From 90530975266d7cc2d779b09cdbf61a86a4390a0c Mon Sep 17 00:00:00 2001 From: pantsel Date: Sat, 11 Mar 2017 11:38:00 +0200 Subject: [PATCH] Massive Refactoring --- backend/.bowerrc => .bowerrc | 0 .dockerignore | 129 +- .gitignore | 108 +- backend/.sailsrc => .sailsrc | 0 Dockerfile | 2 +- backend/Gruntfile.js => Gruntfile.js | 0 {backend/api => api}/base/Controller.js | 0 {backend/api => api}/base/KongController.js | 0 {backend/api => api}/base/Model.js | 0 {backend/api => api}/controllers/.gitkeep | 0 .../api => api}/controllers/ApiController.js | 0 .../api => api}/controllers/AuthController.js | 0 .../controllers/ConsumerController.js | 0 .../controllers/KongApiController.js | 0 .../controllers/KongConsumerController.js | 0 .../controllers/KongInfoController.js | 0 .../controllers/KongNodeController.js | 0 .../controllers/KongPluginController.js | 0 .../controllers/RemoteStorageController.js | 0 .../api => api}/controllers/UserController.js | 0 {backend/api => api}/hooks/load-db.js | 0 {backend/api => api}/models/.gitkeep | 0 {backend/api => api}/models/Consumer.js | 0 {backend/api => api}/models/KongGroup.js | 0 {backend/api => api}/models/KongNode.js | 0 {backend/api => api}/models/Passport.js | 0 {backend/api => api}/models/User.js | 0 {backend/api => api}/policies/Passport.js | 0 .../api => api}/policies/activeNodeData.js | 0 .../api => api}/policies/addDataCreate.js | 0 .../api => api}/policies/addDataUpdate.js | 0 .../api => api}/policies/authenticated.js | 0 {backend/api => api}/policies/createUser.js | 0 {backend/api => api}/policies/dynamicNode.js | 0 {backend/api => api}/policies/isAdmin.js | 0 {backend/api => api}/policies/updateUser.js | 0 {backend/api => api}/responses/badRequest.js | 0 {backend/api => api}/responses/created.js | 0 {backend/api => api}/responses/forbidden.js | 0 {backend/api => api}/responses/kongError.js | 0 {backend/api => api}/responses/notFound.js | 0 {backend/api => api}/responses/ok.js | 0 {backend/api => api}/responses/serverError.js | 0 .../services/ConsumerCredentialsService.js | 0 .../api => api}/services/ConsumerService.js | 0 .../api => api}/services/KongPluginService.js | 0 {backend/api => api}/services/KongService.js | 0 {backend/api => api}/services/Passport.js | 0 {backend/api => api}/services/Token.js | 0 .../api => api}/services/protocols/index.js | 0 .../api => api}/services/protocols/local.js | 0 .../api => api}/services/protocols/oauth.js | 0 .../api => api}/services/protocols/oauth2.js | 0 .../api => api}/services/protocols/openid.js | 0 .../services/remote/RemoteStorageService.js | 0 .../services/remote/adapters/csv.js | 0 .../remote/adapters/google-spreadsheet.js | 0 .../services/remote/adapters/index.js | 0 .../services/remote/adapters/mongodb.js | 0 .../services/remote/adapters/mysql.js | 0 .../google-spreadsheets/credentials.json | 12 + backend/app.js => app.js | 0 {backend/assets => assets}/favicon.ico | Bin {backend/assets => assets}/images/.gitkeep | 0 .../images/konga-logo-small.png | Bin .../assets => assets}/images/konga-logo.png | Bin .../assets => assets}/images/svg/conga.svg | 0 .../assets => assets}/images/user-icon.png | Bin .../assets => assets}/images/user-profile.png | Bin {backend/assets => assets}/js/apis/00_apis.js | 0 .../js/apis/add-api-modal-controller.js | 0 .../js/apis/add-api-modal.html | 0 .../apis/add-api-plugin-modal-controller.js | 0 .../js/apis/add-api-plugin-modal.html | 0 .../js/apis/api-controller.js | 0 .../js/apis/api-details-controller.js | 0 .../js/apis/api-details.html | 0 .../js/apis/api-plugins.html | 0 .../js/apis/apis-controller.js | 0 .../assets => assets}/js/apis/apis-service.js | 0 {backend/assets => assets}/js/apis/apis.html | 0 .../assets => assets}/js/apis/edit-api.html | 0 {backend/assets => assets}/js/app.js | 0 .../js/consumers/00_consumers.js | 0 .../js/consumers/consumer-controller.js | 0 .../js/consumers/consumer-model.js | 0 .../js/consumers/consumer-service.js | 0 .../js/consumers/consumers-controller.js | 0 .../js/consumers/create-consumer-modal.html | 0 .../js/consumers/credentials/basic-auth.html | 0 .../consumer-credentials-controller.js | 0 .../credentials/consumer-credentials.html | 0 .../credentials/create-api-key-modal.html | 0 .../create-basic-auth-controller.js | 0 .../credentials/create-basic-auth-modal.html | 0 .../create-hmac-auth-controller.js | 0 .../credentials/create-hmac-auth-modal.html | 0 .../credentials/create-jwt-controller.js | 0 .../credentials/create-jwt-modal.html | 0 .../credentials/create-key-auth-controller.js | 0 .../credentials/create-oauth2-controller.js | 0 .../credentials/create-oauth2-modal.html | 0 .../js/consumers/credentials/hmac.html | 0 .../js/consumers/credentials/jwt.html | 0 .../js/consumers/credentials/key-auth.html | 0 .../mass-assign-credentials-controller.js | 0 .../credentials/mass-assign-modal.html | 0 .../js/consumers/credentials/oauth2.html | 0 .../details/consumer-details-controller.js | 0 .../consumers/details/consumer-details.html | 0 .../js/consumers/edit-consumer-modal.html | 0 .../js/consumers/edit-consumer.html | 0 .../groups/consumer-groups-controller.js | 0 .../js/consumers/groups/consumer-groups.html | 0 .../consumers/groups/create-group-modal.html | 0 .../js/consumers/groups/group.js | 0 .../groups/manage-groups-modal-controllers.js | 0 .../consumers/groups/manage-groups-modal.html | 0 .../import-consumers-connection-controller.js | 0 .../import/import-consumers-controller.js | 0 .../import-consumers-storage-controller.js | 0 .../import-consumers-table-controller.js | 0 .../import/modal-connection-options.html | 0 .../import/modal-consumers-table.html | 0 .../js/consumers/import/modal-import.html | 0 .../import/modal-select-storage.html | 0 .../assets => assets}/js/consumers/index.html | 0 .../consumers/partials/consumers-table.html | 2 +- .../assets => assets}/js/core/auth/auth.js | 0 .../js/core/auth/login/login.html | 0 .../js/core/auth/login/login.js | 0 .../js/core/auth/services/00_services.js | 0 .../js/core/auth/services/AuthService.js | 0 .../js/core/auth/services/UserService.js | 0 .../js/core/components/FocusOn.js | 0 .../js/core/components/components.js | 0 .../js/core/constants/AccessLevels.js | 0 .../js/core/constants/BackendConfig.js | 0 {backend/assets => assets}/js/core/core.js | 0 .../js/core/dependencies/dependencies.js | 0 .../js/core/directives/ListSearch.js | 0 .../js/core/directives/RawView.js | 0 .../js/core/directives/directives.js | 0 .../core/directives/partials/ListSearch.html | 0 .../assets => assets}/js/core/error/error.js | 0 .../js/core/error/partials/error.html | 0 .../js/core/filters/filters.js | 0 .../js/core/interceptors/00_interceptors.js | 0 .../js/core/interceptors/AuthInterceptor.js | 0 .../js/core/interceptors/ErrorInterceptor.js | 0 .../js/core/interceptors/KongaIntercenptor.js | 0 .../interceptors/TemplateCacheInterceptor.js | 0 .../js/core/layout/00_layout.js | 0 .../js/core/layout/01_layout-controllers.js | 0 .../js/core/layout/02_layout-directives.js | 0 .../js/core/layout/03_layout-services.js | 0 .../js/core/layout/partials/files.html | 0 .../js/core/layout/partials/footer.html | 0 .../js/core/layout/partials/header.html | 2 +- .../js/core/layout/partials/help.html | 0 .../js/core/layout/partials/navigation.html | 0 .../js/core/layout/partials/sidebar.html | 0 .../layout/partials/uiBreadcrumbs.tpl.html | 0 .../js/core/libraries/LoDash.js | 0 .../js/core/libraries/libraries.js | 0 .../js/core/models/00_models.js | 0 .../js/core/models/DataModel.js | 0 .../js/core/plugins/angular-matchheight.js | 0 .../js/core/plugins/material.spinner.js | 0 .../js/core/plugins/uiBreadcrumbs.js | 0 .../js/core/services/00_services.js | 0 .../js/core/services/DataService.js | 0 .../js/core/services/DialogService.js | 0 .../js/core/services/HttpStatusService.js | 0 .../js/core/services/KongPluginsService.js | 0 .../js/core/services/ListConfigService.js | 0 .../js/core/services/MessageService.js | 0 .../js/core/services/NodesService.js | 0 .../js/core/services/RemoteStorageService.js | 0 .../js/core/services/SocketHelperService.js | 0 .../js/dashboard/01_dashboard.js | 0 .../js/dashboard/02_dashboard-controller.js | 0 .../js/dashboard/dashboard.html | 0 .../js/dependencies/sails.io.js | 0 {backend/assets => assets}/js/info/00_info.js | 0 .../js/info/01_info-controllers.js | 0 .../js/info/02_info-service.js | 0 {backend/assets => assets}/js/info/index.html | 0 .../js/plugins/00_plugins.js | 0 .../js/plugins/add-plugin-controller.js | 0 .../js/plugins/add-plugins-controller.js | 0 .../js/plugins/add-plugins.html | 0 .../js/plugins/api-plugins-controller.js | 0 .../js/plugins/edit-plugin-controller.js | 0 .../js/plugins/modals/add-plugin-modal.html | 0 .../js/plugins/modals/custom-template.html | 0 .../js/plugins/modals/edit-plugin-modal.html | 0 .../js/plugins/plugin-helper-service.js | 0 .../js/plugins/plugins-controller.js | 0 .../js/plugins/plugins-service.js | 0 .../assets => assets}/js/plugins/plugins.html | 0 .../js/settings/01_settings.js | 0 .../assets => assets}/js/settings/index.html | 0 .../js/settings/modals/create-node-modal.html | 0 .../js/settings/modals/test-node-modal.html | 0 .../js/settings/node-model.js | 0 .../js/settings/partials/nodes-table.html | 0 .../js/settings/settings-controller.js | 0 .../js/settings/settings-model.js | 0 .../assets => assets}/js/users/00_users.js | 0 .../assets => assets}/js/users/index.html | 0 .../js/users/partials/users-table.html | 0 .../js/users/user-controller.js | 0 .../js/users/user-create-controller.js | 0 .../js/users/user-create.html | 0 .../assets => assets}/js/users/user-model.js | 0 {backend/assets => assets}/js/users/user.html | 0 .../js/users/users-controller.js | 0 {backend/assets => assets}/robots.txt | 0 .../assets => assets}/styles/_angular.scss | 0 .../assets => assets}/styles/_animloader.scss | 0 .../styles/_bootstrap_over.scss | 0 .../assets => assets}/styles/_bootswatch.scss | 0 .../assets => assets}/styles/_components.scss | 0 {backend/assets => assets}/styles/_forms.scss | 0 .../assets => assets}/styles/_mixins.scss | 0 .../assets => assets}/styles/_ripple.scss | 0 .../assets => assets}/styles/_ripples.scss | 0 .../assets => assets}/styles/_variables.scss | 0 .../assets => assets}/styles/importer.scss | 0 {backend/assets => assets}/templates/.gitkeep | 0 backend/.dockerignore | 20 - backend/.gitignore | 47 - backend/.travis.yml | 26 - backend/Dockerfile | 23 - backend/LICENSE | 22 - backend/README.md | 211 - backend/package.json | 74 - backend/start.sh | Bin 172 -> 0 bytes backend/views/layout.ejs | 224 - bin/konga.js | 82 - backend/bower.json => bower.json | 0 {backend/config => config}/application.js | 0 {backend/config => config}/blueprints.js | 0 {backend/config => config}/bootstrap.js | 0 {backend/config => config}/connections.js | 0 {backend/config => config}/cors.js | 0 {backend/config => config}/csrf.js | 0 {backend/config => config}/env/development.js | 0 {backend/config => config}/env/production.js | 0 {backend/config => config}/globals.js | 0 {backend/config => config}/http.js | 0 {backend/config => config}/i18n.js | 0 {backend/config => config}/jwt.js | 0 {backend/config => config}/load-db.js | 0 config/local.js | 51 + {backend/config => config}/local_example.js | 0 {backend/config => config}/locales/_README.md | 0 {backend/config => config}/locales/en.json | 0 {backend/config => config}/log.js | 0 {backend/config => config}/models.js | 0 {backend/config => config}/orm.js | 0 {backend/config => config}/passport.js | 0 {backend/config => config}/policies.js | 0 {backend/config => config}/pubsub.js | 0 {backend/config => config}/routes.js | 0 {backend/config => config}/session.js | 0 {backend/config => config}/sockets.js | 0 {backend/config => config}/views.js | 0 backend/dummy.js => dummy.js | 0 frontend/.bowerrc | 3 - frontend/.csslintrc | 9 - frontend/.editorconfig | 13 - frontend/.jshintrc | 22 - frontend/LICENSE | 22 - frontend/bower.json | 56 - frontend/config/README.md | 12 - frontend/config/config_example.json | 9 - frontend/gulpfile.js | 404 - frontend/karma.conf.js | 60 - frontend/package.json | 52 - frontend/scsslint.yml | 234 - frontend/server.js | 36 - .../src/app/apis/add-api-modal-controller.js | 59 - frontend/src/app/apis/add-api-modal.html | 115 - .../apis/add-api-plugin-modal-controller.js | 109 - .../src/app/apis/add-api-plugin-modal.html | 56 - frontend/src/app/apis/api-controller.js | 35 - .../src/app/apis/api-details-controller.js | 38 - frontend/src/app/apis/api-details.html | 92 - .../src/app/apis/api-plugins-controller.js | 137 - frontend/src/app/apis/api-plugins.html | 71 - frontend/src/app/apis/apis-controller.js | 85 - frontend/src/app/apis/apis-service.js | 70 - frontend/src/app/apis/apis.html | 91 - frontend/src/app/apis/apis.js | 185 - frontend/src/app/apis/edit-api.html | 26 - frontend/src/app/app.js | 224 - frontend/src/app/app.scss | 1 - frontend/src/app/assets/.gitkeep | 0 .../src/app/assets/img/konga-logo-small.png | Bin 5673 -> 0 bytes frontend/src/app/assets/img/konga-logo.png | Bin 23512 -> 0 bytes frontend/src/app/assets/img/user-icon.png | Bin 1914 -> 0 bytes frontend/src/app/assets/img/user-profile.png | Bin 12555 -> 0 bytes frontend/src/app/assets/svg/conga.svg | 59 - .../src/app/consumers/consumer-controller.js | 40 - frontend/src/app/consumers/consumer-model.js | 74 - .../src/app/consumers/consumer-service.js | 79 - .../src/app/consumers/consumers-controller.js | 385 - frontend/src/app/consumers/consumers.js | 126 - .../app/consumers/create-consumer-modal.html | 40 - .../app/consumers/credentials/basic-auth.html | 36 - .../consumer-credentials-controller.js | 294 - .../credentials/consumer-credentials.html | 25 - .../credentials/create-api-key-modal.html | 34 - .../create-basic-auth-controller.js | 40 - .../credentials/create-basic-auth-modal.html | 42 - .../create-hmac-auth-controller.js | 44 - .../credentials/create-hmac-auth-modal.html | 42 - .../credentials/create-jwt-controller.js | 55 - .../credentials/create-jwt-modal.html | 68 - .../credentials/create-key-auth-controller.js | 44 - .../credentials/create-oauth2-controller.js | 42 - .../credentials/create-oauth2-modal.html | 62 - .../src/app/consumers/credentials/hmac.html | 36 - .../src/app/consumers/credentials/jwt.html | 30 - .../app/consumers/credentials/key-auth.html | 34 - .../mass-assign-credentials-controller.js | 91 - .../credentials/mass-assign-modal.html | 26 - .../src/app/consumers/credentials/oauth2.html | 38 - .../details/consumer-details-controller.js | 33 - .../consumers/details/consumer-details.html | 37 - .../app/consumers/edit-consumer-modal.html | 40 - frontend/src/app/consumers/edit-consumer.html | 28 - .../groups/consumer-groups-controller.js | 83 - .../app/consumers/groups/consumer-groups.html | 51 - .../consumers/groups/create-group-modal.html | 31 - frontend/src/app/consumers/groups/group.js | 16 - .../groups/manage-groups-modal-controllers.js | 132 - .../consumers/groups/manage-groups-modal.html | 62 - .../import-consumers-connection-controller.js | 93 - .../import/import-consumers-controller.js | 89 - .../import-consumers-storage-controller.js | 44 - .../import-consumers-table-controller.js | 77 - .../import/modal-connection-options.html | 118 - .../import/modal-consumers-table.html | 81 - .../app/consumers/import/modal-import.html | 29 - .../import/modal-select-storage.html | 24 - frontend/src/app/consumers/index.html | 64 - .../consumers/partials/consumers-table.html | 110 - frontend/src/app/core/auth/auth.js | 33 - .../app/core/auth/login/login-controllers.js | 63 - frontend/src/app/core/auth/login/login.html | 55 - frontend/src/app/core/auth/login/login.js | 37 - frontend/src/app/core/auth/login/login.scss | 62 - .../src/app/core/auth/services/AuthService.js | 122 - .../src/app/core/auth/services/UserService.js | 40 - .../src/app/core/auth/services/services.js | 6 - frontend/src/app/core/components/FocusOn.js | 78 - .../src/app/core/components/components.js | 6 - .../src/app/core/constants/AccessLevels.js | 17 - .../src/app/core/constants/BackendConfig.js | 15 - frontend/src/app/core/core.js | 33 - .../src/app/core/dependencies/dependencies.js | 33 - .../src/app/core/directives/ListSearch.js | 62 - frontend/src/app/core/directives/RawView.js | 43 - .../src/app/core/directives/directives.js | 19 - .../core/directives/partials/ListSearch.html | 52 - .../src/app/core/error/error-controllers.js | 31 - frontend/src/app/core/error/error.js | 38 - .../src/app/core/error/partials/error.html | 18 - frontend/src/app/core/filters/filters.js | 13 - .../app/core/interceptors/AuthInterceptor.js | 74 - .../app/core/interceptors/ErrorInterceptor.js | 73 - .../core/interceptors/KongaIntercenptor.js | 44 - .../interceptors/TemplateCacheInterceptor.js | 26 - .../src/app/core/interceptors/interceptors.js | 6 - .../src/app/core/layout/layout-controllers.js | 168 - .../src/app/core/layout/layout-directives.js | 39 - .../src/app/core/layout/layout-services.js | 462 - frontend/src/app/core/layout/layout.js | 15 - .../src/app/core/layout/partials/files.html | 25 - .../src/app/core/layout/partials/footer.html | 26 - .../src/app/core/layout/partials/header.html | 80 - .../src/app/core/layout/partials/help.html | 19 - .../app/core/layout/partials/navigation.html | 18 - .../src/app/core/layout/partials/sidebar.html | 9 - .../layout/partials/uiBreadcrumbs.tpl.html | 5 - frontend/src/app/core/libraries/LoDash.js | 30 - frontend/src/app/core/libraries/libraries.js | 6 - frontend/src/app/core/models/DataModel.js | 464 - frontend/src/app/core/models/models.js | 6 - .../app/core/plugins/angular-matchheight.js | 57 - .../src/app/core/plugins/material.spinner.js | 171 - .../src/app/core/plugins/uiBreadcrumbs.js | 178 - frontend/src/app/core/services/DataService.js | 138 - .../src/app/core/services/DialogService.js | 74 - .../app/core/services/HttpStatusService.js | 283 - .../app/core/services/KongPluginsService.js | 873 -- .../app/core/services/ListConfigService.js | 308 - .../src/app/core/services/MessageService.js | 104 - .../src/app/core/services/NodesService.js | 46 - .../app/core/services/RemoteStorageService.js | 45 - .../app/core/services/SocketHelperService.js | 66 - frontend/src/app/core/services/services.js | 6 - .../src/app/dashboard/dashboard-controller.js | 160 - frontend/src/app/dashboard/dashboard.html | 192 - frontend/src/app/dashboard/dashboard.js | 48 - frontend/src/app/index.html | 80 - frontend/src/app/info/index.html | 6 - frontend/src/app/info/info-controllers.js | 19 - frontend/src/app/info/info-service.js | 30 - frontend/src/app/info/info.js | 40 - .../src/app/plugins/add-plugin-controller.js | 162 - .../src/app/plugins/add-plugins-controller.js | 157 - frontend/src/app/plugins/add-plugins.html | 59 - .../src/app/plugins/edit-plugin-controller.js | 247 - .../app/plugins/modals/add-plugin-modal.html | 166 - .../app/plugins/modals/custom-template.html | 4 - .../app/plugins/modals/edit-plugin-modal.html | 186 - .../src/app/plugins/plugin-helper-service.js | 143 - .../src/app/plugins/plugins-controller.js | 106 - frontend/src/app/plugins/plugins-service.js | 49 - frontend/src/app/plugins/plugins.html | 78 - frontend/src/app/plugins/plugins.js | 89 - frontend/src/app/settings/index.html | 43 - .../settings/modals/create-node-modal.html | 45 - .../app/settings/modals/test-node-modal.html | 29 - frontend/src/app/settings/node-model.js | 29 - .../app/settings/partials/nodes-table.html | 66 - .../src/app/settings/settings-controller.js | 347 - frontend/src/app/settings/settings-model.js | 29 - frontend/src/app/settings/settings.js | 65 - frontend/src/app/styles/_angular.scss | 10 - frontend/src/app/styles/_animloader.scss | 72 - frontend/src/app/styles/_base.scss | 586 -- frontend/src/app/styles/_bootstrap_over.scss | 323 - frontend/src/app/styles/_bootswatch.scss | 7509 ----------------- frontend/src/app/styles/_components.scss | 52 - frontend/src/app/styles/_forms.scss | 17 - frontend/src/app/styles/_mixins.scss | 49 - frontend/src/app/styles/_ripple.scss | 1 - frontend/src/app/styles/_ripples.scss | 47 - frontend/src/app/styles/_variables.scss | 856 -- frontend/src/app/users/index.html | 26 - .../src/app/users/partials/users-table.html | 55 - frontend/src/app/users/user-controller.js | 90 - .../src/app/users/user-create-controller.js | 51 - frontend/src/app/users/user-create.html | 72 - frontend/src/app/users/user-model.js | 74 - frontend/src/app/users/user.html | 166 - frontend/src/app/users/users-controller.js | 196 - frontend/src/app/users/users.js | 98 - package.json | 73 +- start.sh | Bin 172 -> 32 bytes {backend/tasks => tasks}/config/clean.js | 0 {backend/tasks => tasks}/config/coffee.js | 0 {backend/tasks => tasks}/config/concat.js | 0 {backend/tasks => tasks}/config/copy.js | 0 {backend/tasks => tasks}/config/cssmin.js | 0 {backend/tasks => tasks}/config/jst.js | 0 {backend/tasks => tasks}/config/less.js | 0 .../tasks => tasks}/config/sails-linker.js | 0 {backend/tasks => tasks}/config/sass.js | 0 {backend/tasks => tasks}/config/sync.js | 0 {backend/tasks => tasks}/config/uglify.js | 3 + {backend/tasks => tasks}/config/watch.js | 0 {backend/tasks => tasks}/pipeline.js | 0 {backend/tasks => tasks}/register/build.js | 0 .../tasks => tasks}/register/buildProd.js | 0 .../tasks => tasks}/register/compileAssets.js | 0 {backend/tasks => tasks}/register/default.js | 2 +- .../tasks => tasks}/register/linkAssets.js | 0 .../register/linkAssetsBuild.js | 0 .../register/linkAssetsBuildProd.js | 0 {backend/tasks => tasks}/register/prod.js | 7 +- .../tasks => tasks}/register/syncAssets.js | 0 {backend/test => test}/bootstrap.test.js | 0 {backend/test => test}/fixtures/KongNode.json | 0 {backend/test => test}/fixtures/Passport.json | 0 {backend/test => test}/fixtures/User.json | 0 .../functional/common/controller.test.js | 0 .../controllers/AuthController.test.js | 0 {backend/test => test}/helpers/README.MD | 0 {backend/test => test}/helpers/login.js | 0 {backend/test => test}/mocha.opts | 0 {backend/views => views}/403.ejs | 0 {backend/views => views}/404.ejs | 0 {backend/views => views}/500.ejs | 0 {backend/views => views}/homepage.ejs | 0 views/layout.ejs | 93 + {backend/views => views}/splash.ejs | 0 492 files changed, 425 insertions(+), 24086 deletions(-) rename backend/.bowerrc => .bowerrc (100%) rename backend/.sailsrc => .sailsrc (100%) rename backend/Gruntfile.js => Gruntfile.js (100%) rename {backend/api => api}/base/Controller.js (100%) rename {backend/api => api}/base/KongController.js (100%) rename {backend/api => api}/base/Model.js (100%) rename {backend/api => api}/controllers/.gitkeep (100%) rename {backend/api => api}/controllers/ApiController.js (100%) rename {backend/api => api}/controllers/AuthController.js (100%) rename {backend/api => api}/controllers/ConsumerController.js (100%) rename {backend/api => api}/controllers/KongApiController.js (100%) rename {backend/api => api}/controllers/KongConsumerController.js (100%) rename {backend/api => api}/controllers/KongInfoController.js (100%) rename {backend/api => api}/controllers/KongNodeController.js (100%) rename {backend/api => api}/controllers/KongPluginController.js (100%) rename {backend/api => api}/controllers/RemoteStorageController.js (100%) rename {backend/api => api}/controllers/UserController.js (100%) rename {backend/api => api}/hooks/load-db.js (100%) rename {backend/api => api}/models/.gitkeep (100%) rename {backend/api => api}/models/Consumer.js (100%) rename {backend/api => api}/models/KongGroup.js (100%) rename {backend/api => api}/models/KongNode.js (100%) rename {backend/api => api}/models/Passport.js (100%) rename {backend/api => api}/models/User.js (100%) rename {backend/api => api}/policies/Passport.js (100%) rename {backend/api => api}/policies/activeNodeData.js (100%) rename {backend/api => api}/policies/addDataCreate.js (100%) rename {backend/api => api}/policies/addDataUpdate.js (100%) rename {backend/api => api}/policies/authenticated.js (100%) rename {backend/api => api}/policies/createUser.js (100%) rename {backend/api => api}/policies/dynamicNode.js (100%) rename {backend/api => api}/policies/isAdmin.js (100%) rename {backend/api => api}/policies/updateUser.js (100%) rename {backend/api => api}/responses/badRequest.js (100%) rename {backend/api => api}/responses/created.js (100%) rename {backend/api => api}/responses/forbidden.js (100%) rename {backend/api => api}/responses/kongError.js (100%) rename {backend/api => api}/responses/notFound.js (100%) rename {backend/api => api}/responses/ok.js (100%) rename {backend/api => api}/responses/serverError.js (100%) rename {backend/api => api}/services/ConsumerCredentialsService.js (100%) rename {backend/api => api}/services/ConsumerService.js (100%) rename {backend/api => api}/services/KongPluginService.js (100%) rename {backend/api => api}/services/KongService.js (100%) rename {backend/api => api}/services/Passport.js (100%) rename {backend/api => api}/services/Token.js (100%) rename {backend/api => api}/services/protocols/index.js (100%) rename {backend/api => api}/services/protocols/local.js (100%) rename {backend/api => api}/services/protocols/oauth.js (100%) rename {backend/api => api}/services/protocols/oauth2.js (100%) rename {backend/api => api}/services/protocols/openid.js (100%) rename {backend/api => api}/services/remote/RemoteStorageService.js (100%) rename {backend/api => api}/services/remote/adapters/csv.js (100%) rename {backend/api => api}/services/remote/adapters/google-spreadsheet.js (100%) rename {backend/api => api}/services/remote/adapters/index.js (100%) rename {backend/api => api}/services/remote/adapters/mongodb.js (100%) rename {backend/api => api}/services/remote/adapters/mysql.js (100%) create mode 100644 api/services/remote/credentials/google-spreadsheets/credentials.json rename backend/app.js => app.js (100%) rename {backend/assets => assets}/favicon.ico (100%) rename {backend/assets => assets}/images/.gitkeep (100%) rename {backend/assets => assets}/images/konga-logo-small.png (100%) rename {backend/assets => assets}/images/konga-logo.png (100%) rename {backend/assets => assets}/images/svg/conga.svg (100%) rename {backend/assets => assets}/images/user-icon.png (100%) rename {backend/assets => assets}/images/user-profile.png (100%) rename {backend/assets => assets}/js/apis/00_apis.js (100%) rename {backend/assets => assets}/js/apis/add-api-modal-controller.js (100%) rename {backend/assets => assets}/js/apis/add-api-modal.html (100%) rename {backend/assets => assets}/js/apis/add-api-plugin-modal-controller.js (100%) rename {backend/assets => assets}/js/apis/add-api-plugin-modal.html (100%) rename {backend/assets => assets}/js/apis/api-controller.js (100%) rename {backend/assets => assets}/js/apis/api-details-controller.js (100%) rename {backend/assets => assets}/js/apis/api-details.html (100%) rename {backend/assets => assets}/js/apis/api-plugins.html (100%) rename {backend/assets => assets}/js/apis/apis-controller.js (100%) rename {backend/assets => assets}/js/apis/apis-service.js (100%) rename {backend/assets => assets}/js/apis/apis.html (100%) rename {backend/assets => assets}/js/apis/edit-api.html (100%) rename {backend/assets => assets}/js/app.js (100%) rename {backend/assets => assets}/js/consumers/00_consumers.js (100%) rename {backend/assets => assets}/js/consumers/consumer-controller.js (100%) rename {backend/assets => assets}/js/consumers/consumer-model.js (100%) rename {backend/assets => assets}/js/consumers/consumer-service.js (100%) rename {backend/assets => assets}/js/consumers/consumers-controller.js (100%) rename {backend/assets => assets}/js/consumers/create-consumer-modal.html (100%) rename {backend/assets => assets}/js/consumers/credentials/basic-auth.html (100%) rename {backend/assets => assets}/js/consumers/credentials/consumer-credentials-controller.js (100%) rename {backend/assets => assets}/js/consumers/credentials/consumer-credentials.html (100%) rename {backend/assets => assets}/js/consumers/credentials/create-api-key-modal.html (100%) rename {backend/assets => assets}/js/consumers/credentials/create-basic-auth-controller.js (100%) rename {backend/assets => assets}/js/consumers/credentials/create-basic-auth-modal.html (100%) rename {backend/assets => assets}/js/consumers/credentials/create-hmac-auth-controller.js (100%) rename {backend/assets => assets}/js/consumers/credentials/create-hmac-auth-modal.html (100%) rename {backend/assets => assets}/js/consumers/credentials/create-jwt-controller.js (100%) rename {backend/assets => assets}/js/consumers/credentials/create-jwt-modal.html (100%) rename {backend/assets => assets}/js/consumers/credentials/create-key-auth-controller.js (100%) rename {backend/assets => assets}/js/consumers/credentials/create-oauth2-controller.js (100%) rename {backend/assets => assets}/js/consumers/credentials/create-oauth2-modal.html (100%) rename {backend/assets => assets}/js/consumers/credentials/hmac.html (100%) rename {backend/assets => assets}/js/consumers/credentials/jwt.html (100%) rename {backend/assets => assets}/js/consumers/credentials/key-auth.html (100%) rename {backend/assets => assets}/js/consumers/credentials/mass-assign-credentials-controller.js (100%) rename {backend/assets => assets}/js/consumers/credentials/mass-assign-modal.html (100%) rename {backend/assets => assets}/js/consumers/credentials/oauth2.html (100%) rename {backend/assets => assets}/js/consumers/details/consumer-details-controller.js (100%) rename {backend/assets => assets}/js/consumers/details/consumer-details.html (100%) rename {backend/assets => assets}/js/consumers/edit-consumer-modal.html (100%) rename {backend/assets => assets}/js/consumers/edit-consumer.html (100%) rename {backend/assets => assets}/js/consumers/groups/consumer-groups-controller.js (100%) rename {backend/assets => assets}/js/consumers/groups/consumer-groups.html (100%) rename {backend/assets => assets}/js/consumers/groups/create-group-modal.html (100%) rename {backend/assets => assets}/js/consumers/groups/group.js (100%) rename {backend/assets => assets}/js/consumers/groups/manage-groups-modal-controllers.js (100%) rename {backend/assets => assets}/js/consumers/groups/manage-groups-modal.html (100%) rename {backend/assets => assets}/js/consumers/import/import-consumers-connection-controller.js (100%) rename {backend/assets => assets}/js/consumers/import/import-consumers-controller.js (100%) rename {backend/assets => assets}/js/consumers/import/import-consumers-storage-controller.js (100%) rename {backend/assets => assets}/js/consumers/import/import-consumers-table-controller.js (100%) rename {backend/assets => assets}/js/consumers/import/modal-connection-options.html (100%) rename {backend/assets => assets}/js/consumers/import/modal-consumers-table.html (100%) rename {backend/assets => assets}/js/consumers/import/modal-import.html (100%) rename {backend/assets => assets}/js/consumers/import/modal-select-storage.html (100%) rename {backend/assets => assets}/js/consumers/index.html (100%) rename {backend/assets => assets}/js/consumers/partials/consumers-table.html (98%) rename {backend/assets => assets}/js/core/auth/auth.js (100%) rename {backend/assets => assets}/js/core/auth/login/login.html (100%) rename {backend/assets => assets}/js/core/auth/login/login.js (100%) rename {backend/assets => assets}/js/core/auth/services/00_services.js (100%) rename {backend/assets => assets}/js/core/auth/services/AuthService.js (100%) rename {backend/assets => assets}/js/core/auth/services/UserService.js (100%) rename {backend/assets => assets}/js/core/components/FocusOn.js (100%) rename {backend/assets => assets}/js/core/components/components.js (100%) rename {backend/assets => assets}/js/core/constants/AccessLevels.js (100%) rename {backend/assets => assets}/js/core/constants/BackendConfig.js (100%) rename {backend/assets => assets}/js/core/core.js (100%) rename {backend/assets => assets}/js/core/dependencies/dependencies.js (100%) rename {backend/assets => assets}/js/core/directives/ListSearch.js (100%) rename {backend/assets => assets}/js/core/directives/RawView.js (100%) rename {backend/assets => assets}/js/core/directives/directives.js (100%) rename {backend/assets => assets}/js/core/directives/partials/ListSearch.html (100%) rename {backend/assets => assets}/js/core/error/error.js (100%) rename {backend/assets => assets}/js/core/error/partials/error.html (100%) rename {backend/assets => assets}/js/core/filters/filters.js (100%) rename {backend/assets => assets}/js/core/interceptors/00_interceptors.js (100%) rename {backend/assets => assets}/js/core/interceptors/AuthInterceptor.js (100%) rename {backend/assets => assets}/js/core/interceptors/ErrorInterceptor.js (100%) rename {backend/assets => assets}/js/core/interceptors/KongaIntercenptor.js (100%) rename {backend/assets => assets}/js/core/interceptors/TemplateCacheInterceptor.js (100%) rename {backend/assets => assets}/js/core/layout/00_layout.js (100%) rename {backend/assets => assets}/js/core/layout/01_layout-controllers.js (100%) rename {backend/assets => assets}/js/core/layout/02_layout-directives.js (100%) rename {backend/assets => assets}/js/core/layout/03_layout-services.js (100%) rename {backend/assets => assets}/js/core/layout/partials/files.html (100%) rename {backend/assets => assets}/js/core/layout/partials/footer.html (100%) rename {backend/assets => assets}/js/core/layout/partials/header.html (97%) rename {backend/assets => assets}/js/core/layout/partials/help.html (100%) rename {backend/assets => assets}/js/core/layout/partials/navigation.html (100%) rename {backend/assets => assets}/js/core/layout/partials/sidebar.html (100%) rename {backend/assets => assets}/js/core/layout/partials/uiBreadcrumbs.tpl.html (100%) rename {backend/assets => assets}/js/core/libraries/LoDash.js (100%) rename {backend/assets => assets}/js/core/libraries/libraries.js (100%) rename {backend/assets => assets}/js/core/models/00_models.js (100%) rename {backend/assets => assets}/js/core/models/DataModel.js (100%) rename {backend/assets => assets}/js/core/plugins/angular-matchheight.js (100%) rename {backend/assets => assets}/js/core/plugins/material.spinner.js (100%) rename {backend/assets => assets}/js/core/plugins/uiBreadcrumbs.js (100%) rename {backend/assets => assets}/js/core/services/00_services.js (100%) rename {backend/assets => assets}/js/core/services/DataService.js (100%) rename {backend/assets => assets}/js/core/services/DialogService.js (100%) rename {backend/assets => assets}/js/core/services/HttpStatusService.js (100%) rename {backend/assets => assets}/js/core/services/KongPluginsService.js (100%) rename {backend/assets => assets}/js/core/services/ListConfigService.js (100%) rename {backend/assets => assets}/js/core/services/MessageService.js (100%) rename {backend/assets => assets}/js/core/services/NodesService.js (100%) rename {backend/assets => assets}/js/core/services/RemoteStorageService.js (100%) rename {backend/assets => assets}/js/core/services/SocketHelperService.js (100%) rename {backend/assets => assets}/js/dashboard/01_dashboard.js (100%) rename {backend/assets => assets}/js/dashboard/02_dashboard-controller.js (100%) rename {backend/assets => assets}/js/dashboard/dashboard.html (100%) rename {backend/assets => assets}/js/dependencies/sails.io.js (100%) rename {backend/assets => assets}/js/info/00_info.js (100%) rename {backend/assets => assets}/js/info/01_info-controllers.js (100%) rename {backend/assets => assets}/js/info/02_info-service.js (100%) rename {backend/assets => assets}/js/info/index.html (100%) rename {backend/assets => assets}/js/plugins/00_plugins.js (100%) rename {backend/assets => assets}/js/plugins/add-plugin-controller.js (100%) rename {backend/assets => assets}/js/plugins/add-plugins-controller.js (100%) rename {backend/assets => assets}/js/plugins/add-plugins.html (100%) rename {backend/assets => assets}/js/plugins/api-plugins-controller.js (100%) rename {backend/assets => assets}/js/plugins/edit-plugin-controller.js (100%) rename {backend/assets => assets}/js/plugins/modals/add-plugin-modal.html (100%) rename {backend/assets => assets}/js/plugins/modals/custom-template.html (100%) rename {backend/assets => assets}/js/plugins/modals/edit-plugin-modal.html (100%) rename {backend/assets => assets}/js/plugins/plugin-helper-service.js (100%) rename {backend/assets => assets}/js/plugins/plugins-controller.js (100%) rename {backend/assets => assets}/js/plugins/plugins-service.js (100%) rename {backend/assets => assets}/js/plugins/plugins.html (100%) rename {backend/assets => assets}/js/settings/01_settings.js (100%) rename {backend/assets => assets}/js/settings/index.html (100%) rename {backend/assets => assets}/js/settings/modals/create-node-modal.html (100%) rename {backend/assets => assets}/js/settings/modals/test-node-modal.html (100%) rename {backend/assets => assets}/js/settings/node-model.js (100%) rename {backend/assets => assets}/js/settings/partials/nodes-table.html (100%) rename {backend/assets => assets}/js/settings/settings-controller.js (100%) rename {backend/assets => assets}/js/settings/settings-model.js (100%) rename {backend/assets => assets}/js/users/00_users.js (100%) rename {backend/assets => assets}/js/users/index.html (100%) rename {backend/assets => assets}/js/users/partials/users-table.html (100%) rename {backend/assets => assets}/js/users/user-controller.js (100%) rename {backend/assets => assets}/js/users/user-create-controller.js (100%) rename {backend/assets => assets}/js/users/user-create.html (100%) rename {backend/assets => assets}/js/users/user-model.js (100%) rename {backend/assets => assets}/js/users/user.html (100%) rename {backend/assets => assets}/js/users/users-controller.js (100%) rename {backend/assets => assets}/robots.txt (100%) rename {backend/assets => assets}/styles/_angular.scss (100%) rename {backend/assets => assets}/styles/_animloader.scss (100%) rename {backend/assets => assets}/styles/_bootstrap_over.scss (100%) rename {backend/assets => assets}/styles/_bootswatch.scss (100%) rename {backend/assets => assets}/styles/_components.scss (100%) rename {backend/assets => assets}/styles/_forms.scss (100%) rename {backend/assets => assets}/styles/_mixins.scss (100%) rename {backend/assets => assets}/styles/_ripple.scss (100%) rename {backend/assets => assets}/styles/_ripples.scss (100%) rename {backend/assets => assets}/styles/_variables.scss (100%) rename {backend/assets => assets}/styles/importer.scss (100%) rename {backend/assets => assets}/templates/.gitkeep (100%) delete mode 100644 backend/.dockerignore delete mode 100644 backend/.gitignore delete mode 100644 backend/.travis.yml delete mode 100644 backend/Dockerfile delete mode 100644 backend/LICENSE delete mode 100644 backend/README.md delete mode 100644 backend/package.json delete mode 100644 backend/start.sh delete mode 100644 backend/views/layout.ejs delete mode 100644 bin/konga.js rename backend/bower.json => bower.json (100%) rename {backend/config => config}/application.js (100%) rename {backend/config => config}/blueprints.js (100%) rename {backend/config => config}/bootstrap.js (100%) rename {backend/config => config}/connections.js (100%) rename {backend/config => config}/cors.js (100%) rename {backend/config => config}/csrf.js (100%) rename {backend/config => config}/env/development.js (100%) rename {backend/config => config}/env/production.js (100%) rename {backend/config => config}/globals.js (100%) rename {backend/config => config}/http.js (100%) rename {backend/config => config}/i18n.js (100%) rename {backend/config => config}/jwt.js (100%) rename {backend/config => config}/load-db.js (100%) create mode 100644 config/local.js rename {backend/config => config}/local_example.js (100%) rename {backend/config => config}/locales/_README.md (100%) rename {backend/config => config}/locales/en.json (100%) rename {backend/config => config}/log.js (100%) rename {backend/config => config}/models.js (100%) rename {backend/config => config}/orm.js (100%) rename {backend/config => config}/passport.js (100%) rename {backend/config => config}/policies.js (100%) rename {backend/config => config}/pubsub.js (100%) rename {backend/config => config}/routes.js (100%) rename {backend/config => config}/session.js (100%) rename {backend/config => config}/sockets.js (100%) rename {backend/config => config}/views.js (100%) rename backend/dummy.js => dummy.js (100%) delete mode 100644 frontend/.bowerrc delete mode 100644 frontend/.csslintrc delete mode 100644 frontend/.editorconfig delete mode 100644 frontend/.jshintrc delete mode 100644 frontend/LICENSE delete mode 100644 frontend/bower.json delete mode 100644 frontend/config/README.md delete mode 100644 frontend/config/config_example.json delete mode 100644 frontend/gulpfile.js delete mode 100644 frontend/karma.conf.js delete mode 100644 frontend/package.json delete mode 100644 frontend/scsslint.yml delete mode 100644 frontend/server.js delete mode 100644 frontend/src/app/apis/add-api-modal-controller.js delete mode 100644 frontend/src/app/apis/add-api-modal.html delete mode 100644 frontend/src/app/apis/add-api-plugin-modal-controller.js delete mode 100644 frontend/src/app/apis/add-api-plugin-modal.html delete mode 100644 frontend/src/app/apis/api-controller.js delete mode 100644 frontend/src/app/apis/api-details-controller.js delete mode 100644 frontend/src/app/apis/api-details.html delete mode 100644 frontend/src/app/apis/api-plugins-controller.js delete mode 100644 frontend/src/app/apis/api-plugins.html delete mode 100644 frontend/src/app/apis/apis-controller.js delete mode 100644 frontend/src/app/apis/apis-service.js delete mode 100644 frontend/src/app/apis/apis.html delete mode 100644 frontend/src/app/apis/apis.js delete mode 100644 frontend/src/app/apis/edit-api.html delete mode 100644 frontend/src/app/app.js delete mode 100644 frontend/src/app/app.scss delete mode 100644 frontend/src/app/assets/.gitkeep delete mode 100644 frontend/src/app/assets/img/konga-logo-small.png delete mode 100644 frontend/src/app/assets/img/konga-logo.png delete mode 100644 frontend/src/app/assets/img/user-icon.png delete mode 100644 frontend/src/app/assets/img/user-profile.png delete mode 100644 frontend/src/app/assets/svg/conga.svg delete mode 100644 frontend/src/app/consumers/consumer-controller.js delete mode 100644 frontend/src/app/consumers/consumer-model.js delete mode 100644 frontend/src/app/consumers/consumer-service.js delete mode 100644 frontend/src/app/consumers/consumers-controller.js delete mode 100644 frontend/src/app/consumers/consumers.js delete mode 100644 frontend/src/app/consumers/create-consumer-modal.html delete mode 100644 frontend/src/app/consumers/credentials/basic-auth.html delete mode 100644 frontend/src/app/consumers/credentials/consumer-credentials-controller.js delete mode 100644 frontend/src/app/consumers/credentials/consumer-credentials.html delete mode 100644 frontend/src/app/consumers/credentials/create-api-key-modal.html delete mode 100644 frontend/src/app/consumers/credentials/create-basic-auth-controller.js delete mode 100644 frontend/src/app/consumers/credentials/create-basic-auth-modal.html delete mode 100644 frontend/src/app/consumers/credentials/create-hmac-auth-controller.js delete mode 100644 frontend/src/app/consumers/credentials/create-hmac-auth-modal.html delete mode 100644 frontend/src/app/consumers/credentials/create-jwt-controller.js delete mode 100644 frontend/src/app/consumers/credentials/create-jwt-modal.html delete mode 100644 frontend/src/app/consumers/credentials/create-key-auth-controller.js delete mode 100644 frontend/src/app/consumers/credentials/create-oauth2-controller.js delete mode 100644 frontend/src/app/consumers/credentials/create-oauth2-modal.html delete mode 100644 frontend/src/app/consumers/credentials/hmac.html delete mode 100644 frontend/src/app/consumers/credentials/jwt.html delete mode 100644 frontend/src/app/consumers/credentials/key-auth.html delete mode 100644 frontend/src/app/consumers/credentials/mass-assign-credentials-controller.js delete mode 100644 frontend/src/app/consumers/credentials/mass-assign-modal.html delete mode 100644 frontend/src/app/consumers/credentials/oauth2.html delete mode 100644 frontend/src/app/consumers/details/consumer-details-controller.js delete mode 100644 frontend/src/app/consumers/details/consumer-details.html delete mode 100644 frontend/src/app/consumers/edit-consumer-modal.html delete mode 100644 frontend/src/app/consumers/edit-consumer.html delete mode 100644 frontend/src/app/consumers/groups/consumer-groups-controller.js delete mode 100644 frontend/src/app/consumers/groups/consumer-groups.html delete mode 100644 frontend/src/app/consumers/groups/create-group-modal.html delete mode 100644 frontend/src/app/consumers/groups/group.js delete mode 100644 frontend/src/app/consumers/groups/manage-groups-modal-controllers.js delete mode 100644 frontend/src/app/consumers/groups/manage-groups-modal.html delete mode 100644 frontend/src/app/consumers/import/import-consumers-connection-controller.js delete mode 100644 frontend/src/app/consumers/import/import-consumers-controller.js delete mode 100644 frontend/src/app/consumers/import/import-consumers-storage-controller.js delete mode 100644 frontend/src/app/consumers/import/import-consumers-table-controller.js delete mode 100644 frontend/src/app/consumers/import/modal-connection-options.html delete mode 100644 frontend/src/app/consumers/import/modal-consumers-table.html delete mode 100644 frontend/src/app/consumers/import/modal-import.html delete mode 100644 frontend/src/app/consumers/import/modal-select-storage.html delete mode 100644 frontend/src/app/consumers/index.html delete mode 100644 frontend/src/app/consumers/partials/consumers-table.html delete mode 100644 frontend/src/app/core/auth/auth.js delete mode 100644 frontend/src/app/core/auth/login/login-controllers.js delete mode 100644 frontend/src/app/core/auth/login/login.html delete mode 100644 frontend/src/app/core/auth/login/login.js delete mode 100644 frontend/src/app/core/auth/login/login.scss delete mode 100644 frontend/src/app/core/auth/services/AuthService.js delete mode 100644 frontend/src/app/core/auth/services/UserService.js delete mode 100644 frontend/src/app/core/auth/services/services.js delete mode 100644 frontend/src/app/core/components/FocusOn.js delete mode 100644 frontend/src/app/core/components/components.js delete mode 100644 frontend/src/app/core/constants/AccessLevels.js delete mode 100644 frontend/src/app/core/constants/BackendConfig.js delete mode 100644 frontend/src/app/core/core.js delete mode 100644 frontend/src/app/core/dependencies/dependencies.js delete mode 100644 frontend/src/app/core/directives/ListSearch.js delete mode 100644 frontend/src/app/core/directives/RawView.js delete mode 100644 frontend/src/app/core/directives/directives.js delete mode 100644 frontend/src/app/core/directives/partials/ListSearch.html delete mode 100644 frontend/src/app/core/error/error-controllers.js delete mode 100644 frontend/src/app/core/error/error.js delete mode 100644 frontend/src/app/core/error/partials/error.html delete mode 100644 frontend/src/app/core/filters/filters.js delete mode 100644 frontend/src/app/core/interceptors/AuthInterceptor.js delete mode 100644 frontend/src/app/core/interceptors/ErrorInterceptor.js delete mode 100644 frontend/src/app/core/interceptors/KongaIntercenptor.js delete mode 100644 frontend/src/app/core/interceptors/TemplateCacheInterceptor.js delete mode 100644 frontend/src/app/core/interceptors/interceptors.js delete mode 100644 frontend/src/app/core/layout/layout-controllers.js delete mode 100644 frontend/src/app/core/layout/layout-directives.js delete mode 100644 frontend/src/app/core/layout/layout-services.js delete mode 100644 frontend/src/app/core/layout/layout.js delete mode 100644 frontend/src/app/core/layout/partials/files.html delete mode 100644 frontend/src/app/core/layout/partials/footer.html delete mode 100644 frontend/src/app/core/layout/partials/header.html delete mode 100644 frontend/src/app/core/layout/partials/help.html delete mode 100644 frontend/src/app/core/layout/partials/navigation.html delete mode 100644 frontend/src/app/core/layout/partials/sidebar.html delete mode 100644 frontend/src/app/core/layout/partials/uiBreadcrumbs.tpl.html delete mode 100644 frontend/src/app/core/libraries/LoDash.js delete mode 100644 frontend/src/app/core/libraries/libraries.js delete mode 100644 frontend/src/app/core/models/DataModel.js delete mode 100644 frontend/src/app/core/models/models.js delete mode 100644 frontend/src/app/core/plugins/angular-matchheight.js delete mode 100644 frontend/src/app/core/plugins/material.spinner.js delete mode 100644 frontend/src/app/core/plugins/uiBreadcrumbs.js delete mode 100644 frontend/src/app/core/services/DataService.js delete mode 100644 frontend/src/app/core/services/DialogService.js delete mode 100644 frontend/src/app/core/services/HttpStatusService.js delete mode 100644 frontend/src/app/core/services/KongPluginsService.js delete mode 100644 frontend/src/app/core/services/ListConfigService.js delete mode 100644 frontend/src/app/core/services/MessageService.js delete mode 100644 frontend/src/app/core/services/NodesService.js delete mode 100644 frontend/src/app/core/services/RemoteStorageService.js delete mode 100644 frontend/src/app/core/services/SocketHelperService.js delete mode 100644 frontend/src/app/core/services/services.js delete mode 100644 frontend/src/app/dashboard/dashboard-controller.js delete mode 100644 frontend/src/app/dashboard/dashboard.html delete mode 100644 frontend/src/app/dashboard/dashboard.js delete mode 100644 frontend/src/app/index.html delete mode 100644 frontend/src/app/info/index.html delete mode 100644 frontend/src/app/info/info-controllers.js delete mode 100644 frontend/src/app/info/info-service.js delete mode 100644 frontend/src/app/info/info.js delete mode 100644 frontend/src/app/plugins/add-plugin-controller.js delete mode 100644 frontend/src/app/plugins/add-plugins-controller.js delete mode 100644 frontend/src/app/plugins/add-plugins.html delete mode 100644 frontend/src/app/plugins/edit-plugin-controller.js delete mode 100644 frontend/src/app/plugins/modals/add-plugin-modal.html delete mode 100644 frontend/src/app/plugins/modals/custom-template.html delete mode 100644 frontend/src/app/plugins/modals/edit-plugin-modal.html delete mode 100644 frontend/src/app/plugins/plugin-helper-service.js delete mode 100644 frontend/src/app/plugins/plugins-controller.js delete mode 100644 frontend/src/app/plugins/plugins-service.js delete mode 100644 frontend/src/app/plugins/plugins.html delete mode 100644 frontend/src/app/plugins/plugins.js delete mode 100644 frontend/src/app/settings/index.html delete mode 100644 frontend/src/app/settings/modals/create-node-modal.html delete mode 100644 frontend/src/app/settings/modals/test-node-modal.html delete mode 100644 frontend/src/app/settings/node-model.js delete mode 100644 frontend/src/app/settings/partials/nodes-table.html delete mode 100644 frontend/src/app/settings/settings-controller.js delete mode 100644 frontend/src/app/settings/settings-model.js delete mode 100644 frontend/src/app/settings/settings.js delete mode 100644 frontend/src/app/styles/_angular.scss delete mode 100644 frontend/src/app/styles/_animloader.scss delete mode 100644 frontend/src/app/styles/_base.scss delete mode 100644 frontend/src/app/styles/_bootstrap_over.scss delete mode 100644 frontend/src/app/styles/_bootswatch.scss delete mode 100644 frontend/src/app/styles/_components.scss delete mode 100644 frontend/src/app/styles/_forms.scss delete mode 100644 frontend/src/app/styles/_mixins.scss delete mode 100644 frontend/src/app/styles/_ripple.scss delete mode 100644 frontend/src/app/styles/_ripples.scss delete mode 100644 frontend/src/app/styles/_variables.scss delete mode 100644 frontend/src/app/users/index.html delete mode 100644 frontend/src/app/users/partials/users-table.html delete mode 100644 frontend/src/app/users/user-controller.js delete mode 100644 frontend/src/app/users/user-create-controller.js delete mode 100644 frontend/src/app/users/user-create.html delete mode 100644 frontend/src/app/users/user-model.js delete mode 100644 frontend/src/app/users/user.html delete mode 100644 frontend/src/app/users/users-controller.js delete mode 100644 frontend/src/app/users/users.js rename {backend/tasks => tasks}/config/clean.js (100%) rename {backend/tasks => tasks}/config/coffee.js (100%) rename {backend/tasks => tasks}/config/concat.js (100%) rename {backend/tasks => tasks}/config/copy.js (100%) rename {backend/tasks => tasks}/config/cssmin.js (100%) rename {backend/tasks => tasks}/config/jst.js (100%) rename {backend/tasks => tasks}/config/less.js (100%) rename {backend/tasks => tasks}/config/sails-linker.js (100%) rename {backend/tasks => tasks}/config/sass.js (100%) rename {backend/tasks => tasks}/config/sync.js (100%) rename {backend/tasks => tasks}/config/uglify.js (91%) rename {backend/tasks => tasks}/config/watch.js (100%) rename {backend/tasks => tasks}/pipeline.js (100%) rename {backend/tasks => tasks}/register/build.js (100%) rename {backend/tasks => tasks}/register/buildProd.js (100%) rename {backend/tasks => tasks}/register/compileAssets.js (100%) rename {backend/tasks => tasks}/register/default.js (92%) rename {backend/tasks => tasks}/register/linkAssets.js (100%) rename {backend/tasks => tasks}/register/linkAssetsBuild.js (100%) rename {backend/tasks => tasks}/register/linkAssetsBuildProd.js (100%) rename {backend/tasks => tasks}/register/prod.js (73%) rename {backend/tasks => tasks}/register/syncAssets.js (100%) rename {backend/test => test}/bootstrap.test.js (100%) rename {backend/test => test}/fixtures/KongNode.json (100%) rename {backend/test => test}/fixtures/Passport.json (100%) rename {backend/test => test}/fixtures/User.json (100%) rename {backend/test => test}/functional/common/controller.test.js (100%) rename {backend/test => test}/functional/controllers/AuthController.test.js (100%) rename {backend/test => test}/helpers/README.MD (100%) rename {backend/test => test}/helpers/login.js (100%) rename {backend/test => test}/mocha.opts (100%) rename {backend/views => views}/403.ejs (100%) rename {backend/views => views}/404.ejs (100%) rename {backend/views => views}/500.ejs (100%) rename {backend/views => views}/homepage.ejs (100%) create mode 100644 views/layout.ejs rename {backend/views => views}/splash.ejs (100%) diff --git a/backend/.bowerrc b/.bowerrc similarity index 100% rename from backend/.bowerrc rename to .bowerrc diff --git a/.dockerignore b/.dockerignore index e6536dde6..f66e8eb82 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,20 +1,121 @@ +################################################ +############### .gitignore ################## +################################################ +# +# This file is only relevant if you are using git. +# +# Files which match the splat patterns below will +# be ignored by git. This keeps random crap and +# sensitive credentials from being uploaded to +# your repository. It allows you to configure your +# app for your machine without accidentally +# committing settings which will smash the local +# settings of other developers on your team. +# +# Some reasonable defaults are included below, +# but, of course, you should modify/extend/prune +# to fit your needs! +################################################ + + + +################################################ +# Local Configuration +# +# Explicitly ignore files which contain: +# +# 1. Sensitive information you'd rather not push to +# your git repository. +# e.g., your personal API keys or passwords. +# +# 2. Environment-specific configuration +# Basically, anything that would be annoying +# to have to change every time you do a +# `git pull` +# e.g., your local development database, or +# the S3 bucket you're using for file uploads +# development. +# +################################################ + +config/local.js + + + + + +################################################ +# Dependencies +# +# When releasing a production app, you may +# consider including your node_modules and +# bower_components directory in your git repo, +# but during development, its best to exclude it, +# since different developers may be working on +# different kernels, where dependencies would +# need to be recompiled anyway. +# +# More on that here about node_modules dir: +# http://www.futurealoof.com/posts/nodemodules-in-git.html +# (credit Mikeal Rogers, @mikeal) +# +# About bower_components dir, you can see this: +# http://addyosmani.com/blog/checking-in-front-end-dependencies/ +# (credit Addy Osmani, @addyosmani) +# +################################################ + +node_modules +bower_components + + + + +################################################ +# Sails.js / Waterline / Grunt +# +# Files generated by Sails and Grunt, or related +# tasks and adapters. +################################################ +.tmp +dump.rdb + + + + + +################################################ +# Node.js / NPM +# +# Common files generated by Node, NPM, and the +# related ecosystem. +################################################ +lib-cov +*.seed +*.log +*.out +*.pid +npm-debug.log + + + + + +################################################ +# Miscellaneous +# +# Common files generated by text editors, +# operating systems, file systems, etc. +################################################ + +*~ +*# .DS_STORE .netbeans nbproject .idea .node_history -frontend/.tmp -frontend/node_modules -backend/.tmp -backend/node_modules -backend/config/local.js -node_modules -npm-debug.log -frontend/npm-debug.log -_README.md -frontend/config/config.json -backend/api/services/remote/credentials/google-spreadsheets -frontend/bower_components/ -screenshots/ -bin/ +/logs/* +!/logs/.gitkeep +/config/mssqlconfig.js diff --git a/.gitignore b/.gitignore index 0af2db54c..f66e8eb82 100644 --- a/.gitignore +++ b/.gitignore @@ -6,17 +6,102 @@ # # Files which match the splat patterns below will # be ignored by git. This keeps random crap and -# and sensitive credentials from being uploaded to +# sensitive credentials from being uploaded to # your repository. It allows you to configure your # app for your machine without accidentally -# committing settings which will smash the local -# settings of other developers on your team. +# committing settings which will smash the local +# settings of other developers on your team. # # Some reasonable defaults are included below, # but, of course, you should modify/extend/prune # to fit your needs! ################################################ + + + +################################################ +# Local Configuration +# +# Explicitly ignore files which contain: +# +# 1. Sensitive information you'd rather not push to +# your git repository. +# e.g., your personal API keys or passwords. +# +# 2. Environment-specific configuration +# Basically, anything that would be annoying +# to have to change every time you do a +# `git pull` +# e.g., your local development database, or +# the S3 bucket you're using for file uploads +# development. +# +################################################ + +config/local.js + + + + + +################################################ +# Dependencies +# +# When releasing a production app, you may +# consider including your node_modules and +# bower_components directory in your git repo, +# but during development, its best to exclude it, +# since different developers may be working on +# different kernels, where dependencies would +# need to be recompiled anyway. +# +# More on that here about node_modules dir: +# http://www.futurealoof.com/posts/nodemodules-in-git.html +# (credit Mikeal Rogers, @mikeal) +# +# About bower_components dir, you can see this: +# http://addyosmani.com/blog/checking-in-front-end-dependencies/ +# (credit Addy Osmani, @addyosmani) +# +################################################ + +node_modules +bower_components + + + + +################################################ +# Sails.js / Waterline / Grunt +# +# Files generated by Sails and Grunt, or related +# tasks and adapters. +################################################ +.tmp +dump.rdb + + + + + +################################################ +# Node.js / NPM +# +# Common files generated by Node, NPM, and the +# related ecosystem. +################################################ +lib-cov +*.seed +*.log +*.out +*.pid +npm-debug.log + + + + + ################################################ # Miscellaneous # @@ -31,17 +116,6 @@ nbproject .idea .node_history -/frontend/bower_components/ -/frontend/.tmp/ -/frontend/dist/ -/frontend/node_modules/ -/backend/.tmp/ -/backend/node_modules/ -frontend/dist/ -/backend/config/local.js -node_modules/ -/npm-debug.log -/frontend/npm-debug.log -/_README.md -/frontend/config/config.json -/backend/api/services/remote/credentials/google-spreadsheets/ +/logs/* +!/logs/.gitkeep +/config/mssqlconfig.js diff --git a/backend/.sailsrc b/.sailsrc similarity index 100% rename from backend/.sailsrc rename to .sailsrc diff --git a/Dockerfile b/Dockerfile index 8e9fbf500..c790beb36 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ COPY . /app RUN npm --unsafe-perm --verbose install --production -EXPOSE 3000 1338 +EXPOSE 1338 RUN chmod 777 ./start.sh diff --git a/backend/Gruntfile.js b/Gruntfile.js similarity index 100% rename from backend/Gruntfile.js rename to Gruntfile.js diff --git a/backend/api/base/Controller.js b/api/base/Controller.js similarity index 100% rename from backend/api/base/Controller.js rename to api/base/Controller.js diff --git a/backend/api/base/KongController.js b/api/base/KongController.js similarity index 100% rename from backend/api/base/KongController.js rename to api/base/KongController.js diff --git a/backend/api/base/Model.js b/api/base/Model.js similarity index 100% rename from backend/api/base/Model.js rename to api/base/Model.js diff --git a/backend/api/controllers/.gitkeep b/api/controllers/.gitkeep similarity index 100% rename from backend/api/controllers/.gitkeep rename to api/controllers/.gitkeep diff --git a/backend/api/controllers/ApiController.js b/api/controllers/ApiController.js similarity index 100% rename from backend/api/controllers/ApiController.js rename to api/controllers/ApiController.js diff --git a/backend/api/controllers/AuthController.js b/api/controllers/AuthController.js similarity index 100% rename from backend/api/controllers/AuthController.js rename to api/controllers/AuthController.js diff --git a/backend/api/controllers/ConsumerController.js b/api/controllers/ConsumerController.js similarity index 100% rename from backend/api/controllers/ConsumerController.js rename to api/controllers/ConsumerController.js diff --git a/backend/api/controllers/KongApiController.js b/api/controllers/KongApiController.js similarity index 100% rename from backend/api/controllers/KongApiController.js rename to api/controllers/KongApiController.js diff --git a/backend/api/controllers/KongConsumerController.js b/api/controllers/KongConsumerController.js similarity index 100% rename from backend/api/controllers/KongConsumerController.js rename to api/controllers/KongConsumerController.js diff --git a/backend/api/controllers/KongInfoController.js b/api/controllers/KongInfoController.js similarity index 100% rename from backend/api/controllers/KongInfoController.js rename to api/controllers/KongInfoController.js diff --git a/backend/api/controllers/KongNodeController.js b/api/controllers/KongNodeController.js similarity index 100% rename from backend/api/controllers/KongNodeController.js rename to api/controllers/KongNodeController.js diff --git a/backend/api/controllers/KongPluginController.js b/api/controllers/KongPluginController.js similarity index 100% rename from backend/api/controllers/KongPluginController.js rename to api/controllers/KongPluginController.js diff --git a/backend/api/controllers/RemoteStorageController.js b/api/controllers/RemoteStorageController.js similarity index 100% rename from backend/api/controllers/RemoteStorageController.js rename to api/controllers/RemoteStorageController.js diff --git a/backend/api/controllers/UserController.js b/api/controllers/UserController.js similarity index 100% rename from backend/api/controllers/UserController.js rename to api/controllers/UserController.js diff --git a/backend/api/hooks/load-db.js b/api/hooks/load-db.js similarity index 100% rename from backend/api/hooks/load-db.js rename to api/hooks/load-db.js diff --git a/backend/api/models/.gitkeep b/api/models/.gitkeep similarity index 100% rename from backend/api/models/.gitkeep rename to api/models/.gitkeep diff --git a/backend/api/models/Consumer.js b/api/models/Consumer.js similarity index 100% rename from backend/api/models/Consumer.js rename to api/models/Consumer.js diff --git a/backend/api/models/KongGroup.js b/api/models/KongGroup.js similarity index 100% rename from backend/api/models/KongGroup.js rename to api/models/KongGroup.js diff --git a/backend/api/models/KongNode.js b/api/models/KongNode.js similarity index 100% rename from backend/api/models/KongNode.js rename to api/models/KongNode.js diff --git a/backend/api/models/Passport.js b/api/models/Passport.js similarity index 100% rename from backend/api/models/Passport.js rename to api/models/Passport.js diff --git a/backend/api/models/User.js b/api/models/User.js similarity index 100% rename from backend/api/models/User.js rename to api/models/User.js diff --git a/backend/api/policies/Passport.js b/api/policies/Passport.js similarity index 100% rename from backend/api/policies/Passport.js rename to api/policies/Passport.js diff --git a/backend/api/policies/activeNodeData.js b/api/policies/activeNodeData.js similarity index 100% rename from backend/api/policies/activeNodeData.js rename to api/policies/activeNodeData.js diff --git a/backend/api/policies/addDataCreate.js b/api/policies/addDataCreate.js similarity index 100% rename from backend/api/policies/addDataCreate.js rename to api/policies/addDataCreate.js diff --git a/backend/api/policies/addDataUpdate.js b/api/policies/addDataUpdate.js similarity index 100% rename from backend/api/policies/addDataUpdate.js rename to api/policies/addDataUpdate.js diff --git a/backend/api/policies/authenticated.js b/api/policies/authenticated.js similarity index 100% rename from backend/api/policies/authenticated.js rename to api/policies/authenticated.js diff --git a/backend/api/policies/createUser.js b/api/policies/createUser.js similarity index 100% rename from backend/api/policies/createUser.js rename to api/policies/createUser.js diff --git a/backend/api/policies/dynamicNode.js b/api/policies/dynamicNode.js similarity index 100% rename from backend/api/policies/dynamicNode.js rename to api/policies/dynamicNode.js diff --git a/backend/api/policies/isAdmin.js b/api/policies/isAdmin.js similarity index 100% rename from backend/api/policies/isAdmin.js rename to api/policies/isAdmin.js diff --git a/backend/api/policies/updateUser.js b/api/policies/updateUser.js similarity index 100% rename from backend/api/policies/updateUser.js rename to api/policies/updateUser.js diff --git a/backend/api/responses/badRequest.js b/api/responses/badRequest.js similarity index 100% rename from backend/api/responses/badRequest.js rename to api/responses/badRequest.js diff --git a/backend/api/responses/created.js b/api/responses/created.js similarity index 100% rename from backend/api/responses/created.js rename to api/responses/created.js diff --git a/backend/api/responses/forbidden.js b/api/responses/forbidden.js similarity index 100% rename from backend/api/responses/forbidden.js rename to api/responses/forbidden.js diff --git a/backend/api/responses/kongError.js b/api/responses/kongError.js similarity index 100% rename from backend/api/responses/kongError.js rename to api/responses/kongError.js diff --git a/backend/api/responses/notFound.js b/api/responses/notFound.js similarity index 100% rename from backend/api/responses/notFound.js rename to api/responses/notFound.js diff --git a/backend/api/responses/ok.js b/api/responses/ok.js similarity index 100% rename from backend/api/responses/ok.js rename to api/responses/ok.js diff --git a/backend/api/responses/serverError.js b/api/responses/serverError.js similarity index 100% rename from backend/api/responses/serverError.js rename to api/responses/serverError.js diff --git a/backend/api/services/ConsumerCredentialsService.js b/api/services/ConsumerCredentialsService.js similarity index 100% rename from backend/api/services/ConsumerCredentialsService.js rename to api/services/ConsumerCredentialsService.js diff --git a/backend/api/services/ConsumerService.js b/api/services/ConsumerService.js similarity index 100% rename from backend/api/services/ConsumerService.js rename to api/services/ConsumerService.js diff --git a/backend/api/services/KongPluginService.js b/api/services/KongPluginService.js similarity index 100% rename from backend/api/services/KongPluginService.js rename to api/services/KongPluginService.js diff --git a/backend/api/services/KongService.js b/api/services/KongService.js similarity index 100% rename from backend/api/services/KongService.js rename to api/services/KongService.js diff --git a/backend/api/services/Passport.js b/api/services/Passport.js similarity index 100% rename from backend/api/services/Passport.js rename to api/services/Passport.js diff --git a/backend/api/services/Token.js b/api/services/Token.js similarity index 100% rename from backend/api/services/Token.js rename to api/services/Token.js diff --git a/backend/api/services/protocols/index.js b/api/services/protocols/index.js similarity index 100% rename from backend/api/services/protocols/index.js rename to api/services/protocols/index.js diff --git a/backend/api/services/protocols/local.js b/api/services/protocols/local.js similarity index 100% rename from backend/api/services/protocols/local.js rename to api/services/protocols/local.js diff --git a/backend/api/services/protocols/oauth.js b/api/services/protocols/oauth.js similarity index 100% rename from backend/api/services/protocols/oauth.js rename to api/services/protocols/oauth.js diff --git a/backend/api/services/protocols/oauth2.js b/api/services/protocols/oauth2.js similarity index 100% rename from backend/api/services/protocols/oauth2.js rename to api/services/protocols/oauth2.js diff --git a/backend/api/services/protocols/openid.js b/api/services/protocols/openid.js similarity index 100% rename from backend/api/services/protocols/openid.js rename to api/services/protocols/openid.js diff --git a/backend/api/services/remote/RemoteStorageService.js b/api/services/remote/RemoteStorageService.js similarity index 100% rename from backend/api/services/remote/RemoteStorageService.js rename to api/services/remote/RemoteStorageService.js diff --git a/backend/api/services/remote/adapters/csv.js b/api/services/remote/adapters/csv.js similarity index 100% rename from backend/api/services/remote/adapters/csv.js rename to api/services/remote/adapters/csv.js diff --git a/backend/api/services/remote/adapters/google-spreadsheet.js b/api/services/remote/adapters/google-spreadsheet.js similarity index 100% rename from backend/api/services/remote/adapters/google-spreadsheet.js rename to api/services/remote/adapters/google-spreadsheet.js diff --git a/backend/api/services/remote/adapters/index.js b/api/services/remote/adapters/index.js similarity index 100% rename from backend/api/services/remote/adapters/index.js rename to api/services/remote/adapters/index.js diff --git a/backend/api/services/remote/adapters/mongodb.js b/api/services/remote/adapters/mongodb.js similarity index 100% rename from backend/api/services/remote/adapters/mongodb.js rename to api/services/remote/adapters/mongodb.js diff --git a/backend/api/services/remote/adapters/mysql.js b/api/services/remote/adapters/mysql.js similarity index 100% rename from backend/api/services/remote/adapters/mysql.js rename to api/services/remote/adapters/mysql.js diff --git a/api/services/remote/credentials/google-spreadsheets/credentials.json b/api/services/remote/credentials/google-spreadsheets/credentials.json new file mode 100644 index 000000000..2af097dbf --- /dev/null +++ b/api/services/remote/credentials/google-spreadsheets/credentials.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "konga-148120", + "private_key_id": "84413cd1c5f890600ed6d0c77beb0040f2880471", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDB6r16wV0AGbG3\nHVY3hXc/g6r01UrYHQScNTAAA021zMKYJ8TLe3dJXm978avDcKkFeYL58dWVmTT9\nlICm8JsXGrLlx55K2MHs8NjrtEzI3c4xK2Y4pvFqDA+kKqQYgdxGlaaEyX8p0me3\nx2Zh8SgXRD+zUHTjZtL/oawU6FJkXY7D2ewmEhsYhvja+lqSv3GCOofhkfH/EtIX\nsdO9Jkg/UHHKjUW3UbS5U2HesiTGVtDMuP10TawT4d2CCGPdjRTUriTZU8jR1LcW\naHBA17QPMdWa9ObP3unUJebKv2p3shmNNfj46R6UcJSEKxhrviun3lo0aQYQLeAl\nVz4LTQIRAgMBAAECggEAHphOtON1LOLg6ycxxyjDm73GZ0KPwHEznQG3RQlAZYKc\n4SzFG+Wq+GRx6nhCxV8tC7QUOiMxs5ysg6W+dphXn9mSiDZqfxyb3CpTzzxvMPHt\n6kwSoLWWOUkV3qzrnwI+ItTRpPm1mn+b5Z8MRD+sN5+I/V2gU5CRkcuMPvA4r6Tc\nvLSv7x2Ilq8jWNiTNZS/ec39OcFObnL+gesgtw+PHlh+bITaXJKPqvEYM74TM5mh\nGth1EOm6YkOcoTvUSBYzmD1S+mrX5EcDiSxEL9je83banqbd631oAIjP8XmictjR\nYCznFvl7z9S4Bx0OvmvZeAR3eRZaoJgvbvHJ0THRAQKBgQDumQXw+WWWK8yEryCK\nfC1CxwKeKCig9VsrWeHD5llJK5kngEZbulJ7T/45MogMtfqbZ7DGzFVju5kSzs0v\n7NBRkJllgw0O2xh4hVjT+J2+QzA73IGDP1R3LnBfa5tUnzy8bNuKLh29qBffaTmx\nBOqFxDcb7akm9nfPC4rLz5XLCQKBgQDQD3Wvnge8YLPeCa+49crNnaubfp9I7F5M\nzAhyBocfz0s57LV2YbDIxhuK/c9n8STuRvyHoZAEtKHy4vQopxgtkRsa2Yx8yIOa\nKt0rSGX14zv6djgN18Mbc0f8kefgDwsx7GdTQ5mxs5ZojpYmDYiuzjbagwPqBSRK\nKk6Oe5nYyQKBgQC6d5jvFNnRnPU/FOanlBiDQajIFbZ65IWVwa7xPMq2pn4RIuzZ\nryna+U9DQDyXQnlSjpzXIMXzJZ+h1UECnV7I/+sCLIM+AviC6CPdtUUCdtvxTIlj\nG1FVu1NTH3PLlI8Q6zpAKX5QxFez4DaYI7FtTUWMbBZwPtqvUuPsGJWGkQKBgC7N\n+4SJQWZAPtZJSY2LRZchzBQL1RtbiQ8vqwqzqzwdrueV93BtI47W+iU3WawhVFSC\nBZchYjucwv3XzmNCy66cgQN2QyNjHC/XSq/M9prtBnYemBeNHSgUs/H+hLIj0Dnn\n24qgn3eZVdGpmd9vlfr1CuP3Ky8+/t3sTIXDCmX5AoGBAOirb1knm3jT7cbbtNfO\n5gEKw7GC9MPo/Sh9RDAhIEIhYkACgGSiWcQmOv17HJW55BCHlDVw4PDqv70XfnVT\nChbx7Rdcwy0Co+WK9wAmt8mQRM7njh4+wxVQWdDnfotAxrjFJtO7RPjpZ29oyvsK\n/iD5HA2q4XORpNgJ1nNZ/jGC\n-----END PRIVATE KEY-----\n", + "client_email": "pantsel@konga-148120.iam.gserviceaccount.com", + "client_id": "113335730171302572539", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://accounts.google.com/o/oauth2/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/pantsel%40konga-148120.iam.gserviceaccount.com" +} diff --git a/backend/app.js b/app.js similarity index 100% rename from backend/app.js rename to app.js diff --git a/backend/assets/favicon.ico b/assets/favicon.ico similarity index 100% rename from backend/assets/favicon.ico rename to assets/favicon.ico diff --git a/backend/assets/images/.gitkeep b/assets/images/.gitkeep similarity index 100% rename from backend/assets/images/.gitkeep rename to assets/images/.gitkeep diff --git a/backend/assets/images/konga-logo-small.png b/assets/images/konga-logo-small.png similarity index 100% rename from backend/assets/images/konga-logo-small.png rename to assets/images/konga-logo-small.png diff --git a/backend/assets/images/konga-logo.png b/assets/images/konga-logo.png similarity index 100% rename from backend/assets/images/konga-logo.png rename to assets/images/konga-logo.png diff --git a/backend/assets/images/svg/conga.svg b/assets/images/svg/conga.svg similarity index 100% rename from backend/assets/images/svg/conga.svg rename to assets/images/svg/conga.svg diff --git a/backend/assets/images/user-icon.png b/assets/images/user-icon.png similarity index 100% rename from backend/assets/images/user-icon.png rename to assets/images/user-icon.png diff --git a/backend/assets/images/user-profile.png b/assets/images/user-profile.png similarity index 100% rename from backend/assets/images/user-profile.png rename to assets/images/user-profile.png diff --git a/backend/assets/js/apis/00_apis.js b/assets/js/apis/00_apis.js similarity index 100% rename from backend/assets/js/apis/00_apis.js rename to assets/js/apis/00_apis.js diff --git a/backend/assets/js/apis/add-api-modal-controller.js b/assets/js/apis/add-api-modal-controller.js similarity index 100% rename from backend/assets/js/apis/add-api-modal-controller.js rename to assets/js/apis/add-api-modal-controller.js diff --git a/backend/assets/js/apis/add-api-modal.html b/assets/js/apis/add-api-modal.html similarity index 100% rename from backend/assets/js/apis/add-api-modal.html rename to assets/js/apis/add-api-modal.html diff --git a/backend/assets/js/apis/add-api-plugin-modal-controller.js b/assets/js/apis/add-api-plugin-modal-controller.js similarity index 100% rename from backend/assets/js/apis/add-api-plugin-modal-controller.js rename to assets/js/apis/add-api-plugin-modal-controller.js diff --git a/backend/assets/js/apis/add-api-plugin-modal.html b/assets/js/apis/add-api-plugin-modal.html similarity index 100% rename from backend/assets/js/apis/add-api-plugin-modal.html rename to assets/js/apis/add-api-plugin-modal.html diff --git a/backend/assets/js/apis/api-controller.js b/assets/js/apis/api-controller.js similarity index 100% rename from backend/assets/js/apis/api-controller.js rename to assets/js/apis/api-controller.js diff --git a/backend/assets/js/apis/api-details-controller.js b/assets/js/apis/api-details-controller.js similarity index 100% rename from backend/assets/js/apis/api-details-controller.js rename to assets/js/apis/api-details-controller.js diff --git a/backend/assets/js/apis/api-details.html b/assets/js/apis/api-details.html similarity index 100% rename from backend/assets/js/apis/api-details.html rename to assets/js/apis/api-details.html diff --git a/backend/assets/js/apis/api-plugins.html b/assets/js/apis/api-plugins.html similarity index 100% rename from backend/assets/js/apis/api-plugins.html rename to assets/js/apis/api-plugins.html diff --git a/backend/assets/js/apis/apis-controller.js b/assets/js/apis/apis-controller.js similarity index 100% rename from backend/assets/js/apis/apis-controller.js rename to assets/js/apis/apis-controller.js diff --git a/backend/assets/js/apis/apis-service.js b/assets/js/apis/apis-service.js similarity index 100% rename from backend/assets/js/apis/apis-service.js rename to assets/js/apis/apis-service.js diff --git a/backend/assets/js/apis/apis.html b/assets/js/apis/apis.html similarity index 100% rename from backend/assets/js/apis/apis.html rename to assets/js/apis/apis.html diff --git a/backend/assets/js/apis/edit-api.html b/assets/js/apis/edit-api.html similarity index 100% rename from backend/assets/js/apis/edit-api.html rename to assets/js/apis/edit-api.html diff --git a/backend/assets/js/app.js b/assets/js/app.js similarity index 100% rename from backend/assets/js/app.js rename to assets/js/app.js diff --git a/backend/assets/js/consumers/00_consumers.js b/assets/js/consumers/00_consumers.js similarity index 100% rename from backend/assets/js/consumers/00_consumers.js rename to assets/js/consumers/00_consumers.js diff --git a/backend/assets/js/consumers/consumer-controller.js b/assets/js/consumers/consumer-controller.js similarity index 100% rename from backend/assets/js/consumers/consumer-controller.js rename to assets/js/consumers/consumer-controller.js diff --git a/backend/assets/js/consumers/consumer-model.js b/assets/js/consumers/consumer-model.js similarity index 100% rename from backend/assets/js/consumers/consumer-model.js rename to assets/js/consumers/consumer-model.js diff --git a/backend/assets/js/consumers/consumer-service.js b/assets/js/consumers/consumer-service.js similarity index 100% rename from backend/assets/js/consumers/consumer-service.js rename to assets/js/consumers/consumer-service.js diff --git a/backend/assets/js/consumers/consumers-controller.js b/assets/js/consumers/consumers-controller.js similarity index 100% rename from backend/assets/js/consumers/consumers-controller.js rename to assets/js/consumers/consumers-controller.js diff --git a/backend/assets/js/consumers/create-consumer-modal.html b/assets/js/consumers/create-consumer-modal.html similarity index 100% rename from backend/assets/js/consumers/create-consumer-modal.html rename to assets/js/consumers/create-consumer-modal.html diff --git a/backend/assets/js/consumers/credentials/basic-auth.html b/assets/js/consumers/credentials/basic-auth.html similarity index 100% rename from backend/assets/js/consumers/credentials/basic-auth.html rename to assets/js/consumers/credentials/basic-auth.html diff --git a/backend/assets/js/consumers/credentials/consumer-credentials-controller.js b/assets/js/consumers/credentials/consumer-credentials-controller.js similarity index 100% rename from backend/assets/js/consumers/credentials/consumer-credentials-controller.js rename to assets/js/consumers/credentials/consumer-credentials-controller.js diff --git a/backend/assets/js/consumers/credentials/consumer-credentials.html b/assets/js/consumers/credentials/consumer-credentials.html similarity index 100% rename from backend/assets/js/consumers/credentials/consumer-credentials.html rename to assets/js/consumers/credentials/consumer-credentials.html diff --git a/backend/assets/js/consumers/credentials/create-api-key-modal.html b/assets/js/consumers/credentials/create-api-key-modal.html similarity index 100% rename from backend/assets/js/consumers/credentials/create-api-key-modal.html rename to assets/js/consumers/credentials/create-api-key-modal.html diff --git a/backend/assets/js/consumers/credentials/create-basic-auth-controller.js b/assets/js/consumers/credentials/create-basic-auth-controller.js similarity index 100% rename from backend/assets/js/consumers/credentials/create-basic-auth-controller.js rename to assets/js/consumers/credentials/create-basic-auth-controller.js diff --git a/backend/assets/js/consumers/credentials/create-basic-auth-modal.html b/assets/js/consumers/credentials/create-basic-auth-modal.html similarity index 100% rename from backend/assets/js/consumers/credentials/create-basic-auth-modal.html rename to assets/js/consumers/credentials/create-basic-auth-modal.html diff --git a/backend/assets/js/consumers/credentials/create-hmac-auth-controller.js b/assets/js/consumers/credentials/create-hmac-auth-controller.js similarity index 100% rename from backend/assets/js/consumers/credentials/create-hmac-auth-controller.js rename to assets/js/consumers/credentials/create-hmac-auth-controller.js diff --git a/backend/assets/js/consumers/credentials/create-hmac-auth-modal.html b/assets/js/consumers/credentials/create-hmac-auth-modal.html similarity index 100% rename from backend/assets/js/consumers/credentials/create-hmac-auth-modal.html rename to assets/js/consumers/credentials/create-hmac-auth-modal.html diff --git a/backend/assets/js/consumers/credentials/create-jwt-controller.js b/assets/js/consumers/credentials/create-jwt-controller.js similarity index 100% rename from backend/assets/js/consumers/credentials/create-jwt-controller.js rename to assets/js/consumers/credentials/create-jwt-controller.js diff --git a/backend/assets/js/consumers/credentials/create-jwt-modal.html b/assets/js/consumers/credentials/create-jwt-modal.html similarity index 100% rename from backend/assets/js/consumers/credentials/create-jwt-modal.html rename to assets/js/consumers/credentials/create-jwt-modal.html diff --git a/backend/assets/js/consumers/credentials/create-key-auth-controller.js b/assets/js/consumers/credentials/create-key-auth-controller.js similarity index 100% rename from backend/assets/js/consumers/credentials/create-key-auth-controller.js rename to assets/js/consumers/credentials/create-key-auth-controller.js diff --git a/backend/assets/js/consumers/credentials/create-oauth2-controller.js b/assets/js/consumers/credentials/create-oauth2-controller.js similarity index 100% rename from backend/assets/js/consumers/credentials/create-oauth2-controller.js rename to assets/js/consumers/credentials/create-oauth2-controller.js diff --git a/backend/assets/js/consumers/credentials/create-oauth2-modal.html b/assets/js/consumers/credentials/create-oauth2-modal.html similarity index 100% rename from backend/assets/js/consumers/credentials/create-oauth2-modal.html rename to assets/js/consumers/credentials/create-oauth2-modal.html diff --git a/backend/assets/js/consumers/credentials/hmac.html b/assets/js/consumers/credentials/hmac.html similarity index 100% rename from backend/assets/js/consumers/credentials/hmac.html rename to assets/js/consumers/credentials/hmac.html diff --git a/backend/assets/js/consumers/credentials/jwt.html b/assets/js/consumers/credentials/jwt.html similarity index 100% rename from backend/assets/js/consumers/credentials/jwt.html rename to assets/js/consumers/credentials/jwt.html diff --git a/backend/assets/js/consumers/credentials/key-auth.html b/assets/js/consumers/credentials/key-auth.html similarity index 100% rename from backend/assets/js/consumers/credentials/key-auth.html rename to assets/js/consumers/credentials/key-auth.html diff --git a/backend/assets/js/consumers/credentials/mass-assign-credentials-controller.js b/assets/js/consumers/credentials/mass-assign-credentials-controller.js similarity index 100% rename from backend/assets/js/consumers/credentials/mass-assign-credentials-controller.js rename to assets/js/consumers/credentials/mass-assign-credentials-controller.js diff --git a/backend/assets/js/consumers/credentials/mass-assign-modal.html b/assets/js/consumers/credentials/mass-assign-modal.html similarity index 100% rename from backend/assets/js/consumers/credentials/mass-assign-modal.html rename to assets/js/consumers/credentials/mass-assign-modal.html diff --git a/backend/assets/js/consumers/credentials/oauth2.html b/assets/js/consumers/credentials/oauth2.html similarity index 100% rename from backend/assets/js/consumers/credentials/oauth2.html rename to assets/js/consumers/credentials/oauth2.html diff --git a/backend/assets/js/consumers/details/consumer-details-controller.js b/assets/js/consumers/details/consumer-details-controller.js similarity index 100% rename from backend/assets/js/consumers/details/consumer-details-controller.js rename to assets/js/consumers/details/consumer-details-controller.js diff --git a/backend/assets/js/consumers/details/consumer-details.html b/assets/js/consumers/details/consumer-details.html similarity index 100% rename from backend/assets/js/consumers/details/consumer-details.html rename to assets/js/consumers/details/consumer-details.html diff --git a/backend/assets/js/consumers/edit-consumer-modal.html b/assets/js/consumers/edit-consumer-modal.html similarity index 100% rename from backend/assets/js/consumers/edit-consumer-modal.html rename to assets/js/consumers/edit-consumer-modal.html diff --git a/backend/assets/js/consumers/edit-consumer.html b/assets/js/consumers/edit-consumer.html similarity index 100% rename from backend/assets/js/consumers/edit-consumer.html rename to assets/js/consumers/edit-consumer.html diff --git a/backend/assets/js/consumers/groups/consumer-groups-controller.js b/assets/js/consumers/groups/consumer-groups-controller.js similarity index 100% rename from backend/assets/js/consumers/groups/consumer-groups-controller.js rename to assets/js/consumers/groups/consumer-groups-controller.js diff --git a/backend/assets/js/consumers/groups/consumer-groups.html b/assets/js/consumers/groups/consumer-groups.html similarity index 100% rename from backend/assets/js/consumers/groups/consumer-groups.html rename to assets/js/consumers/groups/consumer-groups.html diff --git a/backend/assets/js/consumers/groups/create-group-modal.html b/assets/js/consumers/groups/create-group-modal.html similarity index 100% rename from backend/assets/js/consumers/groups/create-group-modal.html rename to assets/js/consumers/groups/create-group-modal.html diff --git a/backend/assets/js/consumers/groups/group.js b/assets/js/consumers/groups/group.js similarity index 100% rename from backend/assets/js/consumers/groups/group.js rename to assets/js/consumers/groups/group.js diff --git a/backend/assets/js/consumers/groups/manage-groups-modal-controllers.js b/assets/js/consumers/groups/manage-groups-modal-controllers.js similarity index 100% rename from backend/assets/js/consumers/groups/manage-groups-modal-controllers.js rename to assets/js/consumers/groups/manage-groups-modal-controllers.js diff --git a/backend/assets/js/consumers/groups/manage-groups-modal.html b/assets/js/consumers/groups/manage-groups-modal.html similarity index 100% rename from backend/assets/js/consumers/groups/manage-groups-modal.html rename to assets/js/consumers/groups/manage-groups-modal.html diff --git a/backend/assets/js/consumers/import/import-consumers-connection-controller.js b/assets/js/consumers/import/import-consumers-connection-controller.js similarity index 100% rename from backend/assets/js/consumers/import/import-consumers-connection-controller.js rename to assets/js/consumers/import/import-consumers-connection-controller.js diff --git a/backend/assets/js/consumers/import/import-consumers-controller.js b/assets/js/consumers/import/import-consumers-controller.js similarity index 100% rename from backend/assets/js/consumers/import/import-consumers-controller.js rename to assets/js/consumers/import/import-consumers-controller.js diff --git a/backend/assets/js/consumers/import/import-consumers-storage-controller.js b/assets/js/consumers/import/import-consumers-storage-controller.js similarity index 100% rename from backend/assets/js/consumers/import/import-consumers-storage-controller.js rename to assets/js/consumers/import/import-consumers-storage-controller.js diff --git a/backend/assets/js/consumers/import/import-consumers-table-controller.js b/assets/js/consumers/import/import-consumers-table-controller.js similarity index 100% rename from backend/assets/js/consumers/import/import-consumers-table-controller.js rename to assets/js/consumers/import/import-consumers-table-controller.js diff --git a/backend/assets/js/consumers/import/modal-connection-options.html b/assets/js/consumers/import/modal-connection-options.html similarity index 100% rename from backend/assets/js/consumers/import/modal-connection-options.html rename to assets/js/consumers/import/modal-connection-options.html diff --git a/backend/assets/js/consumers/import/modal-consumers-table.html b/assets/js/consumers/import/modal-consumers-table.html similarity index 100% rename from backend/assets/js/consumers/import/modal-consumers-table.html rename to assets/js/consumers/import/modal-consumers-table.html diff --git a/backend/assets/js/consumers/import/modal-import.html b/assets/js/consumers/import/modal-import.html similarity index 100% rename from backend/assets/js/consumers/import/modal-import.html rename to assets/js/consumers/import/modal-import.html diff --git a/backend/assets/js/consumers/import/modal-select-storage.html b/assets/js/consumers/import/modal-select-storage.html similarity index 100% rename from backend/assets/js/consumers/import/modal-select-storage.html rename to assets/js/consumers/import/modal-select-storage.html diff --git a/backend/assets/js/consumers/index.html b/assets/js/consumers/index.html similarity index 100% rename from backend/assets/js/consumers/index.html rename to assets/js/consumers/index.html diff --git a/backend/assets/js/consumers/partials/consumers-table.html b/assets/js/consumers/partials/consumers-table.html similarity index 98% rename from backend/assets/js/consumers/partials/consumers-table.html rename to assets/js/consumers/partials/consumers-table.html index 612fcea7a..bc1ff758a 100644 --- a/backend/assets/js/consumers/partials/consumers-table.html +++ b/assets/js/consumers/partials/consumers-table.html @@ -21,7 +21,7 @@ > - + diff --git a/backend/assets/js/core/auth/auth.js b/assets/js/core/auth/auth.js similarity index 100% rename from backend/assets/js/core/auth/auth.js rename to assets/js/core/auth/auth.js diff --git a/backend/assets/js/core/auth/login/login.html b/assets/js/core/auth/login/login.html similarity index 100% rename from backend/assets/js/core/auth/login/login.html rename to assets/js/core/auth/login/login.html diff --git a/backend/assets/js/core/auth/login/login.js b/assets/js/core/auth/login/login.js similarity index 100% rename from backend/assets/js/core/auth/login/login.js rename to assets/js/core/auth/login/login.js diff --git a/backend/assets/js/core/auth/services/00_services.js b/assets/js/core/auth/services/00_services.js similarity index 100% rename from backend/assets/js/core/auth/services/00_services.js rename to assets/js/core/auth/services/00_services.js diff --git a/backend/assets/js/core/auth/services/AuthService.js b/assets/js/core/auth/services/AuthService.js similarity index 100% rename from backend/assets/js/core/auth/services/AuthService.js rename to assets/js/core/auth/services/AuthService.js diff --git a/backend/assets/js/core/auth/services/UserService.js b/assets/js/core/auth/services/UserService.js similarity index 100% rename from backend/assets/js/core/auth/services/UserService.js rename to assets/js/core/auth/services/UserService.js diff --git a/backend/assets/js/core/components/FocusOn.js b/assets/js/core/components/FocusOn.js similarity index 100% rename from backend/assets/js/core/components/FocusOn.js rename to assets/js/core/components/FocusOn.js diff --git a/backend/assets/js/core/components/components.js b/assets/js/core/components/components.js similarity index 100% rename from backend/assets/js/core/components/components.js rename to assets/js/core/components/components.js diff --git a/backend/assets/js/core/constants/AccessLevels.js b/assets/js/core/constants/AccessLevels.js similarity index 100% rename from backend/assets/js/core/constants/AccessLevels.js rename to assets/js/core/constants/AccessLevels.js diff --git a/backend/assets/js/core/constants/BackendConfig.js b/assets/js/core/constants/BackendConfig.js similarity index 100% rename from backend/assets/js/core/constants/BackendConfig.js rename to assets/js/core/constants/BackendConfig.js diff --git a/backend/assets/js/core/core.js b/assets/js/core/core.js similarity index 100% rename from backend/assets/js/core/core.js rename to assets/js/core/core.js diff --git a/backend/assets/js/core/dependencies/dependencies.js b/assets/js/core/dependencies/dependencies.js similarity index 100% rename from backend/assets/js/core/dependencies/dependencies.js rename to assets/js/core/dependencies/dependencies.js diff --git a/backend/assets/js/core/directives/ListSearch.js b/assets/js/core/directives/ListSearch.js similarity index 100% rename from backend/assets/js/core/directives/ListSearch.js rename to assets/js/core/directives/ListSearch.js diff --git a/backend/assets/js/core/directives/RawView.js b/assets/js/core/directives/RawView.js similarity index 100% rename from backend/assets/js/core/directives/RawView.js rename to assets/js/core/directives/RawView.js diff --git a/backend/assets/js/core/directives/directives.js b/assets/js/core/directives/directives.js similarity index 100% rename from backend/assets/js/core/directives/directives.js rename to assets/js/core/directives/directives.js diff --git a/backend/assets/js/core/directives/partials/ListSearch.html b/assets/js/core/directives/partials/ListSearch.html similarity index 100% rename from backend/assets/js/core/directives/partials/ListSearch.html rename to assets/js/core/directives/partials/ListSearch.html diff --git a/backend/assets/js/core/error/error.js b/assets/js/core/error/error.js similarity index 100% rename from backend/assets/js/core/error/error.js rename to assets/js/core/error/error.js diff --git a/backend/assets/js/core/error/partials/error.html b/assets/js/core/error/partials/error.html similarity index 100% rename from backend/assets/js/core/error/partials/error.html rename to assets/js/core/error/partials/error.html diff --git a/backend/assets/js/core/filters/filters.js b/assets/js/core/filters/filters.js similarity index 100% rename from backend/assets/js/core/filters/filters.js rename to assets/js/core/filters/filters.js diff --git a/backend/assets/js/core/interceptors/00_interceptors.js b/assets/js/core/interceptors/00_interceptors.js similarity index 100% rename from backend/assets/js/core/interceptors/00_interceptors.js rename to assets/js/core/interceptors/00_interceptors.js diff --git a/backend/assets/js/core/interceptors/AuthInterceptor.js b/assets/js/core/interceptors/AuthInterceptor.js similarity index 100% rename from backend/assets/js/core/interceptors/AuthInterceptor.js rename to assets/js/core/interceptors/AuthInterceptor.js diff --git a/backend/assets/js/core/interceptors/ErrorInterceptor.js b/assets/js/core/interceptors/ErrorInterceptor.js similarity index 100% rename from backend/assets/js/core/interceptors/ErrorInterceptor.js rename to assets/js/core/interceptors/ErrorInterceptor.js diff --git a/backend/assets/js/core/interceptors/KongaIntercenptor.js b/assets/js/core/interceptors/KongaIntercenptor.js similarity index 100% rename from backend/assets/js/core/interceptors/KongaIntercenptor.js rename to assets/js/core/interceptors/KongaIntercenptor.js diff --git a/backend/assets/js/core/interceptors/TemplateCacheInterceptor.js b/assets/js/core/interceptors/TemplateCacheInterceptor.js similarity index 100% rename from backend/assets/js/core/interceptors/TemplateCacheInterceptor.js rename to assets/js/core/interceptors/TemplateCacheInterceptor.js diff --git a/backend/assets/js/core/layout/00_layout.js b/assets/js/core/layout/00_layout.js similarity index 100% rename from backend/assets/js/core/layout/00_layout.js rename to assets/js/core/layout/00_layout.js diff --git a/backend/assets/js/core/layout/01_layout-controllers.js b/assets/js/core/layout/01_layout-controllers.js similarity index 100% rename from backend/assets/js/core/layout/01_layout-controllers.js rename to assets/js/core/layout/01_layout-controllers.js diff --git a/backend/assets/js/core/layout/02_layout-directives.js b/assets/js/core/layout/02_layout-directives.js similarity index 100% rename from backend/assets/js/core/layout/02_layout-directives.js rename to assets/js/core/layout/02_layout-directives.js diff --git a/backend/assets/js/core/layout/03_layout-services.js b/assets/js/core/layout/03_layout-services.js similarity index 100% rename from backend/assets/js/core/layout/03_layout-services.js rename to assets/js/core/layout/03_layout-services.js diff --git a/backend/assets/js/core/layout/partials/files.html b/assets/js/core/layout/partials/files.html similarity index 100% rename from backend/assets/js/core/layout/partials/files.html rename to assets/js/core/layout/partials/files.html diff --git a/backend/assets/js/core/layout/partials/footer.html b/assets/js/core/layout/partials/footer.html similarity index 100% rename from backend/assets/js/core/layout/partials/footer.html rename to assets/js/core/layout/partials/footer.html diff --git a/backend/assets/js/core/layout/partials/header.html b/assets/js/core/layout/partials/header.html similarity index 97% rename from backend/assets/js/core/layout/partials/header.html rename to assets/js/core/layout/partials/header.html index 28429d446..c2e16d5b0 100644 --- a/backend/assets/js/core/layout/partials/header.html +++ b/assets/js/core/layout/partials/header.html @@ -8,7 +8,7 @@ - + diff --git a/backend/assets/js/core/layout/partials/help.html b/assets/js/core/layout/partials/help.html similarity index 100% rename from backend/assets/js/core/layout/partials/help.html rename to assets/js/core/layout/partials/help.html diff --git a/backend/assets/js/core/layout/partials/navigation.html b/assets/js/core/layout/partials/navigation.html similarity index 100% rename from backend/assets/js/core/layout/partials/navigation.html rename to assets/js/core/layout/partials/navigation.html diff --git a/backend/assets/js/core/layout/partials/sidebar.html b/assets/js/core/layout/partials/sidebar.html similarity index 100% rename from backend/assets/js/core/layout/partials/sidebar.html rename to assets/js/core/layout/partials/sidebar.html diff --git a/backend/assets/js/core/layout/partials/uiBreadcrumbs.tpl.html b/assets/js/core/layout/partials/uiBreadcrumbs.tpl.html similarity index 100% rename from backend/assets/js/core/layout/partials/uiBreadcrumbs.tpl.html rename to assets/js/core/layout/partials/uiBreadcrumbs.tpl.html diff --git a/backend/assets/js/core/libraries/LoDash.js b/assets/js/core/libraries/LoDash.js similarity index 100% rename from backend/assets/js/core/libraries/LoDash.js rename to assets/js/core/libraries/LoDash.js diff --git a/backend/assets/js/core/libraries/libraries.js b/assets/js/core/libraries/libraries.js similarity index 100% rename from backend/assets/js/core/libraries/libraries.js rename to assets/js/core/libraries/libraries.js diff --git a/backend/assets/js/core/models/00_models.js b/assets/js/core/models/00_models.js similarity index 100% rename from backend/assets/js/core/models/00_models.js rename to assets/js/core/models/00_models.js diff --git a/backend/assets/js/core/models/DataModel.js b/assets/js/core/models/DataModel.js similarity index 100% rename from backend/assets/js/core/models/DataModel.js rename to assets/js/core/models/DataModel.js diff --git a/backend/assets/js/core/plugins/angular-matchheight.js b/assets/js/core/plugins/angular-matchheight.js similarity index 100% rename from backend/assets/js/core/plugins/angular-matchheight.js rename to assets/js/core/plugins/angular-matchheight.js diff --git a/backend/assets/js/core/plugins/material.spinner.js b/assets/js/core/plugins/material.spinner.js similarity index 100% rename from backend/assets/js/core/plugins/material.spinner.js rename to assets/js/core/plugins/material.spinner.js diff --git a/backend/assets/js/core/plugins/uiBreadcrumbs.js b/assets/js/core/plugins/uiBreadcrumbs.js similarity index 100% rename from backend/assets/js/core/plugins/uiBreadcrumbs.js rename to assets/js/core/plugins/uiBreadcrumbs.js diff --git a/backend/assets/js/core/services/00_services.js b/assets/js/core/services/00_services.js similarity index 100% rename from backend/assets/js/core/services/00_services.js rename to assets/js/core/services/00_services.js diff --git a/backend/assets/js/core/services/DataService.js b/assets/js/core/services/DataService.js similarity index 100% rename from backend/assets/js/core/services/DataService.js rename to assets/js/core/services/DataService.js diff --git a/backend/assets/js/core/services/DialogService.js b/assets/js/core/services/DialogService.js similarity index 100% rename from backend/assets/js/core/services/DialogService.js rename to assets/js/core/services/DialogService.js diff --git a/backend/assets/js/core/services/HttpStatusService.js b/assets/js/core/services/HttpStatusService.js similarity index 100% rename from backend/assets/js/core/services/HttpStatusService.js rename to assets/js/core/services/HttpStatusService.js diff --git a/backend/assets/js/core/services/KongPluginsService.js b/assets/js/core/services/KongPluginsService.js similarity index 100% rename from backend/assets/js/core/services/KongPluginsService.js rename to assets/js/core/services/KongPluginsService.js diff --git a/backend/assets/js/core/services/ListConfigService.js b/assets/js/core/services/ListConfigService.js similarity index 100% rename from backend/assets/js/core/services/ListConfigService.js rename to assets/js/core/services/ListConfigService.js diff --git a/backend/assets/js/core/services/MessageService.js b/assets/js/core/services/MessageService.js similarity index 100% rename from backend/assets/js/core/services/MessageService.js rename to assets/js/core/services/MessageService.js diff --git a/backend/assets/js/core/services/NodesService.js b/assets/js/core/services/NodesService.js similarity index 100% rename from backend/assets/js/core/services/NodesService.js rename to assets/js/core/services/NodesService.js diff --git a/backend/assets/js/core/services/RemoteStorageService.js b/assets/js/core/services/RemoteStorageService.js similarity index 100% rename from backend/assets/js/core/services/RemoteStorageService.js rename to assets/js/core/services/RemoteStorageService.js diff --git a/backend/assets/js/core/services/SocketHelperService.js b/assets/js/core/services/SocketHelperService.js similarity index 100% rename from backend/assets/js/core/services/SocketHelperService.js rename to assets/js/core/services/SocketHelperService.js diff --git a/backend/assets/js/dashboard/01_dashboard.js b/assets/js/dashboard/01_dashboard.js similarity index 100% rename from backend/assets/js/dashboard/01_dashboard.js rename to assets/js/dashboard/01_dashboard.js diff --git a/backend/assets/js/dashboard/02_dashboard-controller.js b/assets/js/dashboard/02_dashboard-controller.js similarity index 100% rename from backend/assets/js/dashboard/02_dashboard-controller.js rename to assets/js/dashboard/02_dashboard-controller.js diff --git a/backend/assets/js/dashboard/dashboard.html b/assets/js/dashboard/dashboard.html similarity index 100% rename from backend/assets/js/dashboard/dashboard.html rename to assets/js/dashboard/dashboard.html diff --git a/backend/assets/js/dependencies/sails.io.js b/assets/js/dependencies/sails.io.js similarity index 100% rename from backend/assets/js/dependencies/sails.io.js rename to assets/js/dependencies/sails.io.js diff --git a/backend/assets/js/info/00_info.js b/assets/js/info/00_info.js similarity index 100% rename from backend/assets/js/info/00_info.js rename to assets/js/info/00_info.js diff --git a/backend/assets/js/info/01_info-controllers.js b/assets/js/info/01_info-controllers.js similarity index 100% rename from backend/assets/js/info/01_info-controllers.js rename to assets/js/info/01_info-controllers.js diff --git a/backend/assets/js/info/02_info-service.js b/assets/js/info/02_info-service.js similarity index 100% rename from backend/assets/js/info/02_info-service.js rename to assets/js/info/02_info-service.js diff --git a/backend/assets/js/info/index.html b/assets/js/info/index.html similarity index 100% rename from backend/assets/js/info/index.html rename to assets/js/info/index.html diff --git a/backend/assets/js/plugins/00_plugins.js b/assets/js/plugins/00_plugins.js similarity index 100% rename from backend/assets/js/plugins/00_plugins.js rename to assets/js/plugins/00_plugins.js diff --git a/backend/assets/js/plugins/add-plugin-controller.js b/assets/js/plugins/add-plugin-controller.js similarity index 100% rename from backend/assets/js/plugins/add-plugin-controller.js rename to assets/js/plugins/add-plugin-controller.js diff --git a/backend/assets/js/plugins/add-plugins-controller.js b/assets/js/plugins/add-plugins-controller.js similarity index 100% rename from backend/assets/js/plugins/add-plugins-controller.js rename to assets/js/plugins/add-plugins-controller.js diff --git a/backend/assets/js/plugins/add-plugins.html b/assets/js/plugins/add-plugins.html similarity index 100% rename from backend/assets/js/plugins/add-plugins.html rename to assets/js/plugins/add-plugins.html diff --git a/backend/assets/js/plugins/api-plugins-controller.js b/assets/js/plugins/api-plugins-controller.js similarity index 100% rename from backend/assets/js/plugins/api-plugins-controller.js rename to assets/js/plugins/api-plugins-controller.js diff --git a/backend/assets/js/plugins/edit-plugin-controller.js b/assets/js/plugins/edit-plugin-controller.js similarity index 100% rename from backend/assets/js/plugins/edit-plugin-controller.js rename to assets/js/plugins/edit-plugin-controller.js diff --git a/backend/assets/js/plugins/modals/add-plugin-modal.html b/assets/js/plugins/modals/add-plugin-modal.html similarity index 100% rename from backend/assets/js/plugins/modals/add-plugin-modal.html rename to assets/js/plugins/modals/add-plugin-modal.html diff --git a/backend/assets/js/plugins/modals/custom-template.html b/assets/js/plugins/modals/custom-template.html similarity index 100% rename from backend/assets/js/plugins/modals/custom-template.html rename to assets/js/plugins/modals/custom-template.html diff --git a/backend/assets/js/plugins/modals/edit-plugin-modal.html b/assets/js/plugins/modals/edit-plugin-modal.html similarity index 100% rename from backend/assets/js/plugins/modals/edit-plugin-modal.html rename to assets/js/plugins/modals/edit-plugin-modal.html diff --git a/backend/assets/js/plugins/plugin-helper-service.js b/assets/js/plugins/plugin-helper-service.js similarity index 100% rename from backend/assets/js/plugins/plugin-helper-service.js rename to assets/js/plugins/plugin-helper-service.js diff --git a/backend/assets/js/plugins/plugins-controller.js b/assets/js/plugins/plugins-controller.js similarity index 100% rename from backend/assets/js/plugins/plugins-controller.js rename to assets/js/plugins/plugins-controller.js diff --git a/backend/assets/js/plugins/plugins-service.js b/assets/js/plugins/plugins-service.js similarity index 100% rename from backend/assets/js/plugins/plugins-service.js rename to assets/js/plugins/plugins-service.js diff --git a/backend/assets/js/plugins/plugins.html b/assets/js/plugins/plugins.html similarity index 100% rename from backend/assets/js/plugins/plugins.html rename to assets/js/plugins/plugins.html diff --git a/backend/assets/js/settings/01_settings.js b/assets/js/settings/01_settings.js similarity index 100% rename from backend/assets/js/settings/01_settings.js rename to assets/js/settings/01_settings.js diff --git a/backend/assets/js/settings/index.html b/assets/js/settings/index.html similarity index 100% rename from backend/assets/js/settings/index.html rename to assets/js/settings/index.html diff --git a/backend/assets/js/settings/modals/create-node-modal.html b/assets/js/settings/modals/create-node-modal.html similarity index 100% rename from backend/assets/js/settings/modals/create-node-modal.html rename to assets/js/settings/modals/create-node-modal.html diff --git a/backend/assets/js/settings/modals/test-node-modal.html b/assets/js/settings/modals/test-node-modal.html similarity index 100% rename from backend/assets/js/settings/modals/test-node-modal.html rename to assets/js/settings/modals/test-node-modal.html diff --git a/backend/assets/js/settings/node-model.js b/assets/js/settings/node-model.js similarity index 100% rename from backend/assets/js/settings/node-model.js rename to assets/js/settings/node-model.js diff --git a/backend/assets/js/settings/partials/nodes-table.html b/assets/js/settings/partials/nodes-table.html similarity index 100% rename from backend/assets/js/settings/partials/nodes-table.html rename to assets/js/settings/partials/nodes-table.html diff --git a/backend/assets/js/settings/settings-controller.js b/assets/js/settings/settings-controller.js similarity index 100% rename from backend/assets/js/settings/settings-controller.js rename to assets/js/settings/settings-controller.js diff --git a/backend/assets/js/settings/settings-model.js b/assets/js/settings/settings-model.js similarity index 100% rename from backend/assets/js/settings/settings-model.js rename to assets/js/settings/settings-model.js diff --git a/backend/assets/js/users/00_users.js b/assets/js/users/00_users.js similarity index 100% rename from backend/assets/js/users/00_users.js rename to assets/js/users/00_users.js diff --git a/backend/assets/js/users/index.html b/assets/js/users/index.html similarity index 100% rename from backend/assets/js/users/index.html rename to assets/js/users/index.html diff --git a/backend/assets/js/users/partials/users-table.html b/assets/js/users/partials/users-table.html similarity index 100% rename from backend/assets/js/users/partials/users-table.html rename to assets/js/users/partials/users-table.html diff --git a/backend/assets/js/users/user-controller.js b/assets/js/users/user-controller.js similarity index 100% rename from backend/assets/js/users/user-controller.js rename to assets/js/users/user-controller.js diff --git a/backend/assets/js/users/user-create-controller.js b/assets/js/users/user-create-controller.js similarity index 100% rename from backend/assets/js/users/user-create-controller.js rename to assets/js/users/user-create-controller.js diff --git a/backend/assets/js/users/user-create.html b/assets/js/users/user-create.html similarity index 100% rename from backend/assets/js/users/user-create.html rename to assets/js/users/user-create.html diff --git a/backend/assets/js/users/user-model.js b/assets/js/users/user-model.js similarity index 100% rename from backend/assets/js/users/user-model.js rename to assets/js/users/user-model.js diff --git a/backend/assets/js/users/user.html b/assets/js/users/user.html similarity index 100% rename from backend/assets/js/users/user.html rename to assets/js/users/user.html diff --git a/backend/assets/js/users/users-controller.js b/assets/js/users/users-controller.js similarity index 100% rename from backend/assets/js/users/users-controller.js rename to assets/js/users/users-controller.js diff --git a/backend/assets/robots.txt b/assets/robots.txt similarity index 100% rename from backend/assets/robots.txt rename to assets/robots.txt diff --git a/backend/assets/styles/_angular.scss b/assets/styles/_angular.scss similarity index 100% rename from backend/assets/styles/_angular.scss rename to assets/styles/_angular.scss diff --git a/backend/assets/styles/_animloader.scss b/assets/styles/_animloader.scss similarity index 100% rename from backend/assets/styles/_animloader.scss rename to assets/styles/_animloader.scss diff --git a/backend/assets/styles/_bootstrap_over.scss b/assets/styles/_bootstrap_over.scss similarity index 100% rename from backend/assets/styles/_bootstrap_over.scss rename to assets/styles/_bootstrap_over.scss diff --git a/backend/assets/styles/_bootswatch.scss b/assets/styles/_bootswatch.scss similarity index 100% rename from backend/assets/styles/_bootswatch.scss rename to assets/styles/_bootswatch.scss diff --git a/backend/assets/styles/_components.scss b/assets/styles/_components.scss similarity index 100% rename from backend/assets/styles/_components.scss rename to assets/styles/_components.scss diff --git a/backend/assets/styles/_forms.scss b/assets/styles/_forms.scss similarity index 100% rename from backend/assets/styles/_forms.scss rename to assets/styles/_forms.scss diff --git a/backend/assets/styles/_mixins.scss b/assets/styles/_mixins.scss similarity index 100% rename from backend/assets/styles/_mixins.scss rename to assets/styles/_mixins.scss diff --git a/backend/assets/styles/_ripple.scss b/assets/styles/_ripple.scss similarity index 100% rename from backend/assets/styles/_ripple.scss rename to assets/styles/_ripple.scss diff --git a/backend/assets/styles/_ripples.scss b/assets/styles/_ripples.scss similarity index 100% rename from backend/assets/styles/_ripples.scss rename to assets/styles/_ripples.scss diff --git a/backend/assets/styles/_variables.scss b/assets/styles/_variables.scss similarity index 100% rename from backend/assets/styles/_variables.scss rename to assets/styles/_variables.scss diff --git a/backend/assets/styles/importer.scss b/assets/styles/importer.scss similarity index 100% rename from backend/assets/styles/importer.scss rename to assets/styles/importer.scss diff --git a/backend/assets/templates/.gitkeep b/assets/templates/.gitkeep similarity index 100% rename from backend/assets/templates/.gitkeep rename to assets/templates/.gitkeep diff --git a/backend/.dockerignore b/backend/.dockerignore deleted file mode 100644 index e6536dde6..000000000 --- a/backend/.dockerignore +++ /dev/null @@ -1,20 +0,0 @@ - -.DS_STORE -.netbeans -nbproject -.idea -.node_history -frontend/.tmp -frontend/node_modules -backend/.tmp -backend/node_modules -backend/config/local.js -node_modules -npm-debug.log -frontend/npm-debug.log -_README.md -frontend/config/config.json -backend/api/services/remote/credentials/google-spreadsheets -frontend/bower_components/ -screenshots/ -bin/ diff --git a/backend/.gitignore b/backend/.gitignore deleted file mode 100644 index 0af2db54c..000000000 --- a/backend/.gitignore +++ /dev/null @@ -1,47 +0,0 @@ -################################################ -############### .gitignore ################## -################################################ -# -# This file is only relevant if you are using git. -# -# Files which match the splat patterns below will -# be ignored by git. This keeps random crap and -# and sensitive credentials from being uploaded to -# your repository. It allows you to configure your -# app for your machine without accidentally -# committing settings which will smash the local -# settings of other developers on your team. -# -# Some reasonable defaults are included below, -# but, of course, you should modify/extend/prune -# to fit your needs! -################################################ - -################################################ -# Miscellaneous -# -# Common files generated by text editors, -# operating systems, file systems, etc. -################################################ - -*~ -*# -.DS_STORE -.netbeans -nbproject -.idea -.node_history -/frontend/bower_components/ -/frontend/.tmp/ -/frontend/dist/ -/frontend/node_modules/ -/backend/.tmp/ -/backend/node_modules/ -frontend/dist/ -/backend/config/local.js -node_modules/ -/npm-debug.log -/frontend/npm-debug.log -/_README.md -/frontend/config/config.json -/backend/api/services/remote/credentials/google-spreadsheets/ diff --git a/backend/.travis.yml b/backend/.travis.yml deleted file mode 100644 index c05b3220a..000000000 --- a/backend/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: node_js - -node_js: - - "0.10" - - "0.11" - - "0.12" - - "4.0" - - "4.1" - - "4.2" - - "5.0" - - "6.9.1" - - "7.1.0" - -services: - - mysql - -before_script: - -notifications: - email: true - -# whitelisted branches -branches: - only: - - master - - dev \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index 8e9fbf500..000000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# Note that if you want to build Konga from here, -# you must < cd frontend && gulp dist > first - -FROM mhart/alpine-node - -RUN apk update && apk upgrade && \ - apk add --no-cache bash git - - -RUN npm install -g bower - -WORKDIR /app - -# Copy app -COPY . /app - -RUN npm --unsafe-perm --verbose install --production - -EXPOSE 3000 1338 - -RUN chmod 777 ./start.sh - -ENTRYPOINT ["/bin/bash","./start.sh"] \ No newline at end of file diff --git a/backend/LICENSE b/backend/LICENSE deleted file mode 100644 index 14db5fd01..000000000 --- a/backend/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) -===================== - -Copyright (c) 2015 Panagis Tselentis - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/backend/README.md b/backend/README.md deleted file mode 100644 index 743475109..000000000 --- a/backend/README.md +++ /dev/null @@ -1,211 +0,0 @@ -## More than just another GUI to [KONG Admin API](http://getkong.org) [![Build Status](https://travis-ci.org/pantsel/konga.svg?branch=master)](https://travis-ci.org/pantsel/konga) [![Gitter chat](https://badges.gitter.im/pantsel-konga/Lobby.png)](https://gitter.im/pantsel-konga/Lobby) - -[![konga-logo.png](screenshots/konga-logo.png)](screenshots/konga-logo.png?raw=true) - - -[![Dashboard](screenshots/bc.png)](screenshots/bc.png?raw=true) - -Konga is not an official app. No affiliation with [Mashape](https://www.mashape.com/). - - -> Konga is not compatible with current Kong 0.10.x versions. An update is underway but I cannot guarantee a release date. - - -## Summary - -- [**Discussions & Support**](#discussions--support) -- [**Features**](#features) -- [**Compatibility**](#compatibility) -- [**Prerequisites**](#prerequisites) -- [**Used libraries**](#used-libraries) -- [**Installation**](#installation) -- [**Configuration**](#configuration) -- [**Running Konga**](#running-konga) -- [**More Kong related stuff**](#more-kong-related-stuff) -- [**License**](#license) - -## Discussions & Support -If you need to discuss anything Konga related, we have a chatroom on Gitter: - -[![Gitter chat](https://badges.gitter.im/pantsel-konga/Lobby.png)](https://gitter.im/pantsel-konga/Lobby) - -## Features -* Manage APIs and plugins -* Manage consumers, groups and credentials -* Mass import consumers from : - * CSV document - * Google Spreadsheets - * MySQL - * MongoDB - * more underway... -* Multiple nodes management -* GUI level authentication -* Multiple users (Only admin and user roles for now) -* Utilities API - -## Compatibility -Konga is built and tested on Kong 0.9.x but it probably works with older versions as well. -Feedback on older versions compatibility is welcome. - -## Prerequisites -- A running [Kong installation](https://getkong.org/) -- Nodejs -- Npm -- Gulp -- Bower - -## Used libraries -* angular-sailsjs-boilerplate (awesome): https://github.com/tarlepp/angular-sailsjs-boilerplate -* Sails.js, http://sailsjs.org/ -* AngularJS, https://angularjs.org/ -* Bootstrap, http://getbootstrap.com/ - -## Installation - -Install npm and node.js. Instructions can be found [here](http://sailsjs.org/#/getStarted?q=what-os-do-i-need). - -Install bower, gulp and sails packages. -
-$ npm install bower gulp sails -g
-$ git clone https://github.com/pantsel/konga.git
-$ cd konga
-$ npm install
-
-This will install all frontend and backend dependencies. If for some reason this fails, -try running $ npm install in /backend and /frontend separately - -## Configuration -You can configure your backend and frontend applications to use your environment specified -settings. - -##### Backend -There is an example of backend configuration file on following path. - -
-/backend/config/local_example.js
-
- -Just copy this to /backend/config/local.js and make necessary changes to it. Note that this -local.js file is in .gitignore so it won't go to VCS at any point. - -##### Frontend -There is an example of front configuration file on following path. - -
-/frontend/config/config_example.json
-
- -Just copy this to /frontend/config/config.json and make necessary changes to it. Note that this -config.json file is in .gitignore so it won't go to VCS at any point. - -##### Notes -If you're changing your backend API url to another than http://localhost:1337 you need to make -frontend/config/config.json with proper content on it. Use that example file as start. - -## Running Konga - -#### Development -
-$ npm start
-
-Konga GUI is available at http://localhost:3001 - -You can also start frontend and backend separately -
-$ cd frontend
-$ gulp serve
-
-
-$ cd backend
-$ sails lift
-
- -#### Production -
-$ cd frontend
-$ gulp dist
-
-This will create production-ready static code to frontend/dist ready to be served by any web server - -
-$ npm run production
-
-Konga GUI is available at http://localhost:3000 - -You can also start frontend and backend separately -
-$ cd frontend
-$ gulp production
-
-
-$ cd backend
-$ sails lift --prod
-
- -#### Production Docker Image - -Environment variables - - - - - - - - - - -
Env varDescription
KONGA_BACKEND_URLThe full URL of Konga's backend server component
- -The following instructions assume that you have a running Kong instance following the -instruction from [Kong's docker hub](https://hub.docker.com/r/mashape/kong/) -
-$ docker pull pantsel/konga
-$ docker run -p 3000:3000 
-             -p 1338:1338 
-             -e KONGA_BACKEND_URL={Konga's backend url} 
-             --link kong:kong
-             --name konga
-             pantsel/konga
-
- -The GUI will be available at http://{your server's public ip}:3000 -Login, go to settings -> new node and add http://kong:8001 for Kong Admin URL. - - -#### Login -*Admin* -login: admin | password: adminadminadmin - -*Demo user* -login: demo | password: demodemodemo - -## More Kong related stuff -- [**Kong Admin proxy**](https://github.com/pantsel/kong-admin-proxy) -- [**Kong Middleman plugin**](https://github.com/pantsel/kong-middleman-plugin) - - -## ToDo -* Complete tests -* Add more consumer import adapters (?) -* Write a detailed Wiki -* Move API to it's own module so that it can be lifted on a different port - See [kong-admin-proxy](https://github.com/pantsel/kong-admin-proxy) - -## Author -Panagis Tselentis - -## License -
-The MIT License (MIT)
-=====================
-
-Copyright (c) 2015 Panagis Tselentis
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
diff --git a/backend/package.json b/backend/package.json deleted file mode 100644 index 24d9df20c..000000000 --- a/backend/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "kongadmin", - "private": true, - "version": "0.5.0", - "description": "Kong admin GUI", - "keywords": [ - "sails.js", - "backend", - "REST", - "API", - "JWT", - "JSON Web Token", - "Passport.js" - ], - "dependencies": { - "async": "1.5.0", - "barrels": "1.6.0", - "bcryptjs": "2.3.0", - "bluebird": "3.0.5", - "csv-parser": "^1.11.0", - "ejs": "^2.5.6", - "google-auth-library": "^0.10.0", - "googleapis": "^14.1.0", - "grunt": "1.0.1", - "grunt-contrib-clean": "1.0.0", - "grunt-contrib-coffee": "1.0.0", - "grunt-contrib-concat": "1.0.1", - "grunt-contrib-copy": "1.0.0", - "grunt-contrib-cssmin": "1.0.1", - "grunt-contrib-jst": "1.0.0", - "grunt-contrib-less": "1.3.0", - "grunt-contrib-sass": "^1.0.0", - "grunt-contrib-uglify": "1.0.1", - "grunt-contrib-watch": "1.0.0", - "grunt-sails-linker": "~0.10.1", - "grunt-sass": "^2.0.0", - "grunt-sync": "0.5.2", - "http-proxy": "^1.16.2", - "include-all": "^1.0.0", - "jsonwebtoken": "5.4.1", - "lodash": "3.10.1", - "mkdirp": "^0.5.1", - "mongodb": "^2.2.11", - "mysql": "^2.11.1", - "node-sass": "^4.5.0", - "node-uuid": "^1.4.7", - "passport": "0.3.0", - "passport-local": "1.0.0", - "rc": "1.0.1", - "sails": "~0.12.11", - "sails-disk": "^0.10.10", - "ua-parser": "0.3.5", - "unirest": "^0.5.1", - "validator": "4.2.1" - }, - "devDependencies": { - "chai": "3.4.0", - "mocha": "2.3.3", - "should": "7.1.1", - "supertest": "1.1.0" - }, - "scripts": { - "start": "node app.js", - "debug": "node debug app.js", - "test": "./node_modules/mocha/bin/mocha" - }, - "main": "app.js", - "repository": { - "type": "git", - "url": "https://github.com/pantsel/konga.git" - }, - "author": "Tselentis Panagis", - "license": "MIT" -} diff --git a/backend/start.sh b/backend/start.sh deleted file mode 100644 index c35f81fb8ecc00aa63d9b69aff1ae981d4be67bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmXwy%L;=q6hynuSKMm1O@2Z9pbLwIf@?9}sKIz6c|aHW_*$W}m{}Z{lOKiDBxL6& z#(IRoSqh4fVlW!J3EV(f#q#18*_0U>rZ_W%F@ diff --git a/backend/views/layout.ejs b/backend/views/layout.ejs deleted file mode 100644 index 24508b297..000000000 --- a/backend/views/layout.ejs +++ /dev/null @@ -1,224 +0,0 @@ - - - - <%=typeof title == 'undefined' ? 'Konga' : title%> - - - - - - - - - - - - - - - - - - - - - - - <%- body %> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/konga.js b/bin/konga.js deleted file mode 100644 index 53c6069de..000000000 --- a/bin/konga.js +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env node bin -var argv = require('minimist')(process.argv.slice(2)); -var child_process = require('child_process'); -var spawn = child_process.spawn -var isWin = /^win/.test(process.platform); -var path = require('path') - - -var front_settings = require('../frontend/config/config.json') || require('../frontend/config/config_example.json'); -var back_settings = require('../backend/config/local') || require('../backend/config/local_example'); - - - - -if (argv._[0] === 'help') { - console.log("Usage:"); - logHelp() - process.exit() -} -else if (argv._[0] === 'build') -{ - - var cmd = spawn('npm' + ( isWin ? '.cmd' : '' ), - ["install"], - {cwd: '../' ,stdio: "inherit"}); - cmd.on('exit', function(code){ - console.log(code); - }); -} -else if (argv._[0] === 'play') -{ - var fport = process.env.KONGA_FRONTEND_PORT || argv.frontend || front_settings.frontend.ports["production"] - var bport = process.env.KONGA_BACKEND_PORT || argv.backend || back_settings.port - - console.log("------------------------------------------------------") - console.log("Playing Konga!") - console.log("") - console.log("Environment : Production") - console.log("") - console.log("PORTS") - console.log("frontend : " + fport) - console.log("backend : " + bport) - console.log("------------------------------------------------------") - console.log("") - - // Lift backend - var cmdBack = spawn('node', - [ - "app.js", - //"--port=" + bport, - "--prod" - ], - {cwd : path.join(__dirname,"..","backend"), stdio: "inherit"}); - cmdBack.on('exit', function(code){ - console.log("Exiting",code); - }); - - var cmdFront = spawn('gulp' + ( isWin ? '.cmd' : '' ), - [ - "production", - "--p=" + fport - ], - {cwd: path.join(__dirname,"..","frontend") ,stdio: "inherit"}); - cmdFront.on('exit', function(code){ - console.log(code); - }); -} -else -{ - console.log(argv) - console.log("Unknown command. Try one of:"); - logHelp() -} - -function logHelp() { - console.log("========================================================================"); - console.log("konga build | Install dependencies."); - console.log("konga dist | Create production-ready static code to frontend/dist"); - console.log("konga play | Start frontend and backend servers in production mode."); - console.log("========================================================================"); - process.exit() -} diff --git a/backend/bower.json b/bower.json similarity index 100% rename from backend/bower.json rename to bower.json diff --git a/backend/config/application.js b/config/application.js similarity index 100% rename from backend/config/application.js rename to config/application.js diff --git a/backend/config/blueprints.js b/config/blueprints.js similarity index 100% rename from backend/config/blueprints.js rename to config/blueprints.js diff --git a/backend/config/bootstrap.js b/config/bootstrap.js similarity index 100% rename from backend/config/bootstrap.js rename to config/bootstrap.js diff --git a/backend/config/connections.js b/config/connections.js similarity index 100% rename from backend/config/connections.js rename to config/connections.js diff --git a/backend/config/cors.js b/config/cors.js similarity index 100% rename from backend/config/cors.js rename to config/cors.js diff --git a/backend/config/csrf.js b/config/csrf.js similarity index 100% rename from backend/config/csrf.js rename to config/csrf.js diff --git a/backend/config/env/development.js b/config/env/development.js similarity index 100% rename from backend/config/env/development.js rename to config/env/development.js diff --git a/backend/config/env/production.js b/config/env/production.js similarity index 100% rename from backend/config/env/production.js rename to config/env/production.js diff --git a/backend/config/globals.js b/config/globals.js similarity index 100% rename from backend/config/globals.js rename to config/globals.js diff --git a/backend/config/http.js b/config/http.js similarity index 100% rename from backend/config/http.js rename to config/http.js diff --git a/backend/config/i18n.js b/config/i18n.js similarity index 100% rename from backend/config/i18n.js rename to config/i18n.js diff --git a/backend/config/jwt.js b/config/jwt.js similarity index 100% rename from backend/config/jwt.js rename to config/jwt.js diff --git a/backend/config/load-db.js b/config/load-db.js similarity index 100% rename from backend/config/load-db.js rename to config/load-db.js diff --git a/config/local.js b/config/local.js new file mode 100644 index 000000000..382021757 --- /dev/null +++ b/config/local.js @@ -0,0 +1,51 @@ +/** + * Created by pang on 7/10/2016. + */ +'use strict'; + +/** + * Local environment settings + * + * While you're DEVELOPING your app, this config file should include + * any settings specifically for your development computer (db passwords, etc.) + * + * When you're ready to deploy your app in PRODUCTION, you can always use this file + * for configuration options specific to the server where the app will be deployed. + * But environment variables are usually the best way to handle production settings. + * + * PLEASE NOTE: + * This file is included in your .gitignore, so if you're using git + * as a version control solution for your Sails app, keep in mind that + * this file won't be committed to your repository! + * + * Good news is, that means you can specify configuration for your local + * machine in this file without inadvertently committing personal information + * (like database passwords) to the repo. Plus, this prevents other members + * of your team from committing their local configuration changes on top of yours. + * + * For more information, check out: + * http://links.sailsjs.org/docs/config/local + */ +module.exports = { + + /** + * The default fallback URL to Kong's admin API. + */ + kong_admin_url : process.env.KONG_ADMIN_URL || 'http://127.0.0.1:8001', + + + connections: { + + }, + models: { + + }, + session: { + secret: '' // Add your own SECRET string here + }, + port: process.env.PORT || 1339, + environment: process.env.ENVIRONMENT || 'development', + log: { + level: 'info' + } +}; diff --git a/backend/config/local_example.js b/config/local_example.js similarity index 100% rename from backend/config/local_example.js rename to config/local_example.js diff --git a/backend/config/locales/_README.md b/config/locales/_README.md similarity index 100% rename from backend/config/locales/_README.md rename to config/locales/_README.md diff --git a/backend/config/locales/en.json b/config/locales/en.json similarity index 100% rename from backend/config/locales/en.json rename to config/locales/en.json diff --git a/backend/config/log.js b/config/log.js similarity index 100% rename from backend/config/log.js rename to config/log.js diff --git a/backend/config/models.js b/config/models.js similarity index 100% rename from backend/config/models.js rename to config/models.js diff --git a/backend/config/orm.js b/config/orm.js similarity index 100% rename from backend/config/orm.js rename to config/orm.js diff --git a/backend/config/passport.js b/config/passport.js similarity index 100% rename from backend/config/passport.js rename to config/passport.js diff --git a/backend/config/policies.js b/config/policies.js similarity index 100% rename from backend/config/policies.js rename to config/policies.js diff --git a/backend/config/pubsub.js b/config/pubsub.js similarity index 100% rename from backend/config/pubsub.js rename to config/pubsub.js diff --git a/backend/config/routes.js b/config/routes.js similarity index 100% rename from backend/config/routes.js rename to config/routes.js diff --git a/backend/config/session.js b/config/session.js similarity index 100% rename from backend/config/session.js rename to config/session.js diff --git a/backend/config/sockets.js b/config/sockets.js similarity index 100% rename from backend/config/sockets.js rename to config/sockets.js diff --git a/backend/config/views.js b/config/views.js similarity index 100% rename from backend/config/views.js rename to config/views.js diff --git a/backend/dummy.js b/dummy.js similarity index 100% rename from backend/dummy.js rename to dummy.js diff --git a/frontend/.bowerrc b/frontend/.bowerrc deleted file mode 100644 index 69fad3580..000000000 --- a/frontend/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "bower_components" -} diff --git a/frontend/.csslintrc b/frontend/.csslintrc deleted file mode 100644 index 493e681b1..000000000 --- a/frontend/.csslintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "box-model": false, - "fallback-colors": false, - "box-sizing": false, - "compatible-vendor-prefixes": false, - "gradients": false, - "adjoining-classes": false, - "outline-none" : false -} diff --git a/frontend/.editorconfig b/frontend/.editorconfig deleted file mode 100644 index e717f5eb6..000000000 --- a/frontend/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/frontend/.jshintrc b/frontend/.jshintrc deleted file mode 100644 index e2a1884d1..000000000 --- a/frontend/.jshintrc +++ /dev/null @@ -1,22 +0,0 @@ -{ - "browser": true, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "indent": 2, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "smarttabs": true, - "globals": { - "angular": false, - "console": false - } -} diff --git a/frontend/LICENSE b/frontend/LICENSE deleted file mode 100644 index 7f3b919aa..000000000 --- a/frontend/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) -===================== - -Copyright (c) 2015 Tarmo Leppänen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/frontend/bower.json b/frontend/bower.json deleted file mode 100644 index b8040a5fa..000000000 --- a/frontend/bower.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "frontend", - "version": "0.1.0", - "description": "Frontend application for Konga", - "authors": [ - "Tselentis Panagis" - ], - "ignore": [ - "**/.*", - "package.json", - "klei.json", - "gulpfile.js", - "node_modules", - "bower_components", - "src" - ], - "dependencies": { - "jquery": "2.1.3", - "angular": "1.5.*", - "angular-animate": "1.5.*", - "angular-loading-bar": "0.7.0", - "angular-ui-router": "0.2.13", - "angular-ui-utils": "0.2.2", - "angular-moment": "0.9.0", - "angular-bootstrap-show-errors": "2.3.0", - "angular-sanitize": "1.5.*", - "angular-xeditable": "0.1.8", - "angular-toastr": "1.0.1", - "bootbox": "4.4.0", - "ngBootbox": "0.0.4", - "sails.io.js": "0.11.5", - "angularSails": "master", - "ngstorage": "~0.3.0", - "bootswatch-dist": "paper", - "angular-bootstrap": "~2.1.4", - "angular-json-human": "~1.2.1", - "angular-bootstrap-switch": "~0.5.1", - "angular-spinkit": "~0.3.4", - "lodash": "~4.16.4", - "angular-chips": "~1.0.8", - "ng-file-upload": "~12.2.12", - "angular-messages": "1.5.*", - "angular-utils-pagination": "~0.11.1", - "angular-chart.js": "~1.0.3", - "angular-resource": "1.5.*", - "ngInfiniteScroll": "1.0.0" - }, - "devDependencies": { - "angular-mocks": "1.3.13" - }, - "resolutions": { - "bootbox": "4.4.0", - "lodash": "~4.16.4", - "angular": "1.5.*" - } -} diff --git a/frontend/config/README.md b/frontend/config/README.md deleted file mode 100644 index 8b275d55c..000000000 --- a/frontend/config/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Frontend config -============ - -This folder contains example of frontend config JSON file. By default folder contains just an example file for this. -If you need to override default values just copy ```config_example.json``` to ```config.json``` and make necessary -changes to it. Note that ```config.json``` is ignored from vcs. - -Currently this configration file contains following values for frontend side: - -
-backendUrl = Sails backend URL, defaults to http://localhost:1338
-
\ No newline at end of file diff --git a/frontend/config/config_example.json b/frontend/config/config_example.json deleted file mode 100644 index 22cea76bd..000000000 --- a/frontend/config/config_example.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "backendUrl": "@@backendUrl", - "frontend": { - "ports": { - "production": 3000, - "development": 3002 - } - } -} \ No newline at end of file diff --git a/frontend/gulpfile.js b/frontend/gulpfile.js deleted file mode 100644 index 1957b0cf5..000000000 --- a/frontend/gulpfile.js +++ /dev/null @@ -1,404 +0,0 @@ -/* jshint node: true */ -'use strict'; - -var gulp = require('gulp'); -var replace = require('gulp-replace-task'); -var fs = require('fs'); -var g = require('gulp-load-plugins')({lazy: false}); -var noop = g.util.noop; -var es = require('event-stream'); -var Queue = require('streamqueue'); -var lazypipe = require('lazypipe'); -var stylish = require('jshint-stylish'); -var bower = require('./bower'); -var mainBowerFiles = require('main-bower-files'); -var historyApiFallback = require('connect-history-api-fallback'); -var isWatching = false; - -var htmlminOpts = { - removeComments: true, - collapseWhitespace: true, - removeEmptyAttributes: false, - collapseBooleanAttributes: true, - removeRedundantAttributes: true -}; - -var settings; - -// Try to read frontend configuration file, fallback to default file -try { - settings = JSON.parse(fs.readFileSync('./config/config.json', 'utf8')); -} catch (error) { - settings = JSON.parse(fs.readFileSync('./config/config_example.json', 'utf8')); -} - -var KONGA_BACKEND_URL = process.env.KONGA_BACKEND_URL || settings.backendUrl - -// Overwrite port if explicitly set in command -//var argv = require('minimist')(process.argv.slice(2)); -//if(argv.p) { -// settings.frontend.ports.production = argv.p -// settings.frontend.ports.development = argv.p -//} - - -/** - * JS Hint - */ -gulp.task('jshint', function() { - return gulp.src([ - './gulpfile.js', - './src/app/**/*.js' - ]) - .pipe(g.cached('jshint')) - .pipe(jshint('./.jshintrc')) - .pipe(livereload()); -}); - -/** - * CSS - */ -gulp.task('clean-css', function() { - return gulp.src('./.tmp/css').pipe(g.clean()); -}); - -gulp.task('styles', ['clean-css'], function() { - return gulp.src([ - './src/app/**/*.scss', - '!./src/app/**/_*.scss' - ]) - .pipe(g.sass()) - .pipe(gulp.dest('./.tmp/css/')) - .pipe(g.cached('built-css')) - .pipe(livereload()); -}); - -gulp.task('styles-dist', ['styles'], function() { - return cssFiles().pipe(dist('css', bower.name)); -}); - -gulp.task('csslint', ['styles'], function() { - return cssFiles() - .pipe(g.cached('csslint')) - .pipe(g.csslint('./.csslintrc')) - .pipe(g.csslint.reporter()) - ; -}); - - -/** - * Scripts - */ -gulp.task('scripts-dist', ['templates-dist'], function() { - return appFiles().pipe(dist('js', bower.name, {ngAnnotate: true})); -}); - -/** - * Templates - */ -gulp.task('templates', function() { - return templateFiles().pipe(buildTemplates()); -}); - -gulp.task('templates-dist', function() { - return templateFiles({min: true}).pipe(buildTemplates()); -}); - -/** - * Vendors - */ -gulp.task('vendors', function() { - var bowerStream = gulp.src(mainBowerFiles()); - - return es.merge( - bowerStream.pipe(g.filter('**/*.css')).pipe(dist('css', 'vendors')), - bowerStream.pipe(g.filter('**/*.js')).pipe(dist('js', 'vendors')) - ); -}); - -/** - * Index - */ -gulp.task('index', index); -gulp.task('build-all', ['styles', 'fontsdev','templates'], index); - -function index() { - var opt = {read: false}; - - return gulp.src('./src/app/index.html') - .pipe(g.inject(gulp.src(mainBowerFiles(opt)), {ignorePath: 'bower_components', starttag: ''})) - .pipe(g.inject(es.merge(appFiles(), cssFiles(opt)), {ignorePath: ['.tmp', 'src/app']})) - .pipe(g.embedlr()) - .pipe(replace({ - patterns: [ - { - match: 'backendUrl', - replacement: KONGA_BACKEND_URL || settings.backendUrl - }, - { - match: 'enableLogs', - replacement: true - } - ] - })) - .pipe(gulp.dest('./.tmp/')) - .pipe(livereload()) - ; -} - -/** - * Assets - */ -gulp.task('assets', function() { - return gulp.src('./src/app/assets/**') - .pipe(gulp.dest('./dist/assets')) - ; -}); - -/** - * Partials - */ -gulp.task('partials', function() { - return gulp.src('./src/app/partials/**') - .pipe(gulp.dest('./dist/partials')) - ; -}); - -/** - * Fonts - */ -gulp.task('fonts', function() { - return gulp.src('./bower_components/bootstrap/fonts/**') - .pipe(gulp.dest('./dist/fonts')) - ; -}); - -gulp.task('fontsdev', function() { - return gulp.src('./bower_components/bootstrap/fonts/**') - .pipe(gulp.dest('./.tmp/fonts')) - ; -}); - -/** - * Dist - */ -gulp.task('dist', ['vendors', 'assets', 'fonts', 'styles-dist', 'scripts-dist'], function() { - return gulp.src('./src/app/index.html') - .pipe(g.inject(gulp.src('./dist/vendors.min.{js,css}'), { - ignorePath: 'dist', - addRootSlash: false, - starttag: '' - })) - .pipe(g.inject(gulp.src('./dist/' + bower.name + '.min.{js,css}'), {ignorePath: 'dist',addRootSlash: false})) - .pipe(replace({ - patterns: [ - { - match: 'backendUrl', - replacement: KONGA_BACKEND_URL || settings.backendUrl - }, - { - match: 'enableLogs', - replacement: false - } - ] - })) - .pipe(g.htmlmin(htmlminOpts)) - .pipe(gulp.dest('./dist/')) - ; -}); - -/** - * Static file server - */ -gulp.task('statics', g.serve({ - port: settings.frontend.ports.development, - root: ['./.tmp', './src/app', './bower_components'], - middleware: historyApiFallback({}) -})); - -/** - * Production file server, note remember to run 'gulp dist' first! - */ -gulp.task('production',g.serve({ - port: settings.frontend.ports.production, - root: ['./dist'], - middleware: historyApiFallback({}) -})); - - -/** - * Watch - */ -gulp.task('serve', ['watch']); - - -gulp.task('watch', ['statics', 'default'], function() { - isWatching = true; - - // Initiate livereload server: - g.livereload({ - start: true - }); - - gulp.watch('./src/app/**/*.js', ['jshint']).on('change', function(evt) { - if (evt.type !== 'changed') { - gulp.start('index'); - } - }); - - gulp.watch('./src/app/index.html', ['index']); - gulp.watch(['./src/app/**/*.html', '!./src/app/index.html'], ['templates']); - gulp.watch(['./src/app/**/*.scss'], ['csslint']).on('change', function(evt) { - if (evt.type !== 'changed') { - gulp.start('index'); - } - }); -}); - -/** - * Default task - */ -gulp.task('default', ['lint', 'build-all']); - -/** - * Lint everything - */ -gulp.task('lint', ['jshint', 'csslint']); - -/** - * Test - */ -gulp.task('test', ['templates'], function() { - return testFiles() - .pipe(g.karma({ - configFile: __dirname + '/karma.conf.js', - singleRun: true - })) - ; -}); - -/** - * Inject all files for tests into karma.conf.js - * to be able to run `karma` without gulp. - */ -gulp.task('karma-conf', ['templates'], function() { - return gulp.src('./karma.conf.js') - .pipe(g.inject(testFiles(), { - starttag: 'files: [', - endtag: ']', - addRootSlash: false, - transform: function(filepath, file, i, length) { - return ' \'' + filepath + '\'' + (i + 1 < length ? ',' : ''); - } - })) - .pipe(gulp.dest('./')) - ; -}); - -/** - * Test files - */ -function testFiles() { - return new Queue({objectMode: true}) - .Queue(gulp.src(mainBowerFiles()).pipe(g.filter('**/*.js'))) - .Queue(gulp.src('./bower_components/angular-mocks/angular-mocks.js')) - .Queue(appFiles()) - .Queue(gulp.src('./src/app/**/*_test.js')) - .done() - ; -} - -/** - * All CSS files as a stream - */ -function cssFiles(opt) { - return gulp.src('./.tmp/css/**/*.css', opt); -} - -/** - * All AngularJS application files as a stream - */ -function appFiles() { - var files = [ - './.tmp/' + bower.name + '-templates.js', - './src/app/**/*.js', - '!./src/app/**/*_test.js' - ]; - - return gulp.src(files) - .pipe(g.angularFilesort()) - ; -} - -/** - * All AngularJS templates/partials as a stream - */ -function templateFiles(opt) { - return gulp.src([ - './src/app/**/*.html', - './src/app/**/**/*.html', - './src/app/**/**/**/*.html', - '!./src/app/index.html'], opt) - .pipe(opt && opt.min ? g.htmlmin(htmlminOpts) : noop()) - ; -} - -/** - * Build AngularJS templates/partials - */ -function buildTemplates() { - return lazypipe() - .pipe(g.ngHtml2js, { - moduleName: bower.name + '-templates', - prefix: '/' + bower.name + '/', - stripPrefix: '/src/app' - }) - .pipe(g.concat, bower.name + '-templates.js') - .pipe(gulp.dest, './.tmp') - .pipe(livereload)() - ; -} - -/** - * Concat, rename, minify - * - * @param {String} ext - * @param {String} name - * @param {Object} opt - */ -function dist(ext, name, opt) { - opt = opt || {}; - - return lazypipe() - .pipe(g.concat, name + '.' + ext) - .pipe(gulp.dest, './dist') - .pipe(opt.ngAnnotate ? g.ngAnnotate : noop) - .pipe(opt.ngAnnotate ? g.rename : noop, name + '.annotated.' + ext) - .pipe(opt.ngAnnotate ? gulp.dest : noop, './dist') - .pipe(ext === 'js' ? g.uglify : g.minifyCss,ext === 'js' ? {} : {processImport: false}) - .pipe(g.rename, name + '.min.' + ext) - .pipe(gulp.dest, './dist')() - ; -} - -/** - * Livereload (or noop if not run by watch) - */ -function livereload() { - return lazypipe() - .pipe(isWatching ? g.livereload : noop)() - ; -} - -/** - * Jshint with stylish reporter - */ -function jshint(jshintfile) { - // Read JSHint settings, for some reason jshint-stylish won't work on initial load of files - var jshintSettings = JSON.parse(fs.readFileSync(jshintfile, 'utf8')); - - return lazypipe() - .pipe(g.jshint, jshintSettings) - .pipe(g.jshint.reporter, stylish)() - ; -} \ No newline at end of file diff --git a/frontend/karma.conf.js b/frontend/karma.conf.js deleted file mode 100644 index d2da48237..000000000 --- a/frontend/karma.conf.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function ( karma ) { - process.env.PHANTOMJS_BIN = 'node_modules/karma-phantomjs-launcher/node_modules/.bin/phantomjs'; - - karma.set({ - /** - * From where to look for files, starting with the location of this file. - */ - basePath: './', - - /** - * Filled by the task `gulp karma-conf` - */ - files: [ - ], - - frameworks: [ 'mocha', 'chai' ], - plugins: [ 'karma-mocha', 'karma-chai', 'karma-phantomjs-launcher' ], - - /** - * How to report, by default. - */ - reporters: 'progress', - - /** - * Show colors in output? - */ - colors: true, - - /** - * On which port should the browser connect, on which port is the test runner - * operating, and what is the URL path for the browser to use. - */ - port: 9099, - runnerPort: 9100, - urlRoot: '/', - - /** - * Disable file watching by default. - */ - autoWatch: false, - - /** - * The list of browsers to launch to test on. This includes only "Firefox" by - * default, but other browser names include: - * Chrome, ChromeCanary, Firefox, Opera, Safari, PhantomJS - * - * Note that you can also use the executable name of the browser, like "chromium" - * or "firefox", but that these vary based on your operating system. - * - * You may also leave this blank and manually navigate your browser to - * http://localhost:9099/ when you're running tests. The window/tab can be left - * open and the tests will automatically occur there during the build. This has - * the aesthetic advantage of not launching a browser every time you save. - */ - browsers: [ - 'PhantomJS' - ] - }); -}; diff --git a/frontend/package.json b/frontend/package.json deleted file mode 100644 index e742e3601..000000000 --- a/frontend/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "frontend", - "version": "0.1.1", - "private": true, - "scripts": { - "prestart" : "gulp dist", - "start": "node server.js", - "test": "gulp test", - "postinstall": "bower --allow-root install" - }, - "keywords": [ - "angular" - ], - "dependencies": { - "bower": "^1.8.0", - "connect": "^3.5.0", - "connect-history-api-fallback": "1.1.0", - "serve-static": "^1.11.2" - }, - "devDependencies": { - "event-stream": "3.3.2", - "gulp": "3.9.0", - "gulp-angular-filesort": "1.1.1", - "gulp-cached": "1.1.0", - "gulp-clean": "0.3.1", - "gulp-concat": "2.6.0", - "gulp-csslint": "0.2.0", - "gulp-embedlr": "0.5.2", - "gulp-filter": "3.0.1", - "gulp-header": "1.7.1", - "gulp-htmlmin": "1.2.0", - "gulp-inject": "3.0.0", - "gulp-jshint": "1.12.0", - "gulp-livereload": "3.8.1", - "gulp-load-plugins": "1.1.0", - "gulp-minify-css": "1.2.1", - "gulp-ng-annotate": "1.1.0", - "gulp-ng-html2js": "0.2.0", - "gulp-rename": "1.2.2", - "gulp-replace-task": "0.11.0", - "gulp-sass": "2.1.0", - "gulp-serve": "1.2.0", - "gulp-uglify": "1.4.2", - "gulp-util": "3.0.7", - "jshint-stylish": "2.0.1", - "lazypipe": "1.0.1", - "main-bower-files": "^2.9.0", - "sort-stream": "1.0.1", - "streamqueue": "1.1.1", - "tiny-lr": "0.2.1" - } -} diff --git a/frontend/scsslint.yml b/frontend/scsslint.yml deleted file mode 100644 index fcd351d01..000000000 --- a/frontend/scsslint.yml +++ /dev/null @@ -1,234 +0,0 @@ -# Default application configuration that all configurations inherit from. - -scss_files: "**/*.scss" -plugin_directories: ['.scss-linters'] - -# List of gem names to load custom linters from (make sure they are already -# installed) -plugin_gems: [] - -linters: - BangFormat: - enabled: true - space_before_bang: true - space_after_bang: false - - BemDepth: - enabled: false - max_elements: 1 - - BorderZero: - enabled: true - convention: zero # or `none` - - ColorKeyword: - enabled: true - - ColorVariable: - enabled: true - - Comment: - enabled: true - - DebugStatement: - enabled: true - - DeclarationOrder: - enabled: true - - DisableLinterReason: - enabled: false - - DuplicateProperty: - enabled: true - - ElsePlacement: - enabled: true - style: same_line # or 'new_line' - - EmptyLineBetweenBlocks: - enabled: true - ignore_single_line_blocks: true - - EmptyRule: - enabled: true - - ExtendDirective: - enabled: false - - FinalNewline: - enabled: true - present: true - - HexLength: - enabled: true - style: short # or 'long' - - HexNotation: - enabled: true - style: lowercase # or 'uppercase' - - HexValidation: - enabled: true - - IdSelector: - enabled: true - - ImportantRule: - enabled: true - - ImportPath: - enabled: true - leading_underscore: false - filename_extension: false - - Indentation: - enabled: true - allow_non_nested_indentation: false - character: space # or 'tab' - width: 2 - - LeadingZero: - enabled: true - style: exclude_zero # or 'include_zero' - - MergeableSelector: - enabled: true - force_nesting: true - - NameFormat: - enabled: true - allow_leading_underscore: true - convention: hyphenated_lowercase # or 'camel_case', or 'snake_case', or a regex pattern - - NestingDepth: - enabled: true - max_depth: 10 - ignore_parent_selectors: false - - PlaceholderInExtend: - enabled: true - - PropertyCount: - enabled: false - include_nested: false - max_properties: 10 - - PropertySortOrder: - enabled: true - ignore_unspecified: false - min_properties: 2 - separate_groups: false - - PropertySpelling: - enabled: true - extra_properties: [] - - PropertyUnits: - enabled: true - global: [ - 'ch', 'em', 'ex', 'rem', # Font-relative lengths - 'cm', 'in', 'mm', 'pc', 'pt', 'px', 'q', # Absolute lengths - 'vh', 'vw', 'vmin', 'vmax', # Viewport-percentage lengths - 'deg', 'grad', 'rad', 'turn', # Angle - 'ms', 's', # Duration - 'Hz', 'kHz', # Frequency - 'dpi', 'dpcm', 'dppx', # Resolution - '%'] # Other - properties: {} - - QualifyingElement: - enabled: true - allow_element_with_attribute: false - allow_element_with_class: false - allow_element_with_id: false - - SelectorDepth: - enabled: true - max_depth: 6 - - SelectorFormat: - enabled: true - convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern - - Shorthand: - enabled: true - allowed_shorthands: [1, 2, 3] - - SingleLinePerProperty: - enabled: true - allow_single_line_rule_sets: true - - SingleLinePerSelector: - enabled: true - - SpaceAfterComma: - enabled: true - style: one_space # or 'no_space', or 'at_least_one_space' - - SpaceAfterPropertyColon: - enabled: true - style: one_space # or 'no_space', or 'at_least_one_space', or 'aligned' - - SpaceAfterPropertyName: - enabled: true - - SpaceAfterVariableName: - enabled: true - - SpaceAroundOperator: - enabled: true - style: one_space # or 'no_space' - - SpaceBeforeBrace: - enabled: true - style: space # or 'new_line' - allow_single_line_padding: false - - SpaceBetweenParens: - enabled: true - spaces: 0 - - StringQuotes: - enabled: true - style: single_quotes # or double_quotes - - TrailingSemicolon: - enabled: true - - TrailingWhitespace: - enabled: true - - TrailingZero: - enabled: false - - TransitionAll: - enabled: false - - UnnecessaryMantissa: - enabled: true - - UnnecessaryParentReference: - enabled: true - - UrlFormat: - enabled: true - - UrlQuotes: - enabled: true - - VariableForProperty: - enabled: false - properties: [] - - VendorPrefix: - enabled: true - identifier_list: base - additional_identifiers: [] - excluded_identifiers: [] - - ZeroUnit: - enabled: true - - Compass::*: - enabled: false \ No newline at end of file diff --git a/frontend/server.js b/frontend/server.js deleted file mode 100644 index 11ae3a2ba..000000000 --- a/frontend/server.js +++ /dev/null @@ -1,36 +0,0 @@ -var connect = require('connect'); -var serveStatic = require('serve-static'); -var path = require('path') -var port = process.env.PORT || 3000 -//var isWin = /^win/.test(process.platform); -//var child_process = require('child_process'); -//var spawn = child_process.spawn -// -//// First of all, create distribution files -//var cmdBack = spawn('gulp' + ( isWin ? '.cmd' : '' ), -// [ -// "dist" -// ], -// {cwd : path.join(__dirname,"."), stdio: "inherit"}); -//cmdBack.on('exit', function(code){ -// -// if(code == 0) { -// connect().use(serveStatic(path.join(__dirname,'dist'))).listen(port, function(){ -// console.log('Server running on ' + port); -// }); -// }else{ -// console.log("Cannot start frontend. Build process failed with exitCode: ",code); -// } -// -//}); - - -connect().use(serveStatic(path.join(__dirname,'dist'))).listen(port, function(){ - console.log('Server running on ' + port); -}); - - - - - - diff --git a/frontend/src/app/apis/add-api-modal-controller.js b/frontend/src/app/apis/add-api-modal-controller.js deleted file mode 100644 index bcf6dd593..000000000 --- a/frontend/src/app/apis/add-api-modal-controller.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.apis') - .controller('AddApiModalController', [ - '$scope', '$rootScope','$log', '$state','ApiService','$uibModalInstance','MessageService', - function controller($scope,$rootScope, $log, $state, ApiService, $uibModalInstance, MessageService ) { - - $scope.api = { - name : '', - request_host : '', - request_path : '', - strip_request_path : false, - preserve_host: false, - upstream_url : '' - } - - $scope.close = function() { - $uibModalInstance.dismiss() - } - - - - $scope.submit = function() { - - clearApi() - - ApiService.add($scope.api) - .then(function(res){ - $rootScope.$broadcast('api.created') - MessageService.success('Api created!') - $uibModalInstance.dismiss() - }).catch(function(err){ - $log.error("Create new api error:", err) - $scope.errors = err.data.customMessage || {} - - - }) - } - - - function clearApi() { - for(var key in $scope.api) { - if($scope.api[key] == '') { - delete($scope.api[key]) - } - } - } - - - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/add-api-modal.html b/frontend/src/app/apis/add-api-modal.html deleted file mode 100644 index f39d1f865..000000000 --- a/frontend/src/app/apis/add-api-modal.html +++ /dev/null @@ -1,115 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/app/apis/add-api-plugin-modal-controller.js b/frontend/src/app/apis/add-api-plugin-modal-controller.js deleted file mode 100644 index 5a7760a96..000000000 --- a/frontend/src/app/apis/add-api-plugin-modal-controller.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.apis') - .controller('AddApiPluginModalController', [ - '_','$scope', '$rootScope','$log', - '$state','ApiService','MessageService','DialogService', - 'KongPluginsService','PluginsService','$uibModal','$uibModalInstance', - '_api','_plugins', - function controller(_,$scope,$rootScope, $log, - $state, ApiService, MessageService, DialogService, - KongPluginsService,PluginsService, $uibModal,$uibModalInstance, - _api,_plugins ) { - - - var pluginOptions = new KongPluginsService().pluginOptions() - - $scope.api = _api - $scope.pluginOptions = pluginOptions - - new KongPluginsService().makePluginGroups().then(function(groups){ - $scope.pluginGroups = groups - $log.debug("Plugin Groups",$scope.pluginGroups) - }) - - $scope.activeGroup = 'Authentication' - $scope.setActiveGroup = setActiveGroup - $scope.filterGroup = filterGroup - $scope.onAddPlugin = onAddPlugin - $scope.close = function() { - return $uibModalInstance.dismiss() - } - - - /** - * ------------------------------------------------------------- - * Functions - * ------------------------------------------------------------- - */ - - function setActiveGroup(name) { - $scope.activeGroup = name - } - - function filterGroup(group) { - return group.name == $scope.activeGroup - } - - function onAddPlugin(name) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/plugins/modals/add-plugin-modal.html', - size : 'lg', - controller: 'AddPluginController', - resolve: { - _api : function() { - return $scope.api - }, - _pluginName: function () { - return name - }, - _schema: function () { - return PluginsService.schema(name) - } - } - }); - } - - - - - function fetchPlugins() { - PluginsService.load() - .then(function(res){ - - }) - } - - // Listeners - $scope.$on('plugin.added',function(){ - fetchPlugins() - }) - - /** - * ------------------------------------------------------------ - * Listeners - * ------------------------------------------------------------ - */ - $scope.$on("plugin.added",function(){ - fetchPlugins() - }) - - $scope.$on("plugin.updated",function(ev,plugin){ - fetchPlugins() - }) - - - - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/add-api-plugin-modal.html b/frontend/src/app/apis/add-api-plugin-modal.html deleted file mode 100644 index 42cf3baf1..000000000 --- a/frontend/src/app/apis/add-api-plugin-modal.html +++ /dev/null @@ -1,56 +0,0 @@ - - - diff --git a/frontend/src/app/apis/api-controller.js b/frontend/src/app/apis/api-controller.js deleted file mode 100644 index 03027c58f..000000000 --- a/frontend/src/app/apis/api-controller.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.apis') - .controller('ApiController', [ - '$scope','$state','_api', - function controller($scope,$state,_api) { - - $scope.api = _api.data - $state.current.data.pageName = "Edit API : " + ( $scope.api.name || $scope.api.id ) - $scope.activeSection = 0; - $scope.sections = [ - { - name : 'API Details', - icon : '' - }, - { - name : 'Assigned plugins', - icon : '' - } - ] - - $scope.showSection = function(index) { - $scope.activeSection = index - } - - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/api-details-controller.js b/frontend/src/app/apis/api-details-controller.js deleted file mode 100644 index cab079c36..000000000 --- a/frontend/src/app/apis/api-details-controller.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.apis') - .controller('ApiDetailsController', [ - '$scope', '$log', '$state','ApiService','$uibModal','MessageService', - function controller($scope, $log, $state, ApiService, $uibModal,MessageService) { - - - $scope.updateApi = function() { - - $scope.loading = true - ApiService.update($scope.api) - .then(function(res){ - $log.debug("Update Api: ",res) - $scope.loading = false - MessageService.success('API updated successfully!') - }).catch(function(err){ - $scope.loading = false - var errors = {} - Object.keys(err.data.customMessage).forEach(function(key){ - errors[key.replace('config.','')] = err.data.customMessage[key] - MessageService.error(key + " : " + err.data.customMessage[key]) - }) - $scope.errors = errors - }) - - } - - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/api-details.html b/frontend/src/app/apis/api-details.html deleted file mode 100644 index bc01e6d09..000000000 --- a/frontend/src/app/apis/api-details.html +++ /dev/null @@ -1,92 +0,0 @@ -
-
-
- info_outline - API details - -
-
-
-
-
- -
- -
-

The API name. If none is specified, will default to the request_host or request_path.

-
-
-
- -
- -
-

- The public DNS address that points to your API. For example, mockbin.com. At least request_host or request_path or both should be specified. -

- -
-
-
- -
- -
-

- The public path that points to your API. For example, /someservice. At least request_host or request_path or both should be specified. -

-
-
-
-
-
- -
-

- Strip the request_path value before proxying the request to the final API. For example a request made to /someservice/hello will be resolved to upstream_url/hello. By default is false. -

-
-
-
-
- -
- -
-

- Preserves the original Host header sent by the client, instead of replacing it with the hostname of the upstream_url. By default is false. -

-
-
-
- -
- -
-

- The base target URL that points to your API server, this URL will be used for proxying requests. For example, https://mockbin.com. -

-
-
-
-
- -
-
- -
-
-
\ No newline at end of file diff --git a/frontend/src/app/apis/api-plugins-controller.js b/frontend/src/app/apis/api-plugins-controller.js deleted file mode 100644 index 8612d0977..000000000 --- a/frontend/src/app/apis/api-plugins-controller.js +++ /dev/null @@ -1,137 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.plugins') - .controller('ApiPluginsController', [ - '_','$scope', '$stateParams','$log', '$state','ApiService','PluginsService', - '$uibModal','DialogService','InfoService','_plugins', - function controller(_,$scope, $stateParams, $log, $state, ApiService, PluginsService, - $uibModal,DialogService,InfoService,_plugins ) { - - - - $scope.plugins = _plugins.data - $scope.onAddPlugin = onAddPlugin - $scope.onEditPlugin = onEditPlugin - $scope.deletePlugin = deletePlugin - $scope.updatePlugin = updatePlugin - $scope.search = '' - - $log.debug("Plugins",$scope.plugins.data) - - /** - * ---------------------------------------------------------------------- - * Functions - * ---------------------------------------------------------------------- - */ - - function onAddPlugin() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/apis/add-api-plugin-modal.html', - size : 'lg', - controller: 'AddApiPluginModalController', - resolve: { - _api: function () { - return $scope.api - }, - _plugins : function() { - return PluginsService.load() - }, - _info: [ - '$stateParams', - 'InfoService', - '$log', - function resolve( - $stateParams, - InfoService, - $log - ) { - return InfoService.getInfo() - } - ] - } - }); - } - - function updatePlugin(plugin) { - PluginsService.update(plugin.id,{ - enabled : plugin.enabled, - //config : plugin.config - }) - .then(function(res){ - $log.debug("updatePlugin",res) - $scope.plugins.data[$scope.plugins.data.indexOf(plugin)] = res.data; - - }).catch(function(err){ - $log.error("updatePlugin",err) - }) - } - - - function deletePlugin(plugin) { - DialogService.prompt( - "Delete Plugin","Really want to delete the plugin?", - ['No don\'t','Yes! delete it'], - function accept(){ - PluginsService.delete(plugin.id) - .then(function(resp){ - $scope.plugins.data.splice($scope.plugins.data.indexOf(plugin),1); - }).catch(function(err){ - $log.error(err) - }) - },function decline(){}) - } - - function onEditPlugin(item) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/plugins/modals/edit-plugin-modal.html', - size : 'lg', - controller: 'EditPluginController', - resolve: { - _plugin: function () { - return _.cloneDeep(item) - }, - _schema: function () { - return PluginsService.schema(item.name) - } - } - }); - } - - function fetchPlugins() { - PluginsService.load({api_id:$stateParams.api_id}) - .then(function(res){ - $scope.plugins = res.data - }) - } - - - /** - * ------------------------------------------------------------ - * Listeners - * ------------------------------------------------------------ - */ - $scope.$on("plugin.added",function(){ - fetchPlugins() - }) - - $scope.$on("plugin.updated",function(ev,plugin){ - fetchPlugins() - }) - - - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/api-plugins.html b/frontend/src/app/apis/api-plugins.html deleted file mode 100644 index 054c041a8..000000000 --- a/frontend/src/app/apis/api-plugins.html +++ /dev/null @@ -1,71 +0,0 @@ -
-
-
- settings_input_component - Assigned plugins - -
-
-
-
-
- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - -
NameConsumerCreated
- - - - {{item.name}} - {{item.consumer_id}} - All consumers - {{item.created_at | date : format : timezone}} - - - - - -
- no data found... -
-
\ No newline at end of file diff --git a/frontend/src/app/apis/apis-controller.js b/frontend/src/app/apis/apis-controller.js deleted file mode 100644 index 479429fb5..000000000 --- a/frontend/src/app/apis/apis-controller.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.apis') - .controller('ApisController', [ - '$scope', '$log', '$state','ApiService','$uibModal','DialogService','_apis', - function controller($scope, $log, $state, ApiService, $uibModal,DialogService,_apis ) { - - $scope.apis = _apis.data - - function getApis(){ - $scope.loading = true; - ApiService.all() - .then(function(res){ - $scope.apis = res.data - $scope.loading= false; - }).catch(function(err){ - $scope.loading= false; - }) - - } - - - $scope.$on('api.created',function(){ - getApis() - }) - - $scope.deleteApi = function($index,api) { - DialogService.prompt( - "Delete API","Really want to delete the selected API?", - ['No don\'t','Yes! delete it'], - function accept(){ - ApiService.delete(api) - .then(function(res){ - $scope.apis.data.splice($scope.apis.data.indexOf(api),1); - }).catch(function(err){ - - }) - },function decline(){}) - - } - - $scope.openAddApiModal = function(api) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/apis/add-api-modal.html', - controller: 'AddApiModalController', - controllerAs: '$ctrl', - size: 'lg', - resolve: { - api: function () { - return api; - } - } - }); - } - - - - $scope.updateApi = function(api) { - - $scope.loading = true - ApiService.update(api) - .then(function(res){ - $log.debug("Update Api: ",res) - $scope.loading = false - getApis() - }).catch(function(err){ - $log.error("Update Api: ",err) - $scope.loading = false - }) - - } - - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/apis-service.js b/frontend/src/app/apis/apis-service.js deleted file mode 100644 index 817634abb..000000000 --- a/frontend/src/app/apis/apis-service.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.apis') - .service('ApiService', [ - '$log', '$state','$http','BackendConfig', - function( $log, $state, $http,BackendConfig) { - - return { - - all : function() { - return $http.get(BackendConfig.url + '/kong/apis') - }, - - findById : function(apiId) { - return $http.get(BackendConfig.url + '/kong/apis/' + apiId) - }, - - update : function(api) { - return $http.patch(BackendConfig.url + '/kong/apis/' + api.id,api) - }, - - delete : function(api) { - return $http.delete(BackendConfig.url + '/kong/apis/' + api.id) - }, - - add : function(api) { - return $http.post(BackendConfig.url + '/kong/apis/',api) - }, - - plugins : function(apiId) { - return $http.get(BackendConfig.url + '/kong/apis/' + apiId + '/plugins') - }, - - - addPlugin : function(apiId,plugin) { - for(var key in plugin) { - if(!plugin[key] || plugin[key] == '') delete plugin[key] - } - - return $http.post(BackendConfig.url + '/kong/apis/' + apiId + '/plugins',plugin) - - - }, - - updatePlugin : function(apiId,pluginId,data) { - - if(data.config) { - for(var key in data.config){ - data['config.' + key] = data.config[key] - } - delete data.config - } - - return $http.patch(BackendConfig.url + '/kong/apis/' + apiId + '/plugins/' + pluginId,data) - }, - - deletePlugin : function(apiId,pluginId) { - return $http.delete(BackendConfig.url + '/kong/apis/' + apiId + '/plugins/' + pluginId) - } - } - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/apis.html b/frontend/src/app/apis/apis.html deleted file mode 100644 index 96b30d387..000000000 --- a/frontend/src/app/apis/apis.html +++ /dev/null @@ -1,91 +0,0 @@ - - -
-
-
- -
- -
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameRequest HostRequest PathUpstream URLCreated
- - - font_download - - - - - - {{api.preserve_host ? 'cloud_done' : 'cloud_off'}} - - - - - - - {{ api.name || "-" }} - - {{ api.request_host || "-" }}{{ api.request_path || "-" }}{{ api.upstream_url || "-" }}{{api.created_at | date : format : timezone}} - - edit - edit - - - -
-
- -
-
- diff --git a/frontend/src/app/apis/apis.js b/frontend/src/app/apis/apis.js deleted file mode 100644 index 1de2f7502..000000000 --- a/frontend/src/app/apis/apis.js +++ /dev/null @@ -1,185 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.apis', [ - 'angular.chips', - 'ngFileUpload' - ]); - - // Module configuration - angular.module('frontend.apis') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('apis', { - parent : 'frontend', - url: '/apis', - data : { - activeNode : true, - pageName : "APIs", - displayName : "apis", - prefix : 'cloud_queue' - }, - views: { - 'content@': { - templateUrl: '/frontend/apis/apis.html', - controller: 'ApisController', - resolve : { - _apis: [ - 'ApiService', - function resolve(ApiService) { - return ApiService.all() - } - ] - } - } - } - }) - .state('apis.edit', { - url: '/:api_id/edit', - data : { - pageName : "Edit API", - displayName : "edit", - prefix : 'edit' - }, - views: { - 'content@': { - templateUrl: '/frontend/apis/edit-api.html', - controller: 'ApiController', - resolve : { - _api: [ - 'ApiService','$stateParams', - function resolve(ApiService,$stateParams) { - return ApiService.findById($stateParams.api_id) - } - ], - _activeNode: [ - 'NodesService', - function resolve(NodesService) { - return NodesService.isActiveNodeSet() - } - ], - } - - }, - 'details@apis.edit': { - templateUrl: '/frontend/apis/api-details.html', - controller: 'ApiDetailsController', - }, - 'plugins@apis.edit': { - templateUrl: '/frontend/apis/api-plugins.html', - controller: 'ApiPluginsController', - resolve : { - _plugins : [ - 'PluginsService','$stateParams', - function(PluginsService,$stateParams) { - return PluginsService.load({api_id : $stateParams.api_id}) - } - ] - } - } - } - }) - .state('apis.plugins', { - url: '/:api_id/plugins', - params : { - api : {} - }, - data : { - pageName : "API Plugins", - displayName : "API plugins" - }, - views: { - 'content@': { - templateUrl: '/frontend/apis/api-plugins.html', - controller: 'ApiPluginsController', - resolve : { - _api : [ - 'ApiService','$stateParams', - function(ApiService, $stateParams) { - return ApiService.findById($stateParams.api_id) - } - ], - _plugins : [ - 'PluginsService','$stateParams', - function(PluginsService, $stateParams) { - return PluginsService.load({ - api_id : $stateParams.api_id - }) - } - ], - _activeNode: [ - 'NodesService', - function resolve(NodesService) { - - return NodesService.isActiveNodeSet() - } - ], - } - } - }, - }) - .state('apis.plugins.manage', { - url: '/manage', - data : { - pageName : "Manage API Plugins", - displayName : "manage" - }, - views: { - 'content@': { - templateUrl: '/frontend/apis/plugins/manage/manage-api-plugins.html', - controller: 'ManageApiPluginsController', - resolve : { - _api: [ - '$stateParams', - 'ApiService', - '$log', - function resolve( - $stateParams, - ApiService, - $log - ) { - return ApiService.findById($stateParams.api_id) - } - ], - _plugins: [ - '$stateParams', - 'ApiService', - '$log', - function resolve( - $stateParams, - ApiService, - $log - ) { - return ApiService.plugins($stateParams.api_id) - } - ], - _info: [ - '$stateParams', - 'InfoService', - '$log', - function resolve( - $stateParams, - InfoService, - $log - ) { - return InfoService.getInfo() - } - ], - _activeNode: [ - 'NodesService', - function resolve(NodesService) { - - return NodesService.isActiveNodeSet() - } - ], - } - } - }, - }) - } - ]) - ; -}()); diff --git a/frontend/src/app/apis/edit-api.html b/frontend/src/app/apis/edit-api.html deleted file mode 100644 index d0982fa21..000000000 --- a/frontend/src/app/apis/edit-api.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
-
-
-
- Configuration -
-
- -
- -
-
-
-
-
-
diff --git a/frontend/src/app/app.js b/frontend/src/app/app.js deleted file mode 100644 index 4052321c6..000000000 --- a/frontend/src/app/app.js +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Frontend application definition. - * - * This is the main file for the 'Frontend' application. - */ -(function() { - 'use strict'; - - // Create frontend module and specify dependencies for that - angular.module('frontend', [ - 'angular-spinkit', - 'frontend-templates', - 'frontend.core', - 'frontend.dashboard', - 'frontend.settings', - 'frontend.info', - 'frontend.plugins', - 'frontend.users', - 'frontend.consumers', - 'frontend.apis', - - - ]); - - /** - * Configuration for frontend application, this contains following main sections: - * - * 1) Configure $httpProvider and $sailsSocketProvider - * 2) Set necessary HTTP and Socket interceptor(s) - * 3) Turn on HTML5 mode on application routes - * 4) Set up application routes - */ - angular.module('frontend') - .config(function($logProvider){ - $logProvider.debugEnabled(window.enableLogs == 'true' ? true : false); - }) - .config(['$provide',function($provide) { - $provide.decorator('$state', function($delegate) { - var originalTransitionTo = $delegate.transitionTo; - $delegate.transitionTo = function(to, toParams, options) { - return originalTransitionTo(to, toParams, angular.extend({ - reload: true - }, options)); - }; - return $delegate; - }); - }]) - .config([ - '$stateProvider', '$locationProvider', '$urlRouterProvider', '$httpProvider', '$sailsSocketProvider', - 'cfpLoadingBarProvider', - 'toastrConfig', - 'AccessLevels', - function config( - $stateProvider, $locationProvider, $urlRouterProvider, $httpProvider, $sailsSocketProvider, - cfpLoadingBarProvider, - toastrConfig, - AccessLevels - ) { - $httpProvider.defaults.useXDomain = true; - - delete $httpProvider.defaults.headers.common['X-Requested-With']; - - // Add interceptors for $httpProvider and $sailsSocketProvider - $httpProvider.interceptors.push('AuthInterceptor'); - $httpProvider.interceptors.push('ErrorInterceptor'); - $httpProvider.interceptors.push('TemplateCacheInterceptor'); - $httpProvider.interceptors.push('KongaInterceptor'); - - // Iterate $httpProvider interceptors and add those to $sailsSocketProvider - angular.forEach($httpProvider.interceptors, function iterator(interceptor) { - $sailsSocketProvider.interceptors.push(interceptor); - }); - - - - // Disable spinner from cfpLoadingBar - cfpLoadingBarProvider.includeSpinner = false; - cfpLoadingBarProvider.latencyThreshold = 200; - - // Extend default toastr configuration with application specified configuration - angular.extend( - toastrConfig, - { - allowHtml: true, - closeButton: true, - extendedTimeOut: 3000 - } - ); - - // Yeah we wanna to use HTML5 urls! - $locationProvider - .html5Mode({ - enabled: false, // disable html5 mode - requireBase: false - }) - .hashPrefix('!'); - - // Routes that needs authenticated user - //$stateProvider - // .state('profile', { - // abstract: true, - // template: '', - // data: { - // access: AccessLevels.user - // } - // }) - // .state('profile.edit', { - // url: '/profile', - // templateUrl: '/frontend/profile/profile.html', - // controller: 'ProfileController' - // }) - //; - - // Main state provider for frontend application - $stateProvider - .state('frontend', { - abstract: true, - data: { - access : 1 - }, - views: { - header: { - templateUrl: '/frontend/core/layout/partials/header.html', - controller: 'HeaderController' - }, - footer: { - templateUrl: '/frontend/core/layout/partials/footer.html', - controller: 'FooterController' - } - } - }) - ; - - // For any unmatched url, redirect to /dashboard - $urlRouterProvider.otherwise('/dashboard'); - } - ]) - ; - - - /** - * Frontend application run hook configuration. This will attach auth status - * check whenever application changes URL states. - */ - angular.module('frontend') - .run([ - '$rootScope', '$state', '$injector', - 'editableOptions','editableThemes','$templateCache','NodesService', - 'AuthService','cfpLoadingBar', - function run( - $rootScope, $state, $injector, - editableOptions,editableThemes,$templateCache,NodesService, - AuthService,cfpLoadingBar - ) { - - editableThemes.bs3.buttonsClass = 'btn-sm btn-link'; - - // Set usage of Bootstrap 3 CSS with angular-xeditable - editableOptions.theme = 'bs3'; - - /** - * Route state change start event, this is needed for following: - * 1) Check if user is authenticated to access page, and if not redirect user back to login page - */ - $rootScope.$on('$stateChangeStart', function stateChangeStart(event, toState, params) { - - cfpLoadingBar.start(); - - if(toState.name == 'auth.login' && AuthService.isAuthenticated()) { - event.preventDefault(); - $state.go('dashboard', params, {location: 'replace'}) - } - - if (!AuthService.authorize(toState.data.access)) { - event.preventDefault(); - $state.go('auth.login', params, {location: 'replace'}) - } - - - if (!NodesService.authorize(toState.data.activeNode)) { - event.preventDefault(); - $state.go('settings', params, {location: 'replace'}) - } - - if (toState.redirectTo) { - event.preventDefault(); - $state.go(toState.redirectTo, params, {location: 'replace'}) - } - - }); - - $rootScope.$on('$stateChangeSuccess', function stateChangeStart(event, toState) { - $rootScope.$state = toState - cfpLoadingBar.complete() - - }); - - - $rootScope.isAuthenticated = function() { - return AuthService.isAuthenticated() - } - - // Check for state change errors. - //$rootScope.$on('$stateChangeError', function stateChangeError(event, toState, toParams, fromState, fromParams, error) { - // event.preventDefault(); - // - // $injector.get('MessageService') - // .error('Error loading the page'); - // - // $state.get('error').error = { - // event: event, - // toState: toState, - // toParams: toParams, - // fromState: fromState, - // fromParams: fromParams, - // error: error - // }; - // - // return $state.go('error'); - //}); - } - ]) - ; -}()); diff --git a/frontend/src/app/app.scss b/frontend/src/app/app.scss deleted file mode 100644 index 8f45caa92..000000000 --- a/frontend/src/app/app.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'styles/base'; diff --git a/frontend/src/app/assets/.gitkeep b/frontend/src/app/assets/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/src/app/assets/img/konga-logo-small.png b/frontend/src/app/assets/img/konga-logo-small.png deleted file mode 100644 index 044d849c8dec3719868e964a9b8d493e86863e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5673 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 diff --git a/frontend/src/app/assets/img/user-icon.png b/frontend/src/app/assets/img/user-icon.png deleted file mode 100644 index 8c381584e605c22e35f9eea6363691108231b886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1914 zcmV-=2Zi{FP))_tf{B2`1kkj@9(Cmt?lmUr>m}~sII7|toHWx^Yrwbpri5e z^7;Asqo=B#qNVNb>Y=5m_xJgqo}=;c@bK{O?e6dG?dqVUr=g&wnx3JYot^ac_w)1f z(bChKpQ5O&uc)c2qoSvyqobXiq51m#`}+Fs@bTZ@;K#?xw6wUVrmUu=tEQ)@pQEOo zo}c#l{PXwv>hALG?DFpJ?7O|cp`oCdnw{G=H}?-<>lGg+SJ(E*Vo$5&(Flj z%c`latgNl1qpJM;{rmg;@bvff^z^g1yP2J!_xt|h=IPwr-pS0*zrVq)ud%AGvG(@& z^6~ZL=j-6%;mOI$wz|Ezxw)>gwX(9btE;f3rmCf+sidW)o}r`QmD$=zWeBoLR3IPOT=Gt?uqUZi9zljF(D&Ns@Tpe?9tC-L?DV22IDorT3o1pacl; z3K<8YqqI}n?uXeaD3mmC0e|ub{Qv>LFhD_hNFWCA{MBk^8kOMq`uSSh0f1b`&nSOd z#Za=h?t!>jMI+N|B@+brJBd~(nsJ+sE1fGR*GQlyS-UR}HcXB&tky&xfq#G`|JjK- ziKlYej)Q*_+zy)vOl~OEk1=S11O=mlnazr`A4_opOh8)0INJDZ37;Pj0uu>E*J~aPr?0&MSO=3%aW(`WHVL72GE}JElr{;WyB+k5RtVuF&aWzk9uMvlr zI}BKWHc6mhx8p`6?rdRkUSlPTYby~$drHK6v}n;Nxx0PG;YK9f%G*VYRhwk_F2@>^ ze6+pMED7v84aF5+)gf8j7YsNWvc#fUvJ@Byv@wZIyTtY0NgL`(S5Hp{P6LgH7`Hms z(UYDL2?kG2bc}G|d>tBaaN&d7Wo;|oI={5|l;sRqc1LXjXa=>nH$A!?ku$=9fOf>4 zKBYS?XRm~S9{2-RzoZ`%^+`thCG01^sHZ1DI?x{%cV-o>B&o?jlBAX32l}^2`m_+R z*=(dHiOptNTwdjLOTMNbQ+gz+rW4mMIXx}3mt+Z{WyM=kcdKCoi?Qxpc}b-laScts zO|{3lbk>NZ?hFqO3XaJV$J>0gUa7Ab*y+9X`f2*ZD2ULc;pGeK>!~e<5P0F=MAwP`;=rkBA8lhCgIIX3izH&c%s^#A8vx)FGQYdo4}uyZDa9%m8;s z!AX+XWf(UnsqQ%@d~IZ6{WQc(;bEKQ@sd^jjn@`f%SKE}8f-3Ew2iY*lVVA25> zJi=l5?Yz3gb!4~WCMCW(YPGn`5NZ;eYal?(Bnxv;xNxaf@;2~t;>OG}HwUSKi%^X# zmEZ81mOvk*4D%PP)ydq~vxwKMt>oW!Ia#rLm2P zqluqZ25{_W^W zrCO`u>XOafTJ)NaIT&CN0`alq(O#wc_fnKzY-}DdJ3NR3!k_~oL?FkG_;e;jus>EO zjpH=66+PZ55r7~}NC+Tbjy7}Q&d?CYf0INux?jo?LSPCIz+XPN|%6%n-!CuV9sfAebRm zBGwFJo0k%pDUSFGwucBXOAu4)WBn4CEe!ws4gF`yK=4{02LJ#707*qoM6N<$f<{W^ AL;wH) diff --git a/frontend/src/app/assets/img/user-profile.png b/frontend/src/app/assets/img/user-profile.png deleted file mode 100644 index 08cb4be3478436db867d1e4c6385aaa2b8ded147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12555 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 Ja>wT7{{g|NL1O>_ diff --git a/frontend/src/app/assets/svg/conga.svg b/frontend/src/app/assets/svg/conga.svg deleted file mode 100644 index 9a23026a8..000000000 --- a/frontend/src/app/assets/svg/conga.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/src/app/consumers/consumer-controller.js b/frontend/src/app/consumers/consumer-controller.js deleted file mode 100644 index 820554421..000000000 --- a/frontend/src/app/consumers/consumer-controller.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ConsumerController', [ - '_','$scope', '$log', '$state','_consumer', - function controller(_,$scope, $log, $state,_consumer) { - - $scope.consumer = _consumer.data - $scope.activeSection = 0; - $scope.sections = [ - { - name : 'Details', - icon : '' - }, - { - name : 'ACL Groups', - icon : '' - }, - { - name : 'Credentials', - icon : '' - }, - ] - - $scope.showSection = function(index) { - $scope.activeSection = index - } - - - - - } - ]) -}()); diff --git a/frontend/src/app/consumers/consumer-model.js b/frontend/src/app/consumers/consumer-model.js deleted file mode 100644 index 1a8e71817..000000000 --- a/frontend/src/app/consumers/consumer-model.js +++ /dev/null @@ -1,74 +0,0 @@ -(function() { - 'use strict'; - - /** - * Model for Author API, this is used to wrap all Author objects specified actions and data change actions. - */ - angular.module('frontend.consumers') - .service('ConsumerModel', [ - 'DataModel','DataService','$q','$log', - function(DataModel,DataService,$q,$log) { - - var model = new DataModel('consumers'); - - - model.load = function load(parameters, fromCache) { - var self = this; - - // Normalize parameters - parameters = parameters || {}; - fromCache = fromCache || false; - - if (fromCache) { - parameters = self.cache.load.parameters; - } else { - // Store used parameters - self.cache.load = { - parameters: parameters - }; - } - - console.log("################",self.endpoint) - - return DataService - .collection(self.endpoint, parameters) - .then( - function onSuccess(response) { - self.objects = response.data; - - if (fromCache && self.scope && self.itemNames.objects) { - self.scope[self.itemNames.objects] = self.objects; - } - - return self.objects; - }, - function onError(error) { - $log.error('DataModel.load() failed.', error, self.endpoint, parameters); - } - ) - ; - }; - - model.handleError = function($scope,err) { - $scope.errors = {} - if(err.data){ - - for(var key in err.data.invalidAttributes){ - $scope.errors[key] = err.data.invalidAttributes[key][0].message - } - - // Passport errors - if(err.data.raw && err.data.raw.length) { - err.data.raw.forEach(function(raw){ - for(var key in raw.err.invalidAttributes){ - $scope.errors[key] = raw.err.invalidAttributes[key][0].message - } - }) - } - } - } - return model; - } - ]) - ; -}()); \ No newline at end of file diff --git a/frontend/src/app/consumers/consumer-service.js b/frontend/src/app/consumers/consumer-service.js deleted file mode 100644 index 5f8012f6b..000000000 --- a/frontend/src/app/consumers/consumer-service.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .service('ConsumerService', [ - '$log', '$state','$http','BackendConfig', - function( $log, $state, $http,BackendConfig) { - - return { - - query : function(query) { - console.log("sdsdsd") - return $http({ - url : BackendConfig.url + '/api/consumers', - method: "GET", - params : query - }) - }, - - findById : function(id) { - return $http({ - url : BackendConfig.url + '/kong/consumers/' + id, - method: "GET" - }) - }, - - sync : function() { - return $http.post(BackendConfig.url + '/consumers/sync') - }, - - create : function(consumer) { - return $http.post(BackendConfig.url + '/kong/consumers',consumer) - }, - - update : function(id,data) { - return $http.patch(BackendConfig.url + '/kong/consumers/' + id,data) - }, - - delete : function(consumer) { - return $http.delete(BackendConfig.url + '/kong/consumers/' + consumer.id) - }, - - fetchAcls : function(consumerId) { - return $http.get(BackendConfig.url + '/kong/consumers/' + consumerId + '/acls') - }, - - addAcl : function(consumerId,data) { - return $http.post(BackendConfig.url + '/kong/consumers/' + consumerId + '/acls',data) - }, - - deleteAcl : function(consumerId,groupId) { - return $http.delete(BackendConfig.url + '/kong/consumers/' + consumerId + '/acls/' + groupId) - }, - - addCredential : function(consumerId,credential,data) { - return $http.post(BackendConfig.url + '/kong/consumers/' + consumerId + '/' + credential,data) - }, - - loadCredentials : function(consumerId,credential) { - return $http.get(BackendConfig.url + '/kong/consumers/' + consumerId + '/' + credential) - }, - - listCredentials : function(consumerId) { - return $http.get(BackendConfig.url + '/kong/consumers/' + consumerId + '/credentials') - }, - - removeCredential : function(consumerId,credential,credential_id) { - return $http.delete(BackendConfig.url + '/kong/consumers/' + consumerId + '/' + credential + '/' + credential_id) - }, - } - } - ]) - ; -}()); diff --git a/frontend/src/app/consumers/consumers-controller.js b/frontend/src/app/consumers/consumers-controller.js deleted file mode 100644 index 7b1fb3dde..000000000 --- a/frontend/src/app/consumers/consumers-controller.js +++ /dev/null @@ -1,385 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ConsumersController', [ - '_','$scope', '$log', '$state','ConsumerService','$q','MessageService', - 'RemoteStorageService','UserService','SocketHelperService', - '$uibModal','DialogService','ConsumerModel','ListConfig', - function controller(_,$scope, $log, $state, ConsumerService,$q,MessageService, - RemoteStorageService,UserService,SocketHelperService, - $uibModal,DialogService,ConsumerModel,ListConfig ) { - - ConsumerModel.setScope($scope, false, 'items', 'itemCount'); - - // Add default list configuration variable to current scope - $scope = angular.extend($scope, angular.copy(ListConfig.getConfig())); - - // Set initial data - $scope.loading = false; - $scope.items = [] // Init items - $scope.user = UserService.user(); - $scope.importConsumers = importConsumers - $scope.openCreateConsumerModal = openCreateConsumerModal - $scope.deleteConsumer = deleteConsumer - $scope.deleteChecked = deleteChecked - $scope.massAssignCredentials = massAssignCredentials - $scope.syncConsumers = syncConsumers - $scope.globalCheck = { - isAllChecked : false - }; - - // Initialize used title items - $scope.titleItems = ListConfig.getTitleItems(ConsumerModel.endpoint); - - $log.debug("items",$scope.items) - //$log.debug("_count",_count) - //$log.debug("titleItems",$scope.titleItems) - - - // Initialize default sort data - $scope.paging = { - currentPage: 1, - - }; - - $scope.sort = { - column: 'createdAt', - direction: false - }; - - // Initialize filters - $scope.filters = { - searchWord: '', - columns: $scope.titleItems - }; - - // Function to change sort column / direction on list - $scope.changeSort = function changeSort(item) { - var sort = $scope.sort; - - if (sort.column === item.column) { - sort.direction = !sort.direction; - } else { - sort.column = item.column; - sort.direction = true; - } - - _triggerFetchData(); - }; - - - //$scope.pageChanged = function() { - // $log.log('Page changed to: ' + $scope.paging.currentPage); - // _fetchData(); - //} - - function getParameterByName(name, url) { - if (!url) { - url = window.location.href; - } - name = name.replace(/[\[\]]/g, "\\$&"); - var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), - results = regex.exec(url); - if (!results) return null; - if (!results[2]) return ''; - return decodeURIComponent(results[2].replace(/\+/g, " ")); - } - - $scope.loadMore = function() { - if(!$scope.next) return false; - console.log("Must load More!!!") - $scope.paging.offset = $scope.offset - _fetchData(); - } - - - $scope.$watch('paging.currentPage', function watcher(valueNew, valueOld) { - - $log.log('Page changed from : ' + valueOld + ' to: ' + valueNew); - if (valueNew !== valueOld) { - - if(valueNew > valueOld) { - $scope.paging.offset = $scope.offset - } - - if(valueNew < valueOld) { - $scope.paging.offset = $scope.offset - } - _triggerFetchData(); - - } - }); - - - - $scope.$watch('itemsPerPage', function watcher(valueNew, valueOld) { - if (valueNew !== valueOld) { - _triggerFetchData(); - } - }); - - - $scope.$watch('filters', function watcher(valueNew, valueOld) { - if (valueNew !== valueOld) { - _triggerFetchData(); - } - },true); - - - $scope.$watch('globalCheck.isAllChecked', function watcher(valueNew, valueOld) { - if (valueNew !== valueOld) { - checkConsumers(valueNew) - } - }); - - - function checkConsumers(checked) { - $scope.items.forEach(function(consumer){ - consumer.checked = checked - }) - } - - function massAssignCredentials() { - - var consumers = [] - $scope.items.forEach(function(consumer){ - if(consumer.checked) consumers.push(consumer) - }) - - if(!consumers.length) { - MessageService.error('You have not selected any consumers') - return false - } - - - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/credentials/mass-assign-modal.html', - controller: 'MassAssignCredentialsController', - controllerAs: '$ctrl', - resolve : { - _consumers : function() { - return consumers; - } - } - }); - - - - } - - function deleteChecked() { - - var consumers = [] - $scope.items.forEach(function(consumer){ - if(consumer.checked) consumers.push(consumer) - }) - - if(!consumers.length) { - MessageService.error('You have not selected any consumers to delete') - return false - } - - DialogService.prompt( - "Delete Consumers","Really want to delete the selected consumers?", - ['No don\'t','Yes! delete them'], - function accept(){ - deleteConsumers(consumers) - },function decline(){}) - - } - - function syncConsumers() { - DialogService.prompt( - "Sync Consumers","This action will sync Kong's consumers with Konga.
" + - "Kong's consumers that don't exists in Konga's database will be imported" + - " while Konga's consumers that don't exist in Kong's database will be removed." + - "

Continue?", - ['No don\'t','Yes, do it!'], - function accept(){ - $scope.syncing = true - ConsumerService.sync() - .then(function(res){ - $scope.syncing = false - MessageService.success("Consumers synced successfully!") - _triggerFetchData() - }).catch(function(err){ - $scope.syncing = false - }) - },function decline(){}) - } - - function deleteConsumers(consumers) { - - $scope.deleting = true; - var promises = [] - consumers.forEach(function(consumer){ - promises.push(ConsumerService.delete(consumer)) - }) - - $q - .all(promises) - .finally( - function onFinally() { - $scope.deleting = false; - _triggerFetchData() - } - ) - ; - } - - - function deleteConsumer(consumer) { - DialogService.prompt( - "Delete Consumer","Really want to delete the selected consumer?", - ['No don\'t','Yes! delete it'], - function accept(){ - ConsumerService.delete(consumer) - .then(function(res){ - $scope.items.splice($scope.items.indexOf(consumer),1); - }).catch(function(err){ - - }) - },function decline(){}) - } - - - - function importConsumers() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/import/modal-select-storage.html', - controller: 'ImportConsumersStorageController', - controllerAs: '$ctrl', - resolve : { - _adapters : function() { - return RemoteStorageService.loadAdapters(); - } - } - }); - } - - function openCreateConsumerModal() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/create-consumer-modal.html', - controller: function($scope,$rootScope,$log,$uibModalInstance,MessageService,ConsumerService){ - - $scope.consumer = { - username : '', - custom_id : '' - } - - $scope.close = close - $scope.submit = submit - - function submit(){ - ConsumerService.create($scope.consumer) - .then(function(res){ - MessageService.success("Consumer created successfully!") - $rootScope.$broadcast('consumer.created',res.data) - close() - }).catch(function(err){ - $log.error("Failed to create consumer", err) - $scope.errors = err.data.customMessage || {} - }) - } - - function close() { - $uibModalInstance.dismiss() - } - }, - controllerAs: '$ctrl', - }); - } - - - - function _triggerFetchData() { - _fetchData(); - } - - - - /** - * Helper function to fetch actual data for GUI from backend server with current parameters: - * 1) Current page - * 2) Search word - * 3) Sort order - * 4) Items per page - * - * Actually this function is doing two request to backend: - * 1) Data count by given filter parameters - * 2) Actual data fetch for current page with filter parameters - * - * These are fetched via 'AuthorModel' service with promises. - * - * @private - */ - function _fetchData() { - console.log("$scope.loading",$scope.loading) - if($scope.loading) return false; - $scope.loading = true; - - // Common parameters for count and data query - var commonParameters = { - //where: SocketHelperService.getWhere($scope.filters) - }; - - // Data query specified parameters - var parameters = { - size: $scope.itemsPerPage, - offset: $scope.paging.offset - }; - - // Fetch data count - $log.debug("parameters",parameters) - - // Fetch actual data - ConsumerService - .query(_.merge({}, commonParameters, parameters)) - .then( - function onSuccess(response) { - - console.log("ConsumerService",response) - $scope.loading = false; - $scope.items = $scope.items.concat(response.data.data); - $scope.itemCount = response.data.total; - $scope.next = response.data.next; - $scope.offset = response.data.offset; - } - ); - } - - - - $scope.$on('consumer.created',function(ev,user){ - _fetchData() - }) - - - $scope.$on('consumer.updated',function(ev,user){ - _fetchData() - }) - - $scope.$on('credentials.assigned',function(ev,user){ - _fetchData() - }) - - _fetchData() - - } - ]) -}()); diff --git a/frontend/src/app/consumers/consumers.js b/frontend/src/app/consumers/consumers.js deleted file mode 100644 index c9fc899e4..000000000 --- a/frontend/src/app/consumers/consumers.js +++ /dev/null @@ -1,126 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.consumers', [ - 'angular.chips', - 'ngMessages', - 'angularUtils.directives.dirPagination' - ]); - - // Module configuration - angular.module('frontend.consumers') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('consumers', { - parent : 'frontend', - url: '/consumers', - data : { - activeNode : true, - pageName : "Consumers", - displayName : "consumers", - prefix : 'perm_identity' - }, - - views: { - 'content@': { - templateUrl: '/frontend/consumers/index.html', - controller: 'ConsumersController' - } - } - }) - .state('consumers.edit', { - url: '/:id', - data : { - pageName : "Edit Consumer", - displayName : "edit consumer", - prefix : 'perm_identity' - }, - views: { - 'content@': { - templateUrl: '/frontend/consumers/edit-consumer.html', - controller: 'ConsumerController', - - }, - 'details@consumers.edit': { - templateUrl: '/frontend/consumers/details/consumer-details.html', - controller: 'ConsumerDetailsController', - }, - 'groups@consumers.edit': { - templateUrl: '/frontend/consumers/groups/consumer-groups.html', - controller: 'ConsumerGroupsController', - resolve : { - _acls : [ - 'ConsumerService', - '$stateParams', - function(ConsumerService,$stateParams){ - return ConsumerService.fetchAcls($stateParams.id) - } - ], - } - }, - 'credentials@consumers.edit': { - templateUrl: '/frontend/consumers/credentials/consumer-credentials.html', - controller: 'ConsumerCredentialsController', - resolve : { - _keys : [ - 'ConsumerService', - '$stateParams', - function(ConsumerService,$stateParams){ - return ConsumerService.loadCredentials($stateParams.id,'key-auth') - } - ], - _jwts : [ - 'ConsumerService', - '$stateParams', - function(ConsumerService,$stateParams){ - return ConsumerService.loadCredentials($stateParams.id,'jwt') - } - ], - _basic_auth_credentials : [ - 'ConsumerService', - '$stateParams', - function(ConsumerService,$stateParams){ - return ConsumerService.loadCredentials($stateParams.id,'basic-auth') - } - ], - _oauth2_credentials : [ - 'ConsumerService', - '$stateParams', - function(ConsumerService,$stateParams){ - return ConsumerService.loadCredentials($stateParams.id,'oauth2') - } - ], - _hmac_auth_credentials : [ - 'ConsumerService', - '$stateParams', - function(ConsumerService,$stateParams){ - return ConsumerService.loadCredentials($stateParams.id,'hmac-auth') - } - ] - } - } - }, - resolve : { - _consumer : [ - 'ConsumerService', - '$stateParams', - function(ConsumerService,$stateParams){ - return ConsumerService.findById($stateParams.id) - } - ], - _activeNode: [ - 'NodesService', - function resolve(NodesService) { - return NodesService.isActiveNodeSet() - } - ], - }, - }) - - } - ]) - ; -}()); diff --git a/frontend/src/app/consumers/create-consumer-modal.html b/frontend/src/app/consumers/create-consumer-modal.html deleted file mode 100644 index 8b156cb6e..000000000 --- a/frontend/src/app/consumers/create-consumer-modal.html +++ /dev/null @@ -1,40 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/basic-auth.html b/frontend/src/app/consumers/credentials/basic-auth.html deleted file mode 100644 index 0f05dfcd9..000000000 --- a/frontend/src/app/consumers/credentials/basic-auth.html +++ /dev/null @@ -1,36 +0,0 @@ -

- perm_identity - Basic Auth - -

-

- You have not created any Basic Auth credentials for this consumer yet -

-
- - - - - - - - - - - - - - - -
#usernamepasswordcreated
{{$index+1}}.{{cred.username}}{{cred.password}}{{cred.created_at | date : format : timezone}} - -
-
\ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/consumer-credentials-controller.js b/frontend/src/app/consumers/credentials/consumer-credentials-controller.js deleted file mode 100644 index 1cc81e96e..000000000 --- a/frontend/src/app/consumers/credentials/consumer-credentials-controller.js +++ /dev/null @@ -1,294 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ConsumerCredentialsController', [ - '_','$scope', '$log', '$state', - 'ConsumerService','MessageService','$uibModal', - 'DialogService', - '_keys','_jwts','_basic_auth_credentials','_hmac_auth_credentials','_oauth2_credentials', - function controller(_,$scope, $log, $state, - ConsumerService, MessageService,$uibModal, - DialogService, - _keys, _jwts, _basic_auth_credentials, _hmac_auth_credentials,_oauth2_credentials ) { - - - $scope.keys = _keys.data - $scope.jwts = _jwts.data - $scope.basic_auth_credentials = _basic_auth_credentials.data - $scope.hmac_auth_credentials = _hmac_auth_credentials.data - $scope.oauth2_credentials = _oauth2_credentials.data - - - $scope.updateConsumerDetails = updateConsumerDetails - $scope.createApiKey = createApiKey - $scope.createJWT = createJWT - $scope.createBasicAuthCredentials = createBasicAuthCredentials - $scope.createOAuth2 = createOAuth2 - $scope.createHMAC = createHMAC - $scope.deleteKey = deleteKey - $scope.deleteJWT = deleteJWT - $scope.deleteOAuth2 = deleteOAuth2 - $scope.deleteBasicAuthCredentials = deleteBasicAuthCredentials - $scope.deleteHMACAuthCredentials = deleteHMACAuthCredentials - - - function deleteHMACAuthCredentials($index,credentials) { - DialogService.prompt( - "Delete Credentials","Really want to delete the selected credentials?", - ['No don\'t','Yes! delete it'], - function accept(){ - ConsumerService - .removeCredential($scope.consumer.id,'hmac-auth',credentials.id) - .then( - function onSuccess(result) { - MessageService.success('Credentials deleted successfully'); - fetchHMACAuthCredentials() - } - ) - - },function decline(){}) - } - - function deleteBasicAuthCredentials($index,credentials) { - DialogService.prompt( - "Delete Credentials","Really want to delete the selected credentials?", - ['No don\'t','Yes! delete it'], - function accept(){ - ConsumerService - .removeCredential($scope.consumer.id,'basic-auth',credentials.id) - .then( - function onSuccess(result) { - MessageService.success('Credentials deleted successfully'); - fetchBasicAuthCredentials() - } - ) - - },function decline(){}) - } - - function deleteOAuth2($index,oauth) { - DialogService.prompt( - "Delete JWT","Really want to delete the selected OAuth2?", - ['No don\'t','Yes! delete it'], - function accept(){ - ConsumerService - .removeCredential($scope.consumer.id,'oauth2',oauth.id) - .then( - function onSuccess(result) { - MessageService.success('OAuth2 deleted successfully'); - fetchOAuth2() - } - ) - - },function decline(){}) - } - - function deleteJWT($index,jwt) { - DialogService.prompt( - "Delete JWT","Really want to delete the selected JWT?", - ['No don\'t','Yes! delete it'], - function accept(){ - ConsumerService - .removeCredential($scope.consumer.id,'jwt',jwt.id) - .then( - function onSuccess(result) { - MessageService.success('JWT deleted successfully'); - fetchJWTs() - } - ) - - },function decline(){}) - } - - function deleteKey($index,key) { - DialogService.prompt( - "Delete Key","Really want to delete the selected key?", - ['No don\'t','Yes! delete it'], - function accept(){ - ConsumerService - .removeCredential($scope.consumer.id,'key-auth',key.id) - .then( - function onSuccess(result) { - MessageService.success('Key deleted successfully'); - fetchKeys() - } - ) - - },function decline(){}) - } - - function createApiKey() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/credentials/create-api-key-modal.html', - controller: 'CreateKeyAuthController', - controllerAs: '$ctrl', - resolve : { - _consumer : function() { - return $scope.consumer - } - } - }); - } - - - function createBasicAuthCredentials() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/credentials/create-basic-auth-modal.html', - controller: 'CreateBasicAuthController', - controllerAs: '$ctrl', - resolve : { - _consumer : function() { - return $scope.consumer - } - } - }); - } - - function createOAuth2() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/credentials/create-oauth2-modal.html', - controller: 'CreateOAuth2Controller', - controllerAs: '$ctrl', - resolve : { - _consumer : function() { - return $scope.consumer - } - } - }); - } - - function createHMAC() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/credentials/create-hmac-auth-modal.html', - controller: 'CreateHMACAuthController', - controllerAs: '$ctrl', - resolve : { - _consumer : function() { - return $scope.consumer - } - } - }); - } - - function createJWT() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/credentials/create-jwt-modal.html', - controller: 'CreateJWTController', - controllerAs: '$ctrl', - resolve : { - _consumer : function() { - return $scope.consumer - } - } - }); - } - - - - function updateConsumerDetails() { - ConsumerService.update($scope.consumer.id,{ - username : $scope.consumer.username, - custom_id : $scope.consumer.custom_id - }) - .then(function(res){ - $log.debug(res.data) - $scope.consumer = res.data - MessageService.success("Consumer updated successfully!") - }).catch(function(err){ - $log.error("Failed to update consumer", err) - $scope.errors = err.data.customMessage || {} - }) - } - - - function fetchBasicAuthCredentials() { - ConsumerService.loadCredentials($scope.consumer.id,'basic-auth') - .then(function(res){ - $scope.basic_auth_credentials = res.data; - }) - } - - - function fetchHMACAuthCredentials() { - ConsumerService.loadCredentials($scope.consumer.id,'hmac-auth') - .then(function(res){ - $scope.hmac_auth_credentials = res.data; - }) - } - - function fetchKeys() { - ConsumerService.loadCredentials($scope.consumer.id,'key-auth') - .then(function(res){ - $scope.keys = res.data - }) - - } - - function fetchJWTs() { - ConsumerService.loadCredentials($scope.consumer.id,'jwt') - .then(function(res){ - $scope.jwts = res.data - }) - - } - - function fetchOAuth2() { - ConsumerService.loadCredentials($scope.consumer.id,'oauth2') - .then(function(res){ - $scope.oauth2_credentials = res.data - }) - - } - - /** - * ---------------------------------------------------------- - * Listeners - * ---------------------------------------------------------- - */ - - - $scope.$on('consumer.key.created',function(ev,group){ - fetchKeys() - }) - - $scope.$on('consumer.oauth2.created',function(ev,group){ - fetchOAuth2() - }) - - $scope.$on('consumer.jwt.created',function(ev,group){ - fetchJWTs() - }) - - $scope.$on('consumer.basic-auth.created',function(ev,group){ - fetchBasicAuthCredentials() - }) - - - $scope.$on('consumer.hmac-auth.created',function(ev,group){ - fetchHMACAuthCredentials() - }) - - } - ]) -}()); diff --git a/frontend/src/app/consumers/credentials/consumer-credentials.html b/frontend/src/app/consumers/credentials/consumer-credentials.html deleted file mode 100644 index 8e0e3082e..000000000 --- a/frontend/src/app/consumers/credentials/consumer-credentials.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
-
- Credentials -
-
- - -
-
- -
-
- -
-
- -
-
- -
-
- -
-
\ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/create-api-key-modal.html b/frontend/src/app/consumers/credentials/create-api-key-modal.html deleted file mode 100644 index db5b4e71f..000000000 --- a/frontend/src/app/consumers/credentials/create-api-key-modal.html +++ /dev/null @@ -1,34 +0,0 @@ - -
-

Create Api Key for {{consumer.username || consumer.custom_id}}

-
- - \ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/create-basic-auth-controller.js b/frontend/src/app/consumers/credentials/create-basic-auth-controller.js deleted file mode 100644 index 8b2904143..000000000 --- a/frontend/src/app/consumers/credentials/create-basic-auth-controller.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('CreateBasicAuthController', [ - '$scope', '$rootScope', '$log','ConsumerService','MessageService','$uibModalInstance','_consumer', - function controller($scope, $rootScope, $log, ConsumerService, MessageService, $uibModalInstance,_consumer ) { - - $scope.consumer = _consumer - $scope.createBasicAuthCredentials = createBasicAuthCredentials - $scope.close = function(){ - $uibModalInstance.dismiss() - } - - $scope.credentials = { - username : '', - password : '' - } - - - function createBasicAuthCredentials() { - ConsumerService - .addCredential($scope.consumer.id,'basic-auth',$scope.credentials).then(function(resp){ - $log.debug("Credentials generated",resp) - $rootScope.$broadcast('consumer.basic-auth.created') - $uibModalInstance.dismiss() - }).catch(function(err){ - $log.error(err) - $scope.errors = err.data.customMessage || {} - }) - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/credentials/create-basic-auth-modal.html b/frontend/src/app/consumers/credentials/create-basic-auth-modal.html deleted file mode 100644 index a58afac55..000000000 --- a/frontend/src/app/consumers/credentials/create-basic-auth-modal.html +++ /dev/null @@ -1,42 +0,0 @@ - -
-

Create Basic Auth credentials for {{consumer.username || consumer.custom_id}}

-
- - \ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/create-hmac-auth-controller.js b/frontend/src/app/consumers/credentials/create-hmac-auth-controller.js deleted file mode 100644 index efc2b6382..000000000 --- a/frontend/src/app/consumers/credentials/create-hmac-auth-controller.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('CreateHMACAuthController', [ - '$scope', '$rootScope', '$log','ConsumerService','MessageService','$uibModalInstance','_consumer', - function controller($scope, $rootScope, $log, ConsumerService, MessageService, $uibModalInstance,_consumer ) { - - $scope.consumer = _consumer - $scope.createHMACAuthCredentials = createHMACAuthCredentials - $scope.close = function(){ - $uibModalInstance.dismiss() - } - - $scope.credentials = { - username : '', - secret : '' - } - - - function createHMACAuthCredentials() { - - // Clear secret if empty - if($scope.credentials.secret == '') - delete $scope.credentials.secret - - ConsumerService.addCredential($scope.consumer.id,'hmac-auth',$scope.credentials).then(function(resp){ - $log.debug("Credentials generated",resp) - $rootScope.$broadcast('consumer.hmac-auth.created') - $uibModalInstance.dismiss() - }).catch(function(err){ - $log.error(err) - $scope.errors = err.data.customMessage || {} - }) - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/credentials/create-hmac-auth-modal.html b/frontend/src/app/consumers/credentials/create-hmac-auth-modal.html deleted file mode 100644 index 96a1a5e57..000000000 --- a/frontend/src/app/consumers/credentials/create-hmac-auth-modal.html +++ /dev/null @@ -1,42 +0,0 @@ - -
-

Create HMAC credentials for {{consumer.username || consumer.custom_id}}

-
- - \ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/create-jwt-controller.js b/frontend/src/app/consumers/credentials/create-jwt-controller.js deleted file mode 100644 index fb26cfc78..000000000 --- a/frontend/src/app/consumers/credentials/create-jwt-controller.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('CreateJWTController', [ - '_','$scope', '$rootScope', '$log','ConsumerService','MessageService','$uibModalInstance','_consumer', - function controller(_, $scope, $rootScope, $log, ConsumerService, MessageService, $uibModalInstance,_consumer ) { - - $scope.consumer = _consumer - $scope.createJWT = createJWT - $scope.close = function(){ - $uibModalInstance.dismiss() - } - - $scope.jwt = { - key : '', - algorithm : 'HS256', - rsa_public_key : '', - secret : '' - } - - function cleanJWT(jwt) { - - var jwtClone = _.clone(jwt) - - for(var key in jwtClone) { - if(!jwtClone[key] || jwtClone[key] == ''){ - delete jwtClone[key] - } - } - - return jwtClone - } - - - function createJWT() { - - ConsumerService.addCredential($scope.consumer.id,'jwt',cleanJWT($scope.jwt)).then(function(resp){ - $log.debug("JWT generated",resp) - $rootScope.$broadcast('consumer.jwt.created') - $uibModalInstance.dismiss() - }).catch(function(err){ - $log.error(err) - $scope.errors = err.data.customMessage || {} - }) - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/credentials/create-jwt-modal.html b/frontend/src/app/consumers/credentials/create-jwt-modal.html deleted file mode 100644 index 69e689263..000000000 --- a/frontend/src/app/consumers/credentials/create-jwt-modal.html +++ /dev/null @@ -1,68 +0,0 @@ - -
-

Create JWT for {{consumer.username || consumer.custom_id}}

-
- - \ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/create-key-auth-controller.js b/frontend/src/app/consumers/credentials/create-key-auth-controller.js deleted file mode 100644 index c564eb4a1..000000000 --- a/frontend/src/app/consumers/credentials/create-key-auth-controller.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('CreateKeyAuthController', [ - '$scope', '$rootScope', '$log','ConsumerService','MessageService','$uibModalInstance','_consumer', - function controller($scope, $rootScope, $log, ConsumerService, MessageService, $uibModalInstance,_consumer ) { - - $scope.consumer = _consumer - $scope.createApiKey = createApiKey - $scope.close = function(){ - $uibModalInstance.dismiss() - } - - $scope.key = { - value : '' - } - - - function createApiKey() { - ConsumerService.addCredential($scope.consumer.id,'key-auth',{ - key : $scope.key.value - }).then(function(resp){ - $log.debug("Key generated",resp) - $rootScope.$broadcast('consumer.key.created') - $uibModalInstance.dismiss() - }).catch(function(err){ - $log.error(err) - $scope.errors = err.data.customMessage || {} - }) - } - - - - - - } - ]) -}()); diff --git a/frontend/src/app/consumers/credentials/create-oauth2-controller.js b/frontend/src/app/consumers/credentials/create-oauth2-controller.js deleted file mode 100644 index e9d48fa6a..000000000 --- a/frontend/src/app/consumers/credentials/create-oauth2-controller.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('CreateOAuth2Controller', [ - '_','$scope', '$rootScope', '$log','ConsumerService','MessageService','$uibModalInstance','_consumer', - function controller(_, $scope, $rootScope, $log, ConsumerService, MessageService, $uibModalInstance,_consumer ) { - - $scope.consumer = _consumer - $scope.create = create - $scope.close = function(){ - $uibModalInstance.dismiss() - } - - $scope.jwt = { - key : '', - algorithm : 'HS256', - rsa_public_key : '', - secret : '' - } - - - function create() { - - ConsumerService.addCredential($scope.consumer.id,'oauth2',$scope.data).then(function(resp){ - $log.debug("OAuth2 generated",resp) - $rootScope.$broadcast('consumer.oauth2.created') - $uibModalInstance.dismiss() - }).catch(function(err){ - $log.error(err) - $scope.errors = err.data.customMessage || {} - }) - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/credentials/create-oauth2-modal.html b/frontend/src/app/consumers/credentials/create-oauth2-modal.html deleted file mode 100644 index db3a9185b..000000000 --- a/frontend/src/app/consumers/credentials/create-oauth2-modal.html +++ /dev/null @@ -1,62 +0,0 @@ - -
-

Create OAuth2 for {{consumer.username || consumer.custom_id}}

-
- - \ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/hmac.html b/frontend/src/app/consumers/credentials/hmac.html deleted file mode 100644 index 208ab2084..000000000 --- a/frontend/src/app/consumers/credentials/hmac.html +++ /dev/null @@ -1,36 +0,0 @@ -

- code - HMAC Auth - -

-

- You have not created any HMAC credentials for this consumer yet -

-
- - - - - - - - - - - - - - - -
#usernamesecretcreated
{{$index+1}}.{{cred.username}}{{cred.secret || '-'}}{{cred.created_at | date : format : timezone}} - -
-
\ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/jwt.html b/frontend/src/app/consumers/credentials/jwt.html deleted file mode 100644 index b5e7fec01..000000000 --- a/frontend/src/app/consumers/credentials/jwt.html +++ /dev/null @@ -1,30 +0,0 @@ -

- fingerprint - JWT - -

-

- You have not created any jwt credentials for this consumer yet -

-
- - - - - - -
{{jwt | json}}
- Created
- {{jwt.created_at | date : format : timezone}} -
- -
-
diff --git a/frontend/src/app/consumers/credentials/key-auth.html b/frontend/src/app/consumers/credentials/key-auth.html deleted file mode 100644 index dcce6fc0d..000000000 --- a/frontend/src/app/consumers/credentials/key-auth.html +++ /dev/null @@ -1,34 +0,0 @@ -

- vpn_key - Api Keys - -

-

- You have not created any keys for this consumer yet -

-
- - - - - - - - - - - - - -
#keycreated
{{$index+1}}.{{key.key}}{{key.created_at | date : format : timezone}} - -
-
\ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/mass-assign-credentials-controller.js b/frontend/src/app/consumers/credentials/mass-assign-credentials-controller.js deleted file mode 100644 index b247464f5..000000000 --- a/frontend/src/app/consumers/credentials/mass-assign-credentials-controller.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('MassAssignCredentialsController', [ - "$log","$q","$scope","$rootScope","$uibModalInstance","ConsumerService","DialogService", - "MessageService","_consumers", - function controller($log,$q,$scope,$rootScope,$uibModalInstance,ConsumerService,DialogService, - MessageService,_consumers) { - - $scope.consumers = _consumers - $scope.close = function() { - $uibModalInstance.dismiss() - } - - $scope.credentials = [ - { - name : "Key Auth", - description : "Generate an API key for each consumer.", - value : "key-auth" - }, - { - name : "JWT", - description : "Generate JWT credentials for each consumer." + - " The default values will be used for all of JWT configuration properties" + - " as specified in Kong's documentation.", - value : "jwt" - }, - { - name : "HMAC Auth", - description : "Generate HMAC credentials for each consumer." + - "The consumer's username will be used as the username property " + - "and a secret will be auto-generated for each credential.", - value : "hmac-auth" - } - ] - - - $scope.onCredentialSelected = function(credential) { - DialogService.prompt( - "Mass Assign Credentials", - "You are about to mass assign " + credential + " credentials" + - " to " + $scope.consumers.length + " selected consumers.
Continue?", - ['No don\'t','Yes, do it!'], - function accept(){ - $scope.busy = true - - var promises = [] - - switch(credential) { - case "hmac-auth": - _consumers.forEach(function(consumer){ - promises.push(ConsumerService.addCredential(consumer.id,credential,{ - username : consumer.username, - secret : Math.random().toString(36).slice(-8) - })) - }) - break; - default: - _consumers.forEach(function(consumer){ - promises.push(ConsumerService.addCredential(consumer.id,credential)) - }) - } - - - - $q - .all(promises) - .finally( - function onFinally() { - $scope.busy = false; - MessageService.success('Credentials where assigned successfully!') - $rootScope.$broadcast('credentials.assigned') - } - ) - ; - - },function decline(){}) - } - - - - - } - ]) -}()); diff --git a/frontend/src/app/consumers/credentials/mass-assign-modal.html b/frontend/src/app/consumers/credentials/mass-assign-modal.html deleted file mode 100644 index 28b473efb..000000000 --- a/frontend/src/app/consumers/credentials/mass-assign-modal.html +++ /dev/null @@ -1,26 +0,0 @@ - -
-

Select the type of credential to assign to all {{consumers.length}} selected consumers -

- - - - \ No newline at end of file diff --git a/frontend/src/app/consumers/credentials/oauth2.html b/frontend/src/app/consumers/credentials/oauth2.html deleted file mode 100644 index d18704ef7..000000000 --- a/frontend/src/app/consumers/credentials/oauth2.html +++ /dev/null @@ -1,38 +0,0 @@ -

- security - OAuth2 - -

-

- You have not created any OAuth2 credentials for this consumer yet -

-
- - - - - - - - - - - - - - - - - -
#nameclient idredirect uricreated
{{$index+1}}.{{cred.name}}{{cred.client_id}}{{cred.redirect_uri || '-'}}{{cred.created_at | date : format : timezone}} - -
-
\ No newline at end of file diff --git a/frontend/src/app/consumers/details/consumer-details-controller.js b/frontend/src/app/consumers/details/consumer-details-controller.js deleted file mode 100644 index 726740116..000000000 --- a/frontend/src/app/consumers/details/consumer-details-controller.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ConsumerDetailsController', [ - '_','$scope', '$log', '$state','ConsumerService','MessageService', - function controller(_,$scope, $log, $state, ConsumerService, MessageService) { - - $scope.updateConsumerDetails = updateConsumerDetails - - function updateConsumerDetails() { - ConsumerService.update($scope.consumer.id,{ - username : $scope.consumer.username, - custom_id : $scope.consumer.custom_id - }) - .then(function(res){ - $log.debug(res.data) - $scope.consumer = res.data - MessageService.success("Consumer updated successfully!") - }).catch(function(err){ - $log.error("Failed to update consumer", err) - $scope.errors = err.data.customMessage || {} - }) - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/details/consumer-details.html b/frontend/src/app/consumers/details/consumer-details.html deleted file mode 100644 index cef1afea7..000000000 --- a/frontend/src/app/consumers/details/consumer-details.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-
- Details -
-
-
-
-
- -
- -
-

The username of the consumer. You must send either this field or custom_id with the request.

-
-
- -
- -
- -
-

Field for storing an existing ID for the consumer, useful for mapping Kong with users in your existing database. You must send either this field or username with the request.

-
-
- -
-
- -
-
-
-
-
\ No newline at end of file diff --git a/frontend/src/app/consumers/edit-consumer-modal.html b/frontend/src/app/consumers/edit-consumer-modal.html deleted file mode 100644 index fc154d25d..000000000 --- a/frontend/src/app/consumers/edit-consumer-modal.html +++ /dev/null @@ -1,40 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/app/consumers/edit-consumer.html b/frontend/src/app/consumers/edit-consumer.html deleted file mode 100644 index 6e468408a..000000000 --- a/frontend/src/app/consumers/edit-consumer.html +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-
-
- Manage -
-
- -
- -
-
-
-
-
-
-
- diff --git a/frontend/src/app/consumers/groups/consumer-groups-controller.js b/frontend/src/app/consumers/groups/consumer-groups-controller.js deleted file mode 100644 index f8750b0a3..000000000 --- a/frontend/src/app/consumers/groups/consumer-groups-controller.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ConsumerGroupsController', [ - '_','$scope', '$log', '$state','ConsumerService', - 'MessageService','DialogService','$uibModal','_acls', - function controller(_,$scope, $log, $state, ConsumerService, - MessageService,DialogService,$uibModal,_acls) { - - $scope.acls = _acls.data.data - $scope.addGroup = addGroup - $scope.deleteGroup = deleteConsumerGroup - - function addGroup(consumer) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/groups/create-group-modal.html', - controller: ['$scope','$rootScope','$uibModalInstance','ConsumerService','_consumer', - function($scope,$rootScope, $uibModalInstance,ConsumerService,_consumer){ - - $scope.close = close - $scope.createGroup = createGroup - $scope.acl = { - group : '', - } - - function createGroup() { - ConsumerService.addAcl(_consumer.id,$scope.acl).then(function(data){ - fetcAcls() - close() - }).catch(function(err){ - console.error(err) - $scope.errors = { - group : err.data.customMessage.group - } - }) - - } - - function close() { - $uibModalInstance.dismiss() - } - }], - controllerAs: '$ctrl', - resolve : { - _consumer : function() { - return consumer - } - } - }); - } - - function deleteConsumerGroup(group) { - DialogService.prompt( - "Delete Group","Really want to remove the group from the consumer?", - ['No','Remove it!'], - function accept(){ - ConsumerService.deleteAcl($scope.consumer.id,group.id) - .then(function(data){ - fetcAcls() - }) - - },function decline(){}) - - } - - function fetcAcls() { - ConsumerService.fetchAcls($scope.consumer.id) - .then(function(res){ - $scope.acls = res.data.data; - }) - } - } - ]) -}()); diff --git a/frontend/src/app/consumers/groups/consumer-groups.html b/frontend/src/app/consumers/groups/consumer-groups.html deleted file mode 100644 index 4fa967653..000000000 --- a/frontend/src/app/consumers/groups/consumer-groups.html +++ /dev/null @@ -1,51 +0,0 @@ -
-
-
- Groups - - - - - - - - - - -
-
-
-
-
-
- clear -
- - people - {{acl.group}} - - -
- -
- -
-
-
-
- - add - Add a group - - -
-
-
-
-
-
\ No newline at end of file diff --git a/frontend/src/app/consumers/groups/create-group-modal.html b/frontend/src/app/consumers/groups/create-group-modal.html deleted file mode 100644 index 8b684fb0d..000000000 --- a/frontend/src/app/consumers/groups/create-group-modal.html +++ /dev/null @@ -1,31 +0,0 @@ - -
-

Add a group to this consumer

-
- \ No newline at end of file diff --git a/frontend/src/app/consumers/groups/group.js b/frontend/src/app/consumers/groups/group.js deleted file mode 100644 index ecdcb5127..000000000 --- a/frontend/src/app/consumers/groups/group.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Author component to wrap all author specified stuff together. This component is divided to following logical - * components: - * - * Controllers - * Models - * - * All of these are wrapped to 'frontend.examples.author' angular module. - */ -(function() { - 'use strict'; - - // Define frontend.examples.author angular module - angular.module('frontend.consumers.groups', []); - -}()); diff --git a/frontend/src/app/consumers/groups/manage-groups-modal-controllers.js b/frontend/src/app/consumers/groups/manage-groups-modal-controllers.js deleted file mode 100644 index 7eaf2d345..000000000 --- a/frontend/src/app/consumers/groups/manage-groups-modal-controllers.js +++ /dev/null @@ -1,132 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.examples.author' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - // Controller for new author creation. - angular.module('frontend.consumers.groups') - .controller('ManageKongGroupController', [ - '$scope', '$rootScope', '$log','$state','$uibModal','KongGroupModel','DialogService', - 'MessageService','$uibModalInstance','_groups', - function controller( - $scope, $rootScope, $log, $state, $uibModal, KongGroupModel, DialogService, - MessageService,$uibModalInstance, _groups - ) { - - $scope.close = close - $scope.openCreateGroupModal = openCreateGroupModal - $scope.deleteGroup = deleteGroup - $scope.updateGroup = updateGroup - $scope.groups = _groups - $scope.search = { - value : '' - } - - function openCreateGroupModal() { - var modalInstance = $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/groups/create-group-modal.html', - controller: ['$scope','$rootScope','$uibModalInstance','KongGroupModel', - function($scope,$rootScope, $uibModalInstance,KongGroupModel){ - - $scope.close = close - $scope.createGroup = createGroup - $scope.group = { - name : '', - } - - - - function createGroup() { - KongGroupModel - .create(angular.copy($scope.group)) - .then( - function onSuccess(result) { - if(result.data && result.data.error){ - $scope.errors = {} - for(var key in result.data.invalidAttributes){ - $scope.errors[key] = result.data.invalidAttributes[key][0].message - } - }else{ - MessageService.success('New group created successfully'); - $rootScope.$broadcast('kong.group.created',result) - close() - } - - }, - function onError(err) { - - } - ) - } - - function close() { - $uibModalInstance.dismiss() - } - }], - controllerAs: '$ctrl', - }); - - modalInstance.result.then(function (selectedItem) { - - }, function () { - - }); - } - - function updateGroup(group) { - KongGroupModel - .update(group.id,group) - .then( - function onSuccess(result) { - MessageService.success('Group updated successfully'); - $rootScope.$broadcast('kong.group.updated',result) - fetchGroups() - } - ) - } - - function deleteGroup(group) { - - DialogService.prompt( - "Delete Group","Really want to delete the '" + group.name + "' group?", - ['No don\'t','Yes! delete it'], - function accept(){ - KongGroupModel - .delete(group.id) - .then( - function onSuccess(result) { - MessageService.success('Group deleted successfully'); - $rootScope.$broadcast('kong.group.deleted',result) - fetchGroups() - } - ) - },function decline(){}) - - } - - function close() { - $uibModalInstance.dismiss() - } - - function fetchGroups() { - KongGroupModel.load() - .then(function(data){ - $scope.groups = data - }) - } - - // Listeners - $scope.$on('kong.group.created',function(ev,group){ - fetchGroups(); - }) - } - ]) - ; - -}()); diff --git a/frontend/src/app/consumers/groups/manage-groups-modal.html b/frontend/src/app/consumers/groups/manage-groups-modal.html deleted file mode 100644 index 2d6ec2eb9..000000000 --- a/frontend/src/app/consumers/groups/manage-groups-modal.html +++ /dev/null @@ -1,62 +0,0 @@ - -
-

Manage consumer groups to use with ACL plugin

-
- \ No newline at end of file diff --git a/frontend/src/app/consumers/import/import-consumers-connection-controller.js b/frontend/src/app/consumers/import/import-consumers-connection-controller.js deleted file mode 100644 index 82456ecdd..000000000 --- a/frontend/src/app/consumers/import/import-consumers-connection-controller.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ImportConsumersConnectionController', [ - '_','$scope', '$log', '$state','RemoteStorageService', - 'MessageService','Upload','BackendConfig','ConsumerModel', - 'ConsumerService','$uibModal','$uibModalInstance', - '_adapter', - function controller(_,$scope, $log, $state, RemoteStorageService, - MessageService, Upload, BackendConfig,ConsumerModel, - ConsumerService, $uibModal, $uibModalInstance,_adapter) { - - $scope.adapter = _adapter - $scope.closeModal = function() { - $uibModalInstance.dismiss() - } - - $scope.connOptions = { - adapter : $scope.adapter.value - } - - $scope.loadConsumers = function() { - $scope.busy = true - if($scope.adapter.hasFiles) { - - Upload.upload({ - url: BackendConfig.url + '/remote/consumers', - arrayKey: '', - data: $scope.connOptions - }).then(function (resp) { - $log.debug("Upload ended",resp) - $scope.busy = false - onConsumersLoaded(resp.data) - $uibModalInstance.dismiss() - }, function (err) { - $log.debug("Upload error",err) - MessageService.error("Could not retrieve consumers from " + - "the remote storage. Make sure your connection options " + - "are correct.") - $scope.busy = false - }, function (evt) { - $log.debug("Upload evt",evt) - }); - - }else{ - RemoteStorageService - .fetchConsumers($scope.connOptions) - .then(function(resp){ - $log.debug("Fetch Consumers", resp) - $scope.busy = false; - onConsumersLoaded(resp.data) - $uibModalInstance.dismiss() - }).catch(function(err){ - $log.error("Fetch Consumers", err) - $scope.busy = false; - MessageService.error("Could not retrieve consumers from " + - "the remote storage. Make sure your connection options " + - "are correct.") - }) - } - - } - - function onConsumersLoaded(consumers) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/import/modal-consumers-table.html', - controller: 'ImportConsumersTableController', - controllerAs: '$ctrl', - resolve : { - _consumers : function() { - return consumers - }, - _existingConsumers : function() { - return ConsumerModel - .load() - ; - } - } - }); - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/import/import-consumers-controller.js b/frontend/src/app/consumers/import/import-consumers-controller.js deleted file mode 100644 index 7fba04801..000000000 --- a/frontend/src/app/consumers/import/import-consumers-controller.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ImportConsumersController', [ - '_','$scope', '$rootScope','$log', '$state','ConsumerService','$q','MessageService', - '$uibModal','$uibModalInstance','_consumers', - function controller(_,$scope, $rootScope,$log, $state, ConsumerService,$q,MessageService, - $uibModal, $uibModalInstance,_consumers) { - - $scope.consumers = _consumers; - $scope.importing = true; - $scope.percent = 0 - $scope.count = 0 - $scope.result = { - imported : { - count : 0, - consumers : [] - }, - failed : { - count : 0, - consumers : [] - }, - } - - $scope.uuid = new Date().getTime() - - - $scope.closeModal = function() { - $uibModalInstance.dismiss() - } - - - // Start importing - var imports = []; - - _consumers.forEach(function(consumer){ - var _import = ConsumerService. - create({ - username : consumer.username, - custom_id : consumer.custom_id, - import_id : $scope.uuid, - }) - - .catch(function(error) { - $scope.count ++; - $scope.result.failed.count++ - $scope.result.failed.consumers.push(consumer) - $scope.percent = ($scope.count * 100) / $scope.consumers.length; - return { error:error }; - }) - .finally( - function onSuccess() { - $scope.count ++; - $scope.percent = ($scope.count * 100) / $scope.consumers.length; - - }) - - imports.push(_import) - }) - - - $q - .all(imports) - .then(function(results) { - - console.log("res",results) - results.forEach(function(result){ - if(!result.error) { - $scope.result.imported.count++ - $scope.result.imported.consumers.push(result.data) - } - }) - $scope.importing = false; - $rootScope.$broadcast('consumer.created') - }) - - - - - - } - ]) -}()); diff --git a/frontend/src/app/consumers/import/import-consumers-storage-controller.js b/frontend/src/app/consumers/import/import-consumers-storage-controller.js deleted file mode 100644 index f376c0f4e..000000000 --- a/frontend/src/app/consumers/import/import-consumers-storage-controller.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ImportConsumersStorageController', [ - '_','$scope', '$log', '$state', - 'ConsumerService','RemoteStorageService', - '$uibModal','$uibModalInstance','_adapters', - function controller(_,$scope, $log, $state, - ConsumerService, RemoteStorageService, - $uibModal, $uibModalInstance,_adapters) { - - $scope.adapters = _adapters.data - - $scope.close = function() { - $uibModalInstance.dismiss() - } - - $scope.onStorageSelected = function(adapter) { - $uibModalInstance.dismiss() - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/import/modal-connection-options.html', - controller: 'ImportConsumersConnectionController', - controllerAs: '$ctrl', - resolve : { - _adapter : function() { - return $scope.adapters[adapter] - } - } - }); - - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/import/import-consumers-table-controller.js b/frontend/src/app/consumers/import/import-consumers-table-controller.js deleted file mode 100644 index 26873eb59..000000000 --- a/frontend/src/app/consumers/import/import-consumers-table-controller.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.consumers') - .controller('ImportConsumersTableController', [ - '_','$scope', '$log', '$state','ConsumerService','MessageService', - '$uibModal','$uibModalInstance','_consumers','_existingConsumers', - function controller(_,$scope, $log, $state, ConsumerService, MessageService, - $uibModal, $uibModalInstance,_consumers,_existingConsumers) { - - $scope.consumers = _consumers; - $scope.existingConsumers = _existingConsumers - $log.debug("existingConsumers",_existingConsumers) - - $scope.consumers.forEach(function(consumer){ - for(var i=0;i<_existingConsumers.length;i++) { - if(consumer.username === _existingConsumers[i].username){ - consumer.exists = true - return; - } - } - }) - - $scope.closeModal = function() { - $uibModalInstance.dismiss() - } - - $scope.importChecked = function() { - var _consumers = $scope.consumers.map(function(consumer){ - return consumer.checked ? consumer : undefined - }).filter(function(n){ return n != undefined }) - - if(!_consumers.length){ - MessageService.error("You have not selected any consumers to import") - return false - } - - doImport(_consumers) - } - - - $scope.importAll = function() { - doImport($scope.consumers) - } - - - function doImport(consumers) { - - $uibModalInstance.dismiss() - - $uibModal.open({ - animation: true, - backdrop : 'static', - keyboard : false, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/consumers/import/modal-import.html', - controller: 'ImportConsumersController', - controllerAs: '$ctrl', - resolve : { - _consumers : function() { - return _.remove(consumers, function (consumer) { - return !consumer.exists - }); - } - } - }); - } - - } - ]) -}()); diff --git a/frontend/src/app/consumers/import/modal-connection-options.html b/frontend/src/app/consumers/import/modal-connection-options.html deleted file mode 100644 index da391d606..000000000 --- a/frontend/src/app/consumers/import/modal-connection-options.html +++ /dev/null @@ -1,118 +0,0 @@ - -
-
{{adapter.name}}
-

Define options to the consumer storage.

-

-
- diff --git a/frontend/src/app/consumers/import/modal-consumers-table.html b/frontend/src/app/consumers/import/modal-consumers-table.html deleted file mode 100644 index 1d0871da2..000000000 --- a/frontend/src/app/consumers/import/modal-consumers-table.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - -
usernamecustom_id
- - {{item.username}}{{item.custom_id}}
- \ No newline at end of file diff --git a/frontend/src/app/consumers/import/modal-import.html b/frontend/src/app/consumers/import/modal-import.html deleted file mode 100644 index bff505ffb..000000000 --- a/frontend/src/app/consumers/import/modal-import.html +++ /dev/null @@ -1,29 +0,0 @@ - - diff --git a/frontend/src/app/consumers/import/modal-select-storage.html b/frontend/src/app/consumers/import/modal-select-storage.html deleted file mode 100644 index 2a90a5979..000000000 --- a/frontend/src/app/consumers/import/modal-select-storage.html +++ /dev/null @@ -1,24 +0,0 @@ - -
-
Select storage
-

Select the storage from which to import the consumers

-
- \ No newline at end of file diff --git a/frontend/src/app/consumers/index.html b/frontend/src/app/consumers/index.html deleted file mode 100644 index 91c40f541..000000000 --- a/frontend/src/app/consumers/index.html +++ /dev/null @@ -1,64 +0,0 @@ - -
-
- - - - - - - - - - - - - - - - -
- -
-
- - - - - - - - - - - - - -
-
- - -
-
-
-
-
- diff --git a/frontend/src/app/consumers/partials/consumers-table.html b/frontend/src/app/consumers/partials/consumers-table.html deleted file mode 100644 index 612fcea7a..000000000 --- a/frontend/src/app/consumers/partials/consumers-table.html +++ /dev/null @@ -1,110 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - {{consumer.username || "-"}}{{consumer.custom_id || "-"}}{{consumer.import_id || "-"}}{{consumer.createdAt | date : format : timezone}} - - settings - Configuration - - - -
- No data found... -
- Loading consumers... -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/src/app/core/auth/auth.js b/frontend/src/app/core/auth/auth.js deleted file mode 100644 index 704070588..000000000 --- a/frontend/src/app/core/auth/auth.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Angular module for frontend.core.auth component. This component is divided to following logical components: - * - * frontend.core.auth.login - * frontend.core.auth.services - */ -(function() { - 'use strict'; - - // Define frontend.auth module - angular.module('frontend.core.auth', [ - 'frontend.core.auth.login', - 'frontend.core.auth.services' - ]); - - // Module configuration - angular.module('frontend.core.auth') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('auth', { - abstract: true, - parent: 'frontend', - data: { - access: 0 - } - }) - ; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/auth/login/login-controllers.js b/frontend/src/app/core/auth/login/login-controllers.js deleted file mode 100644 index 9b3e6a625..000000000 --- a/frontend/src/app/core/auth/login/login-controllers.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.auth.login' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - /** - * Login controller to handle user's login to application. Controller uses 'Auth' service to make actual HTTP - * request to server and try to authenticate user. - * - * After successfully login Auth service will store user data and JWT token via 'Storage' service where those are - * asked whenever needed in application. - * - * @todo - * 1) different authentication providers - * 2) user registration - */ - angular.module('frontend.core.auth.login') - .controller('LoginController', [ - '$scope', '$state', - 'AuthService', 'FocusOnService', - function controller( - $scope, $state, - AuthService, FocusOnService - ) { - - // Scope function to perform actual login request to server - $scope.login = function login() { - AuthService - .login($scope.credentials) - .then( - function successCallback() { - $state.go('dashboard'); - }, - function errorCallback() { - _reset(); - } - ) - ; - }; - - /** - * Private helper function to reset credentials and set focus to username input. - * - * @private - */ - function _reset() { - FocusOnService.focus('username'); - - // Initialize credentials - $scope.credentials = { - identifier: '', - password: '' - }; - } - - _reset(); - } - ]) - ; -}()); diff --git a/frontend/src/app/core/auth/login/login.html b/frontend/src/app/core/auth/login/login.html deleted file mode 100644 index 637146626..000000000 --- a/frontend/src/app/core/auth/login/login.html +++ /dev/null @@ -1,55 +0,0 @@ -
-
- - -
-
diff --git a/frontend/src/app/core/auth/login/login.js b/frontend/src/app/core/auth/login/login.js deleted file mode 100644 index 8f926ad02..000000000 --- a/frontend/src/app/core/auth/login/login.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Messages component which is divided to following logical components: - * - * Controllers - * - * All of these are wrapped to 'frontend.auth.login' angular module. - */ -(function() { - 'use strict'; - - // Define frontend.auth.login angular module - angular.module('frontend.core.auth.login', []); - - // Module configuration - angular.module('frontend.core.auth.login') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - // Login - .state('auth.login', { - url: '/login', - data: { - access: 0 - }, - views: { - 'content@': { - templateUrl: '/frontend/core/auth/login/login.html', - controller: 'LoginController' - } - } - }) - ; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/auth/login/login.scss b/frontend/src/app/core/auth/login/login.scss deleted file mode 100644 index ea1bf0562..000000000 --- a/frontend/src/app/core/auth/login/login.scss +++ /dev/null @@ -1,62 +0,0 @@ -.form-login { - margin-top: 100px; - - .form-group{ - float: left; - width: 100%; - - label{ - text-align: right; - } - - input{ - padding-left: 15px; - } - } -} -//.form-login { -// margin: 0 auto; -// max-width: 250px; -// padding: 15px; -// -// .title { -// font-size: 26px; -// text-align: center; -// } -// -// .checkbox { -// font-weight: normal; -// -// input { -// float: none; -// position: relative; -// top: 1px; -// } -// } -// -// .form-group { -// margin-bottom: 0; -// } -// -// .form-control { -// text-align: center; -// -// &:focus { -// z-index: 2; -// } -// } -// -// .username { -// border-bottom-left-radius: 0; -// border-bottom-right-radius: 0; -// } -// -// .password { -// border-radius: 0; -// } -// -// .btn { -// border-top-left-radius: 0; -// border-top-right-radius: 0; -// } -//} diff --git a/frontend/src/app/core/auth/services/AuthService.js b/frontend/src/app/core/auth/services/AuthService.js deleted file mode 100644 index 9192efbaa..000000000 --- a/frontend/src/app/core/auth/services/AuthService.js +++ /dev/null @@ -1,122 +0,0 @@ -/** - * AuthService service which is used to authenticate users with backend server and provide simple - * methods to check if user is authenticated or not. - * - * Within successfully login process service will store user data and JWT token to ngStorage where - * those are accessible in the application. - * - * This service provides following methods: - * - * AuthService.authorize(access) - * AuthService.isAuthenticated() - * AuthService.login(credentials) - * AuthService.logout() - * - * You can use this service fairly easy on your controllers and views if you like to. It's - * recommend that you use this service with 'UserService' service in your controllers and - * views. - * - * Usage example in controller: - * - * angular - * .module('app') - * .controller('SomeController', [ - * '$scope', 'AuthService', 'UserService', - * function ($scope, AuthService, UserService) { - * $scope.auth = AuthService; - * $scope.user = UserService.user; - * } - * ]) - * ; - * - * Usage example in view: - * - *
- * Hello, {{user().email}} - *
- * - * Happy coding! - * - * @todo Revoke method? - * @todo Text localizations? - */ -(function() { - 'use strict'; - - angular.module('frontend.core.auth.services') - .factory('AuthService', [ - '$http', '$state', '$localStorage', - 'AccessLevels', 'BackendConfig', 'MessageService', - function factory( - $http, $state, $localStorage, - AccessLevels, BackendConfig, MessageService - ) { - return { - /** - * Method to authorize current user with given access level in application. - * - * @param {Number} accessLevel Access level to check - * - * @returns {Boolean} - */ - authorize: function authorize(accessLevel) { - if (accessLevel === AccessLevels.user) { - return this.isAuthenticated(); - } else if (accessLevel === AccessLevels.admin) { - return this.isAuthenticated() && Boolean($localStorage.credentials.user.admin); - } else { - return accessLevel === AccessLevels.anon; - } - }, - - /** - * Method to check if current user is authenticated or not. This will just - * simply call 'Storage' service 'get' method and returns it results. - * - * @returns {Boolean} - */ - isAuthenticated: function isAuthenticated() { - return Boolean($localStorage.credentials); - }, - - /** - * Method make login request to backend server. Successfully response from - * server contains user data and JWT token as in JSON object. After successful - * authentication method will store user data and JWT token to local storage - * where those can be used. - * - * @param {*} credentials - * - * @returns {*|Promise} - */ - login: function login(credentials) { - return $http - .post(BackendConfig.url + '/login', credentials, {withCredentials: true}) - .then( - function(response) { - MessageService.success('You have been logged in.'); - - $localStorage.credentials = response.data; - } - ) - ; - }, - - /** - * The backend doesn't care about actual user logout, just delete the token - * and you're good to go. - * - * Question still: Should we make logout process to backend side? - */ - logout: function logout() { - $localStorage.$reset(); - - MessageService.success('You have been logged out.'); - - $state.go('auth.login'); - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/auth/services/UserService.js b/frontend/src/app/core/auth/services/UserService.js deleted file mode 100644 index bff72e0e1..000000000 --- a/frontend/src/app/core/auth/services/UserService.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Current user data service within this you can access to currently signed in user data. - * Note that if you wanna be secure about this you have to also use 'Auth' service in your - * views. - * - * Usage example in controller: - * angular - * .module('app') - * .controller('SomeController',[ - * '$scope', 'AuthService', 'UserService', - * function controller($scope, AuthService, UserService) { - * $scope.auth = AuthService; - * $scope.user = UserService.user; - * } - * ]) - * ; - * - * Usage example in view: - *
- * Hello, {{user().email}} - *
- * - * Happy coding! - */ -(function() { - 'use strict'; - - angular.module('frontend.core.auth.services') - .factory('UserService', [ - '$localStorage', - function factory($localStorage) { - return { - user: function user() { - return $localStorage.credentials ? $localStorage.credentials.user : {}; - }, - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/auth/services/services.js b/frontend/src/app/core/auth/services/services.js deleted file mode 100644 index 61f806697..000000000 --- a/frontend/src/app/core/auth/services/services.js +++ /dev/null @@ -1,6 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.auth.services', []); -}()); diff --git a/frontend/src/app/core/components/FocusOn.js b/frontend/src/app/core/components/FocusOn.js deleted file mode 100644 index 40e2d2f9b..000000000 --- a/frontend/src/app/core/components/FocusOn.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Generic 'focus' component for boilerplate application. Purpose of this component is to provide an easy way to trigger - * focus to specified input whenever needed. - * - * @link https://stackoverflow.com/questions/14833326/how-to-set-focus-on-input-field/18295416#18295416 - */ -(function() { - 'use strict'; - - /** - * Directive definition for 'focus' component. This will listen 'focusOn' event on scope, and whenever that's - * fired directive will check if that event is attached to current element. - * - * Usage example: - * - * - * This will attach 'focusOn' event with 'focusMe' parameter to trigger focus of this element. - */ - angular.module('frontend.core.components') - .directive('focusOn', [ - '$timeout', - function directive($timeout) { - /** - * Actual directive return function. - * - * @param {angular.scope} scope Angular scope object. - * @param {angular.element} element jqLite-wrapped element that this directive matches. - */ - return function focusOn(scope, element) { - scope.$on('focusOn', function focusOnEvent(event, identifier) { - if (element.data('focusOn') && identifier === element.data('focusOn')) { - $timeout(function timeout() { - element.focus(); - }, 0, false); - } - }); - }; - } - ]) - ; - - /** - * Service for focus component. This is need for actual element focus events which can be activated from another - * components like controllers and services. - * - * Usage example: - * angular.module('frontend.controllers') - * .controller('MyCtrl', [ - * '$scope', 'FocusOnService', - * function($scope, FocusOnService) { - * focusOnService('focusMe'); - * } - * ]) - * ; - * - * This will trigger focus to input element that has 'data-focus-on' attribute set with value 'focusMe'. - */ - angular.module('frontend.core.components') - .factory('FocusOnService', [ - '$rootScope', '$timeout', - function factory($rootScope, $timeout) { - /** - * Actual functionality for this service. This will just broadcast 'focusOn' event with specified - * identifier, which is catch on 'focus' component directive. - * - * @param {string} identifier Identifier for 'data-focus-on' attribute - */ - return { - 'focus': function focus(identifier) { - $timeout(function timeout() { - $rootScope.$broadcast('focusOn', identifier); - }, 0, false); - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/components/components.js b/frontend/src/app/core/components/components.js deleted file mode 100644 index 3c3585c38..000000000 --- a/frontend/src/app/core/components/components.js +++ /dev/null @@ -1,6 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.components', []); -}()); diff --git a/frontend/src/app/core/constants/AccessLevels.js b/frontend/src/app/core/constants/AccessLevels.js deleted file mode 100644 index 1b166c958..000000000 --- a/frontend/src/app/core/constants/AccessLevels.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Frontend application access level constant definitions. These are used to to restrict access to certain routes in - * application. - * - * Note that actual access check is done by currently signed in user. - */ -(function() { - 'use strict'; - - angular.module('frontend') - .constant('AccessLevels', { - anon: 0, - user: 1, - admin: 2 - }) - ; -}()); diff --git a/frontend/src/app/core/constants/BackendConfig.js b/frontend/src/app/core/constants/BackendConfig.js deleted file mode 100644 index b96b4ae90..000000000 --- a/frontend/src/app/core/constants/BackendConfig.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Frontend application backend constant definitions. This is something that you must define in your application. - * - * Note that 'BackendConfig.url' is configured in /frontend/config/config.json file and you _must_ change it to match - * your backend API url. - */ -(function() { - 'use strict'; - - angular.module('frontend') - .constant('BackendConfig', { - url: window.io.sails.url - }) - ; -}()); diff --git a/frontend/src/app/core/core.js b/frontend/src/app/core/core.js deleted file mode 100644 index bb2018d75..000000000 --- a/frontend/src/app/core/core.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Angular module for 'core' component. This component is divided to following logical components: - * - * frontend.core.dependencies - * frontend.core.auth - * frontend.core.components - * frontend.core.directives - * frontend.core.error - * frontend.core.filters - * frontend.core.interceptors - * frontend.core.layout - * frontend.core.libraries - * frontend.core.models - * frontend.core.services - */ -(function() { - 'use strict'; - - // Define frontend.core module - angular.module('frontend.core', [ - 'frontend.core.dependencies', // Note that this must be loaded first - 'frontend.core.auth', - 'frontend.core.components', - 'frontend.core.directives', - 'frontend.core.error', - 'frontend.core.filters', - 'frontend.core.interceptors', - 'frontend.core.layout', - 'frontend.core.libraries', - 'frontend.core.models', - 'frontend.core.services' - ]); -}()); diff --git a/frontend/src/app/core/dependencies/dependencies.js b/frontend/src/app/core/dependencies/dependencies.js deleted file mode 100644 index b02498640..000000000 --- a/frontend/src/app/core/dependencies/dependencies.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Generic models angular module initialize. This module contains all 3rd party dependencies that application needs to - * actually work. - * - * Also note that this module have to be loaded before any other application modules that have dependencies to these - * "core" modules. - */ -(function() { - 'use strict'; - - angular.module('frontend.core.dependencies', [ - 'angular-loading-bar', - 'ngAnimate', - 'ngSanitize', - 'infinite-scroll', - 'ngBootbox', - 'ngStorage', - 'ui.router', - 'ui.bootstrap', - 'ui.bootstrap.showErrors', - 'ui.utils', - 'angularMoment', - 'toastr', - 'xeditable', - 'sails.io', - 'angularUtils.directives.uiBreadcrumbs', - 'angularUtils.directives.dirPagination', - 'yaru22.jsonHuman', - 'cfp.loadingBar', - 'frapontillo.bootstrap-switch', - 'ngFileUpload' - ]); -}()); diff --git a/frontend/src/app/core/directives/ListSearch.js b/frontend/src/app/core/directives/ListSearch.js deleted file mode 100644 index bf9baf817..000000000 --- a/frontend/src/app/core/directives/ListSearch.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Directive to create search component for lists. This is used generally in all lists on application. Basically - * this directive just manipulates given filters and items per page variables. Directive needs three attributes to - * work: - * 1) filters, filter data - * 2) options, items per page options - * 3) items, current items per page value - * - * Passed filters must be in following format: - * $scope.filters = { - * searchWord: '', - * columns: $scope.items - * }; - * - * Where '$scope.items' is array of objects like: - * $scope.items = [ - * { - * title: 'Object', - * column: 'objectName', - * searchable: true, - * sortable: true, - * inSearch: true, - * inTitle: true - * }, - * ]; - * - * Usage example: - * - * - */ -(function() { - 'use strict'; - - angular.module('frontend.core.directives') - .directive('listSearch', function directive() { - return { - restrict: 'E', - scope: { - filters: '=', - items: '=', - options: '=' - }, - replace: true, - templateUrl: '/frontend/core/directives/partials/ListSearch.html', - controller: [ - '$scope', - function controller($scope) { - $scope.id = Math.floor((Math.random() * 6) + 1); - - $scope.inSearch = function inSearch(item) { - return (!angular.isUndefined(item.searchable)) ? item.searchable : false; - }; - } - ] - }; - }) - ; -}()); diff --git a/frontend/src/app/core/directives/RawView.js b/frontend/src/app/core/directives/RawView.js deleted file mode 100644 index d19adc09c..000000000 --- a/frontend/src/app/core/directives/RawView.js +++ /dev/null @@ -1,43 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.core.directives') - .directive('rawView', function directive() { - return { - restrict: 'E', - scope: { - item: '=' - }, - replace: true, - template : 'remove_red_eye', - controller: [ - '$scope','$uibModal', - function controller($scope,$uibModal) { - - $scope.openRawView = function(item) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - template: '', - controller: function($scope,_item){ - $scope.item = _item - }, - controllerAs: '$ctrl', - resolve: { - _item: function () { - return item; - } - } - }); - } - - } - ] - }; - }) - ; -}()); diff --git a/frontend/src/app/core/directives/directives.js b/frontend/src/app/core/directives/directives.js deleted file mode 100644 index e1f54d5aa..000000000 --- a/frontend/src/app/core/directives/directives.js +++ /dev/null @@ -1,19 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.directives', []) - .directive('onKeyEnter', function () { - return function (scope, element, attrs) { - element.bind("keydown keypress", function (event) { - if(event.which === 13) { - scope.$apply(function (){ - scope.$eval(attrs.onKeyEnter); - }); - - event.preventDefault(); - } - }); - }; - }); -}()); diff --git a/frontend/src/app/core/directives/partials/ListSearch.html b/frontend/src/app/core/directives/partials/ListSearch.html deleted file mode 100644 index 05a1c9d35..000000000 --- a/frontend/src/app/core/directives/partials/ListSearch.html +++ /dev/null @@ -1,52 +0,0 @@ -
-
-
-
- - - - - - - - -
- -
- - Results : - - -
- -
-
-
- diff --git a/frontend/src/app/core/error/error-controllers.js b/frontend/src/app/core/error/error-controllers.js deleted file mode 100644 index 712443c9e..000000000 --- a/frontend/src/app/core/error/error-controllers.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.core.error' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - /** - * Controller for generic error handling. - */ - angular.module('frontend.core.error') - .controller('ErrorController', [ - '$scope', '$state', - '_', - '_error', - function controller( - $scope, $state, - _, - _error - ) { - if (_.isUndefined(_error)) { - return $state.go('auth.login'); - } - - $scope.error = _error; - - } - ]) - ; -}()); diff --git a/frontend/src/app/core/error/error.js b/frontend/src/app/core/error/error.js deleted file mode 100644 index ffe3854f3..000000000 --- a/frontend/src/app/core/error/error.js +++ /dev/null @@ -1,38 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.error', []); - - // Module configuration - angular.module('frontend.core.error') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('error', { - parent: 'frontend', - url: '/error', - data: { - access: 0, - pageName : "Error", - displayName : "error", - prefix : '' - }, - views: { - 'content@': { - templateUrl: '/frontend/core/error/partials/error.html', - controller: 'ErrorController', - resolve: { - _error: function resolve() { - return this.self.error; - } - } - } - } - }) - ; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/error/partials/error.html b/frontend/src/app/core/error/partials/error.html deleted file mode 100644 index c6acab231..000000000 --- a/frontend/src/app/core/error/partials/error.html +++ /dev/null @@ -1,18 +0,0 @@ -

Error occurred

- -

- Damn gerbils have stopped running again! Someone has been dispatched to poke them with a sharp stick. -

- - - -

- - Back to Home - -

\ No newline at end of file diff --git a/frontend/src/app/core/filters/filters.js b/frontend/src/app/core/filters/filters.js deleted file mode 100644 index be4130ade..000000000 --- a/frontend/src/app/core/filters/filters.js +++ /dev/null @@ -1,13 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.filters', []) - - angular.module('frontend.core.filters') - .filter('to_trusted', ['$sce', function($sce){ - return function(text) { - return $sce.trustAsHtml(text); - }; - }]);; -}()); diff --git a/frontend/src/app/core/interceptors/AuthInterceptor.js b/frontend/src/app/core/interceptors/AuthInterceptor.js deleted file mode 100644 index 65b9c1a0d..000000000 --- a/frontend/src/app/core/interceptors/AuthInterceptor.js +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Auth interceptor for HTTP and Socket request. This interceptor will add required - * JWT (Json Web Token) token to each requests. That token is validated in server side - * application. - * - * @see http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/ - * @see http://angular-tips.com/blog/2014/05/json-web-tokens-examples/ - */ -(function() { - 'use strict'; - - angular.module('frontend.core.interceptors') - .factory('AuthInterceptor', [ - '$q', '$injector', '$localStorage', - function( - $q, $injector, $localStorage - ) { - return { - /** - * Interceptor method for $http requests. Main purpose of this method is to add JWT token - * to every request that application does. - * - * @param {*} config HTTP request configuration - * - * @returns {*} - */ - request: function requestCallback(config) { - var token; - - // Yeah we have some user data on local storage - if ($localStorage.credentials) { - token = $localStorage.credentials.token; - } - - // Yeah we have a token - if (token) { - if (!config.data) { - config.data = {}; - } - - /** - * Set token to actual data and headers. Note that we need bot ways because of socket cannot modify - * headers anyway. These values are cleaned up in backend side policy (middleware). - */ - config.data.token = token; - config.headers.authorization = 'Bearer ' + token; - - - } - - return config; - }, - - /** - * Interceptor method that is triggered whenever response error occurs on $http requests. - * - * @param {*} response - * - * @returns {*|Promise} - */ - responseError: function responseErrorCallback(response) { - if (response.status === 401) { - $localStorage.$reset(); - - $injector.get('$state').go('auth.login'); - } - - return $q.reject(response); - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/interceptors/ErrorInterceptor.js b/frontend/src/app/core/interceptors/ErrorInterceptor.js deleted file mode 100644 index 51c2f97e7..000000000 --- a/frontend/src/app/core/interceptors/ErrorInterceptor.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Interceptor for $http and $sailSocket request to handle possible errors and show - * that error to user automatically. Message is shown by application 'Message' service - * which uses noty library. - * - * @todo Add option to skip showing automatic error message - */ -(function() { - 'use strict'; - - angular.module('frontend.core.interceptors') - .factory('ErrorInterceptor', [ - '$q', '$injector', - function($q, $injector) { - return { - /** - * Interceptor method which is triggered whenever response occurs on $http queries. Note - * that this has some sails.js specified hack for errors that returns HTTP 200 status. - * - * This is maybe sails.js bug, but I'm not sure of that. - * - * @param {*} response - * - * @returns {*|Promise} - */ - response: function responseCallback(response) { - if (response.data.error && - response.data.status && - response.data.status !== 200 - ) { - return $q.reject(response); - } else { - return response || $q.when(response); - } - }, - - /** - * Interceptor method that is triggered whenever response error occurs on $http requests. - * - * @param {*} response - * - * @returns {*|Promise} - */ - responseError: function responseErrorCallback(response) { - var message = ''; - - if (response.data && response.data.error) { - message = response.data.error; - } else if (response.data && response.data.message) { - message = response.data.message; - } else { - if (typeof response.data === 'string') { - message = response.data; - } else if (response.statusText) { - message = response.statusText; - } else { - message = $injector.get('HttpStatusService').getStatusCodeText(response.status); - } - - message = message + ' (HTTP status ' + response.status + ')'; - } - - if (message) { - $injector.get('MessageService').error(message); - } - - return $q.reject(response); - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/interceptors/KongaIntercenptor.js b/frontend/src/app/core/interceptors/KongaIntercenptor.js deleted file mode 100644 index 8e99e2324..000000000 --- a/frontend/src/app/core/interceptors/KongaIntercenptor.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Auth interceptor for HTTP and Socket request. This interceptor will add required - * JWT (Json Web Token) token to each requests. That token is validated in server side - * application. - * - * @see http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/ - * @see http://angular-tips.com/blog/2014/05/json-web-tokens-examples/ - */ -(function() { - 'use strict'; - - angular.module('frontend.core.interceptors') - .factory('KongaInterceptor', [ - '$q', '$injector', '$localStorage', - function( - $q, $injector, $localStorage - ) { - return { - /** - * Interceptor method for $http requests. Main purpose of this method is to add JWT token - * to every request that application does. - * - * @param {*} config HTTP request configuration - * - * @returns {*} - */ - request: function requestCallback(config) { - - var konga_node_id = ''; - - // Yeah we have some user data on local storage - if ($localStorage.credentials) { - konga_node_id = $localStorage.credentials.user.node_id - } - - config.headers['kong-admin-url'] = konga_node_id; - - return config; - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/interceptors/TemplateCacheInterceptor.js b/frontend/src/app/core/interceptors/TemplateCacheInterceptor.js deleted file mode 100644 index 16eed4eb1..000000000 --- a/frontend/src/app/core/interceptors/TemplateCacheInterceptor.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Interceptor for $http and $sailSocket request to handle possible errors and show - * that error to user automatically. Message is shown by application 'Message' service - * which uses noty library. - * - * @todo Add option to skip showing automatic error message - */ -(function() { - 'use strict'; - - angular.module('frontend.core.interceptors') - .factory('TemplateCacheInterceptor', [ - function() { - return { - request: function( config ) { - if( config.url.indexOf( ".html", config.url.length - ".html".length ) !== -1 ) { - - } - - return config; - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/interceptors/interceptors.js b/frontend/src/app/core/interceptors/interceptors.js deleted file mode 100644 index 23e484873..000000000 --- a/frontend/src/app/core/interceptors/interceptors.js +++ /dev/null @@ -1,6 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.interceptors', []); -}()); diff --git a/frontend/src/app/core/layout/layout-controllers.js b/frontend/src/app/core/layout/layout-controllers.js deleted file mode 100644 index cd5e3a068..000000000 --- a/frontend/src/app/core/layout/layout-controllers.js +++ /dev/null @@ -1,168 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.core.layout' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - /** - * Generic header controller for application layout. this contains all necessary logic which is used on application - * header section. Basically this contains following: - * - * 1) Main navigation - * 2) Login / Logout - * 3) Profile - */ - angular.module('frontend.core.layout') - .controller('HeaderController', [ - '$scope', '$state', - 'HeaderNavigationItems', - 'UserService', 'AuthService', - function controller( - $scope, $state, - HeaderNavigationItems, - UserService, AuthService - ) { - $scope.user = UserService.user; - $scope.auth = AuthService; - $scope.navigationItems = HeaderNavigationItems; - - /** - * Helper function to determine if menu item needs 'not-active' class or not. This is basically - * special case because of 'examples.about' state. - * - * @param {layout.menuItem} item Menu item object - * - * @returns {boolean} - */ - $scope.isNotActive = function isNotActive(item) { - return !!(item.state === 'examples' && $state.current.name === 'examples.about'); - }; - - /** - * Helper function to determine if specified menu item needs 'active' class or not. This is needed - * because of reload of page, in this case top level navigation items are not activated without - * this helper. - * - * @param {layout.menuItem} item Menu item object - * - * @returns {boolean} - */ - $scope.isActive = function isActive(item) { - var bits = $state.current.name.toString().split('.'); - - return !!( - (item.state === $state.current.name) || - (item.state === bits[0]) - ); - }; - - // Simple helper function which triggers user logout action. - $scope.logout = function logout() { - AuthService.logout(); - }; - } - ]) - ; - - /** - * Generic footer controller for application layout. This contains all necessary logic which is used on application - * footer section. Basically this contains following: - * - * 1) Generic links - * 2) Version info parsing (back- and frontend) - */ - angular.module('frontend.core.layout') - .controller('FooterController', ['_','$scope','$state','AuthService', - '$rootScope','NodeModel','SocketHelperService', - function controller(_,$scope,$state,AuthService, - $rootScope,NodeModel,SocketHelperService) { - - var commonParameters = { - where: SocketHelperService.getWhere({ - searchWord: '' - },{ - active:true - }) - }; - - function _triggerFetchData() { - NodeModel.load(_.merge({}, commonParameters, {})) - .then(function(resp){ - setNode(resp[0]) - }).catch(function(err){ - $scope.adminUrl = 'no node defined' - }) - } - - function setNode(node) { - $rootScope.node = node - if(node) { - $scope.adminUrl = $rootScope.node.kong_admin_url; - }else{ - $scope.adminUrl = 'no node defined' - } - - } - - $scope.$on('kong.node.updated',function(ev,node){ - if(node.active) { - setNode(node) - }else{ - _triggerFetchData() - } - }) - - if(AuthService.isAuthenticated()) _triggerFetchData(); - } - ]) - ; - - /** - * Generic navigation controller for application layout. This contains all necessary logic for pages sub-navigation - * section. Basically this handles following: - * - * 1) Sub navigation of the page - * 2) Opening of information modal - */ - angular.module('frontend.core.layout') - .controller('NavigationController', [ - '$scope', '$state', '$modal', - '_items', - function controller( - $scope, $state, $modal, - _items - ) { - $scope.navigationItems = _items; - } - ]) - ; - - /** - * Controller for navigation info modal. This is used to show GUI specified detailed information about how those - * are done (links to sources + generic information / description). - */ - angular.module('frontend.core.layout') - .controller('NavigationModalController', [ - '$scope', '$modalInstance', - 'BackendConfig', - '_title', '_files', '_template', - function( - $scope, $modalInstance, - BackendConfig, - _title, _files, _template - ) { - $scope.title = _title; - $scope.files = _files; - $scope.template = _template; - $scope.backendConfig = BackendConfig; - - // Dismiss function for modal - $scope.dismiss = function dismiss() { - $modalInstance.dismiss(); - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/layout/layout-directives.js b/frontend/src/app/core/layout/layout-directives.js deleted file mode 100644 index e740ffd94..000000000 --- a/frontend/src/app/core/layout/layout-directives.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * This file contains all necessary Angular directive definitions for 'frontend.core.layout' module. - * - * Note that this file should only contain directives and nothing else. - */ -(function() { - 'use strict'; - - /** - * Directive to build file links to information modal about current GUI. Actual files are passed to this directive - * within modal open function. - */ - angular.module('frontend.core.layout') - .directive('pageInfoFiles', function directive() { - return { - restrict: 'E', - replace: true, - scope: { - 'files': '@' - }, - templateUrl: '/frontend/core/layout/partials/files.html', - controller: [ - '$scope', - function controller($scope) { - try { - $scope.filesJson = angular.fromJson($scope.files); - } catch (error) { - $scope.filesJson = false; - } - - $scope.getTooltip = function getTooltip(item) { - return '
' + item.title + '
' + item.info; - }; - } - ] - }; - }) - ; -}()); diff --git a/frontend/src/app/core/layout/layout-services.js b/frontend/src/app/core/layout/layout-services.js deleted file mode 100644 index eea9c3fa7..000000000 --- a/frontend/src/app/core/layout/layout-services.js +++ /dev/null @@ -1,462 +0,0 @@ -/** - * This file contains all necessary Angular service definitions for 'frontend.core.layout' module. - * - * Note that this file should only contain services and nothing else. - */ -(function() { - 'use strict'; - - // Generic service to return all available menu items for main level navigation. - angular.module('frontend.core.layout') - .factory('HeaderNavigationItems', [ - 'AccessLevels','AuthService', - function factory(AccessLevels,AuthService) { - return [ - { - state: 'dashboard', - show : function() { - return AuthService.isAuthenticated() - }, - title: 'Dashboard', - access: AccessLevels.user - }, - { - state: 'info', - show : function() { - return AuthService.isAuthenticated() - }, - title: 'Node info', - access: AccessLevels.user - }, - { - state: 'apis', - show : function() { - return AuthService.isAuthenticated() - }, - title: 'APIs', - access: AccessLevels.user - }, - { - state: 'consumers', - show : function() { - return AuthService.isAuthenticated() - }, - title: 'Consumers', - access: AccessLevels.user - }, - { - state: 'plugins', - show : function() { - return AuthService.isAuthenticated() - }, - title: 'Plugins', - access: AccessLevels.anon - } - ]; - } - ]) - ; - - // Generic service to return all available menu items for specified sub level navigation. - angular.module('frontend.core.layout') - .factory('ContentNavigationItems', [ - 'AccessLevels', - function factory(AccessLevels) { - var items = { - 'examples': [ - { - state: 'admin.info', - title: 'Dashboard', - access: AccessLevels.user - }, - { - state: '', - title: 'Apis', - access: AccessLevels.admin - }, - { - state: '', - title: 'Consumers', - access: AccessLevels.admin - }, - ], - 'admin': [ - { - state: 'admin.info', - title: 'Dashboard', - access: AccessLevels.admin - }, - { - state: '', - title: 'Apis', - access: AccessLevels.admin - }, - { - state: '', - title: 'Consumers', - access: AccessLevels.admin - }, - //{ - // state: '', - // title: 'Users', - // access: AccessLevels.admin - //}, - //{ - // state: '', - // title: 'Request log', - // access: AccessLevels.admin - //}, - //{ - // state: 'admin.login-history', - // title: 'Login history', - // access: AccessLevels.admin - //} - ] - }; - - return { - getItems: function getItems(section) { - return items[section]; - } - }; - } - ]) - ; - - /** - * Service which contains information about all used files (back- and frontend) within specified example page. - * These files are shown in example page info modal, so that users can easily see what current example page is - * using to do things. - */ - angular.module('frontend.core.layout') - .factory('NavigationInfoModalFiles', [ - '_', - function factory(_) { - /** - * Base url for code repository. - * - * @type {string} - */ - var repository = 'https://github.com/tarlepp/angular-sailsjs-boilerplate/blob/master/'; - - /** - * Type configuration for files. - * - * @type {{ - * generic: { - * controller: string, - * data: string, - * model: string, - * template: string - * }, - * backend: { - * baseController: string, - * baseModel: string - * }, - * frontend: { - * module: string, - * listConfig: string - * } - * }} - */ - var types = { - generic: { - controller: 'Used controller.', - data: 'Initial data that is loaded to database at first time that sails lift.', - model: 'Used model.', - template: 'Used HTML template.' - }, - backend: { - baseController: 'Generic base controller that is extended by real controllers.', - baseModel: 'Generic base model that is extended by real models.', - policy: { - authenticated: 'Authentication policy that will check if request contains correct JWT or not.', - passport: 'Policy to initialize passport.js library to use.' - } - }, - frontend: { - module: 'Current angular module configuration.', - modelFactory: 'Generic model factory that all individual models uses. This contains default functions for each model.', - dataService: 'Generic data service, which handles all the communications between back- and frontend via $sailsSocket service.', - listConfig: 'Service that contains all list specified configurations (title items, default configurations, etc.).', - backendConfig: 'Backend config, this contains backend url and other "static" backend specified definitions.', - authInterceptor: 'Authentication interceptor, that attach JWT to $http and $sailsSockets requests.', - errorInterceptor: 'Generic error interceptor, this will handle all error situations and shows those to user.', - directive: 'Used directive(s) in this example page.' - } - }; - - /** - * Generic files that are used across each GUI example. - * - * @type {{}} - */ - var generic = { - 'backend': { - 'Backend generic': [ - { - url: repository + 'backend/api/base/controller.js', - title: 'controller.js', - info: types.backend.baseController - }, - { - url: repository + 'backend/api/base/model.js', - title: 'model.js', - info: types.backend.baseModel - }, - { - url: repository + 'backend/api/policies/Authenticated.js', - title: 'Authenticated.js', - info: types.backend.policy.authenticated - }, - { - url: repository + 'backend/api/policies/Passport.js', - title: 'Passport.js', - info: types.backend.policy.passport - } - ] - }, - 'frontend': { - 'Frontend generic': [ - { - url: repository + 'frontend/src/app/core/services/ListConfigService.js', - title: 'ListConfigService.js', - info: types.frontend.listConfig - }, - { - url: repository + 'frontend/src/app/core/models/factory.js', - title: 'factory.js', - info: types.frontend.modelFactory - }, - { - url: repository + 'frontend/src/app/core/services/DataService.js', - title: 'DataService.js', - info: types.frontend.dataService - }, - { - url: repository + 'frontend/src/app/core/constants/BackendConfig.js', - title: 'BackendConfig.js', - info: types.frontend.backendConfig - }, - { - url: repository + 'frontend/src/app/core/interceptors/AuthInterceptor.js', - title: 'AuthInterceptor.js', - info: types.frontend.authInterceptor - }, - { - url: repository + 'frontend/src/app/core/interceptors/ErrorInterceptor.js', - title: 'ErrorInterceptor.js', - info: types.frontend.errorInterceptor - } - ] - } - }; - - /** - * Actual data for each example page. This data contains used files in each example GUI item, these - * files are grouped to following sections: - * - backend - * - backend (generic) - * - frontend - * - frontend (generic) - * - * @type {{}} - */ - var data = { - 'examples.books': { - 'Backend': [ - { - url: repository + 'backend/api/models/Book.js', - title: 'Book.js', - info: types.generic.model - }, - { - url: repository + 'backend/api/controllers/BookController.js', - title: 'BookController.js', - info: types.generic.controller - }, - { - url: repository + 'backend/test/fixtures/Book.json', - title: 'Book.json', - info: types.generic.data - } - ], - 'Frontend': [ - { - url: repository + 'frontend/src/app/examples/book/book.js', - title: 'book.js', - info: types.frontend.module - }, - { - url: repository + 'frontend/src/app/examples/book/book-controllers.js', - title: 'book-controllers.js', - info: types.generic.controller - }, - { - url: repository + 'frontend/src/app/examples/book/book-models.js', - title: 'book-models.js', - info: types.generic.model - }, - { - url: repository + 'frontend/src/app/examples/book/list.html', - title: 'list.html', - info: types.generic.template - } - ] - }, - 'examples.authors': { - 'Backend': [ - { - url: repository + 'backend/api/models/Author.js', - title: 'Author.js', - info: types.generic.model - }, - { - url: repository + 'backend/api/controllers/AuthorController.js', - title: 'AuthorController.js', - info: types.generic.controller - }, - { - url: repository + 'backend/test/fixtures/Author.json', - title: 'Author.json', - info: types.generic.data - } - ], - 'Frontend': [ - { - url: repository + 'frontend/src/app/examples/author/author.js', - title: 'author.js', - info: types.frontend.module - }, - { - url: repository + 'frontend/src/app/examples/author/author-controllers.js', - title: 'author-controllers.js', - info: types.generic.controller - }, - { - url: repository + 'frontend/src/app/examples/author/author-models.js', - title: 'author-models.js', - info: types.generic.model - }, - { - url: repository + 'frontend/src/app/examples/author/list.html', - title: 'list.html', - info: types.generic.template - } - ] - }, - 'examples.messages': { - 'Frontend': [ - { - url: repository + 'frontend/src/app/examples/messages/messages.js', - title: 'messages.js', - info: types.frontend.module - }, - { - url: repository + 'frontend/src/app/examples/messages/messages-controllers.js', - title: 'messages-controllers.js', - info: types.generic.controller - }, - { - url: repository + 'frontend/src/app/examples/messages/messages.html', - title: 'messages.html', - info: types.generic.template - } - ], - 'Frontend generic': [ - { - url: repository + 'frontend/src/app/core/interceptors/ErrorInterceptor.js', - title: 'ErrorInterceptor.js', - info: types.frontend.errorInterceptor - }, - { - url: repository + 'frontend/src/app/core/services/MessageService.js', - title: 'MessageService.js', - info: 'Service to show messages to users via toastr service.' - }, - { - url: repository + 'frontend/src/app/core/services/HttpStatusService.js', - title: 'HttpStatusService.js', - info: 'Generic HTTP status service that contains helper methods for HTTP status code handling.' - } - ] - }, - 'examples.chat': { - 'Backend': [ - { - url: repository + 'backend/api/models/Message.js', - title: 'Message.js', - info: types.generic.model - }, - { - url: repository + 'backend/api/controllers/MessageController.js', - title: 'MessageController.js', - info: types.generic.controller - } - ], - 'Frontend': [ - { - url: repository + 'frontend/src/app/examples/chat/chat.js', - title: 'chat.js', - info: types.frontend.module - }, - { - url: repository + 'frontend/src/app/examples/chat/chat-controllers.js', - title: 'chat-controllers.js', - info: types.generic.controller - }, - { - url: repository + 'frontend/src/app/examples/chat/chat-directives.js', - title: 'chat-directives.js', - info: types.frontend.directive - }, - { - url: repository + 'frontend/src/app/examples/chat/chat-models.js', - title: 'chat-models.js', - info: types.generic.model - }, - { - url: repository + 'frontend/src/app/examples/chat/chat.html', - title: 'chat.html', - info: types.generic.template - } - ] - } - }; - - return { - /** - * Service function to fetch all defined backend and frontend used files. - * - * @returns {{}} All the file definitions - */ - getAll: function getAll() { - return data; - }, - /** - * Service function to fetch specified GUI used backend and frontend used files. - * - * @param {string} state - * - * @returns {{}} - */ - get: function get(state) { - var files = data[state]; - - switch (state) { - case 'examples.books': - case 'examples.authors': - case 'examples.chat': - files = _.merge(files, generic.backend, generic.frontend); - break; - default: - break; - } - - return files; - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/layout/layout.js b/frontend/src/app/core/layout/layout.js deleted file mode 100644 index 70305f18a..000000000 --- a/frontend/src/app/core/layout/layout.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Layout component to wrap all core layout specified stuff together. This component is divided to following logical - * components: - * - * Controllers - * Directives - * Services - * - * All of these are wrapped to 'frontend.core.layout' angular module. - */ -(function() { - 'use strict'; - - angular.module('frontend.core.layout', []); -}()); diff --git a/frontend/src/app/core/layout/partials/files.html b/frontend/src/app/core/layout/partials/files.html deleted file mode 100644 index 93bef40e7..000000000 --- a/frontend/src/app/core/layout/partials/files.html +++ /dev/null @@ -1,25 +0,0 @@ -
-

Files used in this example

- -

- Below you can see all the actual backend / frontend files which are used to make this example page work. -

- -
-
-
- -
    -
  • - -
  • -
-
-
-
diff --git a/frontend/src/app/core/layout/partials/footer.html b/frontend/src/app/core/layout/partials/footer.html deleted file mode 100644 index c907b9aa5..000000000 --- a/frontend/src/app/core/layout/partials/footer.html +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/app/core/layout/partials/header.html b/frontend/src/app/core/layout/partials/header.html deleted file mode 100644 index 471828a5f..000000000 --- a/frontend/src/app/core/layout/partials/header.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - diff --git a/frontend/src/app/core/layout/partials/help.html b/frontend/src/app/core/layout/partials/help.html deleted file mode 100644 index e4399a5ef..000000000 --- a/frontend/src/app/core/layout/partials/help.html +++ /dev/null @@ -1,19 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/app/core/layout/partials/navigation.html b/frontend/src/app/core/layout/partials/navigation.html deleted file mode 100644 index e91b88912..000000000 --- a/frontend/src/app/core/layout/partials/navigation.html +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/frontend/src/app/core/layout/partials/sidebar.html b/frontend/src/app/core/layout/partials/sidebar.html deleted file mode 100644 index 8c33d7410..000000000 --- a/frontend/src/app/core/layout/partials/sidebar.html +++ /dev/null @@ -1,9 +0,0 @@ - - diff --git a/frontend/src/app/core/layout/partials/uiBreadcrumbs.tpl.html b/frontend/src/app/core/layout/partials/uiBreadcrumbs.tpl.html deleted file mode 100644 index d20e8cf01..000000000 --- a/frontend/src/app/core/layout/partials/uiBreadcrumbs.tpl.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/app/core/libraries/LoDash.js b/frontend/src/app/core/libraries/LoDash.js deleted file mode 100644 index 98bab2673..000000000 --- a/frontend/src/app/core/libraries/LoDash.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Angular service to inject lo-dash library to your controllers. - * - * Usage example in controller: - * - * angular - * .module('app') - * .controller('SomeController', - * [ - * '$scope', '_', - * function ($scope, _) { - * var foo = _.map(data, function(foo) { return foo.bar = 'foobar'; }); - * } - * ] - * ); - * - * With this you can use lo-dash library easily in your controllers. - */ -(function() { - 'use strict'; - - angular.module('frontend.core.libraries') - .factory('_', [ - '$window', - function factory($window) { - return $window._; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/libraries/libraries.js b/frontend/src/app/core/libraries/libraries.js deleted file mode 100644 index ce07efd06..000000000 --- a/frontend/src/app/core/libraries/libraries.js +++ /dev/null @@ -1,6 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.libraries', []); -}()); diff --git a/frontend/src/app/core/models/DataModel.js b/frontend/src/app/core/models/DataModel.js deleted file mode 100644 index 2f7259555..000000000 --- a/frontend/src/app/core/models/DataModel.js +++ /dev/null @@ -1,464 +0,0 @@ -/** - * This file contains generic model factory that will return a specified model instance for desired endpoint with - * given event handlers. Basically all of this boilerplate application individual models are using this service to - * generate real model. - */ -(function() { - 'use strict'; - - angular.module('frontend.core.models') - .factory('DataModel', [ - '$sailsSocket', '$log', - '_', - 'DataService', - function( - $sailsSocket, $log, - _, - DataService - ) { - /** - * Constructor for actual data model. - * - * @param {string} [endpoint] Name of the API endpoint - * @constructor - */ - var DataModel = function(endpoint) { - // Initialize default values. - this.object = {}; - this.objects = []; - - // Cache parameters - this.cache = { - count: {}, - fetch: {}, - load: {} - }; - - // Is scope used with data model or not, if yes this is actual scope - this.scope = false; - - // Scope item names for single, collection and count - this.itemNames = { - object: false, - objects: false, - count: false - }; - - // Subscribe to specified endpoint - if (endpoint) { - this.endpoint = endpoint; - - this._subscribe(); - } else { - this.endpoint = false; - } - }; - - //noinspection JSUnusedGlobalSymbols - /** - * Service function to set used model endpoint. Note that this will also trigger subscribe for - * this endpoint actions (created, updated, deleted, etc.). - * - * @param {string} endpoint Model endpoint definition - */ - DataModel.prototype.setEndpoint = function setEndpoint(endpoint) { - var self = this; - - // Set used endpoint - self.endpoint = endpoint; - - // Subscribe to specified endpoint - self._subscribe(); - }; - - /** - * Service function to set used model and 'item' names which are updated on specified scope when - * socket events occurs. - * - * @param {{}} scope - * @param {string|boolean} [nameObject] - * @param {string|boolean} [nameObjects] - * @param {string|boolean} [nameCount] - */ - DataModel.prototype.setScope = function setScope(scope, nameObject, nameObjects, nameCount) { - var self = this; - - self.scope = scope; - self.itemNames = { - object: nameObject || false, - objects: nameObjects || false, - count: nameCount || false - }; - }; - - //noinspection JSUnusedGlobalSymbols - /** - * Default behaviour for created objects for specified endpoint. If you need some custom logic - * for your model, just overwrite this function on your model. - * - * @param {{ - * verb: String, - * data: {}, - * id: Number, - * [previous]: {} - * }} message - */ - DataModel.prototype.handlerCreated = function handlerCreated(message) { - var self = this; - - $log.log('Object created', self.endpoint, message); - - // Scope is set, so we need to load collection and determine count again - if (self.scope) { - if (self.itemNames.objects) { - self.load(null, true); - } - - if (self.itemNames.count) { - self.count(null, true); - } - } - }; - - //noinspection JSUnusedGlobalSymbols - /** - * Default behaviour for updated objects for specified endpoint. If you need some custom logic - * for your model, just overwrite this function on your model. - * - * @param {{ - * verb: String, - * data: {}, - * id: Number, - * [previous]: {} - * }} message - */ - DataModel.prototype.handlerUpdated = function handlerUpdated(message) { - var self = this; - - $log.log('Object updated', self.endpoint, message); - - // Scope is set, so we need to fetch collection and object data again - if (self.scope) { - if (self.itemNames.object && parseInt(message.id, 10) === parseInt(self.object.id, 10)) { - self.fetch(null, null, true); - } - - if (self.itemNames.objects) { - self.load(null, true); - } - } - }; - - //noinspection JSUnusedGlobalSymbols - /** - * Default behaviour for deleted objects for specified endpoint. If you need some custom logic - * for your model, just overwrite this function on your model. - * - * @param {{ - * verb: String, - * data: {}, - * id: Number, - * [previous]: {} - * }} message - */ - DataModel.prototype.handlerDeleted = function handlerDeleted(message) { - var self = this; - - $log.log('Object deleted', self.endpoint, message); - - // Scope is set, so we need to fetch collection and object data again - if (self.scope) { - if (self.itemNames.object && parseInt(message.id, 10) === parseInt(self.object.id, 10)) { - $log.warn('How to handle this case?'); - } - - if (self.itemNames.objects) { - self.load(null, true); - } - - if (self.itemNames.count) { - self.count(null, true); - } - } - }; - - //noinspection JSUnusedGlobalSymbols - /** - * Default behaviour for addedTo events for specified endpoint. If you need some custom logic for - * your model, just overwrite this function on your model. - * - * @param {{ - * verb: String, - * data: {}, - * id: Number, - * [previous]: {} - * }} message - */ - DataModel.prototype.handlerAddedTo = function handlerAddedTo(message) { - var self = this; - - $log.log('AddedTo', self.endpoint, message); - }; - - //noinspection JSUnusedGlobalSymbols - /** - * Default behaviour for removedFrom events for specified endpoint. If you need some custom logic - * for your model, just overwrite this function on your model. - * - * @param {{ - * verb: String, - * data: {}, - * id: Number, - * [previous]: {} - * }} message - */ - DataModel.prototype.handlerRemovedFrom = function handlerRemovedFrom(message) { - var self = this; - - $log.log('RemovedFrom', self.endpoint, message); - }; - - /** - * Service function to return count of objects with specified parameters. - * - * @param {{}} [parameters] Query parameters - * @param {Boolean} [fromCache] Fetch with cache parameters - * - * @returns {Promise|models.count} - */ - DataModel.prototype.count = function count(parameters, fromCache) { - var self = this; - - // Normalize parameters - parameters = parameters || {}; - fromCache = fromCache || false; - - if (fromCache) { - parameters = self.cache.count.parameters; - } else { - // Store used parameters - self.cache.count = { - parameters: parameters - }; - } - - return DataService - .count(self.endpoint, parameters) - .then( - function onSuccess(response) { - if (fromCache && self.scope && self.itemNames.count) { - self.scope[self.itemNames.count] = response.data.count; - } - - return response.data; - }, - function onError(error) { - $log.error('DataModel.count() failed.', error, self.endpoint, parameters); - } - ) - ; - }; - - /** - * Service function to load objects from specified endpoint with given parameters. Note that this - * function will also store those objects to current service instance. - * - * @param {{}} [parameters] Query parameters - * @param {Boolean} [fromCache] Fetch with cache parameters - * - * @returns {Promise|*} - */ - DataModel.prototype.load = function load(parameters, fromCache) { - var self = this; - - // Normalize parameters - parameters = parameters || {}; - fromCache = fromCache || false; - - if (fromCache) { - parameters = self.cache.load.parameters; - } else { - // Store used parameters - self.cache.load = { - parameters: parameters - }; - } - - return DataService - .collection(self.endpoint, parameters) - .then( - function onSuccess(response) { - self.objects = response.data; - - if (fromCache && self.scope && self.itemNames.objects) { - self.scope[self.itemNames.objects] = self.objects; - } - - return self.objects; - }, - function onError(error) { - $log.error('DataModel.load() failed.', error, self.endpoint, parameters); - } - ) - ; - }; - - /** - * Service function to load single object from specified endpoint with given parameters. Note that - * this will also store fetched object to current instance of this service. - * - * @param {Number} identifier Object identifier - * @param {{}} [parameters] Query parameters - * @param {Boolean} [fromCache] Fetch with cache parameters - * - * @returns {Promise|*} - */ - DataModel.prototype.fetch = function fetch(identifier, parameters, fromCache) { - var self = this; - - // Normalize parameters - parameters = parameters || {}; - fromCache = fromCache || false; - - if (fromCache) { - identifier = self.cache.fetch.identifier; - parameters = self.cache.fetch.parameters; - } else { - // Store identifier and used parameters to cache - self.cache.fetch = { - identifier: identifier, - parameters: parameters - }; - } - - return DataService - .fetch(self.endpoint, identifier, parameters) - .then( - function onSuccess(response) { - self.object = response.data; - - if (fromCache && self.scope && self.itemNames.object) { - self.scope[self.itemNames.object] = self.object; - } - - return self.object; - }, - function onError(error) { - $log.error('DataModel.fetch() failed.', error, self.endpoint, identifier, parameters); - } - ) - ; - }; - - /** - * Service function to create new object to current model endpoint. Note that this will also - * trigger 'handleMessage' service function, which will handle all necessary updates to current - * service instance. - * - * @param {{}} data Object data to create - * - * @returns {Promise|*} - */ - DataModel.prototype.create = function create(data) { - var self = this; - - return DataService - .create(self.endpoint, data) - }; - - /** - * Service function to update specified object in current model endpoint. Note that this will also - * trigger 'handleMessage' service function, which will handle all necessary updates to current - * service instance. - * - * @param {Number} identifier Object identifier - * @param {{}} data Object data to update - * - * @returns {Promise|*} - */ - DataModel.prototype.update = function update(identifier, data) { - var self = this; - - - return DataService - .update(self.endpoint, identifier, data); - }; - - /** - * Service function to delete specified object from current model endpoint. Note that this will - * also trigger 'handleMessage' service function, which will handle all necessary updates to - * current service instance. - * - * @param {Number} identifier Object identifier - * - * @returns {Promise|*} - */ - DataModel.prototype.delete = function deleteObject(identifier) { - var self = this; - - return DataService - .delete(self.endpoint, identifier) - .then( - function onSuccess(result) { - return result; - }, - function onError(error) { - $log.error('DataModel.delete() failed.', error, self.endpoint, identifier); - } - ) - ; - }; - - /** - * Service function to subscribe model socket events. This is needed to update model data according - * to another users updates (create, update, delete, etc.) within this model. Basically this will - * just trigger one of following service function calls: - * - * - handlerCreated - * - handlerUpdated - * - handlerDeleted - * - handlerAddedTo - * - handlerRemovedFrom - * - * @private - */ - DataModel.prototype._subscribe = function subscribe() { - var self = this; - - // Actual subscribe - $sailsSocket - .subscribe(self.endpoint, function modelEvent(message) { - // Handle socket event - self._handleEvent(message); - }) - ; - }; - - /** - * Generic event handler for model events (created, updated, deleted, etc.). This function is - * called from model socket events and 'create', 'update' and 'delete' service function. - * - * @param {{ - * verb: String, - * data: {}, - * id: Number - * }} message Message to handle - * - * @private - */ - DataModel.prototype._handleEvent = function handleEvent(message) { - var self = this; - var method = 'handler' + message.verb[0].toUpperCase() + message.verb.slice(1); - - if (_.isFunction(self[method])) { - self[method](message); - } else { - $log.log('Implement handling for \'' + message.verb + '\' socket messages'); - } - }; - - return DataModel; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/models/models.js b/frontend/src/app/core/models/models.js deleted file mode 100644 index 923de2b69..000000000 --- a/frontend/src/app/core/models/models.js +++ /dev/null @@ -1,6 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.models', []); -}()); diff --git a/frontend/src/app/core/plugins/angular-matchheight.js b/frontend/src/app/core/plugins/angular-matchheight.js deleted file mode 100644 index be4007e13..000000000 --- a/frontend/src/app/core/plugins/angular-matchheight.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Angular Match Height - * An angular directive to match heights of divs - * - */ - -angular.module('angular-matchheight', []) - .directive('ilnMatchHeight', [ - function () { - - var elems = []; - - function updateHeights(matchHeights) { - var elemHeights = []; - - for(var i = 0; i < elems.length; i++) { - elems[i].css('height', ''); - elemHeights.push(elems[i][0].offsetHeight); - } - - if(matchHeights == false) { - return; - } - - var maxHeight = Math.max.apply(Math, elemHeights); - - for(var i = 0; i < elems.length; i++) { - elems[i].css('height', maxHeight+'px'); - } - } - - return { - restrict: 'A', - scope: { - updateOnChange: '=', - enableWhen: '=' - }, - link: function (scope, elem, attrs) { - elems.push(elem); - - scope.$watch(elems, function() { - updateHeights(); - }); - - scope.$on('$destroy', function() { - elems = []; - }); - - if(scope.updateOnChange) { - scope.$watch('updateOnChange', function() { - updateHeights(scope.enableWhen); - }); - } - } - }; - } - ]); \ No newline at end of file diff --git a/frontend/src/app/core/plugins/material.spinner.js b/frontend/src/app/core/plugins/material.spinner.js deleted file mode 100644 index bcbda2328..000000000 --- a/frontend/src/app/core/plugins/material.spinner.js +++ /dev/null @@ -1,171 +0,0 @@ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof module === 'object' && module.exports) { - // Node/CommonJS - module.exports = factory(require('jquery')); - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o600)){n=e.fix(n,!0,t);if(i){n=n.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(e,t,n){return/^([a-z]{3,10}:|#)/i.test(n)?e:/^\/\//.test(n)?'url("'+s+n+'")':/^\//.test(n)?'url("'+o+n+'")':/^\?/.test(n)?'url("'+u+n+'")':'url("'+i+n+'")'});var r=i.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g,"\\$1");n=n.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+r,"gi"),"$1")}var l=document.createElement("style");l.textContent=n;l.media=t.media;l.disabled=t.disabled;l.setAttribute("data-href",t.getAttribute("href"));a.insertBefore(l,t);a.removeChild(t);l.media=t.media}};try{f.open("GET",r);f.send(null)}catch(n){if(typeof XDomainRequest!="undefined"){f=new XDomainRequest;f.onerror=f.onprogress=function(){};f.onload=l;f.open("GET",r);f.send(null)}}t.setAttribute("data-inprogress","")},styleElement:function(t){if(t.hasAttribute("data-noprefix"))return;var n=t.disabled;t.textContent=e.fix(t.textContent,!0,t);t.disabled=n},styleAttribute:function(t){var n=t.getAttribute("style");n=e.fix(n,!1,t);t.setAttribute("style",n)},process:function(){t('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);t("style").forEach(StyleFix.styleElement);t("[style]").forEach(StyleFix.styleAttribute)},register:function(t,n){(e.fixers=e.fixers||[]).splice(n===undefined?e.fixers.length:n,0,t)},fix:function(t,n,r){for(var i=0;i-1&&(e=e.replace(/(\s|:|,)(repeating-)?linear-gradient\(\s*(-?\d*\.?\d*)deg/ig,function(e,t,n,r){return t+(n||"")+"linear-gradient("+(90-r)+"deg"}));e=t("functions","(\\s|:|,)","\\s*\\(","$1"+s+"$2(",e);e=t("keywords","(\\s|:)","(\\s|;|\\}|$)","$1"+s+"$2$3",e);e=t("properties","(^|\\{|\\s|;)","\\s*:","$1"+s+"$2:",e);if(n.properties.length){var o=RegExp("\\b("+n.properties.join("|")+")(?!:)","gi");e=t("valueProperties","\\b",":(.+?);",function(e){return e.replace(o,s+"$1")},e)}if(r){e=t("selectors","","\\b",n.prefixSelector,e);e=t("atrules","@","\\b","@"+s+"$1",e)}e=e.replace(RegExp("-"+s,"g"),"-");e=e.replace(/-\*-(?=[a-z]+)/gi,n.prefix);return e},property:function(e){return(n.properties.indexOf(e)>=0?n.prefix:"")+e},value:function(e,r){e=t("functions","(^|\\s|,)","\\s*\\(","$1"+n.prefix+"$2(",e);e=t("keywords","(^|\\s)","(\\s|$)","$1"+n.prefix+"$2$3",e);n.valueProperties.indexOf(r)>=0&&(e=t("properties","(^|\\s|,)","($|\\s|,)","$1"+n.prefix+"$2$3",e));return e},prefixSelector:function(e){return e.replace(/^:{1,2}/,function(e){return e+n.prefix})},prefixProperty:function(e,t){var r=n.prefix+e;return t?StyleFix.camelCase(r):r}};(function(){var e={},t=[],r={},i=getComputedStyle(document.documentElement,null),s=document.createElement("div").style,o=function(n){if(n.charAt(0)==="-"){t.push(n);var r=n.split("-"),i=r[1];e[i]=++e[i]||1;while(r.length>3){r.pop();var s=r.join("-");u(s)&&t.indexOf(s)===-1&&t.push(s)}}},u=function(e){return StyleFix.camelCase(e)in s};if(i.length>0)for(var a=0;a").attr({"class":"keyframe-style",id:e,type:"text/css"}).appendTo("head")};$.keyframe={getVendorPrefix:function(){return t},isSupported:function(){return e},generate:function(e){var i=e.name||"",r="@"+t+"keyframes "+i+" {";for(var o in e)if("name"!==o){r+=o+" {";for(var f in e[o])r+=f+":"+e[o][f]+";";r+="}"}r=PrefixFree.prefixCSS(r+"}");var s=$("style#"+e.name);if(s.length>0){s.html(r);var m=$("*").filter(function(){this.style[n+"Name"]===i});m.each(function(){var e,n;e=$(this),n=e.data("keyframeOptions"),e.resetKeyframe(function(){e.playKeyframe(n)})})}else a(i).append(r)},define:function(e){if(e.length)for(var n=0;n - */ - - -(function() { - - /** - * Config - */ - var moduleName = 'angularUtils.directives.uiBreadcrumbs'; - var templateUrl = 'directives/uiBreadcrumbs/uiBreadcrumbs.tpl.html'; - - /** - * Module - */ - var module; - try { - module = angular.module(moduleName); - } catch(err) { - // named module does not exist, so create one - module = angular.module(moduleName, ['ui.router']); - } - - module.directive('uiBreadcrumbs', ['$interpolate', '$state', function($interpolate, $state) { - return { - restrict: 'E', - templateUrl: function(elem, attrs) { - return attrs.templateUrl || templateUrl; - }, - scope: { - displaynameProperty: '@', - abstractProxyProperty: '@?' - }, - link: function(scope) { - scope.breadcrumbs = []; - if ($state.$current.name !== '') { - updateBreadcrumbsArray(); - } - scope.$on('$stateChangeSuccess', function() { - updateBreadcrumbsArray(); - }); - - /** - * Start with the current state and traverse up the path to build the - * array of breadcrumbs that can be used in an ng-repeat in the template. - */ - function updateBreadcrumbsArray() { - var workingState; - var displayName; - var breadcrumbs = []; - var currentState = $state.$current; - - while(currentState && currentState.name !== '') { - workingState = getWorkingState(currentState); - if (workingState) { - displayName = getDisplayName(workingState); - - if (displayName !== false && !stateAlreadyInBreadcrumbs(workingState, breadcrumbs)) { - breadcrumbs.push({ - displayName: displayName, - route: workingState.name - }); - } - } - currentState = currentState.parent; - } - breadcrumbs.reverse(); - scope.breadcrumbs = breadcrumbs; - } - - /** - * Get the state to put in the breadcrumbs array, taking into account that if the current state is abstract, - * we need to either substitute it with the state named in the `scope.abstractProxyProperty` property, or - * set it to `false` which means this breadcrumb level will be skipped entirely. - * @param currentState - * @returns {*} - */ - function getWorkingState(currentState) { - var proxyStateName; - var workingState = currentState; - if (currentState.abstract === true) { - if (typeof scope.abstractProxyProperty !== 'undefined') { - proxyStateName = getObjectValue(scope.abstractProxyProperty, currentState); - if (proxyStateName) { - workingState = angular.copy($state.get(proxyStateName)); - if (workingState) { - workingState.locals = currentState.locals; - } - } else { - workingState = false; - } - } else { - workingState = false; - } - } - return workingState; - } - - /** - * Resolve the displayName of the specified state. Take the property specified by the `displayname-property` - * attribute and look up the corresponding property on the state's config object. The specified string can be interpolated against any resolved - * properties on the state config object, by using the usual {{ }} syntax. - * @param currentState - * @returns {*} - */ - function getDisplayName(currentState) { - var interpolationContext; - var propertyReference; - var displayName; - - if (!scope.displaynameProperty) { - // if the displayname-property attribute was not specified, default to the state's name - return currentState.name; - } - propertyReference = getObjectValue(scope.displaynameProperty, currentState); - - if (propertyReference === false) { - return false; - } else if (typeof propertyReference === 'undefined') { - return currentState.name; - } else { - // use the $interpolate service to handle any bindings in the propertyReference string. - interpolationContext = (typeof currentState.locals !== 'undefined') ? currentState.locals.globals : currentState; - displayName = $interpolate(propertyReference)(interpolationContext); - return displayName; - } - } - - /** - * Given a string of the type 'object.property.property', traverse the given context (eg the current $state object) and return the - * value found at that path. - * - * @param objectPath - * @param context - * @returns {*} - */ - function getObjectValue(objectPath, context) { - var i; - var propertyArray = objectPath.split('.'); - var propertyReference = context; - - for (i = 0; i < propertyArray.length; i ++) { - if (angular.isDefined(propertyReference[propertyArray[i]])) { - propertyReference = propertyReference[propertyArray[i]]; - } else { - // if the specified property was not found, default to the state's name - return undefined; - } - } - return propertyReference; - } - - /** - * Check whether the current `state` has already appeared in the current breadcrumbs array. This check is necessary - * when using abstract states that might specify a proxy that is already there in the breadcrumbs. - * @param state - * @param breadcrumbs - * @returns {boolean} - */ - function stateAlreadyInBreadcrumbs(state, breadcrumbs) { - var i; - var alreadyUsed = false; - for(i = 0; i < breadcrumbs.length; i++) { - if (breadcrumbs[i].route === state.name) { - alreadyUsed = true; - } - } - return alreadyUsed; - } - } - }; - }]); -})(); diff --git a/frontend/src/app/core/services/DataService.js b/frontend/src/app/core/services/DataService.js deleted file mode 100644 index fe6be6b32..000000000 --- a/frontend/src/app/core/services/DataService.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Generic data service to interact with Sails.js backend. This will just - * wrap $sailsSocket methods to a single service, that is used from application. - * - * This is needed because we need to make some common url handling for sails - * endpoint. - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('DataService', [ - '$sailsSocket', - '_', - 'BackendConfig', - function factory( - $sailsSocket, - _, - BackendConfig - ) { - /** - * Helper function to get "proper" end point url for sails backend API. - * - * @param {string} endPoint Name of the end point - * @param {number} [identifier] Identifier of endpoint object - * - * @returns {string} - * @private - */ - function _parseEndPointUrl(endPoint, identifier) { - if (!_.isUndefined(identifier)) { - endPoint = endPoint + '/' + identifier; - } - - return BackendConfig.url + '/' + endPoint; - } - - /** - * Helper function to parse used parameters in 'get' and 'count' methods. - * - * @param {{}} parameters Used query parameters - * - * @returns {{params: {}}} - * @private - */ - function _parseParameters(parameters) { - parameters = parameters || {}; - - return {params: parameters}; - } - - return { - /** - * Service method to get count of certain end point objects. - * - * @param {string} endPoint Name of the end point - * @param {{}} parameters Used query parameters - * - * @returns {Promise|*} - */ - count: function count(endPoint, parameters) { - return $sailsSocket - .get(_parseEndPointUrl(endPoint) + '/count/', _parseParameters(parameters)); - }, - - /** - * Service method to get data from certain end point. This will always return a collection - * of data. - * - * @param {string} endPoint Name of the end point - * @param {{}} parameters Used query parameters - * - * @returns {Promise|*} - */ - collection: function collection(endPoint, parameters) { - return $sailsSocket - .get(_parseEndPointUrl(endPoint), _parseParameters(parameters)); - }, - - /** - * Service method to get data from certain end point. This will return just a one - * record as an object. - * - * @param {string} endPoint Name of the end point - * @param {number} identifier Identifier of endpoint object - * @param {{}} parameters Used query parameters - * - * @returns {Promise|*} - */ - fetch: function fetch(endPoint, identifier, parameters) { - return $sailsSocket - .get(_parseEndPointUrl(endPoint, identifier), _parseParameters(parameters)); - }, - - /** - * Service method to create new object to specified end point. - * - * @param {string} endPoint Name of the end point - * @param {{}} data Data to update - * - * @returns {Promise|*} - */ - create: function create(endPoint, data) { - return $sailsSocket - .post(_parseEndPointUrl(endPoint), data); - }, - - /** - * Service method to update specified end point object. - * - * @param {string} endPoint Name of the end point - * @param {number} identifier Identifier of endpoint object - * @param {{}} data Data to update - * - * @returns {Promise|*} - */ - update: function update(endPoint, identifier, data) { - return $sailsSocket - .put(_parseEndPointUrl(endPoint, identifier), data); - }, - - /** - * Service method to delete specified object. - * - * @param {string} endPoint Name of the end point - * @param {number} identifier Identifier of endpoint object - * - * @returns {Promise|*} - */ - delete: function remove(endPoint, identifier) { - return $sailsSocket - .delete(_parseEndPointUrl(endPoint, identifier)); - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/services/DialogService.js b/frontend/src/app/core/services/DialogService.js deleted file mode 100644 index 803845347..000000000 --- a/frontend/src/app/core/services/DialogService.js +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Simple service to activate noty2 message to GUI. This service can be used every where in application. Generally - * all $http and $socket queries uses this service to show specified errors to user. - * - * Service can be used as in following examples (assuming that you have inject this service to your controller): - * Message.success(message, [title], [options]); - * Message.error(message, [title], [options]); - * Message.message(message, [title], [options]); - * - * Feel free to be happy and code some awesome stuff! - * - * @todo do we need some queue dismiss? - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('DialogService', [ - '$uibModal', '_', - function factory($uibModal, _) { - var service = {}; - - - - service.prompt = function error(title,message, buttonTexts,accept, decline) { - - var modalInstance = $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - windowClass : 'dialog', - template: '' + - '' + - '' + - '', - controller: function($scope,$uibModalInstance){ - $scope.accept = function() { - $uibModalInstance.dismiss('accept') - } - $scope.decline = function(){ - $uibModalInstance.dismiss('decline') - } - }, - size: 'sm' - }); - - modalInstance.result.then(function (d) { - - }, function (d) { - switch(d){ - case "accept": - accept() - break; - case "decline": - decline() - break; - } - }); - - }; - - - - - return service; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/services/HttpStatusService.js b/frontend/src/app/core/services/HttpStatusService.js deleted file mode 100644 index 5cf6efc83..000000000 --- a/frontend/src/app/core/services/HttpStatusService.js +++ /dev/null @@ -1,283 +0,0 @@ -/** - * Service to wrap generic HTTP status specified helper methods. Currently this service has - * following methods available: - * - * HttpStatusService.getStatusCodeText(httpStatusCode); - * - * @todo add more these helpers :D - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('HttpStatusService', - function factory() { - return { - /** - * Getter method for HTTP status message by given status code. - * - * @param {Number} statusCode HTTP status code - * - * @returns {String} Status message - */ - getStatusCodeText: function getStatusCodeText(statusCode) { - var output = ''; - - switch (parseInt(statusCode.toString(), 10)) { - // 1xx Informational - case 100: - output = 'Continue'; - break; - case 101: - output = 'Switching Protocols'; - break; - case 102: - output = 'Processing (WebDAV; RFC 2518)'; - break; - // 2xx Success - case 200: - output = 'OK'; - break; - case 201: - output = 'Created'; - break; - case 202: - output = 'Accepted'; - break; - case 203: - output = 'Non-Authoritative Information (since HTTP/1.1)'; - break; - case 204: - output = 'No Content'; - break; - case 205: - output = 'Reset Content'; - break; - case 206: - output = 'Partial Content'; - break; - case 207: - output = 'Multi-Status (WebDAV; RFC 4918)'; - break; - case 208: - output = 'Already Reported (WebDAV; RFC 5842)'; - break; - case 226: - output = 'IM Used (RFC 3229)'; - break; - // 3xx Redirection - case 300: - output = 'Multiple Choices'; - break; - case 301: - output = 'Moved Permanently'; - break; - case 302: - output = 'Found'; - break; - case 303: - output = 'See Other'; - break; - case 304: - output = 'Not Modified'; - break; - case 305: - output = 'Use Proxy'; - break; - case 306: - output = 'Switch Proxy'; - break; - case 307: - output = 'Temporary Redirect'; - break; - case 308: - output = 'Permanent Redirect (Experimental RFC; RFC 7238)'; - break; - // 4xx Client Error - case 400: - output = 'Bad Request'; - break; - case 401: - output = 'Unauthorized'; - break; - case 402: - output = 'Payment Required'; - break; - case 403: - output = 'Forbidden'; - break; - case 404: - output = 'Not Found'; - break; - case 405: - output = 'Method Not Allowed'; - break; - case 406: - output = 'Not Acceptable'; - break; - case 407: - output = 'Proxy Authentication Required'; - break; - case 408: - output = 'Request Timeout'; - break; - case 409: - output = 'Conflict'; - break; - case 410: - output = 'Gone'; - break; - case 411: - output = 'Length Required'; - break; - case 412: - output = 'Precondition Failed'; - break; - case 413: - output = 'Request Entity Too Large'; - break; - case 414: - output = 'Request-URI Too Long'; - break; - case 415: - output = 'Unsupported Media Type'; - break; - case 416: - output = 'Requested Range Not Satisfiable'; - break; - case 417: - output = 'Expectation Failed'; - break; - case 418: - output = 'I\'m a teapot (RFC 2324)'; - break; - case 419: - output = 'Authentication Timeout (not in RFC 2616)'; - break; - case 420: - output = 'Method Failure (Spring Framework) / Enhance Your Calm (Twitter)'; - break; - case 422: - output = 'Unprocessable Entity (WebDAV; RFC 4918)'; - break; - case 423: - output = 'Locked (WebDAV; RFC 4918)'; - break; - case 424: - output = 'Failed Dependency (WebDAV; RFC 4918)'; - break; - case 426: - output = 'Upgrade Required'; - break; - case 428: - output = 'Precondition Required (RFC 6585)'; - break; - case 429: - output = 'Too Many Requests (RFC 6585)'; - break; - case 431: - output = 'Request Header Fields Too Large (RFC 6585)'; - break; - case 440: - output = 'Login Timeout (Microsoft)'; - break; - case 444: - output = 'No Response (Nginx)'; - break; - case 449: - output = 'Retry With (Microsoft)'; - break; - case 450: - output = 'Blocked by Windows Parental Controls (Microsoft)'; - break; - case 451: - output = 'Unavailable For Legal Reasons (Internet draft) / Redirect (Microsoft)'; - break; - case 494: - output = 'Request Header Too Large (Nginx)'; - break; - case 495: - output = 'Cert Error (Nginx)'; - break; - case 496: - output = 'No Cert (Nginx)'; - break; - case 497: - output = 'HTTP to HTTPS (Nginx)'; - break; - case 498: - output = 'Token expired/invalid (Esri)'; - break; - case 499: - output = 'Client Closed Request (Nginx) / Token required (Esri)'; - break; - // 5xx Server Error - case 500: - output = 'Internal Server Error'; - break; - case 501: - output = 'Not Implemented'; - break; - case 502: - output = 'Bad Gateway'; - break; - case 503: - output = 'Service Unavailable'; - break; - case 504: - output = 'Gateway Timeout'; - break; - case 505: - output = 'HTTP Version Not Supported'; - break; - case 506: - output = 'Variant Also Negotiates (RFC 2295)'; - break; - case 507: - output = 'Insufficient Storage (WebDAV; RFC 4918)'; - break; - case 508: - output = 'Loop Detected (WebDAV; RFC 5842)'; - break; - case 509: - output = 'Bandwidth Limit Exceeded (Apache bw/limited extension)'; - break; - case 510: - output = 'Not Extended (RFC 2774)'; - break; - case 511: - output = 'Network Authentication Required (RFC 6585)'; - break; - case 520: - output = 'Origin Error (Cloudflare)'; - break; - case 521: - output = 'Web server is down (Cloudflare)'; - break; - case 522: - output = 'Connection timed out (Cloudflare)'; - break; - case 523: - output = 'Proxy Declined Request (Cloudflare)'; - break; - case 524: - output = 'A timeout occurred (Cloudflare)'; - break; - case 598: - output = 'Network read timeout error (Unknown)'; - break; - case 599: - output = 'Network connect timeout error (Unknown)'; - break; - default: - output = 'Unknown HTTP status \'' + statusCode + '\', what is this?'; - break; - } - - return output; - } - }; - } - ) - ; -}()); diff --git a/frontend/src/app/core/services/KongPluginsService.js b/frontend/src/app/core/services/KongPluginsService.js deleted file mode 100644 index c8f0c8c4d..000000000 --- a/frontend/src/app/core/services/KongPluginsService.js +++ /dev/null @@ -1,873 +0,0 @@ -/** - * Simple service to activate noty2 message to GUI. This service can be used every where in application. Generally - * all $http and $socket queries uses this service to show specified errors to user. - * - * Service can be used as in following examples (assuming that you have inject this service to your controller): - * Message.success(message, [title], [options]); - * Message.error(message, [title], [options]); - * Message.message(message, [title], [options]); - * - * Feel free to be happy and code some awesome stuff! - * - * @todo do we need some queue dismiss? - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('KongPluginsService', ['InfoService', - function factory(InfoService) { - - var self; - var KongPluginsService = function() { - self = this - }; - - - function inGroups(plugin_name) { - var found = false - self.pluginGroups().forEach(function(group){ - Object.keys(group.plugins).forEach(function(group_plugin_name){ - if(plugin_name === group_plugin_name) { - found = true - } - }) - }) - - return found; - } - - - KongPluginsService.prototype.makePluginGroups = function() { - return InfoService.getInfo().then(function(resp){ - var info = resp.data - var plugins_available = info.plugins.available_on_server - var pluginGroups = self.pluginGroups() - - Object.keys(plugins_available).forEach(function(plugin_name){ - if(!inGroups(plugin_name)) { - pluginGroups[pluginGroups.length - 1].plugins[plugin_name] = {} - } - }) - - return pluginGroups; - - - }) - }, - - - - /** - * Kong Plugin Groups - * @returns {*[]} - */ - KongPluginsService.prototype.pluginGroups = function(){ - return [ - { - name : "Authentication", - description : "Protect your services with an authentication layer", - icon : "perm_identity", - plugins : { - "basic-auth": { - description : "Add Basic Authentication to your APIs" - }, - "key-auth": { - description : "Add a key authentication to your APIs" - }, - "oauth2": { - description : "Add an OAuth 2.0 authentication to your APIs" - }, - "hmac-auth": { - description : "Add HMAC Authentication to your APIs" - }, - "jwt": { - description : "Verify and authenticate JSON Web Tokens" - }, - "ldap-auth": { - description : "Integrate Kong with a LDAP server" - }, - } - }, - { - name : "Security", - icon : "security", - description : "Protect your services with additional security layers", - plugins : { - "acl": { - description : "Control which consumers can access APIs" - }, - "cors": { - description : "Allow developers to make requests from the browser" - }, - "ssl": { - description : "Add an SSL certificate for an underlying service" - }, - "ip-restriction": { - description : "Whitelist or blacklist IPs that can make requests" - }, - "bot-detection": { - description : "Detects and blocks bots or custom clients" - } - } - }, - { - name : "Traffic Control", - icon : "traffic", - description : "Manage, throttle and restrict inbound and outbound API traffic", - plugins : { - "rate-limiting": { - description : "Rate-limit how many HTTP requests a developer can make" - }, - "response-ratelimiting": { - description : "Rate-Limiting based on a custom response header value" - }, - "request-size-limiting": { - description : "Block requests with bodies greater than a specific size" - }, - } - }, - { - name : "Analytics & Monitoring", - icon : "pie_chart_outlined", - description : "Visualize, inspect and monitor APIs and microservices traffic", - plugins : { - "galileo": { - description : "Business Intelligence Platform for APIs" - }, - "datadog": { - description : "Visualize API metrics on Datadog" - }, - "runscope": { - description : "API Performance Testing and Monitoring" - }, - - } - }, - { - name : "Transformations", - icon : "transform", - description : "Transform request and responses on the fly on Kong", - plugins : { - "request-transformer": { - description : "Modify the request before hitting the upstream server" - }, - "response-transformer": { - description : "Modify the upstream response before returning it to the client" - }, - "correlation-id": { - description : "Correlate requests and responses using a unique ID" - }, - } - }, - { - name : "Logging", - icon : "content_paste", - description : "Log requests and response data using the best transport for your infrastructure", - plugins : { - "tcp-log": { - description : "Send request and response logs to a TCP server" - }, - "udp-log": { - description : "Send request and response logs to an UDP server" - }, - "http-log": { - description : "Send request and response logs to an HTTP server" - }, - "file-log": { - description : "Append request and response data to a log file on disk" - }, - "syslog": { - description : "Send request and response logs to Syslog" - }, - "statsd": { - description : "Send request and response logs to StatsD" - }, - "loggly": { - description : "Send request and response logs to Loggly" - }, - - } - }, - { - name: "Custom", - description: "Custom Plugins", - icon: "perm_identity", - plugins : {} - } - ] - } - - - /** - * Kong Plugin configurations - * @param plugin : optional - * @returns {} - */ - KongPluginsService.prototype.pluginOptions = function(plugin){ - var data = { - "ssl" : { - "meta" : { - description : 'Dynamically binds a specific SSL certificate to the request_host value of a service. ' + - 'In case you want to setup a global SSL certificate for every API, take a look at the Kong SSL configuration options.' + - '
If no .cert and .key files are provided, Konga will create self-signed certificates and send them to Kong ( openssl library must be available on your machine ).' - }, - "cert" : { - type : "file", - help : "Upload the certificate.crt file." - }, - "key" : { - type : "file", - help : "Upload the certificate.key file." - }, - "only_https" : { - type : "boolean", - value : false, - help : "Specify if the service should only be available through an https protocol." - }, - "accept_http_if_already_terminated" : { - type : "boolean", - value : false, - help : "If only_https is true, accepts HTTPs requests that have already been terminated by a proxy or load balancer and the x-forwarded-proto: https header has been added to the request. Only enable this option if the Kong server cannot be publicly accessed and the only entry-point is such proxy or load balancer." - }, - }, - "request-size-limiting" : { - meta : { - description : 'Block incoming requests whose body is greater than a specific size in megabytes.' - }, - 'consumer_id' : { - displayName : "Apply to", - type: 'search', - value: null, - help: 'The CONSUMER ID that this plugin configuration will target. ' + - 'This value can only be used if authentication has been enabled ' + - 'so that the system can identify the user making the request.' + - ' If left blank, the plugin will be applied to all consumers.' - }, - 'allowed_payload_size' : { - type: 'number', - value: 128, - help: 'Allowed request payload size in megabytes, default is 128 (128000000 Bytes)' - }, - }, - "bot-detection" : { - 'meta' : { - description: 'Protects your API from most common bots and has the capability of whitelisting and blacklisting custom clients.' - }, - 'whitelist' : { - type: 'text', - value: null, - help: 'A comma separated array of regular expressions that should be whitelisted. The regular expressions will be checked against the User-Agent header.' - }, - 'blacklist' : { - type: 'text', - value: null, - help: 'A comma separated array of regular expressions that should be blacklisted. The regular expressions will be checked against the User-Agent header.' - }, - }, - "ip-restriction" : { - meta : { - description : 'Restrict access to an API by either whitelisting or blacklisting IP addresses. Single IPs, multiple IPs or ranges in CIDR notation like 10.10.10.0/24 can be used.' - }, - 'consumer_id' : { - displayName : "Apply to", - type: 'search', - value: null, - help: 'The CONSUMER ID that this plugin configuration will target. ' + - 'This value can only be used if authentication has been enabled ' + - 'so that the system can identify the user making the request.' + - ' If left blank, the plugin will be applied to all consumers.' - }, - 'whitelist' : { - type: 'text', - value: '', - help: 'Comma separated list of IPs or CIDR ranges to whitelist. At least one between whitelist or blacklist must be specified.' - }, - 'blacklist' : { - type: 'text', - value: '', - help: 'Comma separated list of IPs or CIDR ranges to blacklist. At least one between whitelist or blacklist must be specified.' - }, - }, - "cors" : { - meta : { - description : 'Easily add Cross-origin resource sharing (CORS) to your API by enabling this plugin.' - }, - 'origin' : { - type: 'text', - value: '', - help: 'Value for the Access-Control-Allow-Origin header, expects a String.' - }, - 'methods' : { - type: 'text', - value: 'GET,HEAD,PUT,PATCH,POST,DELETE', - help: 'Value for the Access-Control-Allow-Methods header, expects a comma delimited string (e.g. GET,POST).' - }, - 'headers' : { - type: 'text', - value: '', - help: 'Value for the Access-Control-Allow-Headers header, expects a comma delimited string (e.g. Origin, Authorization).' - }, - 'exposed_headers' : { - type: 'text', - value: '', - help: 'Value for the Access-Control-Expose-Headers header, expects a comma delimited string (e.g. Origin, Authorization). If not specified, no custom headers are exposed.' - }, - 'max_age' : { - type: 'number', - help : 'Indicated how long the results of the preflight request can be cached, in seconds.' - }, - 'preflight_continue' : { - type : "boolean", - value : false, - help : 'Flag to determine whether the Access-Control-Allow-Credentials header should be sent with true as the value.' - }, - 'credentials' : { - type : "boolean", - value : false, - help : 'A boolean value that instructs the plugin to proxy the OPTIONS preflight request to the upstream API.' - } - }, - "acl" : { - meta : { - description : 'Restrict access to an API by whitelisting or blacklisting consumers using arbitrary ACL group names. This plugin requires an authentication plugin to have been already enabled on the API.' - }, - 'whitelist' : { - type: 'text', - value: '', - help: 'Comma separated list of arbitrary group names that are allowed to consume the API. At least one between whitelist or blacklist must be specified.' - }, - 'blacklist' : { - type: 'text', - value: '', - help: 'Comma separated list of arbitrary group names that are allowed to consume the API. At least one between whitelist or blacklist must be specified.' - } - }, - "ldap-auth" : { - meta : { - description : 'Add LDAP Bind Authentication to your APIs, with username and password protection. The plugin will check for valid credentials in the Proxy-Authorization and Authorization header (in this order).' - }, - 'hide_credentials': { - type: 'boolean', - value: false, - help: 'An optional boolean value telling the plugin to hide the credential to the upstream API server. It will be removed by Kong before proxying the request' - }, - 'ldap_host' : { - type: 'text', - value: '', - help: 'Host on which the LDAP server is running.' - }, - 'ldap_port' : { - type: 'number', - value: '', - help: 'TCP port where the LDAP server is listening.' - }, - 'start_tls' : { - type: 'boolean', - value: false, - help: 'Set it to true to issue StartTLS (Transport Layer Security) extended operation over ldap connection.' - }, - 'base_dn' : { - type: 'text', - value: '', - help: 'Base DN as the starting point for the search.' - }, - 'verify_ldap_host' : { - type: 'boolean', - value: false, - help: 'Set it to true to authenticate LDAP server. The server certificate will be verified according to the CA certificates specified by the lua_ssl_trusted_certificate directive.' - }, - 'attribute' : { - type: 'text', - value: '', - help: 'Attribute to be used to search the user.' - }, - 'cache_ttl' : { - type: 'number', - value: 60, - help: 'Cache expiry time in seconds.' - }, - 'timeout' : { - type: 'number', - value: 10000, - help: 'An optional timeout in milliseconds when waiting for connection with LDAP server.' - }, - 'keepalive' : { - type: 'number', - value: 60000, - help: 'An optional value in milliseconds that defines for how long an idle connection to LDAP server will live before being closed.' - }, - }, - "hmac-auth" : { - meta : { - description : 'Add HMAC Signature Authentication to your APIs to establish the identity of the consumer. The plugin will check for valid signature in the Proxy-Authorization and Authorization header (in this order). This plugin implementation follows the draft-cavage-http-signatures-00 draft with slightly changed signature scheme.' - }, - 'hide_credentials': { - type: 'boolean', - value: false, - help: 'An optional boolean value telling the plugin to hide the credential to the upstream API server. It will be removed by Kong before proxying the request' - }, - 'clock_skew' : { - type: 'number', - value: 300, - help: 'Clock Skew in seconds to prevent replay attacks' - } - }, - "basic-auth" : { - meta : { - description : 'Add Basic Authentication to your APIs, with username and password protection. The plugin will check for valid credentials in the Proxy-Authorization and Authorization header (in this order).', - }, - 'hide_credentials': { - type: 'boolean', - value: false, - help: 'An optional boolean value telling the plugin to hide the credential to the upstream API server. It will be removed by Kong before proxying the request' - } - }, - "key-auth" : { - meta : { - description : 'Add Key Authentication (also referred to as an API key) to your APIs. Consumers then add their key either in a querystring parameter or a header to authenticate their requests.' - }, - 'key_names': { - type: 'text', - value: 'apikey', - help: 'Describes an array of comma separated parameter names where the plugin will look for a key. The client must send the authentication key in one of those key names, and the plugin will try to read the credential from a header or the querystring parameter with the same name.' - }, - 'hide_credentials': { - type: 'boolean', - value: false, - help: 'An optional boolean value telling the plugin to hide the credential to the upstream API server. It will be removed by Kong before proxying the request.' - } - }, - "oauth2" : { - meta : { - description : 'Add an OAuth 2.0 authentication layer with the Authorization Code Grant, Client Credentials, Implicit Grant or Resource Owner Password Credentials Grant flow. This plugin requires the SSL Plugin with the only_https parameter set to true to be already installed on the API, failing to do so will result in a security weakness.' - }, - 'scopes': { - type: 'text', - value: '', - help: 'Describes an array of comma separated scope names that will be available to the end user' - }, - 'mandatory_scope': { - type: 'boolean', - value: false, - help: 'An optional boolean value telling the plugin to require at least one scope to be authorized by the end user' - }, - 'token_expiration' : { - type : 'number', - value : 7200, - help : 'An optional integer value telling the plugin how long should a token last, after which the client will need to refresh the token. Set to 0 to disable the expiration.' - - }, - 'enable_authorization_code' : { - type: 'boolean', - value: false, - help: 'An optional boolean value to enable the three-legged Authorization Code flow (RFC 6742 Section 4.1)' - }, - 'enable_client_credentials': { - type: 'boolean', - value: false, - help: 'An optional boolean value to enable the Client Credentials Grant flow (RFC 6742 Section 4.4)' - }, - 'enable_implicit_grant': { - type: 'boolean', - value: false, - help: 'An optional boolean value to enable the Implicit Grant flow which allows to provision a token as a result of the authorization process (RFC 6742 Section 4.2)' - }, - 'enable_password_grant': { - type: 'boolean', - value: false, - help: 'An optional boolean value to enable the Resource Owner Password Credentials Grant flow (RFC 6742 Section 4.3)' - }, - 'hide_credentials' : { - type: 'boolean', - value: false, - help: 'An optional boolean value telling the plugin to hide the credential to the upstream API server. It will be removed by Kong before proxying the request' - }, - 'accept_http_if_already_terminated': { - type: 'boolean', - value: false, - help: 'Accepts HTTPs requests that have already been terminated by a proxy or load balancer and the x-forwarded-proto: https header has been added to the request. Only enable this option if the Kong server cannot be publicly accessed and the only entry-point is such proxy or load balancer.' - }, - }, - jwt : { - meta : { - description : 'Verify requests containing HS256 or RS256 signed JSON Web Tokens (as specified in RFC 7519). Each of your Consumers will have JWT credentials (public and secret keys) which must be used to sign their JWTs. A token can then be passed through the Authorization header or in the request\'s URI and Kong will either proxy the request to your upstream services if the token\'s signature is verified, or discard the request if not. Kong can also perform verifications on some of the registered claims of RFC 7519 (exp and nbf).' - }, - 'uri_param_names' : { - type : 'text', - value : 'jwt', - help : 'A list of querystring parameters that Kong will inspect to retrieve JWTs.' - }, - 'claims_to_verify' : { - type : 'text', - value : '', - help : 'A list of registered claims (according to RFC 7519) that Kong can verify as well. Accepted values: exp, nbf.' - }, - 'key_claim_name' : { - type : 'text', - value : 'iss', - help : 'The name of the claim in which the key identifying the secret must be passed.' - }, - 'secret_is_base64' : { - type : 'boolean', - value : false, - help : 'If true, the plugin assumes the credential\'s secret to be base64 encoded. You will need to create a base64 encoded secret for your consumer, and sign your JWT with the original secret.' - } - }, - "correlation-id" : { - meta : { - description : 'Correlate requests and responses using a unique ID transmitted over an HTTP header.' - }, - 'header_name' : { - type : 'text', - value : 'Kong-Request-ID', - help : 'The HTTP header name to use for the correlation ID.' - }, - 'generator' : { - type : 'select', - options : ['uuid','uuid#counter','tracker'], - value : 'uuid#counter', - help : 'The generator to use for the correlation ID.' - }, - 'echo_downstream' : { - type : 'boolean', - value : false, - help : 'Whether to echo the header back to downstream (the client).' - } - }, - "datadog" : { - meta : { - description : 'Log API metrics like request count, request size, response status and latency to the local Datadog agent.' - }, - 'consumer_id' : { - displayName : "Apply to", - type: 'search', - value : null, - help : 'The CONSUMER ID that this plugin configuration will target. ' + - 'This value can only be used if authentication has been enabled ' + - 'so that the system can identify the user making the request.' + - ' If left blank, the plugin will be applied to all consumers.' - }, - 'host' : { - type : 'text', - value : '127.0.0.1', - help : 'The IP address or host name to send data to' - }, - 'port' : { - type : 'number', - value : 8125, - help : 'The port to send data to on the upstream server' - }, - 'metrics' : { - type : 'chips', - options : ['request_count','request_size','response_size','latency','status_count','unique_users','request_per_user'], - value : ['request_count','request_size','response_size','latency','status_count','unique_users','request_per_user'], - help : 'The metrics to be logged.', - filters : { - removeSelected : function(values) { - return function( item ) { - if(values instanceof Array) - return values.indexOf(item) < 0; - else - return values - }; - } - } - }, - 'timeout' : { - type : 'number', - value : 10000, - help : 'An optional timeout in milliseconds when sending data to the upstream server' - }, - }, - "runscope" : { - meta : { - description : 'Logs request and response data to Runscope.' - }, - "access_token" : { - type : "text", - value : "", - help : "The Runscope access token (or personal access token) for the Runscope API." - }, - "bucket_key" : { - type : "text", - value : "", - help : "Your Runscope bucket ID where traffic data will be stored." - }, - "log_body" : { - type : "boolean", - value : false, - help : "Whether or not the request and response bodies should be sent to Runscope." - }, - "api_endpoint" : { - type : "text", - value : "https://api.runscope.com", - help : "URL for the Runscope API." - }, - "timeout" : { - type : "number", - value : 10000, - help : "An optional timeout in milliseconds when sending data to Runscope.", - }, - "keepalive" : { - type : "number", - value : 30, - help : "An optional value in milliseconds that defines for how long an idle connection will live before being closed.", - } - }, - "galileo" : { - meta : { - description : 'Logs request and response data to Galileo, the analytics platform for monitoring, visualizing and inspecting API & microservice traffic.' - }, - "consumer_id" : { - displayName : "Apply to", - type: 'search', - value : "", - help : "The CONSUMER ID that this plugin configuration will target. " + - "This value can only be used if authentication has been enabled " + - "so that the system can identify the user making the request." + - " If left blank, the plugin will be applied to all consumers.", - - }, - "service_token" : { - type : "text", - value : "", - help : "The service token provided to you by Galileo." - }, - "environment" : { - type : "text", - value : "", - help : "Slug of your Galileo environment name. None by default." - }, - "log_bodies" : { - type : "boolean", - value : false, - help : "Capture and send request/response bodies." - }, - "retry_count" : { - type : "number", - value : 10, - help : "Number of retries in case of failure to send data to Galileo." - }, - "connection_timeout" : { - type : "number", - value : 30, - help : "Timeout in seconds before aborting a connection to Galileo." - }, - "flush_timeout" : { - type : "number", - value : 2, - help : "Timeout in seconds before flushing the current data to Galileo in case of inactivity." - }, - "queue_size" : { - type : "number", - value : 1000, - help : "Number of calls to trigger a flush of the buffered data to Galileo." - }, - "host" : { - type : "text", - value : "collector.galileo.mashape.com", - help : "Host address of the Galileo collector." - }, - "port" : { - type : "number", - value : 443, - help : "Port of the Galileo collector." - }, - "https" : { - type : "boolean", - value : true, - help : "Use of HTTPs to connect with the Galileo collector." - } - - }, - "rate-limiting" : { - meta : { - description : 'Rate limit how many HTTP requests a developer can make in a given period of seconds, minutes, hours, days, months or years. If the API has no authentication layer, the Client IP address will be used, otherwise the Consumer will be used if an authentication plugin has been configured.' - }, - "consumer_id" : { - displayName : "Apply to", - type: 'search', - value : "", - help : "The CONSUMER ID that this plugin configuration will target. " + - "This value can only be used if authentication has been enabled " + - "so that the system can identify the user making the request." + - " If left blank, the plugin will target all consumers." - }, - "second" : { - type : "number", - value : 0, - help : "The amount of HTTP requests the developer can make per second. At least one limit must exist.", - - }, - "minute" : { - type : "number", - value : 0, - help : "The amount of HTTP requests the developer can make per minute. At least one limit must exist.", - }, - "hour" : { - type : "number", - value : 0, - help : "The amount of HTTP requests the developer can make per hour. At least one limit must exist.", - }, - "day" : { - type : "number", - value : 0, - help : "The amount of HTTP requests the developer can make per day. At least one limit must exist.", - }, - "month" : { - type : "number", - value : 0, - help : "The amount of HTTP requests the developer can make per month. At least one limit must exist.", - }, - "year" : { - type : "number", - value : 0, - help : "The amount of HTTP requests the developer can make per year. At least one limit must exist.", - }, - "limit_by" : { - type : "select", - options : ["consumer","credential","ip"], - value : "consumer", - help : "The entity that will be used when aggregating the limits: consumer, credential, ip. If the consumer or the credential cannot be determined, the system will always fallback to ip.", - }, - "policy" : { - type : "select", - options : ["local","cluster","redis"], - value : "cluster", - help : "The rate-limiting policies to use for retrieving and incrementing the limits. Available values are local (counters will be stored locally in-memory on the node), cluster (counters are stored in the datastore and shared across the nodes) and redis (counters are stored on a Redis server and will be shared across the nodes).", - }, - "fault_tolerant" : { - type : "boolean", - value : true, - help : "A boolean value that determines if the requests should be proxied even if Kong has troubles connecting a third-party datastore. If true requests will be proxied anyways effectively disabling the rate-limiting function until the datastore is working again. If false then the clients will see 500 errors." - }, - "redis_host" : { - type : "text", - value : "", - help : "When using the redis policy, this property specifies the address to the Redis server." - }, - "redis_port" : { - type : "number", - value : 6379, - help : "When using the redis policy, this property specifies the port of the Redis server. By default is 6379." - }, - "redis_timeout" : { - type : "number", - value : 200, - help : "When using the redis policy, this property specifies the timeout in milliseconds of any command submitted to the Redis server." - } - }, - "request-transformer" : { - meta : { - description : 'Transform the request sent by a client on the fly on Kong, before hitting the upstream server.' - }, - "http_method" : { - help : "Changes the HTTP method for the upstream request." - }, - "remove" : { - "headers" : { - help : "List of header names. Unset the headers with the given name." - }, - "querystring" : { - help : "List of querystring names. Remove the querystring if it is present." - }, - "body" : { - help : "List of parameter names. Remove the parameter if and only if content-type is one the following [application/json, multipart/form-data, application/x-www-form-urlencoded] and parameter is present." - }, - }, - "replace" : { - "headers" : { - help : "List of headername:value pairs. If and only if the header is already set, replace its old value with the new one. Ignored if the header is not already set." - }, - "querystring" : { - help : "List of queryname:value pairs. If and only if the header is already set, replace its old value with the new one. Ignored if the header is not already set." - }, - "body" : { - help : "List of paramname:value pairs. If and only if content-type is one the following [application/json, multipart/form-data, application/x-www-form-urlencoded] and the parameter is already present, replace its old value with the new one. Ignored if the parameter is not already present." - }, - }, - "add" : { - "headers" : { - help : "List of headername:value pairs. If and only if the header is not already set, set a new header with the given value. Ignored if the header is already set." - }, - "querystring" : { - help : "List of queryname:value pairs. If and only if the querystring is not already set, set a new querystring with the given value. Ignored if the header is already set." - }, - "body" : { - help : "List of pramname:value pairs. If and only if content-type is one the following [application/json, multipart/form-data, application/x-www-form-urlencoded] and the parameter is not present, add a new parameter with the given value to form-encoded body. Ignored if the parameter is already present." - }, - }, - "append" : { - "headers" : { - help : "List of headername:value pairs. If the header is not set, set it with the given value. If it is already set, a new header with the same name and the new value will be set." - }, - "querystring" : { - help : "List of queryname:value pairs. If the querystring is not set, set it with the given value. If it is already set, a new querystring with the same name and the new value will be set." - }, - "body" : { - help : "List of paramname:value pairs. If the content-type is one the following [application/json, application/x-www-form-urlencoded], add a new parameter with the given value if the parameter is not present, otherwise if it is already present, the two values (old and new) will be aggregated in an array." - } - }, - }, - - "response-transformer" : { - meta : { - description: 'Transform the response sent by the upstream server on the fly on Kong, before returning the response to the client.' - }, - "remove" : { - "headers" : { - help : "List of header names. Unset the header(s) with the given name." - }, - "json" : { - help : "List of property names. Remove the property from the JSON body if it is present." - }, - }, - "replace" : { - "headers" : { - help : "List of headername:value pairs. If and only if the header is already set, replace its old value with the new one. Ignored if the header is not already set." - }, - "json" : { - help : "List of property:value pairs. If and only if the parameter is already present, replace its old value with the new one. Ignored if the parameter is not already present." - }, - }, - "add" : { - "headers" : { - help : "List of headername:value pairs. If and only if the header is not already set, set a new header with the given value. Ignored if the header is already set." - }, - "json" : { - help : "List of property:value pairs. If and only if the property is not present, add a new property with the given value to the JSON body. Ignored if the property is already present." - }, - }, - "append" : { - "headers" : { - help : "List of headername:value pairs. If the header is not set, set it with the given value. If it is already set, a new header with the same name and the new value will be set." - }, - "json" : { - help : "List of property:value pairs. If the property is not present in the JSON body, add it with the given value. If it is already present, the two values (old and new) will be aggregated in an array." - }, - }, - - } - } - - // Monkey patch to help with transition - // of using plugin schema directly from kong - var resp = plugin ? data[plugin] : data - if(plugin && resp) { - resp.fields = { - meta : data[plugin] ? data[plugin].meta : {} - } - } - - - return resp || {} - } - - - return KongPluginsService - - } - ]) - ; -}()); diff --git a/frontend/src/app/core/services/ListConfigService.js b/frontend/src/app/core/services/ListConfigService.js deleted file mode 100644 index 9c4d07764..000000000 --- a/frontend/src/app/core/services/ListConfigService.js +++ /dev/null @@ -1,308 +0,0 @@ -/** - * Simple service to return configuration for generic list. This service contains only - * getter methods that all list views uses in Boilerplate frontend application. - * - * So generally you change these getter methods and changes are affected to all list - * views on application. - * - * @todo text translations - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('ListConfig', [ - '_', - function factory(_) { - /** - * List title item configuration. - * - * @type {{ - * author: *[], - * book: *[] - * }} - */ - var titleItems = { - kongnode: [ - { - title: '#', - width : 1 - }, - { - title: '', - width : 1, - column: 'active', - sortable: true - }, - { - title: 'name', - column: 'name', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'kong admin url', - column: 'kong_admin_url', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'created', - column: 'createdAt', - sortable: true, - }, - { - title: 'updated', - column: 'updatedAt', - sortable: true, - }, - { - title: '', - column: '', - width : 1 - }, - ], - consumer: [ - { - checkbox : true, - width : 1 - }, - { - title: '', - width : 1 - }, - { - title: 'username', - column: 'username', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'custom_id', - column: 'custom_id', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'import_id', - column: 'import_id', - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'created', - column: 'createdAt', - sortable: true, - }, - { - title: '', - column: '', - width : 1 - }, - { - title: '', - column: '', - width : 1 - }, - ], - user: [ - { - title: '#', - width : 1 - }, - { - title: '', - column: '', - width : 1 - }, - { - title: 'username', - column: 'username', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'first name', - column: 'firstName', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'last name', - column: 'lastName', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'created', - column: 'createdAt', - sortable: true, - }, - { - title: 'updated', - column: 'updatedAt', - sortable: true, - }, - { - title: '', - column: '', - width : 1 - }, - ], - author: [ - { - title: 'Author', - column: 'name', - class: 'col-xs-11', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'Books', - column: false, - class: 'text-right col-xs-1', - searchable: false, - sortable: false, - inSearch: false, - inTitle: true - } - ], - book: [ - { - title: 'Title', - column: 'title', - class: 'col-xs-8', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'Author', - column: false, - class: 'col-xs-3', - searchable: false, - sortable: false, - inSearch: false, - inTitle: true - }, - { - title: 'Year', - column: 'releaseDate', - class: 'col-xs-1 text-right', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - } - ], - userlogin: [ - { - title: 'IP-address', - column: 'ip', - class: 'col-xs-2', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'Browser', - column: 'browser', - class: 'col-xs-2', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'Operating System', - column: 'os', - class: 'col-xs-2', - searchable: true, - sortable: true, - inSearch: true, - inTitle: true - }, - { - title: 'Username', - column: false, - class: 'col-xs-2', - searchable: false, - sortable: false, - inSearch: false, - inTitle: true - }, - { - title: 'Login time', - column: 'createdAt', - class: 'col-xs-4', - searchable: false, - sortable: true, - inSearch: false, - inTitle: true - } - ] - }; - - return { - /** - * Getter method for list default settings. - * - * @returns {{ - * itemCount: Number, - * items: Array, - * itemsPerPage: Number, - * itemsPerPageOptions: Array, - * currentPage: Number, - * where: {}, - * loading: Boolean, - * loaded: Boolean - * }} - */ - getConfig: function getConfig() { - return { - itemCount: 0, - items: [], - itemsPerPage: 50, - itemsPerPageOptions: [10, 25, 50, 100, 200], - currentPage: 1, - where: {}, - loading: true, - loaded: false - }; - }, - - /** - * Getter method for lists title items. These are defined in the 'titleItems' - * variable. - * - * @param {String} model Name of the model - * - * @returns {Array} - */ - getTitleItems: function getTitleItems(model) { - return _.isUndefined(titleItems[model]) ? [] : titleItems[model]; - } - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/services/MessageService.js b/frontend/src/app/core/services/MessageService.js deleted file mode 100644 index 23a2483b6..000000000 --- a/frontend/src/app/core/services/MessageService.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Simple service to activate noty2 message to GUI. This service can be used every where in application. Generally - * all $http and $socket queries uses this service to show specified errors to user. - * - * Service can be used as in following examples (assuming that you have inject this service to your controller): - * Message.success(message, [title], [options]); - * Message.error(message, [title], [options]); - * Message.message(message, [title], [options]); - * - * Feel free to be happy and code some awesome stuff! - * - * @todo do we need some queue dismiss? - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('MessageService', [ - 'toastr', '_', - function factory(toastr, _) { - var service = {}; - - /** - * Private helper function to make actual message via toastr component. - * - * @param {string} message Message content - * @param {string} title Message title - * @param {{}} options Message specified options - * @param {{}} defaultOptions Default options for current message type - * @param {string} type Message type - * @private - */ - function _makeMessage(message, title, options, defaultOptions, type) { - title = title || ''; - options = options || {}; - - toastr[type](message, title, _.assign(defaultOptions, options)); - } - - /** - * Method to generate 'success' message. - * - * @param {string} message Message content - * @param {string} [title] Message title - * @param {{}} [options] Message options - */ - service.success = function success(message, title, options) { - var defaultOptions = { - timeOut: 2000 - }; - - _makeMessage(message, title, options, defaultOptions, 'success'); - }; - - /** - * Method to generate 'info' message. - * - * @param {string} message Message content - * @param {string} [title] Message title - * @param {{}} [options] Message options - */ - service.info = function error(message, title, options) { - var defaultOptions = { - timeout: 3000 - }; - - _makeMessage(message, title, options, defaultOptions, 'info'); - }; - - /** - * Method to generate 'warning' message. - * - * @param {string} message Message content - * @param {string} [title] Message title - * @param {{}} [options] Message options - */ - service.warning = function error(message, title, options) { - var defaultOptions = { - timeout: 3000 - }; - - _makeMessage(message, title, options, defaultOptions, 'warning'); - }; - - /** - * Method to generate 'error' message. - * - * @param {string} message Message content - * @param {string} [title] Message title - * @param {{}} [options] Message options - */ - service.error = function error(message, title, options) { - var defaultOptions = { - timeout: 4000 - }; - - _makeMessage(message, title, options, defaultOptions, 'error'); - }; - - return service; - } - ]) - ; -}()); diff --git a/frontend/src/app/core/services/NodesService.js b/frontend/src/app/core/services/NodesService.js deleted file mode 100644 index b9df2e4fd..000000000 --- a/frontend/src/app/core/services/NodesService.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Simple service to activate noty2 message to GUI. This service can be used every where in application. Generally - * all $http and $socket queries uses this service to show specified errors to user. - * - * Service can be used as in following examples (assuming that you have inject this service to your controller): - * Message.success(message, [title], [options]); - * Message.error(message, [title], [options]); - * Message.message(message, [title], [options]); - * - * Feel free to be happy and code some awesome stuff! - * - * @todo do we need some queue dismiss? - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('NodesService', [ - 'NodeModel', '$q','$state','$localStorage', - function factory(NodeModel, $q, $state, $localStorage) { - return { - activeNode : function() { - return $localStorage.credentials.user.node_id - }, - authorize: function authorize(needsActiveNode) { - if(needsActiveNode) - return $localStorage.credentials && $localStorage.credentials.user.node_id - return true; - }, - isActiveNodeSet : function() { - var defer = $q.defer() - - if($localStorage.credentials.user.node_id){ - defer.resolve($localStorage.credentials.user.node_id) - }else{ - $state.go('settings') - defer.reject("No active nodes found") - - } - return defer.promise - } - } - } - ]) - ; -}()); diff --git a/frontend/src/app/core/services/RemoteStorageService.js b/frontend/src/app/core/services/RemoteStorageService.js deleted file mode 100644 index 065dd44c7..000000000 --- a/frontend/src/app/core/services/RemoteStorageService.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Simple service to activate noty2 message to GUI. This service can be used every where in application. Generally - * all $http and $socket queries uses this service to show specified errors to user. - * - * Service can be used as in following examples (assuming that you have inject this service to your controller): - * Message.success(message, [title], [options]); - * Message.error(message, [title], [options]); - * Message.message(message, [title], [options]); - * - * Feel free to be happy and code some awesome stuff! - * - * @todo do we need some queue dismiss? - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('RemoteStorageService', [ - '$log', '$state','$http','BackendConfig', - function factory($log, $state, $http,BackendConfig) { - return { - - loadAdapters : function() { - return $http({ - url : BackendConfig.url + '/remote/adapters/', - method: "GET" - }) - }, - - testConnection : function(query) { - return $http({ - url : BackendConfig.url + '/remote/connection/test', - method: "GET", - params : query - }) - }, - - fetchConsumers : function(data) { - return $http.post(BackendConfig.url + '/remote/consumers',data) - }, - } - } - ]) - ; -}()); diff --git a/frontend/src/app/core/services/SocketHelperService.js b/frontend/src/app/core/services/SocketHelperService.js deleted file mode 100644 index b046d3582..000000000 --- a/frontend/src/app/core/services/SocketHelperService.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Simple angular service to parse search filters for socket queries. Usage example: - * - * $sailsSocket - * .get("/Book/", { - * params: { - * where: SocketHelperService.getWhere($scope.filters) - * } - * }) - * .then( - * function successCb(response) { - * // Do your data handling here - * } - * function errorCb(response) { - * // Do your error handling here - * } - * ); - * - * @todo add more complex parameter handling - */ -(function() { - 'use strict'; - - angular.module('frontend.core.services') - .factory('SocketHelperService', [ - '_', - function factory(_) { - return { - getWhere: function getWhere(filters, defaults) { - var output = defaults || {}; - - // Determine search columns - var columns = _.filter(filters.columns, function iterator(column) { - return column.inSearch; - }); - - // Determine search words - var words = _.filter(filters.searchWord.split(' ')); - - // We have some search word(s) and column(s) - if (columns.length > 0 && words.length > 0) { - var conditions = []; - - // Iterate each columns - _.forEach(columns, function iteratorColumns(column) { - // Iterate each search word - _.forEach(words, function iteratorWords(word) { - var condition = {}; - - // Create actual condition and push that to main condition - condition[column.column] = {contains: word}; - - conditions.push(condition); - }); - }); - - output = {or: conditions}; - } - - return output; - } - }; - } - ]) - ; -}()); \ No newline at end of file diff --git a/frontend/src/app/core/services/services.js b/frontend/src/app/core/services/services.js deleted file mode 100644 index 3db6a25a1..000000000 --- a/frontend/src/app/core/services/services.js +++ /dev/null @@ -1,6 +0,0 @@ -// Generic models angular module initialize. -(function() { - 'use strict'; - - angular.module('frontend.core.services', []); -}()); diff --git a/frontend/src/app/dashboard/dashboard-controller.js b/frontend/src/app/dashboard/dashboard-controller.js deleted file mode 100644 index b93443c79..000000000 --- a/frontend/src/app/dashboard/dashboard-controller.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.dashboard') - .controller('DashboardController', [ - '$scope', '$log', '$state','$q','InfoService','_activeNode', - function controller($scope, $log, $state,$q,InfoService,_activeNode) { - - - $scope.closeAlert = function() { - if($scope.alert) delete $scope.alert - } - - $scope.isEnabled = function(name) { - for(var key in $scope.info.plugins.enabled_in_cluster) { - if(name === $scope.info.plugins.enabled_in_cluster[key]) { - return true - } - } - - return false - } - - - function drawCharts() { - $scope.data = { - server : { - labels : [ - 'Accepted', - 'Active', - 'Handled', - 'Reading', - 'Waiting', - 'Writing', - 'Total Requests' - ], - options: { - scales: { - xAxes: [{ - ticks: { - autoSkip: false, - maxRotation: 0, - minRotation: 0 - } - }] - } - }, - series : ['Connections'], - data : [ - $scope.status.server.connections_accepted, - $scope.status.server.connections_active, - $scope.status.server.connections_handled, - $scope.status.server.connections_reading, - $scope.status.server.connections_waiting, - $scope.status.server.connections_writing, - $scope.status.server.total_requests, - ] - }, - timers : { - labels : [ - 'Pending', - 'Running' - ], - options : { - //title: { - // display: true, - // text: 'timers' - //}, - }, - series : ['Timers'], - data : [ - $scope.info.timers.pending, - $scope.info.timers.running - ] - }, - database : { - labels : [ - 'ACLs', - 'APIs', - 'Consumers', - 'Nodes', - 'Plugins' - ], - options: { - //scales: { - // xAxes: [{ - // ticks: { - // autoSkip: false, - // maxRotation: 0, - // minRotation: 0 - // } - // }] - //} - }, - series : ['database'], - data : [ - $scope.status.database.acls, - $scope.status.database.apis, - $scope.status.database.consumers, - $scope.status.database.nodes, - $scope.status.database.plugins - ] - } - } - } - - var status = InfoService - .nodeStatus() - .then(function(resp){ - $scope.status = resp.data - }) - var info = InfoService - .getInfo() - .then(function(resp){ - $scope.info = resp.data - }) - var clusters = InfoService - .clusterStatus() - .then(function(resp){ - $scope.clusters = resp.data - }) - - - - function fetchData() { - $scope.loading = true - $q - .all([status, info]) - .finally( - function onFinally() { - - $log.debug("status",$scope.status) - $log.debug("info",$scope.info) - $log.debug("clusters",$scope.clusters) - $scope.loading = false - - if($scope.status && $scope.info) { - drawCharts(); - }else{ - $scope.error = true - $scope.alert = { - msg : 'You have to setup and activate a node in order to connect to Kong\'s admin API. You can do that in settings', - type : 'warning' - } - } - - }) - } - - fetchData(); - - } - ]) - ; -}()); diff --git a/frontend/src/app/dashboard/dashboard.html b/frontend/src/app/dashboard/dashboard.html deleted file mode 100644 index c455dd402..000000000 --- a/frontend/src/app/dashboard/dashboard.html +++ /dev/null @@ -1,192 +0,0 @@ -
-
-
-

Unable to connect!

-

- You will have to setup and activate a valid node in order to connect to Kong's admin API. You can do that in settings -

-

- - settings - Go to settings - -

-
-
-
-
-
-

Connecting to node. Please wait...

-
-
- - - - -
-
-
-
- -
-
-
-
- cast_connected  - Connections
-
-
- - -
-
-
-
-
-
-
- storage  - Database
-
-
- - -
-
-
-
-
-
-
- schedule  - Timers
-
-
- - -
-
-
-
-
-
-
- info_outline Gateway Info
-
- - - - - - - - - - - - - - - - - - - - - -
HostName{{info.hostname}}
Tag Line{{info.tagline}}
Version{{info.version}}
LUA Version{{info.lua_version}}
Admin listen{{info.configuration.admin_listen}}
-
-
-
-
-
-
- info_outline Database Info
-
- - - - - - - - - - - - - - - - - - - - - -
DBMS{{info.configuration.database}}
Host{{info.configuration.pg_host}}
Database{{info.configuration.pg_database}}
User{{info.configuration.pg_user}}
Port{{info.configuration.pg_port}}
-
-
-
-
-
-
- device_hub  - Cluster ({{clusters.total}} nodes)
-
- - - - - - - - - - - - -
statusnameaddress
- - {{cluster.status}} - - {{cluster.name}}{{cluster.address}}
-
-
-
-
-
-
- settings_input_component  - Plugins
-
-
- - {{key}} - -
-
-
-
- - diff --git a/frontend/src/app/dashboard/dashboard.js b/frontend/src/app/dashboard/dashboard.js deleted file mode 100644 index b08335561..000000000 --- a/frontend/src/app/dashboard/dashboard.js +++ /dev/null @@ -1,48 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.dashboard', [ - 'chart.js', - 'angular-matchheight' - ]); - - // Module configuration - angular.module('frontend.dashboard') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('dashboard', { - url: '/dashboard', - parent : 'frontend', - data : { - activeNode : true, - access: 1, - pageName : "Dashboard", - displayName : "dashboard", - prefix : 'dashboard' - }, - - views: { - 'content@': { - templateUrl: '/frontend/dashboard/dashboard.html', - controller: 'DashboardController', - resolve : { - _activeNode: [ - 'NodesService', - function resolve(NodesService) { - return NodesService.isActiveNodeSet() - } - ], - } - }, - - }, - - }) - ; - } - ]) - ; -}()); diff --git a/frontend/src/app/index.html b/frontend/src/app/index.html deleted file mode 100644 index 0ceed0077..000000000 --- a/frontend/src/app/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - Konga - - - - - - - - - - - - - - - - -
-
-
-

- -   -
-

- - -
-
-
-
-
-
- - - - - - - - - - diff --git a/frontend/src/app/info/index.html b/frontend/src/app/info/index.html deleted file mode 100644 index 3d15db1a6..000000000 --- a/frontend/src/app/info/index.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
-
-
-
- diff --git a/frontend/src/app/info/info-controllers.js b/frontend/src/app/info/info-controllers.js deleted file mode 100644 index d33d11779..000000000 --- a/frontend/src/app/info/info-controllers.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.info') - .controller('InfoController', [ - '$scope', '$log', '$state','_info', - function controller($scope, $log, $state,_info) { - - $scope.info = _info.data - - } - ]) - ; -}()); diff --git a/frontend/src/app/info/info-service.js b/frontend/src/app/info/info-service.js deleted file mode 100644 index 6f1a1d0e2..000000000 --- a/frontend/src/app/info/info-service.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.info') - .service('InfoService', [ - '$log', '$state','$http','BackendConfig', - function( $log, $state, $http, BackendConfig) { - - return { - - getInfo : function() { - return $http.get(BackendConfig.url + '/kong/info') - }, - nodeStatus : function() { - return $http.get(BackendConfig.url + '/kong/status') - }, - - clusterStatus : function() { - return $http.get(BackendConfig.url + '/kong/cluster') - }, - } - } - ]) - ; -}()); diff --git a/frontend/src/app/info/info.js b/frontend/src/app/info/info.js deleted file mode 100644 index 28613fa20..000000000 --- a/frontend/src/app/info/info.js +++ /dev/null @@ -1,40 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.info', []); - - // Module configuration - angular.module('frontend.info') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('info', { - parent: 'frontend', - url: '/info', - data : { - activeNode : true, - pageName : "Node Info", - displayName : "node info", - prefix : '' - }, - - views: { - 'content@': { - templateUrl: '/frontend/info/index.html', - controller: 'InfoController', - resolve : { - _info : ['InfoService',function(InfoService) { - return InfoService.getInfo() - }] - } - } - }, - - }) - ; - } - ]) - ; -}()); diff --git a/frontend/src/app/plugins/add-plugin-controller.js b/frontend/src/app/plugins/add-plugin-controller.js deleted file mode 100644 index fd83778d5..000000000 --- a/frontend/src/app/plugins/add-plugin-controller.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.plugins') - .controller('AddPluginController', [ - '_','$scope','$rootScope','$log','$state','ListConfig', - 'MessageService','ConsumerModel','SocketHelperService','PluginHelperService', - 'KongPluginsService','$uibModalInstance','PluginsService','_pluginName','_schema','_api', - function controller(_,$scope,$rootScope,$log,$state,ListConfig, - MessageService,ConsumerModel,SocketHelperService,PluginHelperService, - KongPluginsService,$uibModalInstance,PluginsService,_pluginName,_schema,_api ) { - - - $scope.api = _api - $log.debug("API",$scope.api) - - //var pluginOptions = new KongPluginsService().pluginOptions() - var options = new KongPluginsService().pluginOptions(_pluginName) - - $scope.schema = _schema.data - $scope.pluginName = _pluginName - $log.debug("Schema",$scope.schema) - //$log.debug("Options", options) - $scope.close = close - - $scope.humanizeLabel = function(key) { - return key.split("_").join(" ") - } - - - - function initialize() { - // Initialize plugin fields data - $scope.data = _.merge(options.fields,$scope.schema) - - // Define general modal window content - $scope.description = $scope.data.meta ? $scope.data.meta.description - : 'Configure the Plugin.' - - // Remove unwanted data fields that start with "_" - Object.keys($scope.data.fields).forEach(function(key){ - if(key.startsWith("_")) delete $scope.data.fields[key] - }) - - // Customize data fields according to plugin - PluginHelperService.customizeDataFieldsForPlugin(_pluginName,$scope.data.fields) - - // Assign extra properties from options to data fields - PluginHelperService.assignExtraProperties(options,$scope.data.fields) - $log.debug("Extra properties added to fields =>",$scope.data.fields) - } - - - - $scope.addCustomField = function(obj) { - if(!obj.custom_field) return; - if(!obj.custom_fields) { - obj.custom_fields = {} - } - - obj.custom_fields[obj.custom_field] = _.cloneDeep(obj.schema.fields) - obj.custom_field = "" - } - - $scope.removeCustomField = function(object,key) { - delete object.custom_fields[key] - } - - $scope.addPlugin = function(back) { - - $scope.busy = true; - - // Initialize request data - var request_data = { - name : _pluginName, - } - - // Add api_id to request_data if defined - if($scope.api) request_data.api_id = $scope.api.id - - // If a consumer is defined, add consumer_id to request data - if($scope.data.consumer instanceof Object) { - request_data.consumer_id = $scope.data.consumer.id - } - - // Apply monkey patches to request data if needed - PluginHelperService.applyMonkeyPatches(request_data,$scope.data.fields) - - // Create request data "config." properties - var config = PluginHelperService.createConfigProperties($scope.data.fields) - request_data = _.merge(request_data,config) - - - $log.debug("REQUEST DATA =>",request_data) - - PluginHelperService.addPlugin( - request_data, - function success(res){ - $log.debug("create plugin",res) - $scope.busy = false; - $rootScope.$broadcast('plugin.added',res.data) - MessageService.success('Plugin added successfully!') - $uibModalInstance.dismiss() - if(back) $state.go('plugins') // return to plugins page if specified - },function(err){ - $scope.busy = false; - $log.error("create plugin",err) - var errors = {} - Object.keys(err.data.customMessage).forEach(function(key){ - errors[key.replace('config.','')] = err.data.customMessage[key] - MessageService.error(key + " : " + err.data.customMessage[key]) - }) - $scope.errors = errors - },function evt(event){ - // Only used for ssl plugin certs upload - var progressPercentage = parseInt(100.0 * event.loaded / event.total); - $log.debug('progress: ' + progressPercentage +'% ' + event.config.data.file.name); - }) - } - - - - // Initialize used title items - $scope.titleItems = ListConfig.getTitleItems(ConsumerModel.endpoint); - - // Add the consumers to the plugin options - $scope.getConsumer = function(val) { - - if(!val) return; - - var commonParameters = { - where: SocketHelperService.getWhere({ - searchWord: val, - columns: $scope.titleItems - }) - }; - - return ConsumerModel - .load(_.merge({}, commonParameters, { - limit : 5 - })) - .then(function(response){ - return response.map(function(item){ - return item; - }); - }); - }; - - function close() { - $uibModalInstance.dismiss() - } - - - initialize(); - } - ]); -}()); diff --git a/frontend/src/app/plugins/add-plugins-controller.js b/frontend/src/app/plugins/add-plugins-controller.js deleted file mode 100644 index 32701f76a..000000000 --- a/frontend/src/app/plugins/add-plugins-controller.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.plugins') - .controller('AddPluginsController', [ - '_','$scope', '$rootScope','$log', - '$state','ApiService','MessageService','DialogService', - 'KongPluginsService','PluginsService','$uibModal', - '_plugins','_info', - function controller(_,$scope,$rootScope, $log, - $state, ApiService, MessageService, DialogService, - KongPluginsService,PluginsService, $uibModal, - _plugins,_info ) { - - - var info = _info.data - var plugins_available = info.plugins.available_on_server - var pluginOptions = new KongPluginsService().pluginOptions() - - $scope.pluginOptions = pluginOptions - new KongPluginsService().makePluginGroups().then(function(groups){ - $scope.pluginGroups = groups - $log.debug("Plugin Groups",$scope.pluginGroups) - - $scope.pluginGroups.forEach(function(group){ - for(var key in group.plugins) { - if(!plugins_available[key]) delete group.plugins[key] - } - }) - - // Init - syncPlugins(_plugins.data.data) - }) - $scope.activeGroup = 'Authentication' - $scope.setActiveGroup = setActiveGroup - $scope.filterGroup = filterGroup - $scope.onAddPlugin = onAddPlugin - - $scope.alert = { - msg : 'Plugins added in this section will be applied to all APIs.' + - '
If you need to add plugins to a specific API, you can do it' + - ' in the APIs section.' - } - - $scope.closeAlert = function() { - $scope.alert = undefined - } - - - - - /** - * ------------------------------------------------------------- - * Functions - * ------------------------------------------------------------- - */ - - function setActiveGroup(name) { - $scope.activeGroup = name - } - - function filterGroup(group) { - return group.name == $scope.activeGroup - } - - function onAddPlugin(name) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/plugins/modals/add-plugin-modal.html', - size : 'lg', - controller: 'AddPluginController', - resolve: { - _api : function() { - return null - }, - _pluginName: function () { - return name - }, - _schema: function () { - return PluginsService.schema(name) - } - } - }); - } - - function findPlugin(plugins,name) { - for(var i=0; i < plugins.length; i ++) { - if(plugins[i].name === name) { - return plugins[i] - } - } - return undefined - } - - function syncPlugins(added) { - - var addedMap = added.map(function(item){ - return item.name - }) - - $scope.pluginGroups.forEach(function(group){ - for(var key in group.plugins) { - if(addedMap.indexOf(key) > -1) { - group.plugins[key].isAdded = true - var plugin = findPlugin(added,key); - if(plugin) { - for(var _key in plugin){ - group.plugins[key][_key] = plugin[_key] - } - } - }else{ - group.plugins[key].isAdded = false - } - } - }) - } - - - function fetchPlugins() { - PluginsService.load() - .then(function(res){ - syncPlugins(res.data.data) - }) - } - - // Listeners - $scope.$on('plugin.added',function(){ - fetchPlugins() - }) - - /** - * ------------------------------------------------------------ - * Listeners - * ------------------------------------------------------------ - */ - $scope.$on("plugin.added",function(){ - fetchPlugins() - }) - - $scope.$on("plugin.updated",function(ev,plugin){ - fetchPlugins() - }) - - - - - } - ]) - ; -}()); diff --git a/frontend/src/app/plugins/add-plugins.html b/frontend/src/app/plugins/add-plugins.html deleted file mode 100644 index b35f13aa7..000000000 --- a/frontend/src/app/plugins/add-plugins.html +++ /dev/null @@ -1,59 +0,0 @@ -
-
-
- -
-
-
-
-
- -
-
- - - -
-
-
-

{{group.icon}} {{group.name}}

-

{{group.description}}

-
-
- -
-
-
-
- {{key.split('-').join(" ")}} -
- -
-
-
-
-

- {{value.description}} -

-
-
-
-
-
\ No newline at end of file diff --git a/frontend/src/app/plugins/edit-plugin-controller.js b/frontend/src/app/plugins/edit-plugin-controller.js deleted file mode 100644 index f7cc71dae..000000000 --- a/frontend/src/app/plugins/edit-plugin-controller.js +++ /dev/null @@ -1,247 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.plugins') - .controller('EditPluginController', [ - '_','$scope','$rootScope','$log','ListConfig', - 'MessageService','ConsumerModel','SocketHelperService','PluginHelperService', - 'KongPluginsService','$uibModalInstance','PluginsService','_plugin','_schema', - function controller(_,$scope,$rootScope,$log,ListConfig, - MessageService,ConsumerModel,SocketHelperService,PluginHelperService, - KongPluginsService,$uibModalInstance,PluginsService,_plugin,_schema ) { - - $scope.plugin = _plugin - $scope.schema = _schema.data - $log.debug("Plugin",$scope.plugin) - $log.debug("Schema",$scope.schema) - - //var pluginOptions = new KongPluginsService().pluginOptions() - var options = new KongPluginsService().pluginOptions(_plugin.name) - - - //$log.debug("Options", options) - $scope.close = close - - - $scope.humanizeLabel = function(key) { - return key.split("_").join(" ") - } - - $scope.addFlexField = function(fields,v) { - if(!v.flex_field) return; - - fields[v.flex_field] = { - "schema": { - "fields": { - "day": { - "type": "number", - }, - "minute": { - "type": "number", - }, - "second": { - "type": "number", - }, - "year": { - "type": "number", - }, - "month": { - "type": "number", - }, - "hour": { - "type": "number", - } - } - } - } - - v.flex_field = "" - } - - $scope.removeField = function(object,key) { - delete object[key] - } - - function initialize() { - // Initialize plugin fields data - $scope.data = _.merge(options.fields,$scope.schema,{ - consumer_id : $scope.plugin.consumer_id - }) - - // Define general modal window content - $scope.description = $scope.data.meta ? $scope.data.meta.description - : 'Configure the Plugin.' - - // Remove unwanted data fields that start with "_" - Object.keys($scope.data.fields).forEach(function(key){ - if(key.startsWith("_")) delete $scope.data.fields[key] - }) - - // Monkey patch for response-ratelimiting plugin - if(_plugin.name === 'response-ratelimiting') { - console.log("response-ratelimiting:limits =>",_plugin.config.limits) - - // Delete initial schema fields - delete $scope.data.fields.limits.schema.fields.day - delete $scope.data.fields.limits.schema.fields.hour - delete $scope.data.fields.limits.schema.fields.minute - delete $scope.data.fields.limits.schema.fields.month - delete $scope.data.fields.limits.schema.fields.second - delete $scope.data.fields.limits.schema.fields.year - - - Object.keys(_plugin.config.limits).forEach(function(key){ - - //console.log("_plugin.config.limits[key]",_plugin.config.limits[key]) - - var inner_fields = {} - Object.keys(_plugin.config.limits[key]).forEach(function(k){ - inner_fields[k] = { - type : 'number', - default : _plugin.config.limits[key][k] - } - }) - - $scope.data.fields.limits.schema.fields[key] = { - - schema : { - fields : inner_fields - } - } - }) - - console.log("$scope.data =>",$scope.data) - } - - - - - // Customize data fields according to plugin - PluginHelperService.customizeDataFieldsForPlugin(_plugin.name,$scope.data.fields) - - assignValues($scope.data.fields); - } - - - - function assignValues(fields,prefix) { - - Object.keys(fields).forEach(function (item) { - if(fields[item].schema) { - assignValues(fields[item].schema.fields,prefix ? prefix + "." + item : item) - }else{ - - var path = prefix ? prefix + "." + item : item; - var value = _.get(_plugin.config, path) - - - if (fields[item].type === 'array' - && value !== null && typeof value === 'object' && !Object.keys(value).length) { - value = [] - } - fields[item].value = value - fields[item].help = _.get(options,path) ? _.get(options,path).help : '' - } - }) - } - - - - - $scope.updatePlugin = function() { - - $scope.busy = true; - - - var data = { - enabled : $scope.plugin.enabled, - } - - if($scope.data.consumer_id instanceof Object) { - data.consumer_id = $scope.data.consumer_id.id - } - - - function createConfig(fields,prefix) { - - Object.keys(fields).forEach(function (key) { - if(fields[key].schema) { - createConfig(fields[key].schema.fields,prefix ? prefix + "." + key : key) - }else{ - var path = prefix ? prefix + "." + key : key; - if (fields[key].value instanceof Array) { - // Transform to comma separated string - data['config.' + path] = fields[key].value.join(",") - } else { - data['config.' + path] = fields[key].value - } - } - }) - - } - - createConfig($scope.data.fields); - - $log.debug("REQUEST DATA =>",data) - - PluginsService.update(_plugin.id,data) - .then(function(res){ - $log.debug("updatePlugin",res) - $scope.busy = false; - $rootScope.$broadcast('plugin.updated',res.data) - MessageService.success('"' + _plugin.name + '" plugin updated successfully!') - $uibModalInstance.dismiss() - }).catch(function(err){ - $scope.busy = false; - $log.error("update plugin",err) - var errors = {} - Object.keys(err.data.customMessage).forEach(function(key){ - errors[key.replace('config.','')] = err.data.customMessage[key] - MessageService.error(key + " : " + err.data.customMessage[key]) - }) - $scope.errors = errors - }) - } - - - - // Initialize used title items - $scope.titleItems = ListConfig.getTitleItems(ConsumerModel.endpoint); - - // Add the consumers to the plugin options - $scope.getConsumer = function(val) { - - if(!val) return; - - var commonParameters = { - where: SocketHelperService.getWhere({ - searchWord: val, - columns: $scope.titleItems - }) - }; - - return ConsumerModel - .load(_.merge({}, commonParameters, { - limit : 5 - })) - .then(function(response){ - return response.map(function(item){ - return item; - }); - }); - }; - - function close() { - $uibModalInstance.dismiss() - } - - initialize(); - } - ]) - ; -}()); diff --git a/frontend/src/app/plugins/modals/add-plugin-modal.html b/frontend/src/app/plugins/modals/add-plugin-modal.html deleted file mode 100644 index 925920880..000000000 --- a/frontend/src/app/plugins/modals/add-plugin-modal.html +++ /dev/null @@ -1,166 +0,0 @@ - -
-

-
- \ No newline at end of file diff --git a/frontend/src/app/plugins/modals/custom-template.html b/frontend/src/app/plugins/modals/custom-template.html deleted file mode 100644 index 0a304f17e..000000000 --- a/frontend/src/app/plugins/modals/custom-template.html +++ /dev/null @@ -1,4 +0,0 @@ - -

{{match.model.username}}

-

{{match.model.id}}

-
\ No newline at end of file diff --git a/frontend/src/app/plugins/modals/edit-plugin-modal.html b/frontend/src/app/plugins/modals/edit-plugin-modal.html deleted file mode 100644 index dda52f996..000000000 --- a/frontend/src/app/plugins/modals/edit-plugin-modal.html +++ /dev/null @@ -1,186 +0,0 @@ - -
- -
- -
-

- -
- \ No newline at end of file diff --git a/frontend/src/app/plugins/plugin-helper-service.js b/frontend/src/app/plugins/plugin-helper-service.js deleted file mode 100644 index 5e7777270..000000000 --- a/frontend/src/app/plugins/plugin-helper-service.js +++ /dev/null @@ -1,143 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.plugins') - .service('PluginHelperService', [ - '_','$log','BackendConfig','Upload','PluginsService', - function( _,$log,BackendConfig,Upload,PluginsService) { - - function assignExtraProperties(options,fields,prefix) { - Object.keys(fields).forEach(function (item) { - if(fields[item].schema) { - assignExtraProperties(options,fields[item].schema.fields,item) - }else{ - var path = prefix ? prefix + "." + item : item; - var value = fields[item].default - - if (fields[item].type === 'array' - && (typeof value === 'object' || typeof value === 'string') - ) { - value = [] - } - fields[item].value = value - fields[item].help = _.get(options,path) ? _.get(options,path).help : '' - } - }) - } - - - function createConfigProperties(fields,prefix,data) { - Object.keys(fields).forEach(function (key) { - if(fields[key].schema) { - createConfigProperties(fields[key].schema.fields,key,data) - }else{ - var path = prefix ? prefix + "." + key : key; - if (fields[key].value instanceof Array) { - // Transform to comma separated string - data['config.' + path] = fields[key].value.join(",") - } else { - data['config.' + path] = fields[key].value - } - } - }) - } - - var handlers = { - common : function(data,success,error) { - - PluginsService.add(data) - .then(function(resp){ - success(resp) - }).catch(function(err){ - error(err) - }) - }, - ssl : function(data, success,error,event) { - var files = []; - - files.push(data['config.cert']) - files.push(data['config.key']) - - Upload.upload({ - url: BackendConfig.url + '/kong/plugins', - arrayKey: '', - data: { - file: files, - 'name' : data.name, - 'config.only_https': data['config.only_https'], - 'config.accept_http_if_already_terminated': data['config.accept_http_if_already_terminated'] - } - }).then(function (resp) { - success(resp) - }, function (err) { - error(err) - }, function (evt) { - event(evt) - }); - } - } - - return { - addPlugin : function(data, success,error,event) { - - if(handlers[data.name]) { - return handlers[data.name](data, success,error,event) - }else{ - return handlers['common'](data, success,error,event) - } - }, - - createConfigProperties : function(fields,prefix) { - var output = {} - createConfigProperties(fields,prefix,output) - return output - }, - - assignExtraProperties : function(options,fields,prefix) { - return assignExtraProperties(options,fields,prefix) - }, - - /** - * Customize data fields for specified plugins if required by Konga's logic - * @param pluginName - * @param fields - */ - customizeDataFieldsForPlugin : function(pluginName,fields) { - - switch (pluginName) { - case 'ssl': - fields.cert.type = 'file' - fields.key.type = 'file' - break; - } - }, - - /** - * Mutate request data for specified plugins if required by Konga's logic - * @param request_data - * @param fields - */ - applyMonkeyPatches : function(request_data,fields) { - if(request_data.name === 'response-ratelimiting' - && fields.limits.custom_fields) { - Object.keys(fields.limits.custom_fields) - .forEach(function(key){ - Object.keys(fields.limits.custom_fields[key]) - .forEach(function(cf_key){ - request_data['config.limits.' + key + '.' + cf_key] = fields.limits.custom_fields[key][cf_key].value - - }) - }) - } - } - - } - } - ]) - ; -}()); diff --git a/frontend/src/app/plugins/plugins-controller.js b/frontend/src/app/plugins/plugins-controller.js deleted file mode 100644 index 65f4316e0..000000000 --- a/frontend/src/app/plugins/plugins-controller.js +++ /dev/null @@ -1,106 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.plugins') - .controller('PluginsController', [ - '_','$scope', '$log', '$state','ApiService','PluginsService', - '$uibModal','DialogService','InfoService','_plugins', - function controller(_,$scope, $log, $state, ApiService, PluginsService, - $uibModal,DialogService,InfoService,_plugins ) { - - //$scope.api = _api.data - //$state.current.data.pageName = "Plugins ( API : " + ( $scope.api.name || $scope.api.id )+ " )" - - $scope.plugins = _plugins.data - $scope.onEditPlugin = onEditPlugin - $scope.deletePlugin = deletePlugin - $scope.updatePlugin = updatePlugin - $scope.search = '' - - $log.debug("Plugins",$scope.plugins.data) - - /** - * ---------------------------------------------------------------------- - * Functions - * ---------------------------------------------------------------------- - */ - - function updatePlugin(plugin) { - PluginsService.update(plugin.id,{ - enabled : plugin.enabled, - //config : plugin.config - }) - .then(function(res){ - $log.debug("updatePlugin",res) - $scope.plugins.data[$scope.plugins.data.indexOf(plugin)] = res.data; - - }).catch(function(err){ - $log.error("updatePlugin",err) - }) - } - - - function deletePlugin(plugin) { - DialogService.prompt( - "Delete Plugin","Really want to delete the plugin?", - ['No don\'t','Yes! delete it'], - function accept(){ - PluginsService.delete(plugin.id) - .then(function(resp){ - $scope.plugins.data.splice($scope.plugins.data.indexOf(plugin),1); - }).catch(function(err){ - $log.error(err) - }) - },function decline(){}) - } - - function onEditPlugin(item) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/plugins/modals/edit-plugin-modal.html', - size : 'lg', - controller: 'EditPluginController', - resolve: { - _plugin: function () { - return _.cloneDeep(item) - }, - _schema: function () { - return PluginsService.schema(item.name) - } - } - }); - } - - function fetchPlugins() { - PluginsService.load() - .then(function(res){ - $scope.plugins = res.data - }) - } - - - /** - * ------------------------------------------------------------ - * Listeners - * ------------------------------------------------------------ - */ - $scope.$on("plugin.added",function(){ - fetchPlugins() - }) - - $scope.$on("plugin.updated",function(ev,plugin){ - fetchPlugins() - }) - - - } - ]) - ; -}()); diff --git a/frontend/src/app/plugins/plugins-service.js b/frontend/src/app/plugins/plugins-service.js deleted file mode 100644 index 8a9e7f2af..000000000 --- a/frontend/src/app/plugins/plugins-service.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.plugins') - .service('PluginsService', [ - '$log', '$state','$http','BackendConfig', - function( $log, $state, $http,BackendConfig) { - - return { - - load : function(query) { - return $http.get(BackendConfig.url + '/kong/plugins',{ - params: query - }) - }, - - add : function(data) { - return $http.post(BackendConfig.url + '/kong/plugins',data) - }, - - update : function(id,data) { - return $http.patch(BackendConfig.url + '/kong/plugins/' + id,data) - }, - - fetch : function(pluginId) { - return $http.get(BackendConfig.url + '/kong/plugins/' + pluginId) - }, - - schema : function(name) { - return $http.get(BackendConfig.url + '/kong/plugins/schema/' + name) - }, - - enabled : function() { - return $http.get(BackendConfig.url + '/kong/plugins/enabled'); - }, - - delete : function(id) { - return $http.delete(BackendConfig.url + '/kong/plugins/' + id) - } - } - } - ]) - ; -}()); diff --git a/frontend/src/app/plugins/plugins.html b/frontend/src/app/plugins/plugins.html deleted file mode 100644 index 76a7e1ca1..000000000 --- a/frontend/src/app/plugins/plugins.html +++ /dev/null @@ -1,78 +0,0 @@ - -
-
-
- -
- -
- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
NameAPIConsumerCreated
- - - - {{item.name}} - {{item.api_id || 'All APIs'}} - {{item.consumer_id}} - All consumers - {{item.created_at | date : format : timezone}} - - - -
- no data found... -
- -
- - -
- diff --git a/frontend/src/app/plugins/plugins.js b/frontend/src/app/plugins/plugins.js deleted file mode 100644 index 787075979..000000000 --- a/frontend/src/app/plugins/plugins.js +++ /dev/null @@ -1,89 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.plugins', []); - - // Module configuration - angular.module('frontend.plugins') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('plugins', { - parent : 'frontend', - url: '/plugins', - data : { - activeNode : true, - pageName : "Plugins", - displayName : "plugins", - prefix : 'settings_input_component' - }, - views: { - 'content@': { - templateUrl: '/frontend/plugins/plugins.html', - controller: 'PluginsController', - resolve: { - _plugins : [ - 'PluginsService', - function(PluginsService) { - return PluginsService.load() - } - ] - } - } - } - }) - .state('plugins.add', { - url: '/add', - params : { - api : {} - }, - data : { - pageName : "Add Global Plugins", - displayName : "add" - }, - views: { - 'content@': { - templateUrl: '/frontend/plugins/add-plugins.html', - controller: 'AddPluginsController', - resolve : { - _plugins: [ - '$stateParams', - 'PluginsService', - '$log', - function resolve( - $stateParams, - PluginsService, - $log - ) { - return PluginsService.load() - } - ], - _info: [ - '$stateParams', - 'InfoService', - '$log', - function resolve( - $stateParams, - InfoService, - $log - ) { - return InfoService.getInfo() - } - ], - _activeNode: [ - 'NodesService', - function resolve(NodesService) { - - return NodesService.isActiveNodeSet() - } - ], - } - } - }, - }) - } - ]) - ; -}()); diff --git a/frontend/src/app/settings/index.html b/frontend/src/app/settings/index.html deleted file mode 100644 index 562c8277c..000000000 --- a/frontend/src/app/settings/index.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
-

- - Kong Nodes -

-
-
-
-

- add Create one or more nodes.
- add Select the node to connect to by clicking on the corresponding star icon. -

-
- -
-
-
-
- - -
-
- -
-
-
-
-
- -
-
-
diff --git a/frontend/src/app/settings/modals/create-node-modal.html b/frontend/src/app/settings/modals/create-node-modal.html deleted file mode 100644 index 66da57819..000000000 --- a/frontend/src/app/settings/modals/create-node-modal.html +++ /dev/null @@ -1,45 +0,0 @@ - -
-

- After creating a Node, you will need to activate it in order to be able to connect to Kong's admin API.
- There can be only one active Node. -

-
- \ No newline at end of file diff --git a/frontend/src/app/settings/modals/test-node-modal.html b/frontend/src/app/settings/modals/test-node-modal.html deleted file mode 100644 index 32f182c45..000000000 --- a/frontend/src/app/settings/modals/test-node-modal.html +++ /dev/null @@ -1,29 +0,0 @@ - - \ No newline at end of file diff --git a/frontend/src/app/settings/node-model.js b/frontend/src/app/settings/node-model.js deleted file mode 100644 index de99f986d..000000000 --- a/frontend/src/app/settings/node-model.js +++ /dev/null @@ -1,29 +0,0 @@ -(function() { - 'use strict'; - - /** - * Model for Author API, this is used to wrap all Author objects specified actions and data change actions. - */ - angular.module('frontend.settings') - .service('NodeModel', [ - 'DataModel', - function(DataModel) { - - var model = new DataModel('kongnode'); - - model.handleError = function($scope,err) { - $scope.errors = {} - if(err.data){ - - for(var key in err.data.invalidAttributes){ - $scope.errors[key] = err.data.invalidAttributes[key][0].message - } - } - } - - return model; - - } - ]) - ; -}()); \ No newline at end of file diff --git a/frontend/src/app/settings/partials/nodes-table.html b/frontend/src/app/settings/partials/nodes-table.html deleted file mode 100644 index ea6986d22..000000000 --- a/frontend/src/app/settings/partials/nodes-table.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - -
- - - - -
{{node.id}}. - - - {{node.name || 'undefined'}} - {{node.kong_admin_url}} - {{node.createdAt | date : "MMM d, y"}}{{node.updatedAt | date : "MMM d, y"}} - -
-
No nodes found...
-
- -
    \ No newline at end of file diff --git a/frontend/src/app/settings/settings-controller.js b/frontend/src/app/settings/settings-controller.js deleted file mode 100644 index 0a5f34008..000000000 --- a/frontend/src/app/settings/settings-controller.js +++ /dev/null @@ -1,347 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.settings') - .controller('SettingsController', [ - '_','$scope', '$rootScope','$q','$log','$ngBootbox','UserModel', - 'SocketHelperService','UserService','MessageService', - '$state','$uibModal','DialogService','NodeModel','$localStorage', - 'ListConfig','_nodes','_countNodes', - function controller(_,$scope, $rootScope,$q,$log,$ngBootbox,UserModel, - SocketHelperService, UserService, MessageService, - $state, $uibModal,DialogService,NodeModel,$localStorage, - ListConfig, _nodes, _countNodes ) { - - - NodeModel.setScope($scope, false, 'items', 'itemCount'); - - // Add default list configuration variable to current scope - $scope = angular.extend($scope, angular.copy(ListConfig.getConfig())); - - // Set initial data - $scope.nodes = _nodes; - $scope.nodesCount = _countNodes.count; - $scope.user = UserService.user(); - - // Initialize used title items - $scope.nodeTitleItems = ListConfig.getTitleItems(NodeModel.endpoint); - - $log.debug("_nodes",_nodes) - $log.debug("nodesCount",$scope.nodesCount) - $log.debug("nodeTitleItems",$scope.nodeTitleItems) - - // Initialize default sort data - - $scope.paging = { - currentPage: 1, - }; - - $scope.sort = { - column: 'createdAt', - direction: false, - }; - - // Initialize filters - $scope.filters = { - searchWord: '', - columns: $scope.nodeTitleItems, - }; - - // Function to change sort column / direction on list - $scope.changeSort = function changeSort(item) { - var sort = $scope.sort; - - if (sort.column === item.column) { - sort.direction = !sort.direction; - } else { - sort.column = item.column; - sort.direction = true; - } - - _triggerFetchData(); - }; - - - $scope.pageChanged = function() { - $log.log('Page changed to: ' + $scope.paging.currentPage); - _fetchData(); - } - - /** - * Simple watcher for 'itemsPerPage' scope variable. If this is changed we need to fetch author data - * from server. - */ - $scope.$watch('itemsPerPage', function watcher(valueNew, valueOld) { - if (valueNew !== valueOld) { - _triggerFetchData(); - } - }); - - - $scope.$watch('filters', function watcher(valueNew, valueOld) { - if (valueNew !== valueOld) { - _triggerFetchData(); - } - },true); - - - // User delete dialog buttons configuration - $scope.confirmButtonsDelete = { - ok: { - label: 'Delete', - className: 'btn-danger btn-link', - callback: function callback(result,node) { - console.log(node) - //$scope.deleteNode(); - } - }, - cancel: { - label: 'Cancel', - className: 'btn-default btn-link' - } - }; - - - $scope.deleteNode = function deleteNode(node) { - - NodeModel - .delete(node.id) - .then( - function onSuccess() { - MessageService.success('Node deleted successfully'); - $rootScope.$broadcast('kong.node.deleted',node) - _triggerFetchData() - - } - ) - ; - }; - - $scope.toggleActive = function(node) { - NodeModel - .update(node.id,{active:!node.active}) - .then( - function onSuccess(result) { - $rootScope.$broadcast('kong.node.updated',result.data) - if(node.active) { - $rootScope.$broadcast('kong.node.deactivated',result.data) - }else{ - $rootScope.$broadcast('kong.node.activated',result.data) - } - },function(err){ - $scope.busy = false - NodeModel.handleError($scope,err) - } - ) - ; - } - - - function showTestNodeModal(node) { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/settings/modals/test-node-modal.html', - size : 'sm', - backdrop: 'static', - keyboard: false, - controller: function($scope,$log,InfoService,MessageService,$uibModalInstance,_node) { - - $scope.close = function(){ - $uibModalInstance.dismiss() - } - - $scope.connecting = true; - - $scope.url = _node.kong_admin_url; - - InfoService.getInfo() - .then(function(res){ - console.log(res) - $scope.connecting = false; - $scope.connectionSucceeded = true; - }) - .catch(function(err){ - $scope.connecting = false; - }) - - - }, - resolve : { - _node : function() { - return node; - } - } - }); - } - - $scope.updateNode = function(node) { - NodeModel - .update(node.id,node) - .then( - function onSuccess(result) { - $rootScope.$broadcast('kong.node.updated',result.data) - if(!node.active) showTestNodeModal(node) - },function(err){ - $scope.busy = false - NodeModel.handleError($scope,err) - } - ) - ; - } - - $scope.createNode = function() { - $uibModal.open({ - animation: true, - ariaLabelledBy: 'modal-title', - ariaDescribedBy: 'modal-body', - templateUrl: '/frontend/settings/modals/create-node-modal.html', - size : 'lg', - controller: function($scope,$rootScope,$log,NodeModel,MessageService,$uibModalInstance) { - $scope.node = { - kong_admin_url : '', - } - - $scope.close = function(){ - $uibModalInstance.dismiss() - } - - $scope.create = function() { - $scope.busy = true; - NodeModel - .create(angular.copy($scope.node)) - .then( - function onSuccess(result) { - $log.info('New node created successfully',result) - MessageService.success('New node created successfully'); - $scope.busy = false; - $rootScope.$broadcast('kong.node.created',result.data) - $uibModalInstance.dismiss() - },function(err){ - $scope.busy = false - NodeModel.handleError($scope,err) - } - ) - ; - } - } - }); - } - - - function _triggerFetchData() { - if ($scope.paging.currentPage === 1) { - _fetchData(); - } else { - $scope.paging.currentPage = 1; - } - } - - - /** - * Helper function to fetch actual data for GUI from backend server with current parameters: - * 1) Current page - * 2) Search word - * 3) Sort order - * 4) Items per page - * - * Actually this function is doing two request to backend: - * 1) Data count by given filter parameters - * 2) Actual data fetch for current page with filter parameters - * - * These are fetched via 'AuthorModel' service with promises. - * - * @private - */ - function _fetchData() { - $scope.loading = true; - - // Common parameters for count and data query - var commonParameters = { - where: SocketHelperService.getWhere($scope.filters) - }; - - // Data query specified parameters - var parameters = { - limit: $scope.itemsPerPage, - skip: ($scope.paging.currentPage - 1) * $scope.itemsPerPage, - sort: $scope.sort.column + ' ' + ($scope.sort.direction ? 'ASC' : 'DESC') - }; - - // Fetch data count - var count = NodeModel - .count(commonParameters) - .then( - function onSuccess(response) { - $scope.itemCount = response.count; - } - ); - - - // Fetch actual data - var load = NodeModel - .load(_.merge({}, commonParameters, parameters)) - .then( - function onSuccess(response) { - $scope.nodes = response; - } - ) - ; - - // And wrap those all to promise loading - $q - .all([count, load]) - .finally( - function onFinally() { - $scope.loaded = true; - $scope.loading = false; - } - ) - ; - } - $scope.$on('kong.node.updated',function(ev,node){ - _triggerFetchData() - if(node.active) updateUserNode(node) - }) - - $scope.$on('kong.node.deactivated',function(ev,node){ - updateUserNode() - }) - - $scope.$on('kong.node.activated',function(ev,node){ - updateUserNode(node) - }) - $scope.$on('kong.node.created',function(ev,node){ - _triggerFetchData() - }) - - $scope.$on('kong.node.deleted',function(ev,node){ - _triggerFetchData() - if(node.active) updateUserNode() - }) - - function updateUserNode(node) { - UserModel - .update(UserService.user().id, { - node_id : node ? node.kong_admin_url : '' - }) - .then( - function onSuccess(res) { - var credentials = $localStorage.credentials - credentials.user.node_id = res.data.node_id - $localStorage.credentials = credentials - } - ); - } - - - } - ]) - ; -}()); \ No newline at end of file diff --git a/frontend/src/app/settings/settings-model.js b/frontend/src/app/settings/settings-model.js deleted file mode 100644 index b41567611..000000000 --- a/frontend/src/app/settings/settings-model.js +++ /dev/null @@ -1,29 +0,0 @@ -(function() { - 'use strict'; - - /** - * Model for Author API, this is used to wrap all Author objects specified actions and data change actions. - */ - angular.module('frontend.settings') - .service('SettingModel', [ - 'DataModel', - function(DataModel) { - - var model = new DataModel('settings'); - - model.handleError = function($scope,err) { - $scope.errors = {} - if(err.data){ - - for(var key in err.data.invalidAttributes){ - $scope.errors[key] = err.data.invalidAttributes[key][0].message - } - } - } - - return model; - - } - ]) - ; -}()); \ No newline at end of file diff --git a/frontend/src/app/settings/settings.js b/frontend/src/app/settings/settings.js deleted file mode 100644 index 08227b58d..000000000 --- a/frontend/src/app/settings/settings.js +++ /dev/null @@ -1,65 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.settings', [ - ]); - - // Module configuration - angular.module('frontend.settings') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('settings', { - url: '/settings', - parent : 'frontend', - data : { - access : 1, - pageName : "Konga Settings", - displayName : "settings", - prefix : '' - }, - views: { - 'content@': { - templateUrl: '/frontend/settings/index.html', - controller: 'SettingsController', - resolve: { - _nodes: [ - '_', - 'ListConfig','SocketHelperService', - 'NodeModel', - function resolve( - _, - ListConfig,SocketHelperService, - NodeModel - ) { - var config = ListConfig.getConfig(); - var commonParameters = { - where: SocketHelperService.getWhere({ - searchWord: '' - }) - }; - - var parameters = { - limit: config.itemsPerPage, - sort: 'createdAt DESC' - }; - - return NodeModel.load(_.merge({}, commonParameters, parameters)); - } - ], - _countNodes: [ - 'NodeModel', - function resolve(NodeModel) { - return NodeModel.count(); - } - ] - } - } - } - }) - } - ]) - ; -}()); diff --git a/frontend/src/app/styles/_angular.scss b/frontend/src/app/styles/_angular.scss deleted file mode 100644 index 5638ca187..000000000 --- a/frontend/src/app/styles/_angular.scss +++ /dev/null @@ -1,10 +0,0 @@ -// scss-lint:disable SelectorFormat -[ng\:cloak], -[ng-cloak], -[data-ng-cloak], -[x-ng-cloak], -.ng-cloak, -.x-ng-cloak { - // scss-lint:disable ImportantRule - display: none !important; -} diff --git a/frontend/src/app/styles/_animloader.scss b/frontend/src/app/styles/_animloader.scss deleted file mode 100644 index 13d8e4781..000000000 --- a/frontend/src/app/styles/_animloader.scss +++ /dev/null @@ -1,72 +0,0 @@ -$animationLength: 1.5s; -$animationRadius: 12px; -$dotSize: 8px; - -.sampleContainer { margin-top: 250px; } - -.anim-loader { - position: relative; - width: $animationRadius * 3 + $dotSize; - height: $dotSize; - margin: $animationRadius auto; -} - -.dot { - display: inline-block; - width: $dotSize; - height: $dotSize; - border-radius: $dotSize * 0.5; - background: #ccc; - position: absolute; -} - -.dot_1 { - animation: animateDot1 $animationLength linear infinite; - left: $animationRadius; - background: #e579b8; -} - -.dot_2 { - animation: animateDot2 $animationLength linear infinite; - animation-delay: $animationLength / 3; - left: $animationRadius * 2; -} - -.dot_3 { - animation: animateDot3 $animationLength linear infinite; - left: $animationRadius; -} - -.dot_4 { - animation: animateDot4 $animationLength linear infinite; - animation-delay: $animationLength / 3; - left: $animationRadius * 2; -} - -@keyframes animateDot1 { - 0%{ transform: rotate(0deg) translateX(-$animationRadius); } - 25% { transform: rotate(180deg) translateX(-$animationRadius); } - 75% { transform: rotate(180deg) translateX(-$animationRadius); } - 100% { transform: rotate(360deg) translateX(-$animationRadius); } -} - -@keyframes animateDot2 { - 0%{ transform: rotate(-0deg) translateX(-$animationRadius); } - 25% { transform: rotate(-180deg) translateX(-$animationRadius); } - 75% { transform: rotate(-180deg) translateX(-$animationRadius); } - 100% { transform: rotate(-360deg) translateX(-$animationRadius); } -} - -@keyframes animateDot3 { - 0%{ transform: rotate(0deg) translateX($animationRadius); } - 25% { transform: rotate(180deg) translateX($animationRadius); } - 75% { transform: rotate(180deg) translateX($animationRadius); } - 100% { transform: rotate(360deg) translateX($animationRadius); } -} - -@keyframes animateDot4 { - 0%{ transform: rotate(-0deg) translateX($animationRadius); } - 25% { transform: rotate(-180deg) translateX($animationRadius); } - 75% { transform: rotate(-180deg) translateX($animationRadius); } - 100% { transform: rotate(-360deg) translateX($animationRadius); } -} \ No newline at end of file diff --git a/frontend/src/app/styles/_base.scss b/frontend/src/app/styles/_base.scss deleted file mode 100644 index 47557759f..000000000 --- a/frontend/src/app/styles/_base.scss +++ /dev/null @@ -1,586 +0,0 @@ -@import "mixins"; - -@import 'variables'; -@import 'bootswatch'; -@import 'forms'; -@import 'components'; -@import 'bootstrap_over'; -@import 'angular'; -@import "animloader"; - - -$color-footer-text: #999; -$color-footer-hover-text: #3399f3; -$color-footer-hover-icons: #337bd5; -$color-tooltip-title: #fff; -$color-tooltip-title-border: #9b9b9b; - -body { - cursor: default; - font-family: 'Open Sans', sans-serif; - overflow-y: auto; - font-size: 1.4em; - background-color: #f9f9f9; - padding-bottom: 30px; - -} - - -input:disabled { - opacity: 0.5 !important; -} - - - -h1, -h2, -h3, -h4, -h5, -h5 { - color: #414141; - &:first-of-type { - margin-top: 10px; - } -} - -.no-select { - @include no-select(); -} - -.container { - //max-width: 100%; - //min-width: 100%; -} - -.main-container { - margin-bottom: 30px; - //margin-top: 65px; - padding-top: 20px; -} - -.home{ - padding-top: 80px; - - -} - -#toast-container > div,#toast-container > :hover{ - box-shadow: none; -} - -#toast-container > div{ - padding: 15px; -} - -.toast-error{ - background-color: $brand-danger; -} - -.toast-success{ - background-color: $brand-success; -} - -.toast-warning{ - background-color: $brand-warning; -} - -.konga-nav-icon{ - height: 25px; - float: left; - margin-right: 5px; - -} - -.navbar.default:before{ - //content: ""; - //position: absolute; - //top:0; - //left: 0; - //width: 100%; - //height: 2px; - //background-color: $brand-primary; -} - - - -header .navbar-nav { - - float: none; -} - -.page-title { - font-size: 2em; - //color : $brand-primary - i{ - color : $brand-primary - } -} - -.page-head{ - margin-top: 65px; - padding: 1em; - background-color: #f2f2f2; - - .breadcrumb { - padding: 0; - margin: 0; - background-color: transparent; - } -} - -.material-icons.large{ - font-size: 3em; -} - -.no-wrap{ - white-space: nowrap; -} - -.underline { - padding-bottom: 5px; - border-bottom: 1px solid #eaeaea; -} - -.elipsize { - overflow: hidden; - text-overflow: ellipsis; -} - -footer { - .navbar { - background-color: $gray-lighter; - border-top: 1px solid #ddd; - max-height: 30px; - min-height: 30px; - //text-align: right; - - .navbar-nav { - float: none; - - > li { - display: inline-block; - float: none; - - > a { - font-size: 0.9em; - line-height: 1; - padding: 0 10px; - color : $gray; - - .material-icons { - font-size: 1.3em; - vertical-align: text-bottom; - display: inline-block; - } - - .fa { - - font-size: 14px; - margin-right: 3px; - position: relative; - top: 1px; - } - - &:hover { - color: $color-footer-hover-text; - - .fa { - color: $color-footer-hover-icons; - } - } - } - } - } - } -} - -.label{ - font-size: 0.9em; -} - -.no-margin { - margin:0 !important; -} - -.no-padding{ - padding:0 !important; -} - -.no-select { - -} - -.pagination { - margin: 0; -} - -.text-medium { - font-size: 90%; -} - -.text-small { - font-size: 80%; -} - -.help { - .fa { - font-size: 20px; - line-height: 14px; - margin: 0 0 0 5px; - position: relative; - top: 2px; - } -} - -.tooltip { - .title { - border-bottom: 1px solid $color-tooltip-title-border; - color: $color-tooltip-title; - margin: 3px 0 5px; - padding: 0; - } - - .tooltip-inner { - text-align: left; - } -} - -.sidebar { - padding-left: 0 !important; -} - -.margin-right{ - margin-right:15px; -} - -.margin-left{ - margin-left:15px; -} - -.margin-top{ - margin-top:15px; -} - -.margin-bottom{ - margin-bottom:15px; -} - -.margin{ - margin:15px; -} - -.acl-clear{ - transition: all .2s ease-in-out; - position: absolute; - right: 20px; - top:18px; - font-size: 1.5em; - &:hover{ - color: $brand-danger; - transform: scale(1.3); - } -} - -.inline { - display: inline-block !important; -} - -.actions{ - //margin-top: 1em; - margin-bottom: 1em; - text-align: right; - - .pagination-sm { - margin-top: 5px; - } - - .form-group { - margin: 0; - } -} - -.opaque{ - opacity: 0; -} -.padding-left { - padding-left: 15px; -} -.padding-right { - padding-right: 15px; -} -.padding-top { - padding-top: 15px; -} -.padding-bottom { - padding-bottom: 15px; -} -.no-padding-left { - padding-left: 0; -} - -tr.danger{ - th{ - color: $brand-danger; - } -} - -.elevate-1 { - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); - -} - -.elevate-2 { - box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); -} - -.elevate-3 { - box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); -} - -.elevate-4 { - box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); -} - -.elevate-5 { - box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22); -} -.table { - tr{ - th,td{ - vertical-align: middle !important; - } - } -} - -.page-title-prefix{ - .material-icons { - font-size: 1.2em; - float: left; - margin-right:10px; - } - -} - -.modal-close{ - color: #999; - margin-top: -10px; -} - -.modal-close:hover, .modal-close:focus{ - color: #313131; -} - - -#toast-container > .toast-error, -#toast-container > .toast-warning, -#toast-container > .toast-info, -#toast-container > .toast-success{ - background-image: none !important; -} - -.page-title { - //color: $brand-success; -} - -.home { - .jumbotron{ - padding: 0 !important; - margin-top: 40px; - } -} - -.btn-icon:hover,.btn-icon:active,.btn-icon:focus{ - background-color: transparent; -} - -label { - font-weight: bold; -} -.form-group.highlight{ - background-color: $gray-lighter; - padding: 1em; -} - -.btn-icon{ - padding : 3px 3px 3px 3px; - background-color: transparent !important; - box-shadow: none; - width: 32px; - height: 32px; - border-radius: 50%; - -} - -.btn-flat { - webkit-box-shadow: none; - box-shadow: none; -} - -.panel { - - .panel-heading{ - &.primary { - border-bottom: 2px solid $brand-primary; - background-color: transparent; - color: $brand-primary; - } - .btn.pull-right{ - margin-top: -4px; - } - .btn-icon { - margin-top: -5px; - i{ - font-size: 2em !important; - vertical-align: top !important; - } - } - } - - &.panel-default { - .panel-heading{ - .material-icons { - font-size: 1.4em; - vertical-align: text-top; - } - } - } - - .help-block { - font-size: 1em; - } -} - -.jumbotron { - - - .panel { - - &.panel-default { - .panel-heading{ - background-color: #fafafa; - } - } - .material-icons { - font-size: 4em; - } - .help-block { - font-size: 1em; - } - } -} - -::-webkit-input-placeholder { - font-size: 0.9em; -} - -:-moz-placeholder { /* Firefox 18- */ - font-size: 0.9em; -} - -::-moz-placeholder { /* Firefox 19+ */ - font-size: 0.9em; -} - -:-ms-input-placeholder { - font-size: 0.9em; -} - -pre { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - border-radius: 3px; -} - -.table-clean tr th, .table-clean tr td, .table-clean tr{ - border: none !important; -} - -.capitalize { - text-transform: capitalize; -} - -.clickable{ - cursor: pointer; -} - - -.jh-root tr th,.jh-root tr td{ - padding-left: 1em; -} - -.modal-body.add-plugin{ - padding-top: 0; - padding-bottom: 0; -} - -.modal-body.add-plugin > .row{ - padding-bottom: 1em; -} -.modal-body.add-plugin > .row:nth-of-type(2n){ - background-color: #f4f4f4; -} - -.padding{ - padding: 15px; -} - -.bg-light-grey{ - background-color: #f4f4f4; -} - -.default-chip{ - border-radius: 20px; -} - -.nav{ - - - .dropdown-menu{ - padding: 0; - - li { - &.divider{ - margin:0 - } - a{ - padding: 10px 10px; - } - } - } - -} - -.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus{ - background-color: #f2f2f2; - -} -.nav-auth-img-container { - margin-top: 2px; - padding:12px !important; - cursor: pointer; - img{ - height: 40px; - border-radius: 50%; - border: 1px solid $brand-success; - padding: 2px; - } -} - - -.plugin-field-table { - position: relative; - background-color: $gray-lighter !important; - padding: 15px; - border-radius: 5px; - - input { - background-color: transparent; - } -} - -.default-chip{ - padding-left: 15px; - padding-right: 2px; -} \ No newline at end of file diff --git a/frontend/src/app/styles/_bootstrap_over.scss b/frontend/src/app/styles/_bootstrap_over.scss deleted file mode 100644 index 3d14266d9..000000000 --- a/frontend/src/app/styles/_bootstrap_over.scss +++ /dev/null @@ -1,323 +0,0 @@ - - -.btn { - //padding: 0.8em 1.2em; - font-weight: 600; - - &.btn-sm{ - .material-icons { - font-size: 20px; - } - } -} - -.material-icons{ - vertical-align: bottom; - margin-right: 0.2em; -} - -.btn:focus, a:focus { - outline: none !important; -} - -.spinner > div{ - margin-top: 0; - margin-bottom: 0; - margin-right: 10px; - display: inline-block; - float: left; -} - -.spinner.spinner-invert > div{ - :before { - background-color: #fff; - } -} - - - -.btn-warning.btn-link{ - color: $brand-warning !important; -} - -.btn-danger.btn-link{ - color: $brand-danger !important; -} - -.btn-primary.btn-link{ - color: $brand-primary !important; -} - -.btn-success.btn-link{ - color: $brand-success !important; -} - -.modal-body{ - overflow-y: auto !important; -} - -.help-block{ - font-size: 0.9em; -} - -input.form-control, select.form-control{ - border-bottom: 1px solid #bbb !important; - -} - -.form-group.has-error{ - background-color: #FFEBEE; - - .help-block { - opacity: 0.7; - } -} - -.text-danger{ - font-weight: bold; -} - -.text-white{ - color: #fff; -} - -.modal-header{ - padding-top:0.5em; - padding-bottom: 0.5em; - -} - -.modal-footer{ - padding: 0.5em 1em; -} -.modal-header.success{ - border-bottom: 2px solid $brand-success; - h1,h2,h3,h4,h5{ - color: $brand-success; - } -} - -.modal-header.warning{ - border-bottom: 2px solid $brand-warning; - h1,h2,h3,h4,h5{ - color: $brand-warning; - } -} - - -.content { - margin-top: 20px; -} - - - -.btn,.panel,.nav, .form-control { - border-radius: 0; -} - - - -.panel-disabled{ - opacity: 0.6; -} - -.panel { - transition: all .2s; - &.panel-dashed.panel-flat{ - &:hover{ - border: 2px dashed #666; - } - box-shadow: none; - border: 2px dashed #ccc; - text-align: center; - } - &.panel-default.panel-flat{ - box-shadow: none; - border: 2px solid #e3e3e3; - border-radius: 3px; - background-color: #fafafa; - - &.panel-active{ - //border-color: $brand-primary; - //background-color: #E1F5FE; - font-weight: bold; - //color: $brand-success; - } - // - //&:hover{ - // border-color: $brand-primary; - // background-color: #E1F5FE; - //} - - } - .panel-heading{ - .panel-title{ - .btn{ - //padding-top: 3px; - //padding-right: 0px; - //padding-left: 0; - } - } - } -} - - - -.navbar-default { - background: #fff; - height: 68px; - border-bottom: 1px solid #eaeaea; - box-shadow: none; -} - -.navbar-default .navbar-nav > li > a { - color: $brand-success; - padding: 22px; - text-shadow: none !important; -} - -.navbar-default .navbar-nav > li:hover > a { - color: $brand-success; - -} - -.import-consumers-table { - - //tr { - // th { - // input { - // padding-left: 8px; - // } - // } - // - // td { - // input { - // padding-left: 8px; - // } - // } - //} - -} - -.modal-header.bg-light-grey{ - border-bottom: 1px solid #ddd; -} - -.navbar-default .navbar-nav > li.active > a, -.navbar-default .navbar-nav > li.active > a:hover, -.navbar-default .navbar-nav > li.active > a:focus{ - color: $brand-success; - background-color: transparent; - font-weight: bold; -} - -.navbar-default .navbar-nav > li.active > a:before{ - content: ''; - bottom: 2px; - left: 0; - right: 0; - position: absolute; - height: 3px; - background-color: $brand-success; -} - - - -.navbar-default .navbar-brand, .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus{ - color:$brand-success !important; - padding-top:22px; - font-size: 1.4em; -} - - -.modal-dialog{ - margin: 0 auto; - padding:0; - - .modal-content { - border-radius: 0 0 3px 3px; - } -} - -.bootbox { - .modal-content { - width: 300px; - margin: auto; - } - - .modal-body{ - //padding-top: 0; - //padding-bottom: 0; - } - - .modal-title { - font-size: 1.1em; - font-weight: 600; - text-transform: uppercase; - } - - @media screen and (min-width: 768px) { - &.modal:before { - display: inline-block; - vertical-align: middle; - content: " "; - - height: 100%; - } - } - - .modal-dialog { - display: inline-block; - width: 100%; - text-align: left; - vertical-align: middle; - } -} - -.dialog { - - &.modal { - text-align: center; - } - .modal-body{ - padding-top: 0; - padding-bottom: 0; - } - - @media screen and (min-width: 768px) { - &.modal:before { - display: inline-block; - vertical-align: middle; - content: " "; - height: 100%; - } - } - - .modal-dialog { - display: inline-block; - text-align: left; - vertical-align: middle; - } -} - -.modal-title { - margin-top: 0 !important; - padding-top: 0 !important; - -} - -.table-hover>tbody>tr, .table-hover>tbody>tr>th, .table-hover>tbody>tr>td{ - transition: all 0s; -} - -.well { - background-color: #f2f2f2; -} -.table tr th{ - -} - -.label { - margin-right: 0.5em; - display: inline-block; -} diff --git a/frontend/src/app/styles/_bootswatch.scss b/frontend/src/app/styles/_bootswatch.scss deleted file mode 100644 index d0b17bb93..000000000 --- a/frontend/src/app/styles/_bootswatch.scss +++ /dev/null @@ -1,7509 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700"); -/*! - * bootswatch v3.3.6 - * Homepage: http://bootswatch.com - * Copyright 2012-2016 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*/ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - font-size: 2em; - margin: 0.67em 0; -} -mark { - background: #ff0; - color: #000; -} -small { - font-size: 80%; -} -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-appearance: textfield; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} -legend { - border: 0; - padding: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-collapse: collapse; - border-spacing: 0; -} -td, -th { - padding: 0; -} -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - background: transparent !important; - color: #000 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\002a"; -} -.glyphicon-plus:before { - content: "\002b"; -} -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.glyphicon-cd:before { - content: "\e201"; -} -.glyphicon-save-file:before { - content: "\e202"; -} -.glyphicon-open-file:before { - content: "\e203"; -} -.glyphicon-level-up:before { - content: "\e204"; -} -.glyphicon-copy:before { - content: "\e205"; -} -.glyphicon-paste:before { - content: "\e206"; -} -.glyphicon-alert:before { - content: "\e209"; -} -.glyphicon-equalizer:before { - content: "\e210"; -} -.glyphicon-king:before { - content: "\e211"; -} -.glyphicon-queen:before { - content: "\e212"; -} -.glyphicon-pawn:before { - content: "\e213"; -} -.glyphicon-bishop:before { - content: "\e214"; -} -.glyphicon-knight:before { - content: "\e215"; -} -.glyphicon-baby-formula:before { - content: "\e216"; -} -.glyphicon-tent:before { - content: "\26fa"; -} -.glyphicon-blackboard:before { - content: "\e218"; -} -.glyphicon-bed:before { - content: "\e219"; -} -.glyphicon-apple:before { - content: "\f8ff"; -} -.glyphicon-erase:before { - content: "\e221"; -} -.glyphicon-hourglass:before { - content: "\231b"; -} -.glyphicon-lamp:before { - content: "\e223"; -} -.glyphicon-duplicate:before { - content: "\e224"; -} -.glyphicon-piggy-bank:before { - content: "\e225"; -} -.glyphicon-scissors:before { - content: "\e226"; -} -.glyphicon-bitcoin:before { - content: "\e227"; -} -.glyphicon-btc:before { - content: "\e227"; -} -.glyphicon-xbt:before { - content: "\e227"; -} -.glyphicon-yen:before { - content: "\00a5"; -} -.glyphicon-jpy:before { - content: "\00a5"; -} -.glyphicon-ruble:before { - content: "\20bd"; -} -.glyphicon-rub:before { - content: "\20bd"; -} -.glyphicon-scale:before { - content: "\e230"; -} -.glyphicon-ice-lolly:before { - content: "\e231"; -} -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} -.glyphicon-education:before { - content: "\e233"; -} -.glyphicon-option-horizontal:before { - content: "\e234"; -} -.glyphicon-option-vertical:before { - content: "\e235"; -} -.glyphicon-menu-hamburger:before { - content: "\e236"; -} -.glyphicon-modal-window:before { - content: "\e237"; -} -.glyphicon-oil:before { - content: "\e238"; -} -.glyphicon-grain:before { - content: "\e239"; -} -.glyphicon-sunglasses:before { - content: "\e240"; -} -.glyphicon-text-size:before { - content: "\e241"; -} -.glyphicon-text-color:before { - content: "\e242"; -} -.glyphicon-text-background:before { - content: "\e243"; -} -.glyphicon-object-align-top:before { - content: "\e244"; -} -.glyphicon-object-align-bottom:before { - content: "\e245"; -} -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} -.glyphicon-object-align-left:before { - content: "\e247"; -} -.glyphicon-object-align-vertical:before { - content: "\e248"; -} -.glyphicon-object-align-right:before { - content: "\e249"; -} -.glyphicon-triangle-right:before { - content: "\e250"; -} -.glyphicon-triangle-left:before { - content: "\e251"; -} -.glyphicon-triangle-bottom:before { - content: "\e252"; -} -.glyphicon-triangle-top:before { - content: "\e253"; -} -.glyphicon-console:before { - content: "\e254"; -} -.glyphicon-superscript:before { - content: "\e255"; -} -.glyphicon-subscript:before { - content: "\e256"; -} -.glyphicon-menu-left:before { - content: "\e257"; -} -.glyphicon-menu-right:before { - content: "\e258"; -} -.glyphicon-menu-down:before { - content: "\e259"; -} -.glyphicon-menu-up:before { - content: "\e260"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 1.846; - color: #666666; - background-color: #ffffff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: $brand-primary; - text-decoration: none; -} -a:hover, -a:focus { - color: #0a6ebd; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 3px; -} -.img-thumbnail { - padding: 4px; - line-height: 1.846; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 3px; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - display: inline-block; - max-width: 100%; - height: auto; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 23px; - margin-bottom: 23px; - border: 0; - border-top: 1px solid #eeeeee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 400; - line-height: 1.1; - color: #444444; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #bbbbbb; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 23px; - margin-bottom: 11.5px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 11.5px; - margin-bottom: 11.5px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 56px; -} -h2, -.h2 { - font-size: 45px; -} -h3, -.h3 { - font-size: 34px; -} -h4, -.h4 { - font-size: 24px; -} -h5, -.h5 { - font-size: 20px; -} -h6, -.h6 { - font-size: 14px; -} -p { - margin: 0 0 11.5px; -} -.lead { - margin-bottom: 23px; - font-size: 14px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 19.5px; - } -} -small, -.small { - font-size: 92%; -} -mark, -.mark { - background-color: #ffe0b2; - padding: .2em; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #bbbbbb; -} -.text-primary { - color: $brand-primary; -} -a.text-primary:hover, -a.text-primary:focus { - color: #0c7cd5; -} -.text-success { - color: $brand-success; -} -a.text-success:hover, -a.text-success:focus { - color: #3d8b40; -} -.text-info { - color: $brand-info; -} -a.text-info:hover, -a.text-info:focus { - color: #771e86; -} -.text-warning { - color: $brand-warning; -} -a.text-warning:hover, -a.text-warning:focus { - color: #cc7a00; -} -.text-danger { - color: $brand-danger; -} -a.text-danger:hover, -a.text-danger:focus { - color: #b9151b; -} -.bg-primary { - color: #fff; - background-color: $brand-primary; -} -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #0c7cd5; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; -} -.bg-info { - background-color: #e1bee7; -} -a.bg-info:hover, -a.bg-info:focus { - background-color: #d099d9; -} -.bg-warning { - background-color: #ffe0b2; -} -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #ffcb7f; -} -.bg-danger { - background-color: #f9bdbb; -} -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #f5908c; -} -.page-header { - padding-bottom: 10.5px; - margin: 46px 0 23px; - border-bottom: 1px solid #eeeeee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 11.5px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - list-style: none; - margin-left: -5px; -} -.list-inline > li { - display: inline-block; - padding-left: 5px; - padding-right: 5px; -} -dl { - margin-top: 0; - margin-bottom: 23px; -} -dt, -dd { - line-height: 1.846; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #bbbbbb; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 11.5px 23px; - margin: 0 0 23px; - font-size: 16.25px; - border-left: 5px solid #eeeeee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.846; - color: #bbbbbb; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; - text-align: right; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -address { - margin-bottom: 23px; - font-style: normal; - line-height: 1.846; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 3px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #ffffff; - background-color: #333333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 11px; - margin: 0 0 11.5px; - font-size: 12px; - line-height: 1.846; - word-break: break-all; - word-wrap: break-word; - color: #212121; - background-color: #f5f5f5; - border: 1px solid #cccccc; - border-radius: 3px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; -} -.row { - margin-left: -15px; - margin-right: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-left: 15px; - padding-right: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0%; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0%; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0%; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0%; - } -} -table { - background-color: transparent; -} -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #bbbbbb; - text-align: left; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 23px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.846; - vertical-align: top; - border-top: 1px solid #dddddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #dddddd; -} -.table .table { - background-color: #ffffff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #dddddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - float: none; - display: table-column; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - float: none; - display: table-cell; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #e1bee7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #d8abe0; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #ffe0b2; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #ffd699; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f9bdbb; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #f7a6a4; -} -.table-responsive { - overflow-x: auto; - min-height: 0.01%; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 17.25px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #dddddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - padding: 0; - margin: 0; - border: 0; - min-width: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 23px; - font-size: 19.5px; - line-height: inherit; - color: #212121; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 13px; - line-height: 1.846; - color: #666666; -} -.form-control { - display: block; - width: 100%; - height: 37px; - padding: 6px 16px; - font-size: 13px; - line-height: 1.846; - color: #666666; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); -} -.form-control::-moz-placeholder { - color: #bbbbbb; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #bbbbbb; -} -.form-control::-webkit-input-placeholder { - color: #bbbbbb; -} -.form-control::-ms-expand { - border: 0; - background-color: transparent; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: transparent; - opacity: 1; -} -.form-control[disabled], -fieldset[disabled] .form-control { - cursor: not-allowed; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 37px; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm, - .input-group-sm input[type="date"], - .input-group-sm input[type="time"], - .input-group-sm input[type="datetime-local"], - .input-group-sm input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg, - .input-group-lg input[type="date"], - .input-group-lg input[type="time"], - .input-group-lg input[type="datetime-local"], - .input-group-lg input[type="month"] { - line-height: 45px; - } -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 23px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-left: -20px; - margin-top: 4px \9; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; - min-height: 36px; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-left: 0; - padding-right: 0; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.form-group-sm select.form-control { - height: 30px; - line-height: 30px; -} -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - min-height: 35px; - padding: 6px 10px; - font-size: 12px; - line-height: 1.5; -} -.input-lg { - height: 45px; - padding: 10px 16px; - font-size: 17px; - line-height: 1.3333333; - border-radius: 3px; -} -select.input-lg { - height: 45px; - line-height: 45px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.form-group-lg .form-control { - height: 45px; - padding: 10px 16px; - font-size: 17px; - line-height: 1.3333333; - border-radius: 3px; -} -.form-group-lg select.form-control { - height: 45px; - line-height: 45px; -} -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 45px; - min-height: 40px; - padding: 11px 16px; - font-size: 17px; - line-height: 1.3333333; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 46.25px; -} -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 37px; - height: 37px; - line-height: 37px; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 45px; - height: 45px; - line-height: 45px; -} -.input-sm + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: $brand-success; -} -.has-success .form-control { - border-color: $brand-success; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-success .form-control:focus { - border-color: #3d8b40; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #92cf94; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #92cf94; -} -.has-success .input-group-addon { - color: $brand-success; - border-color: $brand-success; - background-color: #dff0d8; -} -.has-success .form-control-feedback { - color: $brand-success; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: $brand-warning; -} -.has-warning .form-control { - border-color: $brand-warning; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-warning .form-control:focus { - border-color: #cc7a00; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffc166; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffc166; -} -.has-warning .input-group-addon { - color: $brand-warning; - border-color: $brand-warning; - background-color: #ffe0b2; -} -.has-warning .form-control-feedback { - color: $brand-warning; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, -.has-error.radio label, -.has-error.checkbox label, -.has-error.radio-inline label, -.has-error.checkbox-inline label { - color: $brand-danger; -} -.has-error .form-control { - border-color: $brand-danger; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-error .form-control:focus { - border-color: #b9151b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ef787c; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ef787c; -} -.has-error .input-group-addon { - color: $brand-danger; - border-color: $brand-danger; - background-color: #f9bdbb; -} -.has-error .form-control-feedback { - color: $brand-danger; -} -.has-feedback label ~ .form-control-feedback { - top: 28px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #a6a6a6; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: 7px; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 30px; -} -.form-horizontal .form-group { - margin-left: -15px; - margin-right: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - margin-bottom: 0; - padding-top: 7px; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 11px; - font-size: 17px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 12px; - } -} -.btn { - display: inline-block; - margin-bottom: 0; - font-weight: normal; - text-align: center; - vertical-align: middle; - -ms-touch-action: manipulation; - touch-action: manipulation; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - white-space: nowrap; - padding: 6px 16px; - font-size: 13px; - line-height: 1.846; - border-radius: 3px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus, -.btn.focus, -.btn:active.focus, -.btn.active.focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus, -.btn.focus { - color: #444444; - text-decoration: none; -} -.btn:active, -.btn.active { - outline: 0; - background-image: none; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} -.btn-default { - color: #444444; - background-color: #ffffff; - border-color: transparent; -} -.btn-default:focus, -.btn-default.focus { - color: #444444; - background-color: #e6e6e6; - border-color: rgba(0, 0, 0, 0); -} -.btn-default:hover { - color: #444444; - background-color: #e6e6e6; - border-color: rgba(0, 0, 0, 0); -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #444444; - background-color: #e6e6e6; - border-color: rgba(0, 0, 0, 0); -} -.btn-default:active:hover, -.btn-default.active:hover, -.open > .dropdown-toggle.btn-default:hover, -.btn-default:active:focus, -.btn-default.active:focus, -.open > .dropdown-toggle.btn-default:focus, -.btn-default:active.focus, -.btn-default.active.focus, -.open > .dropdown-toggle.btn-default.focus { - color: #444444; - background-color: #d4d4d4; - border-color: rgba(0, 0, 0, 0); -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus { - background-color: #ffffff; - border-color: transparent; -} -.btn-default .badge { - color: #ffffff; - background-color: #444444; -} -.btn-primary { - color: #ffffff; - background-color: $brand-primary; - border-color: transparent; -} -.btn-primary:focus, -.btn-primary.focus { - color: #ffffff; - background-color: #0c7cd5; - border-color: rgba(0, 0, 0, 0); -} -.btn-primary:hover { - color: #ffffff; - background-color: #0c7cd5; - border-color: rgba(0, 0, 0, 0); -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #0c7cd5; - border-color: rgba(0, 0, 0, 0); -} -.btn-primary:active:hover, -.btn-primary.active:hover, -.open > .dropdown-toggle.btn-primary:hover, -.btn-primary:active:focus, -.btn-primary.active:focus, -.open > .dropdown-toggle.btn-primary:focus, -.btn-primary:active.focus, -.btn-primary.active.focus, -.open > .dropdown-toggle.btn-primary.focus { - color: #ffffff; - background-color: #0a68b4; - border-color: rgba(0, 0, 0, 0); -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus { - background-color: $brand-primary; - border-color: transparent; -} -.btn-primary .badge { - color: $brand-primary; - background-color: #ffffff; -} -.btn-success { - color: #ffffff; - background-color: $brand-success; - border-color: transparent; -} -.btn-success:focus, -.btn-success.focus { - color: #ffffff; - background-color: darken($brand-success,30%); - border-color: rgba(0, 0, 0, 0); -} -.btn-success:hover { - color: #ffffff; - background-color: darken($brand-success,30%); - border-color: rgba(0, 0, 0, 0); -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #ffffff; - background-color: darken($brand-success,30%); - border-color: rgba(0, 0, 0, 0); -} -.btn-success:active:hover, -.btn-success.active:hover, -.open > .dropdown-toggle.btn-success:hover, -.btn-success:active:focus, -.btn-success.active:focus, -.open > .dropdown-toggle.btn-success:focus, -.btn-success:active.focus, -.btn-success.active.focus, -.open > .dropdown-toggle.btn-success.focus { - color: #ffffff; - background-color: darken($brand-success,30%); - border-color: rgba(0, 0, 0, 0); -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus { - background-color: $brand-success; - border-color: transparent; -} -.btn-success .badge { - color: $brand-success; - background-color: #ffffff; -} -.btn-info { - color: #ffffff; - background-color: $brand-info; - border-color: transparent; -} -.btn-info:focus, -.btn-info.focus { - color: #ffffff; - background-color: #771e86; - border-color: rgba(0, 0, 0, 0); -} -.btn-info:hover { - color: #ffffff; - background-color: #771e86; - border-color: rgba(0, 0, 0, 0); -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #771e86; - border-color: rgba(0, 0, 0, 0); -} -.btn-info:active:hover, -.btn-info.active:hover, -.open > .dropdown-toggle.btn-info:hover, -.btn-info:active:focus, -.btn-info.active:focus, -.open > .dropdown-toggle.btn-info:focus, -.btn-info:active.focus, -.btn-info.active.focus, -.open > .dropdown-toggle.btn-info.focus { - color: #ffffff; - background-color: #5d1769; - border-color: rgba(0, 0, 0, 0); -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus { - background-color: $brand-info; - border-color: transparent; -} -.btn-info .badge { - color: $brand-info; - background-color: #ffffff; -} -.btn-warning { - color: #ffffff; - background-color: $brand-warning; - border-color: transparent; -} -.btn-warning:focus, -.btn-warning.focus { - color: #ffffff; - background-color: #cc7a00; - border-color: rgba(0, 0, 0, 0); -} -.btn-warning:hover { - color: #ffffff; - background-color: #cc7a00; - border-color: rgba(0, 0, 0, 0); -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #cc7a00; - border-color: rgba(0, 0, 0, 0); -} -.btn-warning:active:hover, -.btn-warning.active:hover, -.open > .dropdown-toggle.btn-warning:hover, -.btn-warning:active:focus, -.btn-warning.active:focus, -.open > .dropdown-toggle.btn-warning:focus, -.btn-warning:active.focus, -.btn-warning.active.focus, -.open > .dropdown-toggle.btn-warning.focus { - color: #ffffff; - background-color: #a86400; - border-color: rgba(0, 0, 0, 0); -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus { - background-color: $brand-warning; - border-color: transparent; -} -.btn-warning .badge { - color: $brand-warning; - background-color: #ffffff; -} -.btn-danger { - color: #ffffff; - background-color: $brand-danger; - border-color: transparent; -} -.btn-danger:focus, -.btn-danger.focus { - color: #ffffff; - background-color: #b9151b; - border-color: rgba(0, 0, 0, 0); -} -.btn-danger:hover { - color: #ffffff; - background-color: #b9151b; - border-color: rgba(0, 0, 0, 0); -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #b9151b; - border-color: rgba(0, 0, 0, 0); -} -.btn-danger:active:hover, -.btn-danger.active:hover, -.open > .dropdown-toggle.btn-danger:hover, -.btn-danger:active:focus, -.btn-danger.active:focus, -.open > .dropdown-toggle.btn-danger:focus, -.btn-danger:active.focus, -.btn-danger.active.focus, -.open > .dropdown-toggle.btn-danger.focus { - color: #ffffff; - background-color: #991216; - border-color: rgba(0, 0, 0, 0); -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus { - background-color: $brand-danger; - border-color: transparent; -} -.btn-danger .badge { - color: $brand-danger; - background-color: #ffffff; -} -.btn-link { - color: $brand-primary; - font-weight: normal; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link.active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #0a6ebd; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #bbbbbb; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 17px; - line-height: 1.3333333; - border-radius: 3px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-property: height, visibility; - -o-transition-property: height, visibility; - transition-property: height, visibility; - -webkit-transition-duration: 0.35s; - -o-transition-duration: 0.35s; - transition-duration: 0.35s; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - font-size: 13px; - text-align: left; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 3px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - -webkit-background-clip: padding-box; - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 10.5px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.846; - color: #666666; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - text-decoration: none; - color: #141414; - background-color: #eeeeee; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - outline: 0; - background-color: $brand-primary; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #bbbbbb; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: not-allowed; -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - left: auto; - right: 0; -} -.dropdown-menu-left { - left: 0; - right: auto; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.846; - color: #bbbbbb; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - left: auto; - right: 0; - } - .navbar-right .dropdown-menu-left { - left: 0; - right: auto; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn, -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 3px; - border-top-left-radius: 3px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-top-left-radius: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - float: none; - display: table-cell; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-left: 0; - padding-right: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group .form-control:focus { - z-index: 3; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 45px; - padding: 10px 16px; - font-size: 17px; - line-height: 1.3333333; - border-radius: 3px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 45px; - line-height: 45px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 16px; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #666666; - text-align: center; - background-color: transparent; - border: 1px solid transparent; - border-radius: 3px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 17px; - border-radius: 3px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} -.nav { - margin-bottom: 0; - padding-left: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #bbbbbb; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #bbbbbb; - text-decoration: none; - background-color: transparent; - cursor: not-allowed; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: $brand-primary; -} -.nav .nav-divider { - height: 1px; - margin: 10.5px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid transparent; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.846; - border: 1px solid transparent; - border-radius: 3px 3px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee transparent; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #666666; - background-color: transparent; - border: 1px solid transparent; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 3px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid transparent; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid transparent; - border-radius: 3px 3px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 3px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: $brand-primary; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 3px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid transparent; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid transparent; - border-radius: 3px 3px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar { - position: relative; - min-height: 64px; - margin-bottom: 23px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 3px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - padding: 20.5px 15px; - font-size: 17px; - line-height: 23px; - height: 64px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 15px; - margin-bottom: 15px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 3px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 10.25px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 23px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 23px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 20.5px; - padding-bottom: 20.5px; - } -} -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 13.5px; - margin-bottom: 13.5px; -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-right-radius: 3px; - border-top-left-radius: 3px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 13.5px; - margin-bottom: 13.5px; -} -.navbar-btn.btn-sm { - margin-top: 17px; - margin-bottom: 17px; -} -.navbar-btn.btn-xs { - margin-top: 21px; - margin-bottom: 21px; -} -.navbar-text { - margin-top: 20.5px; - margin-bottom: 20.5px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #ffffff; - border-color: transparent; -} -.navbar-default .navbar-brand { - color: #666666; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #212121; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #bbbbbb; -} -.navbar-default .navbar-nav > li > a { - color: #666666; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #212121; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #212121; - background-color: #eeeeee; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: transparent; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: transparent; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: rgba(0, 0, 0, 0.5); -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: transparent; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - background-color: #eeeeee; - color: #212121; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #666666; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #212121; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #212121; - background-color: #eeeeee; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #666666; -} -.navbar-default .navbar-link:hover { - color: #212121; -} -.navbar-default .btn-link { - color: #666666; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #212121; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; -} -.navbar-inverse { - background-color: $brand-primary; - border-color: transparent; -} -.navbar-inverse .navbar-brand { - color: #b2dbfb; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #ffffff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #bbbbbb; -} -.navbar-inverse .navbar-nav > li > a { - color: #b2dbfb; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #0c7cd5; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: transparent; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: transparent; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: rgba(0, 0, 0, 0.5); -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #0c84e4; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - background-color: #0c7cd5; - color: #ffffff; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #b2dbfb; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #0c7cd5; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #b2dbfb; -} -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} -.navbar-inverse .btn-link { - color: #b2dbfb; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #ffffff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 23px; - list-style: none; - background-color: #f5f5f5; - border-radius: 3px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - content: "/\00a0"; - padding: 0 5px; - color: #cccccc; -} -.breadcrumb > .active { - color: #bbbbbb; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 23px 0; - border-radius: 3px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 16px; - line-height: 1.846; - text-decoration: none; - color: $brand-primary; - background-color: #ffffff; - border: 1px solid #dddddd; - margin-left: -1px; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - z-index: 2; - color: #0a6ebd; - background-color: #eeeeee; - border-color: #dddddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 3; - color: #ffffff; - background-color: $brand-primary; - border-color: $brand-primary; - cursor: default; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #bbbbbb; - background-color: #ffffff; - border-color: #dddddd; - cursor: not-allowed; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 17px; - line-height: 1.3333333; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 23px 0; - list-style: none; - text-align: center; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #bbbbbb; - background-color: #ffffff; - cursor: not-allowed; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #bbbbbb; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #a2a2a2; -} -.label-primary { - background-color: $brand-primary; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #0c7cd5; -} -.label-success { - background-color: $brand-success; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #3d8b40; -} -.label-info { - background-color: $brand-info; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #771e86; -} -.label-warning { - background-color: $brand-warning; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #cc7a00; -} -.label-danger { - background-color: $brand-danger; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #b9151b; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: normal; - color: #ffffff; - line-height: 1; - vertical-align: middle; - white-space: nowrap; - text-align: center; - background-color: #bbbbbb; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, -.btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: $brand-primary; - background-color: #ffffff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #f9f9f9; -} -.jumbotron h1, -.jumbotron .h1 { - color: #444444; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 20px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #e0e0e0; -} -.container .jumbotron, -.container-fluid .jumbotron { - border-radius: 3px; - padding-left: 15px; - padding-right: 15px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron, - .container-fluid .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 59px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 23px; - line-height: 1.846; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 3px; - -webkit-transition: border 0.2s ease-in-out; - -o-transition: border 0.2s ease-in-out; - transition: border 0.2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-left: auto; - margin-right: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: $brand-primary; -} -.thumbnail .caption { - padding: 9px; - color: #666666; -} -.alert { - padding: 15px; - margin-bottom: 23px; - border: 1px solid transparent; - border-radius: 3px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: $brand-success; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #3d8b40; -} -.alert-info { - background-color: $alert-info-bg; - border-color: $alert-info-border; - color: $alert-info-text; -} -.alert-info hr { - border-top-color: #c191d6; -} -.alert-info .alert-link { - color: #771e86; -} -.alert-warning { - background-color: #ffe0b2; - border-color: #ffc599; - color: $brand-warning; -} -.alert-warning hr { - border-top-color: #ffb67f; -} -.alert-warning .alert-link { - color: #cc7a00; -} -.alert-danger { - background-color: #f9bdbb; - border-color: #f7a4af; - color: $brand-danger; -} -.alert-danger hr { - border-top-color: #f58c9a; -} -.alert-danger .alert-link { - color: #b9151b; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 23px; - margin-bottom: 23px; - background-color: #f5f5f5; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} -.progress-bar { - float: left; - width: 0%; - height: 100%; - font-size: 12px; - line-height: 23px; - color: #ffffff; - text-align: center; - background-color: $brand-primary; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: $brand-success; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: $brand-info; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: $brand-warning; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: $brand-danger; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media, -.media-body { - zoom: 1; - overflow: hidden; -} -.media-body { - width: 10000px; -} -.media-object { - display: block; -} -.media-object.img-thumbnail { - max-width: none; -} -.media-right, -.media > .pull-right { - padding-left: 10px; -} -.media-left, -.media > .pull-left { - padding-right: 10px; -} -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} -.media-middle { - vertical-align: middle; -} -.media-bottom { - vertical-align: bottom; -} -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - margin-bottom: 20px; - padding-left: 0; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; -} -.list-group-item:first-child { - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -a.list-group-item, -button.list-group-item { - color: #555555; -} -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333333; -} -a.list-group-item:hover, -button.list-group-item:hover, -a.list-group-item:focus, -button.list-group-item:focus { - text-decoration: none; - color: #555555; - background-color: #f5f5f5; -} -button.list-group-item { - width: 100%; - text-align: left; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - background-color: #eeeeee; - color: #bbbbbb; - cursor: not-allowed; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #bbbbbb; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #ffffff; - background-color: $brand-primary; - border-color: $brand-primary; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #e3f2fd; -} -.list-group-item-success { - color: $brand-success; - background-color: #dff0d8; -} -a.list-group-item-success, -button.list-group-item-success { - color: $brand-success; -} -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -button.list-group-item-success:hover, -a.list-group-item-success:focus, -button.list-group-item-success:focus { - color: $brand-success; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -button.list-group-item-success.active, -a.list-group-item-success.active:hover, -button.list-group-item-success.active:hover, -a.list-group-item-success.active:focus, -button.list-group-item-success.active:focus { - color: #fff; - background-color: $brand-success; - border-color: $brand-success; -} -.list-group-item-info { - color: $brand-info; - background-color: #e1bee7; -} -a.list-group-item-info, -button.list-group-item-info { - color: $brand-info; -} -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -button.list-group-item-info:hover, -a.list-group-item-info:focus, -button.list-group-item-info:focus { - color: $brand-info; - background-color: #d8abe0; -} -a.list-group-item-info.active, -button.list-group-item-info.active, -a.list-group-item-info.active:hover, -button.list-group-item-info.active:hover, -a.list-group-item-info.active:focus, -button.list-group-item-info.active:focus { - color: #fff; - background-color: $brand-info; - border-color: $brand-info; -} -.list-group-item-warning { - color: $brand-warning; - background-color: #ffe0b2; -} -a.list-group-item-warning, -button.list-group-item-warning { - color: $brand-warning; -} -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -button.list-group-item-warning:hover, -a.list-group-item-warning:focus, -button.list-group-item-warning:focus { - color: $brand-warning; - background-color: #ffd699; -} -a.list-group-item-warning.active, -button.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -button.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus, -button.list-group-item-warning.active:focus { - color: #fff; - background-color: $brand-warning; - border-color: $brand-warning; -} -.list-group-item-danger { - color: $brand-danger; - background-color: #f9bdbb; -} -a.list-group-item-danger, -button.list-group-item-danger { - color: $brand-danger; -} -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -button.list-group-item-danger:hover, -a.list-group-item-danger:focus, -button.list-group-item-danger:focus { - color: $brand-danger; - background-color: #f7a6a4; -} -a.list-group-item-danger.active, -button.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -button.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus, -button.list-group-item-danger.active:focus { - color: #fff; - background-color: $brand-danger; - border-color: $brand-danger; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 23px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 2px; - border-top-left-radius: 2px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 15px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #dddddd; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 2px; -} -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-right-radius: 2px; - border-top-left-radius: 2px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 2px; -} -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-left: 15px; - padding-right: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-right-radius: 2px; - border-top-left-radius: 2px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 2px; - border-top-right-radius: 2px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 2px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 2px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 2px; - border-bottom-left-radius: 2px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 2px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 2px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #dddddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - border: 0; - margin-bottom: 0; -} -.panel-group { - margin-bottom: 23px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 3px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #dddddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; -} -.panel-default { - border-color: #dddddd; -} -.panel-default > .panel-heading { - color: #212121; - background-color: #f5f5f5; - border-color: #dddddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #dddddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #212121; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #dddddd; -} -.panel-primary { - border-color: $brand-primary; -} -.panel-primary > .panel-heading { - color: #ffffff; - background-color: $brand-primary; - border-color: $brand-primary; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: $brand-primary; -} -.panel-primary > .panel-heading .badge { - color: $brand-primary; - background-color: #ffffff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: $brand-primary; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #ffffff; - background-color: $brand-success; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: $brand-success; - background-color: #ffffff; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #cba4dd; -} -.panel-info > .panel-heading { - color: #ffffff; - background-color: $brand-info; - border-color: #cba4dd; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #cba4dd; -} -.panel-info > .panel-heading .badge { - color: $brand-info; - background-color: #ffffff; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #cba4dd; -} -.panel-warning { - border-color: #ffc599; -} -.panel-warning > .panel-heading { - color: #ffffff; - background-color: $brand-warning; - border-color: #ffc599; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ffc599; -} -.panel-warning > .panel-heading .badge { - color: $brand-warning; - background-color: #ffffff; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ffc599; -} -.panel-danger { - border-color: #f7a4af; -} -.panel-danger > .panel-heading { - color: #ffffff; - background-color: $brand-danger; - border-color: #f7a4af; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #f7a4af; -} -.panel-danger > .panel-heading .badge { - color: $brand-danger; - background-color: #ffffff; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #f7a4af; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - left: 0; - bottom: 0; - height: 100%; - width: 100%; - border: 0; -} -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f9f9f9; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-lg { - padding: 24px; - border-radius: 3px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 19.5px; - font-weight: normal; - line-height: 1; - color: #000000; - text-shadow: none; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.modal-open { - overflow: hidden; -} -.modal { - display: none; - overflow: hidden; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #ffffff; - border: 1px solid #999999; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - -webkit-background-clip: padding-box; - background-clip: padding-box; - outline: 0; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} -.modal-header { - padding: 15px; - border-bottom: 1px solid transparent; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.846; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid transparent; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.846; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - font-size: 12px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - background-color: #727272; - border-radius: 3px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #727272; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - right: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #727272; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #727272; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #727272; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #727272; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #727272; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #727272; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #727272; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.846; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - font-size: 13px; - background-color: #ffffff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 13px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 2px 2px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - border-width: 10px; - content: ""; -} -.popover.top > .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: rgba(0, 0, 0, 0); - border-top-color: rgba(0, 0, 0, 0.075); - bottom: -11px; -} -.popover.top > .arrow:after { - content: " "; - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #ffffff; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: rgba(0, 0, 0, 0); - border-right-color: rgba(0, 0, 0, 0.075); -} -.popover.right > .arrow:after { - content: " "; - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #ffffff; -} -.popover.bottom > .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: rgba(0, 0, 0, 0); - border-bottom-color: rgba(0, 0, 0, 0.075); - top: -11px; -} -.popover.bottom > .arrow:after { - content: " "; - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #ffffff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: rgba(0, 0, 0, 0); - border-left-color: rgba(0, 0, 0, 0.075); -} -.popover.left > .arrow:after { - content: " "; - right: 1px; - border-right-width: 0; - border-left-color: #ffffff; - bottom: -10px; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - overflow: hidden; - width: 100%; -} -.carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform 0.6s ease-in-out; - -o-transition: -o-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .item.next, - .carousel-inner > .item.active.right { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - left: 0; - } - .carousel-inner > .item.prev, - .carousel-inner > .item.active.left { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - left: 0; - } - .carousel-inner > .item.next.left, - .carousel-inner > .item.prev.right, - .carousel-inner > .item.active { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - left: 0; - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 15%; - opacity: 0.5; - filter: alpha(opacity=50); - font-size: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - background-color: rgba(0, 0, 0, 0); -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} -.carousel-control.right { - left: auto; - right: 0; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} -.carousel-control:hover, -.carousel-control:focus { - outline: 0; - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - margin-top: -10px; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - line-height: 1; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - margin-left: -30%; - padding-left: 0; - list-style: none; - text-align: center; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - border: 1px solid #ffffff; - border-radius: 10px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); -} -.carousel-indicators .active { - margin: 0; - width: 12px; - height: 12px; - background-color: #ffffff; -} -.carousel-caption { - position: absolute; - left: 15%; - right: 15%; - bottom: 20px; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -10px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -10px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -10px; - } - .carousel-caption { - left: 20%; - right: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-header:before, -.modal-header:after, -.modal-footer:before, -.modal-footer:after { - content: " "; - display: table; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-header:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -.navbar { - border: none; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); -} -.navbar-brand { - font-size: 24px; -} -.navbar-inverse .navbar-form input[type=text], -.navbar-inverse .navbar-form input[type=password] { - color: #fff; - -webkit-box-shadow: inset 0 -1px 0 #b2dbfb; - box-shadow: inset 0 -1px 0 #b2dbfb; -} -.navbar-inverse .navbar-form input[type=text]::-moz-placeholder, -.navbar-inverse .navbar-form input[type=password]::-moz-placeholder { - color: #b2dbfb; - opacity: 1; -} -.navbar-inverse .navbar-form input[type=text]:-ms-input-placeholder, -.navbar-inverse .navbar-form input[type=password]:-ms-input-placeholder { - color: #b2dbfb; -} -.navbar-inverse .navbar-form input[type=text]::-webkit-input-placeholder, -.navbar-inverse .navbar-form input[type=password]::-webkit-input-placeholder { - color: #b2dbfb; -} -.navbar-inverse .navbar-form input[type=text]:focus, -.navbar-inverse .navbar-form input[type=password]:focus { - -webkit-box-shadow: inset 0 -2px 0 #ffffff; - box-shadow: inset 0 -2px 0 #ffffff; -} -.btn-default { - -webkit-background-size: 200% 200%; - background-size: 200%; - background-position: 50%; -} -.btn-default:focus { - background-color: #ffffff; -} -.btn-default:hover, -.btn-default:active:hover { - background-color: #f0f0f0; -} -.btn-default:active { - background-color: #e0e0e0; - background-image: -webkit-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%); - background-image: -o-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%); - background-image: radial-gradient(circle, #e0e0e0 10%, #ffffff 11%); - background-repeat: no-repeat; - -webkit-background-size: 1000% 1000%; - background-size: 1000%; - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); -} -.btn-primary { - -webkit-background-size: 200% 200%; - background-size: 200%; - background-position: 50%; -} -.btn-primary:focus { - background-color: $brand-primary; -} -.btn-primary:hover, -.btn-primary:active:hover { - background-color: darken($brand-primary,13%); -} -.btn-primary:active { - background-color: $brand-primary; - background-image: -webkit-radial-gradient(circle, darken($brand-primary,13%) 10%, $brand-primary 11%); - background-image: -o-radial-gradient(circle, darken($brand-primary,13%) 10%, $brand-primary 11%); - background-image: radial-gradient(circle, darken($brand-primary,13%) 10%, $brand-primary 11%); - background-repeat: no-repeat; - -webkit-background-size: 1000% 1000%; - background-size: 1000%; - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); -} -.btn-success { - -webkit-background-size: 200% 200%; - background-size: 200%; - background-position: 50%; -} -.btn-success:focus { - background-color: $brand-success; -} -.btn-success:hover, -.btn-success:active:hover { - background-color: darken($brand-success,13%); -} -.btn-success:active { - background-color: #39843c; - background-image: -webkit-radial-gradient(circle, darken($brand-success,13%) 10%, $brand-success 11%); - background-image: -o-radial-gradient(circle, darken($brand-success,13%) 10%, $brand-success 11%); - background-image: radial-gradient(circle, darken($brand-success,13%) 10%, $brand-success 11%); - background-repeat: no-repeat; - -webkit-background-size: 1000% 1000%; - background-size: 1000%; - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); -} -.btn-info { - -webkit-background-size: 200% 200%; - background-size: 200%; - background-position: 50%; -} -.btn-info:focus { - background-color: $brand-info; -} -.btn-info:hover, -.btn-info:active:hover { - background-color: #862197; -} -.btn-info:active { - background-color: #701c7e; - background-image: -webkit-radial-gradient(circle, #701c7e 10%, $brand-info 11%); - background-image: -o-radial-gradient(circle, #701c7e 10%, $brand-info 11%); - background-image: radial-gradient(circle, #701c7e 10%, $brand-info 11%); - background-repeat: no-repeat; - -webkit-background-size: 1000% 1000%; - background-size: 1000%; - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); -} -.btn-warning { - -webkit-background-size: 200% 200%; - background-size: 200%; - background-position: 50%; -} -.btn-warning:focus { - background-color: $brand-warning; -} -.btn-warning:hover, -.btn-warning:active:hover { - background-color: #e08600; -} -.btn-warning:active { - background-color: #c27400; - background-image: -webkit-radial-gradient(circle, #c27400 10%, $brand-warning 11%); - background-image: -o-radial-gradient(circle, #c27400 10%, $brand-warning 11%); - background-image: radial-gradient(circle, #c27400 10%, $brand-warning 11%); - background-repeat: no-repeat; - -webkit-background-size: 1000% 1000%; - background-size: 1000%; - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); -} -.btn-danger { - -webkit-background-size: 200% 200%; - background-size: 200%; - background-position: 50%; -} -.btn-danger:focus { - background-color: $brand-danger; -} -.btn-danger:hover, -.btn-danger:active:hover { - background-color: #cb171e; -} -.btn-danger:active { - background-color: #b0141a; - background-image: -webkit-radial-gradient(circle, #b0141a 10%, $brand-danger 11%); - background-image: -o-radial-gradient(circle, #b0141a 10%, $brand-danger 11%); - background-image: radial-gradient(circle, #b0141a 10%, $brand-danger 11%); - background-repeat: no-repeat; - -webkit-background-size: 1000% 1000%; - background-size: 1000%; - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); -} -.btn-link { - -webkit-background-size: 200% 200%; - background-size: 200%; - background-position: 50%; -} -.btn-link:focus { - background-color: #ffffff; -} -.btn-link:hover, -.btn-link:active:hover { - background-color: #f0f0f0; -} -.btn-link:active { - background-color: #e0e0e0; - background-image: -webkit-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%); - background-image: -o-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%); - background-image: radial-gradient(circle, #e0e0e0 10%, #ffffff 11%); - background-repeat: no-repeat; - -webkit-background-size: 1000% 1000%; - background-size: 1000%; - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); -} -.btn { - text-transform: uppercase; - border: none; - -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4); - box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4); - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - transition: all 0.4s; -} -.btn-link { - border-radius: 3px; - -webkit-box-shadow: none; - box-shadow: none; - color: #444444; -} -.btn-link:hover, -.btn-link:focus { - -webkit-box-shadow: none; - box-shadow: none; - color: #444444; - text-decoration: none; -} -.btn-default.disabled { - background-color: rgba(0, 0, 0, 0.1); - color: rgba(0, 0, 0, 0.4); - opacity: 1; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: 0; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: 0; -} -body { - -webkit-font-smoothing: antialiased; - letter-spacing: .1px; -} -p { - margin: 0 0 1em; -} -input, -button { - -webkit-font-smoothing: antialiased; - letter-spacing: .1px; -} -a { - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; -} -.table-hover > tbody > tr, -.table-hover > tbody > tr > th, -.table-hover > tbody > tr > td { - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; -} -label { - font-weight: normal; -} -textarea, -textarea.form-control, -input.form-control, -input[type=text], -input[type=password], -input[type=email], -input[type=number], -[type=text].form-control, -[type=password].form-control, -[type=email].form-control, -[type=tel].form-control, -[contenteditable].form-control { - padding: 0; - border: none; - border-radius: 0; - -webkit-appearance: none; - -webkit-box-shadow: inset 0 -1px 0 #dddddd; - box-shadow: inset 0 -1px 0 #dddddd; - font-size: 16px; -} -textarea:focus, -textarea.form-control:focus, -input.form-control:focus, -input[type=text]:focus, -input[type=password]:focus, -input[type=email]:focus, -input[type=number]:focus, -[type=text].form-control:focus, -[type=password].form-control:focus, -[type=email].form-control:focus, -[type=tel].form-control:focus, -[contenteditable].form-control:focus { - -webkit-box-shadow: inset 0 -2px 0 $brand-primary; - box-shadow: inset 0 -2px 0 $brand-primary; -} -textarea[disabled], -textarea.form-control[disabled], -input.form-control[disabled], -input[type=text][disabled], -input[type=password][disabled], -input[type=email][disabled], -input[type=number][disabled], -[type=text].form-control[disabled], -[type=password].form-control[disabled], -[type=email].form-control[disabled], -[type=tel].form-control[disabled], -[contenteditable].form-control[disabled], -textarea[readonly], -textarea.form-control[readonly], -input.form-control[readonly], -input[type=text][readonly], -input[type=password][readonly], -input[type=email][readonly], -input[type=number][readonly], -[type=text].form-control[readonly], -[type=password].form-control[readonly], -[type=email].form-control[readonly], -[type=tel].form-control[readonly], -[contenteditable].form-control[readonly] { - -webkit-box-shadow: none; - box-shadow: none; - border-bottom: 1px dotted #ddd; -} -textarea.input-sm, -textarea.form-control.input-sm, -input.form-control.input-sm, -input[type=text].input-sm, -input[type=password].input-sm, -input[type=email].input-sm, -input[type=number].input-sm, -[type=text].form-control.input-sm, -[type=password].form-control.input-sm, -[type=email].form-control.input-sm, -[type=tel].form-control.input-sm, -[contenteditable].form-control.input-sm { - font-size: 12px; -} -textarea.input-lg, -textarea.form-control.input-lg, -input.form-control.input-lg, -input[type=text].input-lg, -input[type=password].input-lg, -input[type=email].input-lg, -input[type=number].input-lg, -[type=text].form-control.input-lg, -[type=password].form-control.input-lg, -[type=email].form-control.input-lg, -[type=tel].form-control.input-lg, -[contenteditable].form-control.input-lg { - font-size: 17px; -} -select, -select.form-control { - border: 0; - border-radius: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding-left: 0; - padding-right: 0\9; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); - -webkit-background-size: 13px 13px; - background-size: 13px; - background-repeat: no-repeat; - background-position: right center; - -webkit-box-shadow: inset 0 -1px 0 #dddddd; - box-shadow: inset 0 -1px 0 #dddddd; - font-size: 16px; - line-height: 1.5; -} -select::-ms-expand, -select.form-control::-ms-expand { - display: none; -} -select.input-sm, -select.form-control.input-sm { - font-size: 12px; -} -select.input-lg, -select.form-control.input-lg { - font-size: 17px; -} -select:focus, -select.form-control:focus { - -webkit-box-shadow: inset 0 -2px 0 $brand-primary; - box-shadow: inset 0 -2px 0 $brand-primary; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); -} -select[multiple], -select.form-control[multiple] { - background: none; -} -.radio label, -.radio-inline label, -.checkbox label, -.checkbox-inline label { - padding-left: 25px; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="radio"], -.checkbox-inline input[type="radio"], -.radio input[type="checkbox"], -.radio-inline input[type="checkbox"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - margin-left: -25px; -} -input[type="radio"], -.radio input[type="radio"], -.radio-inline input[type="radio"] { - position: relative; - margin-top: 6px; - margin-right: 4px; - vertical-align: top; - border: none; - background-color: transparent; - -webkit-appearance: none; - appearance: none; - cursor: pointer; -} -input[type="radio"]:focus, -.radio input[type="radio"]:focus, -.radio-inline input[type="radio"]:focus { - outline: none; -} -input[type="radio"]:before, -.radio input[type="radio"]:before, -.radio-inline input[type="radio"]:before, -input[type="radio"]:after, -.radio input[type="radio"]:after, -.radio-inline input[type="radio"]:after { - content: ""; - display: block; - width: 18px; - height: 18px; - border-radius: 50%; - -webkit-transition: 240ms; - -o-transition: 240ms; - transition: 240ms; -} -input[type="radio"]:before, -.radio input[type="radio"]:before, -.radio-inline input[type="radio"]:before { - position: absolute; - left: 0; - top: -3px; - background-color: $brand-primary; - -webkit-transform: scale(0); - -ms-transform: scale(0); - -o-transform: scale(0); - transform: scale(0); -} -input[type="radio"]:after, -.radio input[type="radio"]:after, -.radio-inline input[type="radio"]:after { - position: relative; - top: -3px; - border: 2px solid #666666; -} -input[type="radio"]:checked:before, -.radio input[type="radio"]:checked:before, -.radio-inline input[type="radio"]:checked:before { - -webkit-transform: scale(0.5); - -ms-transform: scale(0.5); - -o-transform: scale(0.5); - transform: scale(0.5); -} -input[type="radio"]:disabled:checked:before, -.radio input[type="radio"]:disabled:checked:before, -.radio-inline input[type="radio"]:disabled:checked:before { - background-color: #bbbbbb; -} -input[type="radio"]:checked:after, -.radio input[type="radio"]:checked:after, -.radio-inline input[type="radio"]:checked:after { - border-color: $brand-primary; -} -input[type="radio"]:disabled:after, -.radio input[type="radio"]:disabled:after, -.radio-inline input[type="radio"]:disabled:after, -input[type="radio"]:disabled:checked:after, -.radio input[type="radio"]:disabled:checked:after, -.radio-inline input[type="radio"]:disabled:checked:after { - border-color: #bbbbbb; -} -input[type="checkbox"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: relative; - border: none; - margin-bottom: -4px; - -webkit-appearance: none; - appearance: none; - cursor: pointer; -} -input[type="checkbox"]:focus, -.checkbox input[type="checkbox"]:focus, -.checkbox-inline input[type="checkbox"]:focus { - outline: none; -} -input[type="checkbox"]:focus:after, -.checkbox input[type="checkbox"]:focus:after, -.checkbox-inline input[type="checkbox"]:focus:after { - border-color: $brand-success; -} -input[type="checkbox"]:after, -.checkbox input[type="checkbox"]:after, -.checkbox-inline input[type="checkbox"]:after { - content: ""; - display: block; - width: 18px; - height: 18px; - margin-top: -2px; - margin-right: 5px; - border: 2px solid #666666; - border-radius: 2px; - -webkit-transition: 240ms; - -o-transition: 240ms; - transition: 240ms; -} -input[type="checkbox"]:checked:before, -.checkbox input[type="checkbox"]:checked:before, -.checkbox-inline input[type="checkbox"]:checked:before { - content: ""; - position: absolute; - top: 0; - left: 6px; - display: table; - width: 6px; - height: 12px; - border: 2px solid #fff; - border-top-width: 0; - border-left-width: 0; - -webkit-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} -input[type="checkbox"]:checked:after, -.checkbox input[type="checkbox"]:checked:after, -.checkbox-inline input[type="checkbox"]:checked:after { - background-color: $brand-primary; - border-color: $brand-primary; -} -input[type="checkbox"]:disabled:after, -.checkbox input[type="checkbox"]:disabled:after, -.checkbox-inline input[type="checkbox"]:disabled:after { - border-color: #bbbbbb; -} -input[type="checkbox"]:disabled:checked:after, -.checkbox input[type="checkbox"]:disabled:checked:after, -.checkbox-inline input[type="checkbox"]:disabled:checked:after { - background-color: #bbbbbb; - border-color: transparent; -} -.has-warning input:not([type=checkbox]), -.has-warning .form-control, -.has-warning input.form-control[readonly], -.has-warning input[type=text][readonly], -.has-warning [type=text].form-control[readonly], -.has-warning input:not([type=checkbox]):focus, -.has-warning .form-control:focus { - border-bottom: none; - -webkit-box-shadow: inset 0 -2px 0 $brand-warning; - box-shadow: inset 0 -2px 0 $brand-warning; -} -.has-error input:not([type=checkbox]), -.has-error .form-control, -.has-error input.form-control[readonly], -.has-error input[type=text][readonly], -.has-error [type=text].form-control[readonly], -.has-error input:not([type=checkbox]):focus, -.has-error .form-control:focus { - border-bottom: none; - -webkit-box-shadow: inset 0 -2px 0 $brand-danger; - box-shadow: inset 0 -2px 0 $brand-danger; -} -.has-success input:not([type=checkbox]), -.has-success .form-control, -.has-success input.form-control[readonly], -.has-success input[type=text][readonly], -.has-success [type=text].form-control[readonly], -.has-success input:not([type=checkbox]):focus, -.has-success .form-control:focus { - border-bottom: none; - -webkit-box-shadow: inset 0 -2px 0 $brand-success; - box-shadow: inset 0 -2px 0 $brand-success; -} -.has-warning .input-group-addon, -.has-error .input-group-addon, -.has-success .input-group-addon { - color: #666666; - border-color: transparent; - background-color: transparent; -} -.form-group-lg select, -.form-group-lg select.form-control { - line-height: 1.5; -} -.nav-tabs > li > a, -.nav-tabs > li > a:focus { - margin-right: 0; - background-color: transparent; - border: none; - color: #666666; - -webkit-box-shadow: inset 0 -1px 0 #dddddd; - box-shadow: inset 0 -1px 0 #dddddd; - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; -} -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus:hover { - background-color: transparent; - -webkit-box-shadow: inset 0 -2px 0 $brand-primary; - box-shadow: inset 0 -2px 0 $brand-primary; - color: $brand-primary; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:focus { - border: none; - -webkit-box-shadow: inset 0 -2px 0 $brand-primary; - box-shadow: inset 0 -2px 0 $brand-primary; - color: $brand-primary; -} -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus:hover { - border: none; - color: $brand-primary; -} -.nav-tabs > li.disabled > a { - -webkit-box-shadow: inset 0 -1px 0 #dddddd; - box-shadow: inset 0 -1px 0 #dddddd; -} -.nav-tabs.nav-justified > li > a, -.nav-tabs.nav-justified > li > a:hover, -.nav-tabs.nav-justified > li > a:focus, -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: none; -} -.nav-tabs .dropdown-menu { - margin-top: 0; -} -.dropdown-menu { - margin-top: 0; - border: none; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); -} - - -.alert a:not(.close):not(.btn), -.alert .alert-link { - //color: #fff; - font-weight: bold; -} -.alert .close { - //color: #fff; -} -.badge { - padding: 4px 6px 4px; -} -.progress { - position: relative; - z-index: 1; - height: 6px; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.progress-bar { - -webkit-box-shadow: none; - box-shadow: none; -} -.progress-bar:last-child { - border-radius: 0 3px 3px 0; -} -.progress-bar:last-child:before { - display: block; - content: ""; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - z-index: -1; - background-color: #cae6fc; -} -.progress-bar-success:last-child.progress-bar:before { - background-color: #c7e7c8; -} -.progress-bar-info:last-child.progress-bar:before { - background-color: #edc9f3; -} -.progress-bar-warning:last-child.progress-bar:before { - background-color: #ffe0b3; -} -.progress-bar-danger:last-child.progress-bar:before { - background-color: #f28e92; -} -.close { - font-size: 34px; - font-weight: 300; - line-height: 24px; - opacity: 0.6; - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; -} -.close:hover { - opacity: 1; -} -.list-group-item { - padding: 15px; -} -.list-group-item-text { - color: #bbbbbb; -} -.well { - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} -.panel { - border: none; - border-radius: 2px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); -} -.panel-heading { - border-bottom: none; -} -.panel-footer { - border-top: none; -} -.popover { - border: none; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); -} -.carousel-caption h1, -.carousel-caption h2, -.carousel-caption h3, -.carousel-caption h4, -.carousel-caption h5, -.carousel-caption h6 { - color: inherit; -} diff --git a/frontend/src/app/styles/_components.scss b/frontend/src/app/styles/_components.scss deleted file mode 100644 index 4095ab969..000000000 --- a/frontend/src/app/styles/_components.scss +++ /dev/null @@ -1,52 +0,0 @@ -.list-search { - padding: 0; - text-align: right; - - .fa.fa-plus-circle { - position: relative; - top: -6px; - } - - .list-search-filters { - max-width: 300px; - - form { - margin: 0 0 -2px; - padding: 0; - position: relative; - top: -9px; - } - - .input-group-addon { - cursor: pointer; - padding: 0 8px; - - i { - position: relative; - top: 1px; - } - } - - ul { - .title { - font-size: 12px; - padding: 3px 10px 0; - text-transform: uppercase; - white-space: nowrap; - } - } - - .dropdown-menu > li > a { - padding-left: 10px; - - i { - margin-right: 5px; - } - } - } - - .list-search-filters, - .pagination { - display: inline-block; - } -} diff --git a/frontend/src/app/styles/_forms.scss b/frontend/src/app/styles/_forms.scss deleted file mode 100644 index 0eda0e109..000000000 --- a/frontend/src/app/styles/_forms.scss +++ /dev/null @@ -1,17 +0,0 @@ -$color-button-info: #fff; - -.editable-wrap { - display: inline; -} - -.editable-textarea { - min-height: 350px; -} - -.btn { - &.active { - .text-info { - color: $color-button-info; - } - } -} diff --git a/frontend/src/app/styles/_mixins.scss b/frontend/src/app/styles/_mixins.scss deleted file mode 100644 index a8feb936e..000000000 --- a/frontend/src/app/styles/_mixins.scss +++ /dev/null @@ -1,49 +0,0 @@ -$color-box-shadow: #ababab; - -@mixin border-radius($radius) { - // If you want to support also old browsers just un-comment lines below - //-webkit-border-radius: $radius; - //-moz-border-radius: $radius; - //-ms-border-radius: $radius; - border-radius: $radius; -} - -@mixin no-select() { - // If you want to support also old browsers just un-comment lines below - //-webkit-touch-callout: none; - //-webkit-user-select: none; - //-khtml-user-select: none; - //-moz-user-select: none; - //-ms-user-select: none; - user-select: none; -} - -@mixin box-shadow($top, $left, $blur, $color: $color-box-shadow, $inset: '') { - // If you want to support also old browsers just un-comment lines below - //-webkit-box-shadow: $top $left $blur $color #{$inset}; - //-moz-box-shadow: $top $left $blur $color #{$inset}; - box-shadow: $top $left $blur $color #{$inset}; -} - -@mixin text-shadow($top, $left, $blur, $color) { - text-shadow: $top $left $blur $color; -} - -@mixin linear-gradient($color-from, $color-to) { - // Fallback Color - // If you want to support also old browsers just un-comment lines below - //background-image: -webkit-gradient(linear, left top, left bottom, from($color-from), to($color-to)); // Saf4+, Chrome - //background-image: -webkit-linear-gradient(top, $color-from, $color-to); // Chrome 10+, Saf5.1+, iOS 5+ - //background-image: -moz-linear-gradient(top, $color-from, $color-to); // FF3.6 - //background-image: -ms-linear-gradient(top, $color-from, $color-to); // IE10 - //background-image: -o-linear-gradient(top, $color-from, $color-to); // Opera 11.10+ - background: $color-to linear-gradient(top, $color-from, $color-to); - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#{$color-from}', EndColorStr='#{$color-to}'); -} - -@mixin border-box() { - // If you want to support also old browsers just un-comment lines below - //-webkit-box-sizing: border-box; - //-moz-box-sizing: border-box; - box-sizing: border-box; -} diff --git a/frontend/src/app/styles/_ripple.scss b/frontend/src/app/styles/_ripple.scss deleted file mode 100644 index d3936228a..000000000 --- a/frontend/src/app/styles/_ripple.scss +++ /dev/null @@ -1 +0,0 @@ -.ripple{position:relative;overflow:hidden}.ripple:after{content:"";background:rgba(255,255,255,0.3);display:block;position:absolute;border-radius:50%;padding-top:240%;padding-left:240%;margin-top:-120%;margin-left:-120%;opacity:0;transition:all 1s}.ripple:active:after{padding-top:0;padding-left:0;margin-top:0;margin-left:0;opacity:1;transition:0s} \ No newline at end of file diff --git a/frontend/src/app/styles/_ripples.scss b/frontend/src/app/styles/_ripples.scss deleted file mode 100644 index cc88c40f5..000000000 --- a/frontend/src/app/styles/_ripples.scss +++ /dev/null @@ -1,47 +0,0 @@ -.withripple { - position: relative; -} -.ripple-container { - position: absolute; - top: 0; - left: 0; - z-index: 1; - width: 100%; - height: 100%; - overflow: hidden; - border-radius: inherit; - pointer-events: none; -} -.ripple { - position: absolute; - width: 20px; - height: 20px; - margin-left: -10px; - margin-top: -10px; - border-radius: 100%; - background-color: #000; - background-color: rgba(0, 0, 0, 0.05); - -webkit-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 50%; - -ms-transform-origin: 50%; - -o-transform-origin: 50%; - transform-origin: 50%; - opacity: 0; - pointer-events: none; -} -.ripple.ripple-on { - -webkit-transition: opacity 0.15s ease-in 0s, -webkit-transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s; - -o-transition: opacity 0.15s ease-in 0s, -o-transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s; - transition: opacity 0.15s ease-in 0s, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s; - opacity: 0.1; -} -.ripple.ripple-out { - -webkit-transition: opacity 0.1s linear 0s !important; - -o-transition: opacity 0.1s linear 0s !important; - transition: opacity 0.1s linear 0s !important; - opacity: 0; -} -/*# sourceMappingURL=ripples.css.map */ \ No newline at end of file diff --git a/frontend/src/app/styles/_variables.scss b/frontend/src/app/styles/_variables.scss deleted file mode 100644 index a60d3dfe5..000000000 --- a/frontend/src/app/styles/_variables.scss +++ /dev/null @@ -1,856 +0,0 @@ -// Paper 3.3.0 -// Variables -// -------------------------------------------------- - - -//== Colors -// -//## Gray and brand colors for use across Bootstrap. - -$gray-base: rgba(77,83,96,1); -$gray-darker: darken($gray-base, 13.5%); // #222 -$gray-dark: darken($gray-base, 10.5%);; -$gray: #666; -$gray-light: #bbb; -$gray-lighter: lighten($gray-base, 62.5%); // #eee - -$brand-primary: #03A9F4; -$brand-success: #26C281; -$brand-info: rgba(70,191,189,1); -$brand-warning: rgba(253,180,92,1); -$brand-danger: rgba(247,70,74,1); - - -//== Scaffolding -// -//## Settings for some of the most global styles. - -//** Background color for ``. -$body-bg: #fff; -//** Global text color on ``. -$text-color: $gray; - -//** Global textual link color. -$link-color: $brand-primary; -//** Link hover color set via `darken()` function. -$link-hover-color: darken($link-color, 15%); -//** Link hover decoration. -$link-hover-decoration: underline; - - -//== Typography -// -//## Font, line-height, and color for body text, headings, and more. - -$font-family-sans-serif: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; -$font-family-serif: Georgia, "Times New Roman", Times, serif; -//** Default monospace fonts for ``, ``, and `
    `.
    -$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
    -$font-family-base:        $font-family-sans-serif;
    -
    -$font-size-base:          13px;
    -$font-size-large:         ceil(($font-size-base * 1.25)); // ~18px
    -$font-size-small:         ceil(($font-size-base * 0.85)); // ~12px
    -
    -$font-size-h1:            56px;
    -$font-size-h2:            45px;
    -$font-size-h3:            34px;
    -$font-size-h4:            24px;
    -$font-size-h5:            20px;
    -$font-size-h6:            14px;
    -
    -//** Unit-less `line-height` for use in components like buttons.
    -$line-height-base:        1.846; // 20/14
    -//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    -$line-height-computed:    floor(($font-size-base * $line-height-base)); // ~20px
    -
    -//** By default, this inherits from the ``.
    -$headings-font-family:    inherit;
    -$headings-font-weight:    400;
    -$headings-line-height:    1.1;
    -$headings-color:          #444;
    -
    -
    -//== Iconography
    -//
    -//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
    -
    -//** Load fonts from this directory.
    -$icon-font-path:          "../fonts/";
    -//** File name for all font files.
    -$icon-font-name:          "glyphicons-halflings-regular";
    -//** Element ID within SVG icon file.
    -$icon-font-svg-id:        "glyphicons_halflingsregular";
    -
    -
    -//== Components
    -//
    -//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
    -
    -$padding-base-vertical:     6px;
    -$padding-base-horizontal:   16px;
    -
    -$padding-large-vertical:    10px;
    -$padding-large-horizontal:  16px;
    -
    -$padding-small-vertical:    5px;
    -$padding-small-horizontal:  10px;
    -
    -$padding-xs-vertical:       1px;
    -$padding-xs-horizontal:     5px;
    -
    -$line-height-large:         1.33;
    -$line-height-small:         1.5;
    -
    -$border-radius-base:        3px;
    -$border-radius-large:       3px;
    -$border-radius-small:       3px;
    -
    -//** Global color for active items (e.g., navs or dropdowns).
    -$component-active-color:    #fff;
    -//** Global background color for active items (e.g., navs or dropdowns).
    -$component-active-bg:       $brand-primary;
    -
    -//** Width of the `border` for generating carets that indicator dropdowns.
    -$caret-width-base:          4px;
    -//** Carets increase slightly in size for larger components.
    -$caret-width-large:         5px;
    -
    -
    -//== Tables
    -//
    -//## Customizes the `.table` component with basic values, each used across all table variations.
    -
    -//** Padding for ``s and ``s.
    -$table-cell-padding:            8px;
    -//** Padding for cells in `.table-condensed`.
    -$table-condensed-cell-padding:  5px;
    -
    -//** Default background color used for all tables.
    -$table-bg:                      transparent;
    -//** Background color used for `.table-striped`.
    -$table-bg-accent:               #f9f9f9;
    -//** Background color used for `.table-hover`.
    -$table-bg-hover:                #f5f5f5;
    -$table-bg-active:               $table-bg-hover;
    -
    -//** Border color for table and cell borders.
    -$table-border-color:            #ddd;
    -
    -
    -//== Buttons
    -//
    -//## For each of Bootstrap's buttons, define text, background and border color.
    -
    -$btn-font-weight:                normal;
    -
    -$btn-default-color:              $text-color;
    -$btn-default-bg:                 #fff;
    -$btn-default-border:             #eee;
    -
    -$btn-primary-color:              #fff;
    -$btn-primary-bg:                 $brand-primary;
    -$btn-primary-border:             transparent;
    -
    -$btn-success-color:              #fff;
    -$btn-success-bg:                 $brand-success;
    -$btn-success-border:             transparent;
    -
    -$btn-info-color:                 #fff;
    -$btn-info-bg:                    $brand-info;
    -$btn-info-border:                transparent;
    -
    -$btn-warning-color:              #fff;
    -$btn-warning-bg:                 $brand-warning;
    -$btn-warning-border:             transparent;
    -
    -$btn-danger-color:               #fff;
    -$btn-danger-bg:                  $brand-danger;
    -$btn-danger-border:              transparent;
    -
    -$btn-link-disabled-color:        $gray-light;
    -
    -
    -//== Forms
    -//
    -//##
    -
    -//** `` background color
    -$input-bg:                       transparent;
    -//** `` background color
    -$input-bg-disabled:              transparent;
    -
    -//** Text color for ``s
    -$input-color:                    $gray;
    -//** `` border color
    -$input-border:                   transparent;
    -
    -// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
    -//** Default `.form-control` border radius
    -$input-border-radius:            $border-radius-base;
    -//** Large `.form-control` border radius
    -$input-border-radius-large:      $border-radius-large;
    -//** Small `.form-control` border radius
    -$input-border-radius-small:      $border-radius-small;
    -
    -//** Border color for inputs on focus
    -$input-border-focus:             #66afe9;
    -
    -//** Placeholder text color
    -$input-color-placeholder:        $gray-light;
    -
    -//** Default `.form-control` height
    -$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2);
    -//** Large `.form-control` height
    -$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2);
    -//** Small `.form-control` height
    -$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2);
    -
    -$legend-color:                   $gray-dark;
    -$legend-border-color:            #e5e5e5;
    -
    -//** Background color for textual input addons
    -$input-group-addon-bg:           transparent;
    -//** Border color for textual input addons
    -$input-group-addon-border-color: $input-border;
    -
    -//** Disabled cursor for form controls and buttons.
    -$cursor-disabled:                not-allowed;
    -
    -
    -//== Dropdowns
    -//
    -//## Dropdown menu container and contents.
    -
    -//** Background for the dropdown menu.
    -$dropdown-bg:                    #fff;
    -//** Dropdown menu `border-color`.
    -$dropdown-border:                rgba(0,0,0,.15);
    -//** Dropdown menu `border-color` **for IE8**.
    -$dropdown-fallback-border:       #ccc;
    -//** Divider color for between dropdown items.
    -$dropdown-divider-bg:            #e5e5e5;
    -
    -//** Dropdown link text color.
    -$dropdown-link-color:            $text-color;
    -//** Hover color for dropdown links.
    -$dropdown-link-hover-color:      darken($gray-dark, 5%);
    -//** Hover background for dropdown links.
    -$dropdown-link-hover-bg:         $gray-lighter;
    -
    -//** Active dropdown menu item text color.
    -$dropdown-link-active-color:     $component-active-color;
    -//** Active dropdown menu item background color.
    -$dropdown-link-active-bg:        $component-active-bg;
    -
    -//** Disabled dropdown menu item background color.
    -$dropdown-link-disabled-color:   $gray-light;
    -
    -//** Text color for headers within dropdown menus.
    -$dropdown-header-color:          $gray-light;
    -
    -//** Deprecated `$dropdown-caret-color` as of v3.1.0
    -$dropdown-caret-color:           $gray-light;
    -
    -
    -//-- Z-index master list
    -//
    -// Warning: Avoid customizing these values. They're used for a bird's eye view
    -// of components dependent on the z-axis and are designed to all work together.
    -//
    -// Note: These variables are not generated into the Customizer.
    -
    -$zindex-navbar:            1000;
    -$zindex-dropdown:          1000;
    -$zindex-popover:           1060;
    -$zindex-tooltip:           1070;
    -$zindex-navbar-fixed:      1030;
    -$zindex-modal:             1040;
    -
    -
    -//== Media queries breakpoints
    -//
    -//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    -
    -// Extra small screen / phone
    -//** Deprecated `$screen-xs` as of v3.0.1
    -$screen-xs:                  480px;
    -//** Deprecated `$screen-xs-min` as of v3.2.0
    -$screen-xs-min:              $screen-xs;
    -//** Deprecated `$screen-phone` as of v3.0.1
    -$screen-phone:               $screen-xs-min;
    -
    -// Small screen / tablet
    -//** Deprecated `$screen-sm` as of v3.0.1
    -$screen-sm:                  768px;
    -$screen-sm-min:              $screen-sm;
    -//** Deprecated `$screen-tablet` as of v3.0.1
    -$screen-tablet:              $screen-sm-min;
    -
    -// Medium screen / desktop
    -//** Deprecated `$screen-md` as of v3.0.1
    -$screen-md:                  992px;
    -$screen-md-min:              $screen-md;
    -//** Deprecated `$screen-desktop` as of v3.0.1
    -$screen-desktop:             $screen-md-min;
    -
    -// Large screen / wide desktop
    -//** Deprecated `$screen-lg` as of v3.0.1
    -$screen-lg:                  1200px;
    -$screen-lg-min:              $screen-lg;
    -//** Deprecated `$screen-lg-desktop` as of v3.0.1
    -$screen-lg-desktop:          $screen-lg-min;
    -
    -// So media queries don't overlap when required, provide a maximum
    -$screen-xs-max:              ($screen-sm-min - 1);
    -$screen-sm-max:              ($screen-md-min - 1);
    -$screen-md-max:              ($screen-lg-min - 1);
    -
    -
    -//== Grid system
    -//
    -//## Define your custom responsive grid.
    -
    -//** Number of columns in the grid.
    -$grid-columns:              12;
    -//** Padding between columns. Gets divided in half for the left and right.
    -$grid-gutter-width:         30px;
    -// Navbar collapse
    -//** Point at which the navbar becomes uncollapsed.
    -$grid-float-breakpoint:     $screen-sm-min;
    -//** Point at which the navbar begins collapsing.
    -$grid-float-breakpoint-max: ($grid-float-breakpoint - 1);
    -
    -
    -//== Container sizes
    -//
    -//## Define the maximum width of `.container` for different screen sizes.
    -
    -// Small screen / tablet
    -$container-tablet:             (720px + $grid-gutter-width);
    -//** For `$screen-sm-min` and up.
    -$container-sm:                 $container-tablet;
    -
    -// Medium screen / desktop
    -$container-desktop:            (940px + $grid-gutter-width);
    -//** For `$screen-md-min` and up.
    -$container-md:                 $container-desktop;
    -
    -// Large screen / wide desktop
    -$container-large-desktop:      (1140px + $grid-gutter-width);
    -//** For `$screen-lg-min` and up.
    -$container-lg:                 $container-large-desktop;
    -
    -
    -//== Navbar
    -//
    -//##
    -
    -// Basics of a navbar
    -$navbar-height:                    64px;
    -$navbar-margin-bottom:             $line-height-computed;
    -$navbar-border-radius:             $border-radius-base;
    -$navbar-padding-horizontal:        floor(($grid-gutter-width / 2));
    -$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2);
    -$navbar-collapse-max-height:       340px;
    -
    -$navbar-default-color:             $gray-light;
    -$navbar-default-bg:                #fff;
    -$navbar-default-border:            transparent;
    -
    -// Navbar links
    -$navbar-default-link-color:                $gray;
    -$navbar-default-link-hover-color:          $gray-dark;
    -$navbar-default-link-hover-bg:             transparent;
    -$navbar-default-link-active-color:         $gray-dark;
    -$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%);
    -$navbar-default-link-disabled-color:       #ccc;
    -$navbar-default-link-disabled-bg:          transparent;
    -
    -// Navbar brand label
    -$navbar-default-brand-color:               $navbar-default-link-color;
    -$navbar-default-brand-hover-color:         $navbar-default-link-hover-color;
    -$navbar-default-brand-hover-bg:            transparent;
    -
    -// Navbar toggle
    -$navbar-default-toggle-hover-bg:           transparent;
    -$navbar-default-toggle-icon-bar-bg:        rgba(0,0,0,0.5);
    -$navbar-default-toggle-border-color:       transparent;
    -
    -
    -// Inverted navbar
    -// Reset inverted navbar basics
    -$navbar-inverse-color:                      $gray-light;
    -$navbar-inverse-bg:                         $brand-primary;
    -$navbar-inverse-border:                     transparent;
    -
    -// Inverted navbar links
    -$navbar-inverse-link-color:                 lighten($brand-primary, 30%);
    -$navbar-inverse-link-hover-color:           #fff;
    -$navbar-inverse-link-hover-bg:              transparent;
    -$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color;
    -$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%);
    -$navbar-inverse-link-disabled-color:        #444;
    -$navbar-inverse-link-disabled-bg:           transparent;
    -
    -// Inverted navbar brand label
    -$navbar-inverse-brand-color:                $navbar-inverse-link-color;
    -$navbar-inverse-brand-hover-color:          #fff;
    -$navbar-inverse-brand-hover-bg:             transparent;
    -
    -// Inverted navbar toggle\
    -$navbar-inverse-toggle-hover-bg:            transparent;
    -$navbar-inverse-toggle-icon-bar-bg:         rgba(0,0,0,0.5);
    -$navbar-inverse-toggle-border-color:        transparent;
    -
    -
    -//== Navs
    -//
    -//##
    -
    -//=== Shared nav styles
    -$nav-link-padding:                          10px 15px;
    -$nav-link-hover-bg:                         $gray-lighter;
    -
    -$nav-disabled-link-color:                   $gray-light;
    -$nav-disabled-link-hover-color:             $gray-light;
    -
    -//== Tabs
    -$nav-tabs-border-color:                     transparent;
    -
    -$nav-tabs-link-hover-border-color:          $gray-lighter;
    -
    -$nav-tabs-active-link-hover-bg:             transparent;
    -$nav-tabs-active-link-hover-color:          $gray;
    -$nav-tabs-active-link-hover-border-color:   transparent;
    -
    -$nav-tabs-justified-link-border-color:            $nav-tabs-border-color;
    -$nav-tabs-justified-active-link-border-color:     $body-bg;
    -
    -//== Pills
    -$nav-pills-border-radius:                   $border-radius-base;
    -$nav-pills-active-link-hover-bg:            $component-active-bg;
    -$nav-pills-active-link-hover-color:         $component-active-color;
    -
    -
    -//== Pagination
    -//
    -//##
    -
    -$pagination-color:                     $link-color;
    -$pagination-bg:                        #fff;
    -$pagination-border:                    #ddd;
    -
    -$pagination-hover-color:               $link-hover-color;
    -$pagination-hover-bg:                  $gray-lighter;
    -$pagination-hover-border:              #ddd;
    -
    -$pagination-active-color:              #fff;
    -$pagination-active-bg:                 $brand-primary;
    -$pagination-active-border:             $brand-primary;
    -
    -$pagination-disabled-color:            $gray-light;
    -$pagination-disabled-bg:               #fff;
    -$pagination-disabled-border:           #ddd;
    -
    -
    -//== Pager
    -//
    -//##
    -
    -$pager-bg:                             $pagination-bg;
    -$pager-border:                         $pagination-border;
    -$pager-border-radius:                  15px;
    -
    -$pager-hover-bg:                       $pagination-hover-bg;
    -
    -$pager-active-bg:                      $pagination-active-bg;
    -$pager-active-color:                   $pagination-active-color;
    -
    -$pager-disabled-color:                 $pagination-disabled-color;
    -
    -
    -//== Jumbotron
    -//
    -//##
    -
    -$jumbotron-padding:              30px;
    -$jumbotron-color:                inherit;
    -$jumbotron-bg:                   #f9f9f9;
    -$jumbotron-heading-color:        $headings-color;
    -$jumbotron-font-size:            ceil(($font-size-base * 1.5));
    -
    -
    -//== Form states and alerts
    -//
    -//## Define colors for form feedback states and, by default, alerts.
    -
    -$state-success-text:             $brand-success;
    -$state-success-bg:               lighten($brand-success,24%);
    -$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%);
    -
    -$state-info-text:                darken($brand-info,15%);
    -$state-info-bg:                  lighten($brand-info,37%);
    -$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%);
    -
    -$state-warning-text:             $brand-warning;
    -$state-warning-bg:               lighten($brand-warning,24%);
    -$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%);
    -
    -$state-danger-text:              $brand-danger;
    -$state-danger-bg:                lighten($brand-danger,24%);
    -$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%);
    -
    -
    -//== Tooltips
    -//
    -//##
    -
    -//** Tooltip max width
    -$tooltip-max-width:           200px;
    -//** Tooltip text color
    -$tooltip-color:               #fff;
    -//** Tooltip background color
    -$tooltip-bg:                  #727272;
    -$tooltip-opacity:             .9;
    -
    -//** Tooltip arrow width
    -$tooltip-arrow-width:         5px;
    -//** Tooltip arrow color
    -$tooltip-arrow-color:         $tooltip-bg;
    -
    -
    -//== Popovers
    -//
    -//##
    -
    -//** Popover body background color
    -$popover-bg:                          #fff;
    -//** Popover maximum width
    -$popover-max-width:                   276px;
    -//** Popover border color
    -$popover-border-color:                transparent;
    -//** Popover fallback border color
    -$popover-fallback-border-color:       transparent;
    -
    -//** Popover title background color
    -$popover-title-bg:                    darken($popover-bg, 3%);
    -
    -//** Popover arrow width
    -$popover-arrow-width:                 10px;
    -//** Popover arrow color
    -$popover-arrow-color:                 $popover-bg;
    -
    -//** Popover outer arrow width
    -$popover-arrow-outer-width:           ($popover-arrow-width + 1);
    -//** Popover outer arrow color
    -$popover-arrow-outer-color:           fadein($popover-border-color, 7.5%);
    -//** Popover outer arrow fallback color
    -$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%);
    -
    -
    -//== Labels
    -//
    -//##
    -
    -//** Default label background color
    -$label-default-bg:            $gray-light;
    -//** Primary label background color
    -$label-primary-bg:            $brand-primary;
    -//** Success label background color
    -$label-success-bg:            $brand-success;
    -//** Info label background color
    -$label-info-bg:               $brand-info;
    -//** Warning label background color
    -$label-warning-bg:            $brand-warning;
    -//** Danger label background color
    -$label-danger-bg:             $brand-danger;
    -
    -//** Default label text color
    -$label-color:                 #fff;
    -//** Default text color of a linked label
    -$label-link-hover-color:      #fff;
    -
    -
    -//== Modals
    -//
    -//##
    -
    -//** Padding applied to the modal body
    -$modal-inner-padding:         15px;
    -
    -//** Padding applied to the modal title
    -$modal-title-padding:         15px;
    -//** Modal title line-height
    -$modal-title-line-height:     $line-height-base;
    -
    -//** Background color of modal content area
    -$modal-content-bg:                             #fff;
    -//** Modal content border color
    -$modal-content-border-color:                   transparent;
    -//** Modal content border color **for IE8**
    -$modal-content-fallback-border-color:          #999;
    -
    -//** Modal backdrop background color
    -$modal-backdrop-bg:           #000;
    -//** Modal backdrop opacity
    -$modal-backdrop-opacity:      .5;
    -//** Modal header border color
    -$modal-header-border-color:   transparent;
    -//** Modal footer border color
    -$modal-footer-border-color:   $modal-header-border-color;
    -
    -$modal-lg:                    900px;
    -$modal-md:                    600px;
    -$modal-sm:                    300px;
    -
    -
    -//== Alerts
    -//
    -//## Define alert colors, border radius, and padding.
    -
    -$alert-padding:               15px;
    -$alert-border-radius:         $border-radius-base;
    -$alert-link-font-weight:      bold;
    -
    -$alert-success-bg:            $state-success-bg;
    -$alert-success-text:          $state-success-text;
    -$alert-success-border:        $state-success-border;
    -
    -$alert-info-bg:               $state-info-bg;
    -$alert-info-text:             $state-info-text;
    -$alert-info-border:           $state-info-border;
    -
    -$alert-warning-bg:            $state-warning-bg;
    -$alert-warning-text:          $state-warning-text;
    -$alert-warning-border:        $state-warning-border;
    -
    -$alert-danger-bg:             $state-danger-bg;
    -$alert-danger-text:           $state-danger-text;
    -$alert-danger-border:         $state-danger-border;
    -
    -
    -//== Progress bars
    -//
    -//##
    -
    -//** Background color of the whole progress component
    -$progress-bg:                 #f5f5f5;
    -//** Progress bar text color
    -$progress-bar-color:          #fff;
    -//** Variable for setting rounded corners on progress bar.
    -$progress-border-radius:      $border-radius-base;
    -
    -//** Default progress bar color
    -$progress-bar-bg:             $brand-primary;
    -//** Success progress bar color
    -$progress-bar-success-bg:     $brand-success;
    -//** Warning progress bar color
    -$progress-bar-warning-bg:     $brand-warning;
    -//** Danger progress bar color
    -$progress-bar-danger-bg:      $brand-danger;
    -//** Info progress bar color
    -$progress-bar-info-bg:        $brand-info;
    -
    -
    -//== List group
    -//
    -//##
    -
    -//** Background color on `.list-group-item`
    -$list-group-bg:                 #fff;
    -//** `.list-group-item` border color
    -$list-group-border:             #ddd;
    -//** List group border radius
    -$list-group-border-radius:      $border-radius-base;
    -
    -//** Background color of single list items on hover
    -$list-group-hover-bg:           #f5f5f5;
    -//** Text color of active list items
    -$list-group-active-color:       $component-active-color;
    -//** Background color of active list items
    -$list-group-active-bg:          $component-active-bg;
    -//** Border color of active list elements
    -$list-group-active-border:      $list-group-active-bg;
    -//** Text color for content within active list items
    -$list-group-active-text-color:  lighten($list-group-active-bg, 40%);
    -
    -//** Text color of disabled list items
    -$list-group-disabled-color:      $gray-light;
    -//** Background color of disabled list items
    -$list-group-disabled-bg:         $gray-lighter;
    -//** Text color for content within disabled list items
    -$list-group-disabled-text-color: $list-group-disabled-color;
    -
    -$list-group-link-color:         #555;
    -$list-group-link-hover-color:   $list-group-link-color;
    -$list-group-link-heading-color: #333;
    -
    -
    -//== Panels
    -//
    -//##
    -
    -$panel-bg:                    #fff;
    -$panel-body-padding:          15px;
    -$panel-heading-padding:       10px 15px;
    -$panel-footer-padding:        $panel-heading-padding;
    -$panel-border-radius:         $border-radius-base;
    -
    -//** Border color for elements within panels
    -$panel-inner-border:          #ddd;
    -$panel-footer-bg:             #f5f5f5;
    -
    -$panel-default-text:          $gray-dark;
    -$panel-default-border:        #ddd;
    -$panel-default-heading-bg:    #f5f5f5;
    -
    -$panel-primary-text:          #fff;
    -$panel-primary-border:        $brand-primary;
    -$panel-primary-heading-bg:    $brand-primary;
    -
    -$panel-success-text:          $state-success-text;
    -$panel-success-border:        $state-success-border;
    -$panel-success-heading-bg:    $state-success-bg;
    -
    -$panel-info-text:             $state-info-text;
    -$panel-info-border:           $state-info-border;
    -$panel-info-heading-bg:       $state-info-bg;
    -
    -$panel-warning-text:          $state-warning-text;
    -$panel-warning-border:        $state-warning-border;
    -$panel-warning-heading-bg:    $state-warning-bg;
    -
    -$panel-danger-text:           $state-danger-text;
    -$panel-danger-border:         $state-danger-border;
    -$panel-danger-heading-bg:     $state-danger-bg;
    -
    -
    -//== Thumbnails
    -//
    -//##
    -
    -//** Padding around the thumbnail image
    -$thumbnail-padding:           4px;
    -//** Thumbnail background color
    -$thumbnail-bg:                $body-bg;
    -//** Thumbnail border color
    -$thumbnail-border:            #ddd;
    -//** Thumbnail border radius
    -$thumbnail-border-radius:     $border-radius-base;
    -
    -//** Custom text color for thumbnail captions
    -$thumbnail-caption-color:     $text-color;
    -//** Padding around the thumbnail caption
    -$thumbnail-caption-padding:   9px;
    -
    -
    -//== Wells
    -//
    -//##
    -
    -$well-bg:                     #f9f9f9;
    -$well-border:                 transparent;
    -
    -
    -//== Badges
    -//
    -//##
    -
    -$badge-color:                 #fff;
    -//** Linked badge text color on hover
    -$badge-link-hover-color:      #fff;
    -$badge-bg:                    $gray-light;
    -
    -//** Badge text color in active nav link
    -$badge-active-color:          $link-color;
    -//** Badge background color in active nav link
    -$badge-active-bg:             #fff;
    -
    -$badge-font-weight:           normal;
    -$badge-line-height:           1;
    -$badge-border-radius:         10px;
    -
    -
    -//== Breadcrumbs
    -//
    -//##
    -
    -$breadcrumb-padding-vertical:   8px;
    -$breadcrumb-padding-horizontal: 15px;
    -//** Breadcrumb background color
    -$breadcrumb-bg:                 #f5f5f5;
    -//** Breadcrumb text color
    -$breadcrumb-color:              #ccc;
    -//** Text color of current page in the breadcrumb
    -$breadcrumb-active-color:       $gray-light;
    -//** Textual separator for between breadcrumb elements
    -$breadcrumb-separator:          "/";
    -
    -
    -//== Carousel
    -//
    -//##
    -
    -$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
    -
    -$carousel-control-color:                      #fff;
    -$carousel-control-width:                      15%;
    -$carousel-control-opacity:                    .5;
    -$carousel-control-font-size:                  20px;
    -
    -$carousel-indicator-active-bg:                #fff;
    -$carousel-indicator-border-color:             #fff;
    -
    -$carousel-caption-color:                      #fff;
    -
    -
    -//== Close
    -//
    -//##
    -
    -$close-font-weight:           normal;
    -$close-color:                 #000;
    -$close-text-shadow:           none;
    -
    -
    -//== Code
    -//
    -//##
    -
    -$code-color:                  #c7254e;
    -$code-bg:                     #f9f2f4;
    -
    -$kbd-color:                   #fff;
    -$kbd-bg:                      #333;
    -
    -$pre-bg:                      #f5f5f5;
    -$pre-color:                   $gray-dark;
    -$pre-border-color:            #ccc;
    -$pre-scrollable-max-height:   340px;
    -
    -
    -//== Type
    -//
    -//##
    -
    -//** Horizontal offset for forms and lists.
    -$component-offset-horizontal: 180px;
    -//** Text muted color
    -$text-muted:                  $gray-light;
    -//** Abbreviations and acronyms border color
    -$abbr-border-color:           $gray-light;
    -//** Headings small color
    -$headings-small-color:        $gray-light;
    -//** Blockquote small color
    -$blockquote-small-color:      $gray-light;
    -//** Blockquote font size
    -$blockquote-font-size:        ($font-size-base * 1.25);
    -//** Blockquote border color
    -$blockquote-border-color:     $gray-lighter;
    -//** Page header border color
    -$page-header-border-color:    $gray-lighter;
    -//** Width of horizontal description list titles
    -$dl-horizontal-offset:        $component-offset-horizontal;
    -//** Horizontal line color.
    -$hr-border:                   $gray-lighter;
    diff --git a/frontend/src/app/users/index.html b/frontend/src/app/users/index.html
    deleted file mode 100644
    index d85fea186..000000000
    --- a/frontend/src/app/users/index.html
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -
    -
    -
    -
    -
    -
    -
    - -
    - diff --git a/frontend/src/app/users/partials/users-table.html b/frontend/src/app/users/partials/users-table.html deleted file mode 100644 index 36782b967..000000000 --- a/frontend/src/app/users/partials/users-table.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - -
    - - - - -
    {{user.id}}.{{user.admin ? 'star' : 'person'}}{{user.username}}{{user.firstName}}{{user.lastName}}{{user.createdAt | date : "MMM d, y"}}{{user.updatedAt | date : "MMM d, y"}} - -
    - no data found... -
    - -
      diff --git a/frontend/src/app/users/user-controller.js b/frontend/src/app/users/user-controller.js deleted file mode 100644 index f307dc709..000000000 --- a/frontend/src/app/users/user-controller.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.users') - .controller('UserController', [ - '_','$scope','$q','$log','UserService','MessageService','$state','DialogService','UserModel','_user', - function controller(_,$scope,$q,$log, UserService, MessageService,$state,DialogService,UserModel,_user ) { - - // Set current scope reference to models - UserModel.setScope($scope, 'user'); - - // Expose necessary data - $scope.user = _user; - initUserPassports() - $scope.authUser = UserService.user(); - - // User delete dialog buttons configuration - $scope.confirmButtonsDelete = { - ok: { - label: 'Delete', - className: 'btn-danger btn-link', - callback: function callback() { - $scope.deleteUser(); - } - }, - cancel: { - label: 'Cancel', - className: 'btn-default btn-link' - } - }; - - // Scope function to save modified user. - $scope.saveUser = function saveUser() { - - var data = angular.copy($scope.user); - - // Make actual data update - var deferred = $q.defer(); - UserModel - .update(data.id, data) - .then( - function onSuccess() { - $scope.showForm = false; - MessageService.success('User "' + $scope.user.username + '" updated successfully'); - initUserPassports() - deferred.resolve(true); - },function(err){ - UserModel.handleError($scope,err) - deferred.reject('Error'); - } - ); - - return deferred.promise; - }; - - // Scope function to delete user - $scope.deleteUser = function deleteUser() { - UserModel - .delete($scope.user.id) - .then( - function onSuccess() { - MessageService.success('User "' + $scope.user.username + '" deleted successfully'); - $state.go('users'); - } - ) - ; - }; - - $scope.cancelEditing = function() { - $scope.editableForm.$cancel() - initUserPassports() - } - - function initUserPassports() { - $scope.user.passports = { - password : "", - protocol : 'local' - } - $scope.user.password_confirmation = undefined - } - - } - ]) - ; -}()); diff --git a/frontend/src/app/users/user-create-controller.js b/frontend/src/app/users/user-create-controller.js deleted file mode 100644 index 1f225cfac..000000000 --- a/frontend/src/app/users/user-create-controller.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.users') - .controller('UserCreateController', [ - '_','$scope','$q','$log','UserService','MessageService','$state','DialogService','UserModel', - function controller(_,$scope,$q,$log, UserService, MessageService,$state,DialogService,UserModel ) { - - // Initialize author model - $scope.user = { - username : '', - firstName : '', - lastName : '', - admin : false, - passports : { - password : '', - protocol : 'local' - }, - password_confirmation : '', - - } - - /** - * Scope function to store new author to database. After successfully save user will be redirected - * to view that new created author. - */ - $scope.createUser = function createUser() { - $scope.busy = true; - UserModel - .create(angular.copy($scope.user)) - .then( - function onSuccess(result) { - MessageService.success('New user created successfully'); - $scope.busy = false; - $state.go('users.show', {id: result.data.id}); - },function(err){ - $scope.busy = false - UserModel.handleError($scope,err) - } - ) - ; - }; - } - ]) - ; -}()); diff --git a/frontend/src/app/users/user-create.html b/frontend/src/app/users/user-create.html deleted file mode 100644 index 6c1732356..000000000 --- a/frontend/src/app/users/user-create.html +++ /dev/null @@ -1,72 +0,0 @@ - -
      -
      -
      -
      - New Konga User -
      - -
      -
      -
      -
      -
      -
      -
      - - -
      -
      -
      - - -
      -
      -
      - - -
      -
      -
      - - -
      -
      -
      -
      -
      - - -
      -
      -
      - - -
      -
      -
      -
      - -
      - -
      -
      -
      -
      -
      -
      -
      - - -
      \ No newline at end of file diff --git a/frontend/src/app/users/user-model.js b/frontend/src/app/users/user-model.js deleted file mode 100644 index e76352fe0..000000000 --- a/frontend/src/app/users/user-model.js +++ /dev/null @@ -1,74 +0,0 @@ -(function() { - 'use strict'; - - /** - * Model for Author API, this is used to wrap all Author objects specified actions and data change actions. - */ - angular.module('frontend.users') - .service('UserModel', [ - 'DataModel','DataService','$q','$log', - function(DataModel,DataService,$q,$log) { - - var model = new DataModel('user'); - - model.handleError = function($scope,err) { - console.log("errrrrrrrrrrrrr",err) - $scope.errors = {} - if(err.data){ - - for(var key in err.data.invalidAttributes){ - $scope.errors[key] = err.data.invalidAttributes[key][0].message - } - - // Passport errors - if(err.data.raw && err.data.raw.length) { - err.data.raw.forEach(function(raw){ - for(var key in raw.err.invalidAttributes){ - $scope.errors[key] = raw.err.invalidAttributes[key][0].message - } - }) - } - } - } - - return model; - // - //model.create = function create(data) { - // var self = this; - // var defer = $q.defer() - // - // if(data.passports.password !== data.password_confirmation) { - // - // defer.reject({ - // data: { - // invalidAttributes: { - // password_confirmation: [ - // {message: "Password and password confirmation don't match"} - // ] - // } - // } - // }) - // }else{ - // DataService - // .create(self.endpoint, data) - // .then( - // function onSuccess(result) { - // defer.resolve(result); - // }, - // function onError(error) { - // $log.error('DataModel.create() failed.', error, self.endpoint, data); - // defer.reject(error) - // } - // ) - // } - // - // - // - // return defer.promise - //}; - // - //return model - } - ]) - ; -}()); \ No newline at end of file diff --git a/frontend/src/app/users/user.html b/frontend/src/app/users/user.html deleted file mode 100644 index ffe298fcc..000000000 --- a/frontend/src/app/users/user.html +++ /dev/null @@ -1,166 +0,0 @@ -
      -

      Requested user not found

      -
      - -
      - -
      -
      -
      - - {{user.firstName}} {{user.lastName}} -
      - - - -
      -
      - - - Edit - - - -
      - - -
      - -
      -
      - -
      -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - Info -
      Username - - {{user.username}} - -
      First Name - - {{user.firstName}} - -
      Last Name - - {{user.lastName}} - -
      Email - - - - {{user.email}} - - -
      - - Security -
      Password - - - - -
      Password Confirmation - - - -

      - -
      Created at{{user.createdAt | date : "MMM d, y"}}
      Last update{{user.updatedAt | date : "MMM d, y"}}
      - -
      -
      - -
      - -
      - -
      -
      diff --git a/frontend/src/app/users/users-controller.js b/frontend/src/app/users/users-controller.js deleted file mode 100644 index a32b48aba..000000000 --- a/frontend/src/app/users/users-controller.js +++ /dev/null @@ -1,196 +0,0 @@ -/** - * This file contains all necessary Angular controller definitions for 'frontend.admin.login-history' module. - * - * Note that this file should only contain controllers and nothing else. - */ -(function() { - 'use strict'; - - angular.module('frontend.users') - .controller('UsersController', [ - '_','$scope', '$q','$log', 'SocketHelperService', - 'UserService','$state','ApiService','$uibModal', - 'DialogService','UserModel','ListConfig','_items','_count', - function controller(_,$scope, $q,$log,SocketHelperService, UserService, - $state, ApiService, $uibModal, - DialogService,UserModel,ListConfig, _items, _count ) { - - - UserModel.setScope($scope, false, 'items', 'itemCount'); - - // Add default list configuration variable to current scope - $scope = angular.extend($scope, angular.copy(ListConfig.getConfig())); - - // Set initial data - $scope.items = _items; - $scope.itemCount = _count.count; - $scope.user = UserService.user(); - - // Initialize used title items - $scope.titleItems = ListConfig.getTitleItems(UserModel.endpoint); - - $log.debug("_items",_items) - $log.debug("_count",_count) - $log.debug("titleItems",$scope.titleItems) - - - - // Initialize default sort data - - $scope.paging = { - currentPage: 1, - }; - - $scope.sort = { - column: 'createdAt', - direction: false - }; - - // Initialize filters - $scope.filters = { - searchWord: '', - columns: $scope.titleItems - }; - - // Function to change sort column / direction on list - $scope.changeSort = function changeSort(item) { - var sort = $scope.sort; - - if (sort.column === item.column) { - sort.direction = !sort.direction; - } else { - sort.column = item.column; - sort.direction = true; - } - - _triggerFetchData(); - }; - - - $scope.pageChanged = function() { - $log.log('Page changed to: ' + $scope.paging.currentPage); - _fetchData(); - } - - - /** - * Simple watcher for 'itemsPerPage' scope variable. If this is changed we need to fetch author data - * from server. - */ - $scope.$watch('itemsPerPage', function watcher(valueNew, valueOld) { - if (valueNew !== valueOld) { - _triggerFetchData(); - } - }); - - - $scope.$watch('filters', function watcher(valueNew, valueOld) { - if (valueNew !== valueOld) { - _triggerFetchData(); - } - },true); - - $scope.deleteUser = deleteUser - - - - function deleteUser($index,user) { - DialogService.prompt( - "Delete User","Really want to delete the user?", - ['No don\'t','Yes! delete it'], - function accept(){ - UserModel.delete(user.id) - .then(function(resp){ - $scope.items.splice($scope.items.indexOf(user),1); - }) - },function decline(){}) - } - - - function _triggerFetchData() { - if ($scope.paging.currentPage === 1) { - _fetchData(); - } else { - $scope.paging.currentPage = 1; - } - } - - - /** - * Helper function to fetch actual data for GUI from backend server with current parameters: - * 1) Current page - * 2) Search word - * 3) Sort order - * 4) Items per page - * - * Actually this function is doing two request to backend: - * 1) Data count by given filter parameters - * 2) Actual data fetch for current page with filter parameters - * - * These are fetched via 'AuthorModel' service with promises. - * - * @private - */ - function _fetchData() { - $scope.loading = true; - - // Common parameters for count and data query - var commonParameters = { - where: SocketHelperService.getWhere($scope.filters) - }; - - // Data query specified parameters - var parameters = { - limit: $scope.itemsPerPage, - skip: ($scope.paging.currentPage - 1) * $scope.itemsPerPage, - sort: $scope.sort.column + ' ' + ($scope.sort.direction ? 'ASC' : 'DESC') - }; - - // Fetch data count - var count = UserModel - .count(commonParameters) - .then( - function onSuccess(response) { - $scope.itemCount = response.count; - } - ) - ; - - console.log("parameters",parameters) - - // Fetch actual data - var load = UserModel - .load(_.merge({}, commonParameters, parameters)) - .then( - function onSuccess(response) { - $scope.items = response; - } - ) - ; - - // And wrap those all to promise loading - $q - .all([count, load]) - .finally( - function onFinally() { - $scope.loaded = true; - $scope.loading = false; - } - ) - ; - } - - - - $scope.$on('konga.user.created',function(ev,user){ - _triggerFetchData() - }) - - - $scope.$on('konga.user.updated',function(ev,user){ - _triggerFetchData() - }) - } - ]) - ; -}()); diff --git a/frontend/src/app/users/users.js b/frontend/src/app/users/users.js deleted file mode 100644 index 9fb41f298..000000000 --- a/frontend/src/app/users/users.js +++ /dev/null @@ -1,98 +0,0 @@ - -(function() { - 'use strict'; - - angular.module('frontend.users', [ - ]); - - // Module configuration - angular.module('frontend.users') - .config([ - '$stateProvider', - function config($stateProvider) { - $stateProvider - .state('users', { - url: '/users', - parent : 'frontend', - cache : false, - data : { - pageName : "Konga Users", - displayName : "konga users", - prefix : '' - }, - views: { - 'content@': { - templateUrl: '/frontend/users/index.html', - controller: 'UsersController', - resolve: { - _items: [ - 'ListConfig', - 'UserModel', - function resolve( - ListConfig, - UserModel - ) { - var config = ListConfig.getConfig(); - - var parameters = { - limit: config.itemsPerPage, - sort: 'createdAt DESC' - }; - - return UserModel.load(parameters); - } - ], - _count: [ - 'UserModel', - function resolve(UserModel) { - return UserModel.count(); - } - ] - } - } - } - }) - .state('users.create', { - url: '/create', - data : { - pageName : "Create Konga user", - displayName : "create", - prefix : '' - }, - views: { - 'content@': { - templateUrl: '/frontend/users/user-create.html', - controller: 'UserCreateController' - } - } - }) - .state('users.show', { - url: '/:id', - data : { - pageName : "User profile", - displayName : "profile", - prefix : '' - }, - views: { - 'content@': { - templateUrl: '/frontend/users/user.html', - controller: 'UserController', - resolve: { - _user: [ - '$stateParams', - 'UserModel', - function resolve( - $stateParams, - UserModel - ) { - return UserModel.fetch($stateParams.id); - } - ], - } - } - } - }) - } - ]) - ; -}()); diff --git a/package.json b/package.json index 47b7f18ff..77c46c0c3 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,71 @@ { "name": "kongadmin", - "version": "0.4.0", + "private": true, + "version": "0.5.0", "description": "Kong admin GUI", "keywords": [ "sails.js", - "kong", - "admin", + "backend", + "REST", "API", "JWT", "JSON Web Token", - "Passport.js", - "frontend", - "angular", - "slush", - "slush-angular" + "Passport.js" ], - "main": "", "dependencies": { - "minimist": "^1.2.0", - "concurrently": "^3.1.0" + "async": "1.5.0", + "barrels": "1.6.0", + "bcryptjs": "2.3.0", + "bluebird": "3.0.5", + "csv-parser": "^1.11.0", + "ejs": "^2.5.6", + "google-auth-library": "^0.10.0", + "googleapis": "^14.1.0", + "grunt": "1.0.1", + "grunt-contrib-clean": "1.0.0", + "grunt-contrib-coffee": "1.0.0", + "grunt-contrib-concat": "1.0.1", + "grunt-contrib-copy": "1.0.0", + "grunt-contrib-cssmin": "1.0.1", + "grunt-contrib-jst": "1.0.0", + "grunt-contrib-less": "1.3.0", + "grunt-contrib-sass": "^1.0.0", + "grunt-contrib-uglify": "1.0.1", + "grunt-contrib-watch": "1.0.0", + "grunt-sails-linker": "~0.10.1", + "grunt-sass": "^2.0.0", + "grunt-sync": "0.5.2", + "http-proxy": "^1.16.2", + "include-all": "^1.0.0", + "jsonwebtoken": "5.4.1", + "lodash": "3.10.1", + "mkdirp": "^0.5.1", + "mongodb": "^2.2.11", + "mysql": "^2.11.1", + "node-sass": "^4.5.0", + "node-uuid": "^1.4.7", + "passport": "0.3.0", + "passport-local": "1.0.0", + "rc": "1.0.1", + "sails": "~0.12.11", + "sails-disk": "^0.10.10", + "ua-parser": "0.3.5", + "unirest": "^0.5.1", + "validator": "4.2.1" }, - "scripts": { - "install": "cd frontend && npm install && cd ../backend && npm --unsafe-perm install", - "start": "node ./bin/konga play", - "production": "concurrently \"(cd backend && node app.js --prod)\" \"(cd frontend && node server.js)\"", - "test": "cd backend && mocha" + "devDependencies": { + "chai": "3.4.0", + "mocha": "2.3.3", + "should": "7.1.1", + "supertest": "1.1.0" }, - "bin": { - "konga": "./bin/konga.js" + "scripts": { + "postinstall" : "bower --allow-root install", + "start": "node app.js", + "debug": "node debug app.js", + "test": "mocha" }, + "main": "app.js", "repository": { "type": "git", "url": "https://github.com/pantsel/konga.git" diff --git a/start.sh b/start.sh index c35f81fb8ecc00aa63d9b69aff1ae981d4be67bd..b82fbbd8e88b29c257ab5129f369b1fe9c86a123 100644 GIT binary patch literal 32 gcmY#Z)KALH(@#n)&fwz8E67zSE=epZ;bMRR0Fr?RF#rGn literal 172 zcmXwy%L;=q6hynuSKMm1O@2Z9pbLwIf@?9}sKIz6c|aHW_*$W}m{}Z{lOKiDBxL6& z#(IRoSqh4fVlW!J3EV(f#q#18*_0U>rZ_W%F@ diff --git a/backend/tasks/config/clean.js b/tasks/config/clean.js similarity index 100% rename from backend/tasks/config/clean.js rename to tasks/config/clean.js diff --git a/backend/tasks/config/coffee.js b/tasks/config/coffee.js similarity index 100% rename from backend/tasks/config/coffee.js rename to tasks/config/coffee.js diff --git a/backend/tasks/config/concat.js b/tasks/config/concat.js similarity index 100% rename from backend/tasks/config/concat.js rename to tasks/config/concat.js diff --git a/backend/tasks/config/copy.js b/tasks/config/copy.js similarity index 100% rename from backend/tasks/config/copy.js rename to tasks/config/copy.js diff --git a/backend/tasks/config/cssmin.js b/tasks/config/cssmin.js similarity index 100% rename from backend/tasks/config/cssmin.js rename to tasks/config/cssmin.js diff --git a/backend/tasks/config/jst.js b/tasks/config/jst.js similarity index 100% rename from backend/tasks/config/jst.js rename to tasks/config/jst.js diff --git a/backend/tasks/config/less.js b/tasks/config/less.js similarity index 100% rename from backend/tasks/config/less.js rename to tasks/config/less.js diff --git a/backend/tasks/config/sails-linker.js b/tasks/config/sails-linker.js similarity index 100% rename from backend/tasks/config/sails-linker.js rename to tasks/config/sails-linker.js diff --git a/backend/tasks/config/sass.js b/tasks/config/sass.js similarity index 100% rename from backend/tasks/config/sass.js rename to tasks/config/sass.js diff --git a/backend/tasks/config/sync.js b/tasks/config/sync.js similarity index 100% rename from backend/tasks/config/sync.js rename to tasks/config/sync.js diff --git a/backend/tasks/config/uglify.js b/tasks/config/uglify.js similarity index 91% rename from backend/tasks/config/uglify.js rename to tasks/config/uglify.js index e522ae05d..fefbf974c 100644 --- a/backend/tasks/config/uglify.js +++ b/tasks/config/uglify.js @@ -12,6 +12,9 @@ module.exports = function(grunt) { grunt.config.set('uglify', { + options: { + mangle: false + }, dist: { src: ['.tmp/public/concat/production.js'], dest: '.tmp/public/min/production.min.js' diff --git a/backend/tasks/config/watch.js b/tasks/config/watch.js similarity index 100% rename from backend/tasks/config/watch.js rename to tasks/config/watch.js diff --git a/backend/tasks/pipeline.js b/tasks/pipeline.js similarity index 100% rename from backend/tasks/pipeline.js rename to tasks/pipeline.js diff --git a/backend/tasks/register/build.js b/tasks/register/build.js similarity index 100% rename from backend/tasks/register/build.js rename to tasks/register/build.js diff --git a/backend/tasks/register/buildProd.js b/tasks/register/buildProd.js similarity index 100% rename from backend/tasks/register/buildProd.js rename to tasks/register/buildProd.js diff --git a/backend/tasks/register/compileAssets.js b/tasks/register/compileAssets.js similarity index 100% rename from backend/tasks/register/compileAssets.js rename to tasks/register/compileAssets.js diff --git a/backend/tasks/register/default.js b/tasks/register/default.js similarity index 92% rename from backend/tasks/register/default.js rename to tasks/register/default.js index a981c5270..3e2065086 100644 --- a/backend/tasks/register/default.js +++ b/tasks/register/default.js @@ -22,5 +22,5 @@ * */ module.exports = function (grunt) { - grunt.registerTask('default', ['compileAssets', 'linkAssets', 'watch']); + grunt.registerTask('default', ['compileAssets', 'linkAssetsBuild', 'watch']); }; diff --git a/backend/tasks/register/linkAssets.js b/tasks/register/linkAssets.js similarity index 100% rename from backend/tasks/register/linkAssets.js rename to tasks/register/linkAssets.js diff --git a/backend/tasks/register/linkAssetsBuild.js b/tasks/register/linkAssetsBuild.js similarity index 100% rename from backend/tasks/register/linkAssetsBuild.js rename to tasks/register/linkAssetsBuild.js diff --git a/backend/tasks/register/linkAssetsBuildProd.js b/tasks/register/linkAssetsBuildProd.js similarity index 100% rename from backend/tasks/register/linkAssetsBuildProd.js rename to tasks/register/linkAssetsBuildProd.js diff --git a/backend/tasks/register/prod.js b/tasks/register/prod.js similarity index 73% rename from backend/tasks/register/prod.js rename to tasks/register/prod.js index 379389d12..73528a297 100644 --- a/backend/tasks/register/prod.js +++ b/tasks/register/prod.js @@ -17,11 +17,6 @@ module.exports = function(grunt) { 'concat', 'uglify', 'cssmin', - 'sails-linker:prodJs', - 'sails-linker:prodStyles', - 'sails-linker:devTpl', - 'sails-linker:prodJsJade', - 'sails-linker:prodStylesJade', - 'sails-linker:devTplJade' + 'linkAssetsBuildProd' ]); }; diff --git a/backend/tasks/register/syncAssets.js b/tasks/register/syncAssets.js similarity index 100% rename from backend/tasks/register/syncAssets.js rename to tasks/register/syncAssets.js diff --git a/backend/test/bootstrap.test.js b/test/bootstrap.test.js similarity index 100% rename from backend/test/bootstrap.test.js rename to test/bootstrap.test.js diff --git a/backend/test/fixtures/KongNode.json b/test/fixtures/KongNode.json similarity index 100% rename from backend/test/fixtures/KongNode.json rename to test/fixtures/KongNode.json diff --git a/backend/test/fixtures/Passport.json b/test/fixtures/Passport.json similarity index 100% rename from backend/test/fixtures/Passport.json rename to test/fixtures/Passport.json diff --git a/backend/test/fixtures/User.json b/test/fixtures/User.json similarity index 100% rename from backend/test/fixtures/User.json rename to test/fixtures/User.json diff --git a/backend/test/functional/common/controller.test.js b/test/functional/common/controller.test.js similarity index 100% rename from backend/test/functional/common/controller.test.js rename to test/functional/common/controller.test.js diff --git a/backend/test/functional/controllers/AuthController.test.js b/test/functional/controllers/AuthController.test.js similarity index 100% rename from backend/test/functional/controllers/AuthController.test.js rename to test/functional/controllers/AuthController.test.js diff --git a/backend/test/helpers/README.MD b/test/helpers/README.MD similarity index 100% rename from backend/test/helpers/README.MD rename to test/helpers/README.MD diff --git a/backend/test/helpers/login.js b/test/helpers/login.js similarity index 100% rename from backend/test/helpers/login.js rename to test/helpers/login.js diff --git a/backend/test/mocha.opts b/test/mocha.opts similarity index 100% rename from backend/test/mocha.opts rename to test/mocha.opts diff --git a/backend/views/403.ejs b/views/403.ejs similarity index 100% rename from backend/views/403.ejs rename to views/403.ejs diff --git a/backend/views/404.ejs b/views/404.ejs similarity index 100% rename from backend/views/404.ejs rename to views/404.ejs diff --git a/backend/views/500.ejs b/views/500.ejs similarity index 100% rename from backend/views/500.ejs rename to views/500.ejs diff --git a/backend/views/homepage.ejs b/views/homepage.ejs similarity index 100% rename from backend/views/homepage.ejs rename to views/homepage.ejs diff --git a/views/layout.ejs b/views/layout.ejs new file mode 100644 index 000000000..fe6c8773a --- /dev/null +++ b/views/layout.ejs @@ -0,0 +1,93 @@ + + + + Konga + + + + + + + + + + + + + + + + <%- body %> + + + + + + + + + + + + + + diff --git a/backend/views/splash.ejs b/views/splash.ejs similarity index 100% rename from backend/views/splash.ejs rename to views/splash.ejs