diff --git a/MANIFEST.in b/MANIFEST.in index 6260b87cea..1466361602 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,8 +4,6 @@ recursive-include awx *.mo recursive-include awx/static * recursive-include awx/templates *.html recursive-include awx/api/templates *.md *.html -recursive-include awx/ui/templates *.html -recursive-include awx/ui/static * recursive-include awx/ui_next/build *.html recursive-include awx/ui_next/build * recursive-include awx/playbooks *.yml diff --git a/Makefile b/Makefile index 3f1b6876e7..28e155a64a 100644 --- a/Makefile +++ b/Makefile @@ -56,11 +56,6 @@ WHEEL_COMMAND ?= bdist_wheel SDIST_TAR_FILE ?= $(SDIST_TAR_NAME).tar.gz WHEEL_FILE ?= $(WHEEL_NAME)-py2-none-any.whl -# UI flag files -UI_DEPS_FLAG_FILE = awx/ui/.deps_built -UI_RELEASE_DEPS_FLAG_FILE = awx/ui/.release_deps_built -UI_RELEASE_FLAG_FILE = awx/ui/.release_built - I18N_FLAG_FILE = .i18n_built .PHONY: awx-link clean clean-tmp clean-venv requirements requirements_dev \ @@ -70,22 +65,6 @@ I18N_FLAG_FILE = .i18n_built ui-docker-machine ui-docker ui-release ui-devel \ ui-test ui-deps ui-test-ci VERSION -# remove ui build artifacts -clean-ui: clean-languages - rm -rf awx/ui/static/ - rm -rf awx/ui/node_modules/ - rm -rf awx/ui/test/unit/reports/ - rm -rf awx/ui/test/spec/reports/ - rm -rf awx/ui/test/e2e/reports/ - rm -rf awx/ui/client/languages/ - rm -rf awx/ui_next/node_modules/ - rm -rf node_modules - rm -rf awx/ui_next/coverage/ - rm -rf awx/ui_next/build/locales/_build/ - rm -f $(UI_DEPS_FLAG_FILE) - rm -f $(UI_RELEASE_DEPS_FLAG_FILE) - rm -f $(UI_RELEASE_FLAG_FILE) - clean-tmp: rm -rf tmp/ @@ -480,107 +459,15 @@ else @echo No PO files endif -# generate UI .pot -pot: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run pot - -# generate django .pot .po -LANG = "en-us" -messages: - @if [ "$(VENV_BASE)" ]; then \ - . $(VENV_BASE)/awx/bin/activate; \ - fi; \ - $(PYTHON) manage.py makemessages -l $(LANG) --keep-pot - -# generate l10n .json .mo -languages: $(I18N_FLAG_FILE) - -$(I18N_FLAG_FILE): $(UI_RELEASE_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run languages - $(PYTHON) tools/scripts/compilemessages.py - touch $(I18N_FLAG_FILE) - -# End l10n TASKS -# -------------------------------------- - -# UI RELEASE TASKS -# -------------------------------------- -ui-release: $(UI_RELEASE_FLAG_FILE) - -$(UI_RELEASE_FLAG_FILE): $(I18N_FLAG_FILE) $(UI_RELEASE_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run build-release - touch $(UI_RELEASE_FLAG_FILE) - -$(UI_RELEASE_DEPS_FLAG_FILE): - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 $(NPM_BIN) --unsafe-perm --prefix awx/ui ci --no-save awx/ui - touch $(UI_RELEASE_DEPS_FLAG_FILE) - -# END UI RELEASE TASKS -# -------------------------------------- - -# UI TASKS -# -------------------------------------- -ui-deps: $(UI_DEPS_FLAG_FILE) - -$(UI_DEPS_FLAG_FILE): - @if [ -f ${UI_RELEASE_DEPS_FLAG_FILE} ]; then \ - rm -rf awx/ui/node_modules; \ - rm -f ${UI_RELEASE_DEPS_FLAG_FILE}; \ - fi; \ - $(NPM_BIN) --unsafe-perm --prefix awx/ui ci --no-save awx/ui - touch $(UI_DEPS_FLAG_FILE) - -ui-docker-machine: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run ui-docker-machine -- $(MAKEFLAGS) - -# Native docker. Builds UI and raises BrowserSync & filesystem polling. -ui-docker: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run ui-docker -- $(MAKEFLAGS) - -# Builds UI with development UI without raising browser-sync or filesystem polling. -ui-devel: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run build-devel -- $(MAKEFLAGS) - -ui-test: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run test - -ui-lint: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) run --prefix awx/ui jshint - $(NPM_BIN) run --prefix awx/ui lint - -# A standard go-to target for API developers to use building the frontend -ui: clean-ui ui-devel - -ui-test-ci: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) --prefix awx/ui run test:ci - $(NPM_BIN) --prefix awx/ui run unit - -jshint: $(UI_DEPS_FLAG_FILE) - $(NPM_BIN) run --prefix awx/ui jshint - $(NPM_BIN) run --prefix awx/ui lint - -ui-zuul-lint-and-test: - CHROMIUM_BIN=$(CHROMIUM_BIN) ./awx/ui/build/zuul_download_chromium.sh - CHROMIUM_BIN=$(CHROMIUM_BIN) PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 $(NPM_BIN) --unsafe-perm --prefix awx/ui ci --no-save awx/ui - CHROMIUM_BIN=$(CHROMIUM_BIN) $(NPM_BIN) run --prefix awx/ui jshint - CHROMIUM_BIN=$(CHROMIUM_BIN) $(NPM_BIN) run --prefix awx/ui lint - CHROME_BIN=$(CHROMIUM_BIN) $(NPM_BIN) --prefix awx/ui run test:ci - CHROME_BIN=$(CHROMIUM_BIN) $(NPM_BIN) --prefix awx/ui run unit - -# END UI TASKS -# -------------------------------------- # UI NEXT TASKS # -------------------------------------- - awx/ui_next/node_modules: $(NPM_BIN) --prefix awx/ui_next install -ui-release-next: - mkdir -p awx/ui_next/build/static - touch awx/ui_next/build/static/.placeholder +ui-release: ui-devel -ui-devel-next: awx/ui_next/node_modules +ui-devel: awx/ui_next/node_modules $(NPM_BIN) --prefix awx/ui_next run extract-strings $(NPM_BIN) --prefix awx/ui_next run compile-strings $(NPM_BIN) --prefix awx/ui_next run build @@ -591,20 +478,18 @@ ui-devel-next: awx/ui_next/node_modules cp -r awx/ui_next/build/static/js/* awx/public/static/js cp -r awx/ui_next/build/static/media/* awx/public/static/media -clean-ui-next: +clean-ui: rm -rf node_modules rm -rf awx/ui_next/node_modules rm -rf awx/ui_next/build +ui-zuul-lint-and-test: ui-next-zuul-lint-and-test ui-next-zuul-lint-and-test: $(NPM_BIN) --prefix awx/ui_next install $(NPM_BIN) run --prefix awx/ui_next lint $(NPM_BIN) run --prefix awx/ui_next prettier-check $(NPM_BIN) run --prefix awx/ui_next test -# END UI NEXT TASKS -# -------------------------------------- - # Build a pip-installable package into dist/ with a timestamped version number. dev_build: $(PYTHON) setup.py dev_build @@ -613,10 +498,10 @@ dev_build: release_build: $(PYTHON) setup.py release_build -dist/$(SDIST_TAR_FILE): ui-release ui-release-next VERSION +dist/$(SDIST_TAR_FILE): ui-release VERSION $(PYTHON) setup.py $(SDIST_COMMAND) -dist/$(WHEEL_FILE): ui-release ui-release-next +dist/$(WHEEL_FILE): ui-release-next $(PYTHON) setup.py $(WHEEL_COMMAND) sdist: dist/$(SDIST_TAR_FILE) diff --git a/awx/main/tests/functional/test_licenses.py b/awx/main/tests/functional/test_licenses.py index f3e623d281..757349ee13 100644 --- a/awx/main/tests/functional/test_licenses.py +++ b/awx/main/tests/functional/test_licenses.py @@ -1,6 +1,5 @@ import glob -import json import os from django.conf import settings @@ -65,28 +64,6 @@ def test_python_and_js_licenses(): ret[name] = { 'name': name, 'version': version} return ret - - def read_ui_requirements(path): - def json_deps(jsondata): - ret = {} - deps = jsondata.get('dependencies',{}) - for key in deps.keys(): - key = key.lower() - devonly = deps[key].get('dev',False) - if not devonly: - if key not in ret.keys(): - depname = key.replace('/','-') - ret[depname] = { - 'name': depname, - 'version': deps[key]['version'] - } - ret.update(json_deps(deps[key])) - return ret - - with open('%s/package-lock.json' % path) as f: - jsondata = json.load(f) - return json_deps(jsondata) - def remediate_licenses_and_requirements(licenses, requirements): errors = [] items = list(licenses.keys()) @@ -113,12 +90,9 @@ def test_python_and_js_licenses(): base_dir = settings.BASE_DIR api_licenses = index_licenses('%s/../docs/licenses' % base_dir) - ui_licenses = index_licenses('%s/../docs/licenses/ui' % base_dir) api_requirements = read_api_requirements('%s/../requirements' % base_dir) - ui_requirements = read_ui_requirements('%s/ui' % base_dir) errors = [] - errors += remediate_licenses_and_requirements(ui_licenses, ui_requirements) errors += remediate_licenses_and_requirements(api_licenses, api_requirements) if errors: raise Exception('Included licenses not consistent with requirements:\n%s' % diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 618f5282a4..6204486456 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -91,7 +91,6 @@ USE_L10N = True USE_TZ = True STATICFILES_DIRS = ( - os.path.join(BASE_DIR, 'ui', 'static'), os.path.join(BASE_DIR, 'ui_next', 'build', 'static'), os.path.join(BASE_DIR, 'static'), ) @@ -249,8 +248,6 @@ TEMPLATES = [ 'django.template.context_processors.static', 'django.template.context_processors.tz', 'django.contrib.messages.context_processors.messages', - 'awx.ui.context_processors.settings', - 'awx.ui.context_processors.version', 'social_django.context_processors.backends', 'social_django.context_processors.login_redirect', ], diff --git a/awx/ui/.eslintignore b/awx/ui/.eslintignore deleted file mode 100644 index f1daf7c9ab..0000000000 --- a/awx/ui/.eslintignore +++ /dev/null @@ -1,19 +0,0 @@ -Gruntfile.js -karma.*.js -webpack.*.js -nightwatch.*.js - -etc -coverage -grunt-tasks -node_modules -po -static -templates - -client/src/**/*.js -client/assets/**/*.js -test/spec/**/*.js - -!client/src/app.start.js -!client/src/vendor.js diff --git a/awx/ui/.eslintrc.js b/awx/ui/.eslintrc.js deleted file mode 100644 index 27759bf2b9..0000000000 --- a/awx/ui/.eslintrc.js +++ /dev/null @@ -1,72 +0,0 @@ -const path = require('path'); - -module.exports = { - root: true, - extends: [ - 'airbnb-base' - ], - plugins: [ - 'import', - 'disable' - ], - settings: { - 'import/resolver': { - webpack: { - config: path.join(__dirname, 'build/webpack.development.js') - } - }, - 'eslint-plugin-disable': { - paths: { - import: ['**/build/*.js'] - } - } - }, - env: { - browser: true, - node: true - }, - globals: { - angular: true, - d3: true, - $: true, - _: true, - codemirror: true, - jsyaml: true, - crypto: true - }, - rules: { - 'arrow-parens': 'off', - 'comma-dangle': 'off', - indent: ['error', 4, { - SwitchCase: 1 - }], - 'max-len': ['error', { - code: 100, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }], - 'no-continue': 'off', - 'no-debugger': 'off', - 'no-mixed-operators': 'off', - 'no-param-reassign': 'off', - 'no-plusplus': 'off', - 'no-underscore-dangle': 'off', - 'no-use-before-define': 'off', - 'no-multiple-empty-lines': ['error', { max: 1 }], - 'object-curly-newline': 'off', - 'space-before-function-paren': ['error', 'always'], - 'no-trailing-spaces': ['error'], - 'prefer-destructuring': ['error', { - 'VariableDeclarator': { - 'array': false, - 'object': true - }, - 'AssignmentExpression': { - 'array': false, - 'object': true - } - }, { - 'enforceForRenamedProperties': false - }] - } -}; diff --git a/awx/ui/.jshintrc b/awx/ui/.jshintrc deleted file mode 100644 index 363d2e5ba8..0000000000 --- a/awx/ui/.jshintrc +++ /dev/null @@ -1,49 +0,0 @@ -{ - "browser": true, - "node": true, - "jquery": true, - "esnext": true, - "globalstrict": true, - "curly": true, - "immed": true, - "latedef": "nofunc", - "noarg": true, - "nonew": true, - "maxerr": 10000, - "notypeof": true, - "globals": { - "$ENV": true, - "require": true, - "global": true, - "beforeEach": false, - "inject": false, - "module": false, - "angular":false, - "alert":false, - "$AnsibleConfig":true, - "$basePath":true, - "jsyaml":false, - "_":false, - "d3":false, - "Donut3D":false, - "nv":false, - "it": false, - "xit": false, - "expect": false, - "context": false, - "describe": false, - "moment": false, - "spyOn": false, - "jasmine": false, - "dagre": false, - "crypto": false - }, - "strict": false, - "quotmark": false, - "trailing": true, - "undef": true, - "unused": true, - "eqeqeq": true, - "indent": 4, - "newcap": false -} diff --git a/awx/ui/.npmrc b/awx/ui/.npmrc deleted file mode 100644 index d883e4fa13..0000000000 --- a/awx/ui/.npmrc +++ /dev/null @@ -1 +0,0 @@ -progress=false diff --git a/awx/ui/Gruntfile.js b/awx/ui/Gruntfile.js deleted file mode 100644 index f688925708..0000000000 --- a/awx/ui/Gruntfile.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = function(grunt) { - // Load grunt tasks & configurations automatically from dir grunt/ - require('load-grunt-tasks')(grunt); - // display task timings - require('time-grunt')(grunt); - - var options = { - config: { - src: './grunt-tasks/*.js' - }, - pkg: grunt.file.readJSON('package.json') - }; - - var configs = require('load-grunt-configs')(grunt, options); - - // Project configuration. - grunt.initConfig(configs); - grunt.loadNpmTasks('grunt-newer'); - grunt.loadNpmTasks('grunt-angular-gettext'); -}; diff --git a/awx/ui/README.md b/awx/ui/README.md deleted file mode 100644 index 4627012162..0000000000 --- a/awx/ui/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# AWX UI - -## Requirements -- node.js 10.x LTS -- npm >=6.x -- bzip2, gcc-c++, git, make - -## Development -The API development server will need to be running. See [CONTRIBUTING.md](../../CONTRIBUTING.md). - -```shell -# Build ui for the devel environment - reachable at https://localhost:8043 -make ui-devel - -# Alternatively, start the ui development server. While running, the ui will be reachable -# at https://localhost:3000 and updated automatically when code changes. -make ui-docker - -# When using docker machine, use this command to start the ui development server instead. -DOCKER_MACHINE_NAME=default make ui-docker-machine -``` - -## Development with an external server -If you normally run awx on an external host/server (in this example, `awx.local`), -you'll need to reconfigure the webpack proxy slightly for `make ui-docker` to -work: - -```javascript -/awx/settings/development.py -+ -+CSRF_TRUSTED_ORIGINS = ['awx.local:8043'] - -awx/ui/build/webpack.watch.js -- host: '127.0.0.1', -+ host: '0.0.0.0', -+ disableHostCheck: true, - -/awx/ui/package.json -@@ -7,7 +7,7 @@ - "config": { - ... -+ "django_host": "awx.local" - }, -``` - -## Testing -```shell -# run linters -make jshint - -# run unit tests -make ui-test-ci - -# run e2e tests - see awx/ui/test/e2e for more information -npm --prefix awx/ui run e2e -``` -**Note**: Unit tests are run on your host machine and not in the development containers. - -## Adding dependencies -```shell -# add an exact development or build dependency -npm install --prefix awx/ui --save-dev --save-exact dev-package@1.2.3 - -# add an exact production dependency -npm install --prefix awx/ui --save --save-exact prod-package@1.23 - -# add the updated package.json and package-lock.json files to scm -git add awx/ui/package.json awx/ui/package-lock.json -``` - -## Removing dependencies -```shell -# remove a development or build dependency -npm uninstall --prefix awx/ui --save-dev dev-package - -# remove a production dependency -npm uninstall --prefix awx/ui --save prod-package -``` - -## Building for Production -```shell -# built files are placed in awx/ui/static -make ui-release -``` - -## Internationalization -Application strings marked for translation are extracted and used to generate `.pot` files using the following command: -```shell -# extract strings and generate .pot files -make pot -``` -To include the translations in the development environment, we compile them prior to building the ui: -```shell -# remove any prior ui builds -make clean-ui - -# compile the .pot files to javascript files usable by the application -make languages - -# build the ui with translations included -make ui-devel -``` -**Note**: Python 3.6 is required to compile the `.pot` files. diff --git a/awx/ui/__init__.py b/awx/ui/__init__.py index ac6a554356..bfb3e776cd 100644 --- a/awx/ui/__init__.py +++ b/awx/ui/__init__.py @@ -2,3 +2,4 @@ # All Rights Reserved. default_app_config = 'awx.ui.apps.UIConfig' + diff --git a/awx/ui/apps.py b/awx/ui/apps.py index 40943c6f53..5b8e5083c1 100644 --- a/awx/ui/apps.py +++ b/awx/ui/apps.py @@ -7,3 +7,4 @@ class UIConfig(AppConfig): name = 'awx.ui' verbose_name = _('UI') + diff --git a/awx/ui/build/webpack.base.js b/awx/ui/build/webpack.base.js deleted file mode 100644 index f1e5ac8e0b..0000000000 --- a/awx/ui/build/webpack.base.js +++ /dev/null @@ -1,235 +0,0 @@ -const path = require('path'); - -const webpack = require('webpack'); -const CleanWebpackPlugin = require('clean-webpack-plugin'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const ExtractTextPlugin = require('extract-text-webpack-plugin'); - -const CLIENT_PATH = path.resolve(__dirname, '../client'); -const LIB_PATH = path.join(CLIENT_PATH, 'lib'); -const UI_PATH = path.resolve(__dirname, '..'); - -const ASSETS_PATH = path.join(CLIENT_PATH, 'assets'); -const COMPONENTS_PATH = path.join(LIB_PATH, 'components'); -const COVERAGE_PATH = path.join(UI_PATH, 'coverage'); -const FEATURES_PATH = path.join(CLIENT_PATH, 'features'); -const LANGUAGES_PATH = path.join(CLIENT_PATH, 'languages'); -const MODELS_PATH = path.join(LIB_PATH, 'models'); -const NODE_MODULES_PATH = path.join(UI_PATH, 'node_modules'); -const SERVICES_PATH = path.join(LIB_PATH, 'services'); -const SRC_PATH = path.join(CLIENT_PATH, 'src'); -const STATIC_PATH = path.join(UI_PATH, 'static'); -const TEST_PATH = path.join(UI_PATH, 'test'); -const THEME_PATH = path.join(LIB_PATH, 'theme'); - -const APP_ENTRY = path.join(SRC_PATH, 'app.js'); -const VENDOR_ENTRY = path.join(SRC_PATH, 'vendor.js'); -const INDEX_ENTRY = path.join(CLIENT_PATH, 'index.template.ejs'); -const INDEX_OUTPUT = path.join(UI_PATH, 'templates/ui/index.html'); -const INSTALL_RUNNING_ENTRY = path.join(CLIENT_PATH, 'installing.template.ejs'); -const INSTALL_RUNNING_OUTPUT = path.join(UI_PATH, 'templates/ui/installing.html'); -const THEME_ENTRY = path.join(LIB_PATH, 'theme', 'index.less'); -const OUTPUT = 'js/[name].[chunkhash].js'; -const CHUNKS = ['vendor', 'app']; - -const VENDOR = VENDOR_ENTRY; -const APP = [THEME_ENTRY, APP_ENTRY]; - -const base = { - entry: { - vendor: VENDOR, - app: APP - }, - output: { - path: STATIC_PATH, - publicPath: '', - filename: OUTPUT - }, - stats: { - children: false, - modules: false, - chunks: false, - excludeAssets: name => { - const chunkNames = `(${CHUNKS.join('|')})`; - const outputPattern = new RegExp(`${chunkNames}.[a-f0-9]+.(js|css)(|.map)$`, 'i'); - - return !outputPattern.test(name); - } - }, - module: { - rules: [ - { - test: /\.js$/, - use: { - loader: 'istanbul-instrumenter-loader', - options: { esModules: true } - }, - enforce: 'pre', - include: [ - /src\/network-ui\// - ] - }, - { - test: /\.js$/, - loader: 'babel-loader', - exclude: /node_modules/, - options: { - presets: [ - ['env', { - targets: { - browsers: ['last 2 versions'] - } - }] - ] - } - }, - { - test: /\.css$/, - use: ExtractTextPlugin.extract({ - use: { - loader: 'css-loader', - options: { - url: false - } - } - }) - }, - { - test: /lib\/theme\/index.less$/, - use: ExtractTextPlugin.extract({ - use: ['css-loader', 'less-loader'] - }) - }, - { - test: /\.html$/, - use: ['ngtemplate-loader', 'html-loader'], - include: [ - /lib\/components\//, - /features\//, - /src\// - ] - }, - { - test: /\.svg$/, - use: ['ngtemplate-loader', 'html-loader'], - include: [ - /lib\/components\//, - /features\//, - /src\// - ] - }, - { - test: /\.json$/, - loader: 'json-loader', - exclude: /node_modules/ - } - ] - }, - plugins: [ - new webpack.ProvidePlugin({ - jsyaml: 'js-yaml', - CodeMirror: 'codemirror', - jsonlint: 'codemirror.jsonlint' - }), - new ExtractTextPlugin('css/[name].[chunkhash].css'), - new CleanWebpackPlugin([STATIC_PATH, COVERAGE_PATH], { - root: UI_PATH, - verbose: false - }), - new CopyWebpackPlugin([ - { - from: path.join(ASSETS_PATH, 'fontcustom/**/*'), - to: path.join(STATIC_PATH, 'fonts/'), - flatten: true - }, - { - from: path.join(NODE_MODULES_PATH, 'components-font-awesome/fonts/*'), - to: path.join(STATIC_PATH, 'fonts/'), - flatten: true - }, - { - from: path.join(ASSETS_PATH, 'custom-theme/images.new/*'), - to: path.join(STATIC_PATH, 'images/'), - flatten: true - }, - { - from: path.join(LANGUAGES_PATH, '*'), - to: path.join(STATIC_PATH, 'languages'), - flatten: true - }, - { - from: ASSETS_PATH, - to: path.join(STATIC_PATH, 'assets') - }, - { - from: path.join(NODE_MODULES_PATH, 'angular-scheduler/lib/*.html'), - to: path.join(STATIC_PATH, 'lib'), - context: NODE_MODULES_PATH - }, - { - from: path.join(NODE_MODULES_PATH, 'angular-tz-extensions/tz/data/*'), - to: path.join(STATIC_PATH, 'lib/'), - context: NODE_MODULES_PATH - }, - { - from: path.join(SRC_PATH, '**/*.partial.html'), - to: path.join(STATIC_PATH, 'partials/'), - context: SRC_PATH - }, - { - from: path.join(SRC_PATH, 'partials', '*.html'), - to: STATIC_PATH, - context: SRC_PATH - }, - { - from: path.join(SRC_PATH, '*config.js'), - to: STATIC_PATH, - flatten: true - } - ]), - new HtmlWebpackPlugin({ - alwaysWriteToDisk: true, - template: INDEX_ENTRY, - filename: INDEX_OUTPUT, - inject: false, - chunks: CHUNKS, - chunksSortMode: chunk => (chunk.names[0] === 'vendor' ? -1 : 1) - }), - new HtmlWebpackPlugin({ - alwaysWriteToDisk: true, - template: INSTALL_RUNNING_ENTRY, - filename: INSTALL_RUNNING_OUTPUT, - inject: false, - chunks: CHUNKS, - chunksSortMode: chunk => (chunk.names[0] === 'vendor' ? -1 : 1) - }), - ], - resolve: { - alias: { - '~assets': ASSETS_PATH, - '~components': COMPONENTS_PATH, - '~features': FEATURES_PATH, - '~models': MODELS_PATH, - '~node_modules': NODE_MODULES_PATH, - '~services': SERVICES_PATH, - '~src': SRC_PATH, - '~test': TEST_PATH, - '~theme': THEME_PATH, - '~ui': UI_PATH, - d3$: '~node_modules/d3/d3.min.js', - 'codemirror.jsonlint$': '~node_modules/codemirror/addon/lint/json-lint.js', - jquery: '~node_modules/jquery/dist/jquery.js', - 'jquery-resize$': '~node_modules/javascript-detect-element-resize/jquery.resize.js', - select2$: '~node_modules/select2/dist/js/select2.full.min.js', - 'js-yaml$': '~node_modules/js-yaml/dist/js-yaml.min.js', - 'lr-infinite-scroll$': '~node_modules/lr-infinite-scroll/lrInfiniteScroll.js', - 'angular-tz-extensions$': '~node_modules/angular-tz-extensions/lib/angular-tz-extensions.js', - 'ng-toast-provider$': '~node_modules/ng-toast/src/scripts/provider.js', - 'ng-toast-directives$': '~node_modules/ng-toast/src/scripts/directives.js', - 'ng-toast$': '~node_modules/ng-toast/src/scripts/module.js' - } - } -}; - -module.exports = base; diff --git a/awx/ui/build/webpack.development.js b/awx/ui/build/webpack.development.js deleted file mode 100644 index 56e2d90b51..0000000000 --- a/awx/ui/build/webpack.development.js +++ /dev/null @@ -1,9 +0,0 @@ -const merge = require('webpack-merge'); - -const base = require('./webpack.base'); - -const development = { - devtool: 'source-map' -}; - -module.exports = merge(base, development); diff --git a/awx/ui/build/webpack.production.js b/awx/ui/build/webpack.production.js deleted file mode 100644 index 4f57e23cc3..0000000000 --- a/awx/ui/build/webpack.production.js +++ /dev/null @@ -1,28 +0,0 @@ -const path = require('path'); - -const merge = require('webpack-merge'); -const webpack = require('webpack'); -const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -const base = require('./webpack.base'); - -const CLIENT_PATH = path.resolve(__dirname, '../client'); -const UI_PATH = path.resolve(__dirname, '..'); -const CHUNKS = ['vendor', 'app']; - -const production = { - plugins: [ - new UglifyJSPlugin({ - compress: true, - mangle: false - }), - new webpack.DefinePlugin({ - 'process.env': { - NODE_ENV: JSON.stringify('production') - } - }) - ] -}; - -module.exports = merge(base, production); diff --git a/awx/ui/build/webpack.test.js b/awx/ui/build/webpack.test.js deleted file mode 100644 index 8fb4e4e1c7..0000000000 --- a/awx/ui/build/webpack.test.js +++ /dev/null @@ -1,20 +0,0 @@ -const _ = require('lodash'); -const webpack = require('webpack'); - -const STATIC_URL = '/static/'; - -const development = require('./webpack.base'); - -const test = { - devtool: 'cheap-source-map', - plugins: [ - new webpack.DefinePlugin({ - $basePath: STATIC_URL - }) - ] -}; - -test.plugins = development.plugins.concat(test.plugins); - -module.exports = _.merge(development, test); - diff --git a/awx/ui/build/webpack.watch.js b/awx/ui/build/webpack.watch.js deleted file mode 100644 index 143058077a..0000000000 --- a/awx/ui/build/webpack.watch.js +++ /dev/null @@ -1,84 +0,0 @@ -const path = require('path'); - -const _ = require('lodash'); -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const nodeObjectHash = require('node-object-hash'); -const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); -const HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin'); - -const TARGET_PORT = _.get(process.env, 'npm_package_config_django_port', 8043); -const TARGET_HOST = _.get(process.env, 'npm_package_config_django_host', 'https://localhost'); -const TARGET = `https://${TARGET_HOST}:${TARGET_PORT}`; -const OUTPUT = 'js/[name].js'; - -const development = require('./webpack.development'); - -const watch = { - cache: true, - devtool: 'cheap-source-map', - output: { - filename: OUTPUT - }, - module: { - rules: [ - { - test: /\.js$/, - enforce: 'pre', - exclude: /node_modules/, - loader: 'eslint-loader' - } - ] - }, - plugins: [ - new HtmlWebpackHarddiskPlugin(), - new HardSourceWebpackPlugin({ - cacheDirectory: 'node_modules/.cache/hard-source/[confighash]', - recordsPath: 'node_modules/.cache/hard-source/[confighash]/records.json', - configHash: config => nodeObjectHash({ sort: false }).hash(config), - environmentHash: { - root: process.cwd(), - directories: ['node_modules'], - files: ['package.json'] - } - }), - new webpack.HotModuleReplacementPlugin() - ], - devServer: { - hot: true, - inline: true, - contentBase: path.resolve(__dirname, '..', 'static'), - stats: 'minimal', - publicPath: '/static/', - host: '127.0.0.1', - https: true, - port: 3000, - clientLogLevel: 'none', - proxy: [{ - context: (pathname, req) => !(pathname === '/api/login/' && req.method === 'POST'), - target: TARGET, - secure: false, - ws: false, - bypass: req => req.originalUrl.includes('hot-update.json') - }, - { - context: '/api/login/', - target: TARGET, - secure: false, - ws: false, - headers: { - Host: `localhost:${TARGET_PORT}`, - Origin: TARGET, - Referer: `${TARGET}/` - } - }, - { - context: '/websocket', - target: TARGET, - secure: false, - ws: true - }] - } -}; - -module.exports = merge(development, watch); diff --git a/awx/ui/build/zuul_download_chromium.sh b/awx/ui/build/zuul_download_chromium.sh deleted file mode 100755 index 23311d2131..0000000000 --- a/awx/ui/build/zuul_download_chromium.sh +++ /dev/null @@ -1,5 +0,0 @@ -REVISION=588429 -CHROMIUM_URL="https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/${REVISION}/chrome-linux.zip" - -wget ${CHROMIUM_URL} -w 30 -t 6 -O /tmp/chrome-linux.zip -unzip -o -d /tmp /tmp/chrome-linux.zip diff --git a/awx/ui/client/assets/LICENSE.txt b/awx/ui/client/assets/LICENSE.txt deleted file mode 100644 index d645695673..0000000000 --- a/awx/ui/client/assets/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/awx/ui/client/assets/OpenSans-Bold.ttf b/awx/ui/client/assets/OpenSans-Bold.ttf deleted file mode 100644 index fd79d43bea..0000000000 Binary files a/awx/ui/client/assets/OpenSans-Bold.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-BoldItalic.ttf b/awx/ui/client/assets/OpenSans-BoldItalic.ttf deleted file mode 100644 index 9bc800958a..0000000000 Binary files a/awx/ui/client/assets/OpenSans-BoldItalic.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-ExtraBold.ttf b/awx/ui/client/assets/OpenSans-ExtraBold.ttf deleted file mode 100644 index 21f6f84a07..0000000000 Binary files a/awx/ui/client/assets/OpenSans-ExtraBold.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-ExtraBoldItalic.ttf b/awx/ui/client/assets/OpenSans-ExtraBoldItalic.ttf deleted file mode 100644 index 31cb688340..0000000000 Binary files a/awx/ui/client/assets/OpenSans-ExtraBoldItalic.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-Italic.ttf b/awx/ui/client/assets/OpenSans-Italic.ttf deleted file mode 100644 index c90da48ff3..0000000000 Binary files a/awx/ui/client/assets/OpenSans-Italic.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-Light.ttf b/awx/ui/client/assets/OpenSans-Light.ttf deleted file mode 100644 index 0d381897da..0000000000 Binary files a/awx/ui/client/assets/OpenSans-Light.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-LightItalic.ttf b/awx/ui/client/assets/OpenSans-LightItalic.ttf deleted file mode 100644 index 68299c4bc6..0000000000 Binary files a/awx/ui/client/assets/OpenSans-LightItalic.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-Regular.ttf b/awx/ui/client/assets/OpenSans-Regular.ttf deleted file mode 100644 index db433349b7..0000000000 Binary files a/awx/ui/client/assets/OpenSans-Regular.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-Semibold.ttf b/awx/ui/client/assets/OpenSans-Semibold.ttf deleted file mode 100644 index 1a7679e394..0000000000 Binary files a/awx/ui/client/assets/OpenSans-Semibold.ttf and /dev/null differ diff --git a/awx/ui/client/assets/OpenSans-SemiboldItalic.ttf b/awx/ui/client/assets/OpenSans-SemiboldItalic.ttf deleted file mode 100644 index 59b6d16b06..0000000000 Binary files a/awx/ui/client/assets/OpenSans-SemiboldItalic.ttf and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/animated-overlay.gif b/awx/ui/client/assets/custom-theme/images.new/animated-overlay.gif deleted file mode 100644 index d441f75ebf..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/animated-overlay.gif and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_0_aaaaaa_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index e1a114b4e2..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_3276b1_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_3276b1_40x100.png deleted file mode 100644 index 3199c1d479..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_3276b1_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_428bca_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_428bca_40x100.png deleted file mode 100644 index 38940fe30d..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_428bca_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_ffffff_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_ffffff_40x100.png deleted file mode 100644 index 708e95ddc0..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_100_ffffff_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_50_ffffff_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_50_ffffff_40x100.png deleted file mode 100644 index cfaa03e8dd..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_50_ffffff_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_55_fbec88_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_55_fbec88_40x100.png deleted file mode 100644 index cb1dbf2936..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_55_fbec88_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_75_e5e3e3_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_75_e5e3e3_40x100.png deleted file mode 100644 index 9d8b67a2e2..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_75_e5e3e3_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_75_ffffff_40x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index 399d1ba7dd..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_55_fbf9ee_1x400.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index 9267153440..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_75_d4d0d0_1x400.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_75_d4d0d0_1x400.png deleted file mode 100644 index f456416e01..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_75_d4d0d0_1x400.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_85_f5f5f5_1x400.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_85_f5f5f5_1x400.png deleted file mode 100644 index d69f282bee..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_85_f5f5f5_1x400.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_95_fef1ec_1x400.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_95_fef1ec_1x400.png deleted file mode 100644 index be40bcf3c3..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_gloss-wave_50_f5f5f5_500x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_gloss-wave_50_f5f5f5_500x100.png deleted file mode 100644 index e73bbb88df..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_gloss-wave_50_f5f5f5_500x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glow-ball_100_fff_600x600.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_glow-ball_100_fff_600x600.png deleted file mode 100644 index b170873d1f..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_glow-ball_100_fff_600x600.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_inset-hard_100_f5f5f5_1x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_inset-hard_100_f5f5f5_1x100.png deleted file mode 100644 index 2ffa648549..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_inset-hard_100_f5f5f5_1x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-bg_inset-hard_100_fcfdfd_1x100.png b/awx/ui/client/assets/custom-theme/images.new/ui-bg_inset-hard_100_fcfdfd_1x100.png deleted file mode 100644 index 534a864605..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-bg_inset-hard_100_fcfdfd_1x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_0088cc_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_0088cc_256x240.png deleted file mode 100644 index 5018f318bc..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_0088cc_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_1778c3_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_1778c3_256x240.png deleted file mode 100644 index cbf7bc13a3..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_1778c3_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_217bc0_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_217bc0_256x240.png deleted file mode 100644 index 8d2b7e5704..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_217bc0_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_2e83ff_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 84b601bf0f..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_2e83ff_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_36454F_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_36454F_256x240.png deleted file mode 100644 index 28a8127a65..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_36454F_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_469bdd_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_469bdd_256x240.png deleted file mode 100644 index 5dff3f962c..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_469bdd_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_6da8d5_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_6da8d5_256x240.png deleted file mode 100644 index f7809f8566..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_6da8d5_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_cd0a0a_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index ed5b6b0930..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_cd0a0a_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_d8e7f3_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_d8e7f3_256x240.png deleted file mode 100644 index 9b46228fb1..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_d8e7f3_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images.new/ui-icons_fff_256x240.png b/awx/ui/client/assets/custom-theme/images.new/ui-icons_fff_256x240.png deleted file mode 100644 index 4f624bb2b1..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images.new/ui-icons_fff_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/animated-overlay.gif b/awx/ui/client/assets/custom-theme/images/animated-overlay.gif deleted file mode 100644 index d441f75ebf..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/animated-overlay.gif and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_0_aaaaaa_40x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 8b3239ca8f..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_100_ffffff_40x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_flat_100_ffffff_40x100.png deleted file mode 100644 index 708e95ddc0..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_100_ffffff_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_50_ffffff_40x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_flat_50_ffffff_40x100.png deleted file mode 100644 index cfaa03e8dd..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_50_ffffff_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_55_fbec88_40x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_flat_55_fbec88_40x100.png deleted file mode 100644 index cb1dbf2936..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_55_fbec88_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_75_e5e3e3_40x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_flat_75_e5e3e3_40x100.png deleted file mode 100644 index 9d8b67a2e2..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_flat_75_e5e3e3_40x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_glass_75_d4d0d0_1x400.png b/awx/ui/client/assets/custom-theme/images/ui-bg_glass_75_d4d0d0_1x400.png deleted file mode 100644 index f456416e01..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_glass_75_d4d0d0_1x400.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_glass_85_f5f5f5_1x400.png b/awx/ui/client/assets/custom-theme/images/ui-bg_glass_85_f5f5f5_1x400.png deleted file mode 100644 index d69f282bee..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_glass_85_f5f5f5_1x400.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_glass_95_fef1ec_1x400.png b/awx/ui/client/assets/custom-theme/images/ui-bg_glass_95_fef1ec_1x400.png deleted file mode 100644 index fa5b93c019..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_gloss-wave_50_f5f5f5_500x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_gloss-wave_50_f5f5f5_500x100.png deleted file mode 100644 index e73bbb88df..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_gloss-wave_50_f5f5f5_500x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_inset-hard_100_f5f5f5_1x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_inset-hard_100_f5f5f5_1x100.png deleted file mode 100644 index 2ffa648549..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_inset-hard_100_f5f5f5_1x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/awx/ui/client/assets/custom-theme/images/ui-bg_inset-hard_100_fcfdfd_1x100.png deleted file mode 100644 index 534a864605..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-bg_inset-hard_100_fcfdfd_1x100.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_0088cc_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_0088cc_256x240.png deleted file mode 100644 index 5018f318bc..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_0088cc_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_217bc0_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_217bc0_256x240.png deleted file mode 100644 index 8d2b7e5704..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_217bc0_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_2e83ff_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 84b601bf0f..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_2e83ff_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_36454F_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_36454F_256x240.png deleted file mode 100644 index 28a8127a65..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_36454F_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_469bdd_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_469bdd_256x240.png deleted file mode 100644 index 5dff3f962c..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_469bdd_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_6da8d5_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_6da8d5_256x240.png deleted file mode 100644 index f7809f8566..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_6da8d5_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_cd0a0a_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index ed5b6b0930..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_cd0a0a_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/images/ui-icons_d8e7f3_256x240.png b/awx/ui/client/assets/custom-theme/images/ui-icons_d8e7f3_256x240.png deleted file mode 100644 index 9b46228fb1..0000000000 Binary files a/awx/ui/client/assets/custom-theme/images/ui-icons_d8e7f3_256x240.png and /dev/null differ diff --git a/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.css b/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.css deleted file mode 100644 index 31f7a97f99..0000000000 --- a/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.css +++ /dev/null @@ -1,1183 +0,0 @@ -/*! jQuery UI - v1.10.3 - 2013-06-26 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=normal&fsDefault=14px&cornerRadius=5px&bgColorHeader=%23ffffff&bgTextureHeader=flat&bgImgOpacityHeader=50&borderColorHeader=%23a6c9e2&fcHeader=%2336454F&iconColorHeader=%2336454F&bgColorContent=%23fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=%23a6c9e2&fcContent=%23222222&iconColorContent=%23469bdd&bgColorDefault=%23ffffff&bgTextureDefault=flat&bgImgOpacityDefault=100&borderColorDefault=%23a6c9e2&fcDefault=%230088cc&iconColorDefault=%230088cc&bgColorHover=%23e5e3e3&bgTextureHover=flat&bgImgOpacityHover=75&borderColorHover=%23e3e3e3&fcHover=%23005580&iconColorHover=%23217bc0&bgColorActive=%23f5f5f5&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=%23e3e3e3&fcActive=%2336454F&iconColorActive=%2336454F&bgColorHighlight=%23fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=%23fad42e&fcHighlight=%23363636&iconColorHighlight=%232e83ff&bgColorError=%23fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=%23cd0a0a&fcError=%23cd0a0a&iconColorError=%23cd0a0a&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before, -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - clear: both; -} -.ui-helper-clearfix { - min-height: 0; /* support: IE7 */ -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - left: 0; - position: absolute; - opacity: 0; - filter:Alpha(Opacity=0); -} - -.ui-front { - z-index: 100; -} - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { - cursor: default !important; -} - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; -} - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; -} -.ui-resizable-disabled .ui-resizable-handle, -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0; -} -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} -.ui-selectable-helper { - position: absolute; - z-index: 100; - border: 1px dotted black; -} -.ui-accordion .ui-accordion-header { - display: block; - cursor: pointer; - position: relative; - margin-top: 2px; - padding: .5em .5em .5em .7em; - min-height: 0; /* support: IE7 */ -} - -.ui-accordion-header { - font-weight: bold; -} - -.ui-accordion .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-noicons { - padding-left: .7em; -} -.ui-accordion .ui-accordion-icons .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-header .ui-accordion-header-icon { - position: absolute; - left: .5em; - top: 50%; - margin-top: -8px; -} -.ui-accordion .ui-accordion-content { - padding: 1em 2.2em; - border-top: 0; - overflow: auto; -} -.ui-autocomplete { - position: absolute; - top: 0; - left: 0; - cursor: default; -} -.ui-button { - display: inline-block; - position: relative; - padding: 0; - line-height: normal; - margin-right: .1em; - cursor: pointer; - vertical-align: middle; - text-align: center; - overflow: visible; /* removes extra width in IE */ -} -.ui-button, -.ui-button:link, -.ui-button:visited, -.ui-button:hover, -.ui-button:active { - text-decoration: none; -} -/* to make room for the icon, a width needs to be set here */ -.ui-button-icon-only { - width: 2.2em; -} -/* button elements seem to need a little more width */ -button.ui-button-icon-only { - width: 2.4em; -} -.ui-button-icons-only { - width: 3.4em; -} -button.ui-button-icons-only { - width: 3.7em; -} - -/* button text element */ -.ui-button .ui-button-text { - display: block; - line-height: normal; -} -.ui-button-text-only .ui-button-text { - padding: .4em 1em; -} -.ui-button-icon-only .ui-button-text, -.ui-button-icons-only .ui-button-text { - padding: .4em; - text-indent: -9999999px; -} -.ui-button-text-icon-primary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 1em .4em 2.1em; -} -.ui-button-text-icon-secondary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 2.1em .4em 1em; -} -.ui-button-text-icons .ui-button-text { - padding-left: 2.1em; - padding-right: 2.1em; -} -/* no icon support for input elements, provide padding by default */ -input.ui-button { - padding: .4em 1em; -} - -/* button icon element(s) */ -.ui-button-icon-only .ui-icon, -.ui-button-text-icon-primary .ui-icon, -.ui-button-text-icon-secondary .ui-icon, -.ui-button-text-icons .ui-icon, -.ui-button-icons-only .ui-icon { - position: absolute; - top: 50%; - margin-top: -8px; -} -.ui-button-icon-only .ui-icon { - left: 50%; - margin-left: -8px; -} -.ui-button-text-icon-primary .ui-button-icon-primary, -.ui-button-text-icons .ui-button-icon-primary, -.ui-button-icons-only .ui-button-icon-primary { - left: .5em; -} -.ui-button-text-icon-secondary .ui-button-icon-secondary, -.ui-button-text-icons .ui-button-icon-secondary, -.ui-button-icons-only .ui-button-icon-secondary { - right: .5em; -} - -/* button sets */ -.ui-buttonset { - margin-right: 7px; -} -.ui-buttonset .ui-button { - margin-left: 0; - margin-right: -.3em; -} - -/* workarounds */ -/* reset extra padding in Firefox, see h5bp.com/l */ -input.ui-button::-moz-focus-inner, -button.ui-button::-moz-focus-inner { - border: 0; - padding: 0; -} -.ui-datepicker { - width: 17em; - padding: .2em .2em 0; - display: none; -} -.ui-datepicker .ui-datepicker-header { - position: relative; - padding: .2em 0; -} -.ui-datepicker .ui-datepicker-prev, -.ui-datepicker .ui-datepicker-next { - position: absolute; - top: 2px; - width: 1.8em; - height: 1.8em; -} -.ui-datepicker .ui-datepicker-prev-hover, -.ui-datepicker .ui-datepicker-next-hover { - top: 1px; -} -.ui-datepicker .ui-datepicker-prev { - left: 2px; -} -.ui-datepicker .ui-datepicker-next { - right: 2px; -} -.ui-datepicker .ui-datepicker-prev-hover { - left: 1px; -} -.ui-datepicker .ui-datepicker-next-hover { - right: 1px; -} -.ui-datepicker .ui-datepicker-prev span, -.ui-datepicker .ui-datepicker-next span { - display: block; - position: absolute; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.ui-datepicker .ui-datepicker-title { - margin: 0 2.3em; - line-height: 1.8em; - text-align: center; -} -.ui-datepicker .ui-datepicker-title select { - font-size: 1em; - margin: 1px 0; -} -.ui-datepicker select.ui-datepicker-month-year { - width: 100%; -} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { - width: 49%; -} -.ui-datepicker table { - width: 100%; - font-size: .9em; - border-collapse: collapse; - margin: 0 0 .4em; -} -.ui-datepicker th { - padding: .7em .3em; - text-align: center; - font-weight: bold; - border: 0; -} -.ui-datepicker td { - border: 0; - padding: 1px; -} -.ui-datepicker td span, -.ui-datepicker td a { - display: block; - padding: .2em; - text-align: right; - text-decoration: none; -} -.ui-datepicker .ui-datepicker-buttonpane { - background-image: none; - margin: .7em 0 0 0; - padding: 0 .2em; - border-left: 0; - border-right: 0; - border-bottom: 0; -} -.ui-datepicker .ui-datepicker-buttonpane button { - float: right; - margin: .5em .2em .4em; - cursor: pointer; - padding: .2em .6em .3em .6em; - width: auto; - overflow: visible; -} -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { - float: left; -} - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { - width: auto; -} -.ui-datepicker-multi .ui-datepicker-group { - float: left; -} -.ui-datepicker-multi .ui-datepicker-group table { - width: 95%; - margin: 0 auto .4em; -} -.ui-datepicker-multi-2 .ui-datepicker-group { - width: 50%; -} -.ui-datepicker-multi-3 .ui-datepicker-group { - width: 33.3%; -} -.ui-datepicker-multi-4 .ui-datepicker-group { - width: 25%; -} -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { - border-left-width: 0; -} -.ui-datepicker-multi .ui-datepicker-buttonpane { - clear: left; -} -.ui-datepicker-row-break { - clear: both; - width: 100%; - font-size: 0; -} - -/* RTL support */ -.ui-datepicker-rtl { - direction: rtl; -} -.ui-datepicker-rtl .ui-datepicker-prev { - right: 2px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next { - left: 2px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-prev:hover { - right: 1px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next:hover { - left: 1px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane { - clear: right; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button { - float: left; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, -.ui-datepicker-rtl .ui-datepicker-group { - float: right; -} -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { - border-right-width: 0; - border-left-width: 1px; -} -.ui-dialog { - position: absolute; - top: 0; - left: 0; - padding: .2em; - outline: 0; -} -.ui-dialog .ui-dialog-titlebar { - padding: .4em 1em; - position: relative; -} -.ui-dialog .ui-dialog-title { - float: left; - margin: .1em 0; - white-space: nowrap; - width: 90%; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-dialog .ui-dialog-titlebar-close { - position: absolute; - right: .3em; - top: 50%; - width: 21px; - margin: -10px 0 0 0; - padding: 1px; - height: 20px; -} -.ui-dialog .ui-dialog-content { - position: relative; - border: 0; - padding: .5em 1em; - background: none; - overflow: auto; -} -.ui-dialog .ui-dialog-buttonpane { - text-align: left; - border-width: 1px 0 0 0; - background-image: none; - margin-top: .5em; - padding: .3em 1em .5em .4em; -} -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { - float: right; -} -.ui-dialog .ui-dialog-buttonpane button { - margin: .5em .4em .5em 0; - cursor: pointer; -} -.ui-dialog .ui-resizable-se { - width: 12px; - height: 12px; - right: -5px; - bottom: -5px; - background-position: 16px 16px; -} -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} -.ui-menu { - list-style: none; - padding: 2px; - margin: 0; - display: block; - outline: none; -} -.ui-menu .ui-menu { - margin-top: -3px; - position: absolute; -} -.ui-menu .ui-menu-item { - margin: 0; - padding: 0; - width: 100%; - /* support: IE10, see #8844 */ - list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); -} -.ui-menu .ui-menu-divider { - margin: 5px -2px 5px -2px; - height: 0; - font-size: 0; - line-height: 0; - border-width: 1px 0 0 0; -} -.ui-menu .ui-menu-item a { - text-decoration: none; - display: block; - padding: 2px .4em; - line-height: 1.5; - min-height: 0; /* support: IE7 */ - font-weight: normal; -} -.ui-menu .ui-menu-item a.ui-state-focus, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} - -.ui-menu .ui-state-disabled { - font-weight: normal; - margin: .4em 0 .2em; - line-height: 1.5; -} -.ui-menu .ui-state-disabled a { - cursor: default; -} - -/* icon support */ -.ui-menu-icons { - position: relative; -} -.ui-menu-icons .ui-menu-item a { - position: relative; - padding-left: 2em; -} - -/* left-aligned */ -.ui-menu .ui-icon { - position: absolute; - top: .2em; - left: .2em; -} - -/* right-aligned */ -.ui-menu .ui-menu-icon { - position: static; - float: right; -} -.ui-progressbar { - height: 2em; - text-align: left; - overflow: hidden; -} -.ui-progressbar .ui-progressbar-value { - margin: -1px; - height: 100%; -} -.ui-progressbar .ui-progressbar-overlay { - background: url("/static/images/animated-overlay.gif"); - height: 100%; - filter: alpha(opacity=25); - opacity: 0.25; -} -.ui-progressbar-indeterminate .ui-progressbar-value { - background-image: none; -} -.ui-slider { - position: relative; - text-align: left; -} -.ui-slider .ui-slider-handle { - position: absolute; - z-index: 2; - width: 1.2em; - height: 1.2em; - cursor: default; -} -.ui-slider .ui-slider-range { - position: absolute; - z-index: 1; - font-size: .7em; - display: block; - border: 0; - background-position: 0 0; -} - -/* For IE8 - See #6727 */ -.ui-slider.ui-state-disabled .ui-slider-handle, -.ui-slider.ui-state-disabled .ui-slider-range { - filter: inherit; -} - -.ui-slider-horizontal { - height: .8em; -} -.ui-slider-horizontal .ui-slider-handle { - top: -.3em; - margin-left: -.6em; -} -.ui-slider-horizontal .ui-slider-range { - top: 0; - height: 100%; -} -.ui-slider-horizontal .ui-slider-range-min { - left: 0; -} -.ui-slider-horizontal .ui-slider-range-max { - right: 0; -} - -.ui-slider-vertical { - width: .8em; - height: 100px; -} -.ui-slider-vertical .ui-slider-handle { - left: -.3em; - margin-left: 0; - margin-bottom: -.6em; -} -.ui-slider-vertical .ui-slider-range { - left: 0; - width: 100%; -} -.ui-slider-vertical .ui-slider-range-min { - bottom: 0; -} -.ui-slider-vertical .ui-slider-range-max { - top: 0; -} -.ui-spinner { - position: relative; - display: inline-block; - overflow: hidden; - padding: 0; - vertical-align: middle; -} -.ui-spinner-input { - border: none; - background: none; - color: inherit; - padding: 0; - margin: .2em 0; - vertical-align: middle; - margin-left: .4em; - margin-right: 22px; -} -.ui-spinner-button { - width: 16px; - height: 50%; - font-size: .5em; - padding: 0; - margin: 0; - text-align: center; - position: absolute; - cursor: default; - display: block; - overflow: hidden; - right: 0; -} -/* more specificity required here to overide default borders */ -.ui-spinner a.ui-spinner-button { - border-top: none; - border-bottom: none; - border-right: none; -} -/* vertical centre icon */ -.ui-spinner .ui-icon { - position: absolute; - margin-top: -8px; - top: 50%; - left: 0; -} -.ui-spinner-up { - top: 0; -} -.ui-spinner-down { - bottom: 0; -} - -/* TR overrides */ -.ui-spinner .ui-icon-triangle-1-s { - /* need to fix icons sprite */ - background-position: -65px -16px; -} -.ui-tabs { - position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ - padding: .2em; -} -.ui-tabs .ui-tabs-nav { - margin: 0; - padding: .2em .2em 0; -} -.ui-tabs .ui-tabs-nav li { - list-style: none; - float: left; - position: relative; - top: 0; - margin: 1px .2em 0 0; - border-bottom-width: 0; - padding: 0; - white-space: nowrap; -} -.ui-tabs .ui-tabs-nav li a { - float: left; - padding: .5em 1em; - text-decoration: none; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active { - margin-bottom: -1px; - padding-bottom: 1px; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active a, -.ui-tabs .ui-tabs-nav li.ui-state-disabled a, -.ui-tabs .ui-tabs-nav li.ui-tabs-loading a { - cursor: text; -} -.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { - cursor: pointer; -} -.ui-tabs .ui-tabs-panel { - display: block; - border-width: 0; - padding: 1em 1.4em; - background: none; -} -.ui-tooltip { - padding: 8px; - position: absolute; - z-index: 9999; - max-width: 300px; - -webkit-box-shadow: 0 0 5px #aaa; - box-shadow: 0 0 5px #aaa; -} -body .ui-tooltip { - border-width: 2px; -} - -/* Component containers -----------------------------------*/ -.ui-widget { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; -} -.ui-widget .ui-widget { - font-size: 1em; -} -.ui-widget input, -.ui-widget select, -.ui-widget textarea, -.ui-widget button { - /*font-family: Lucida Grande,Lucida Sans,Arial,sans-serif; - font-size: 1em;*/ -} -.ui-widget-content { - border: 1px solid #a6c9e2; - background: #fcfdfd url(/static/images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; - color: #36454F; - font-weight: normal; -} -.ui-widget-content a { - color: #0088cc; -} -.ui-widget-header { - border: 1px solid #a6c9e2; - background: #ffffff url(/static/images/ui-bg_flat_50_ffffff_40x100.png) 50% 50% repeat-x; - color: #36454F; - font-weight: bold; -} -.ui-widget-header a { - color: #36454F; -} - -/* Interaction states -----------------------------------*/ -.ui-state-default, -.ui-widget-content .ui-state-default, -.ui-widget-header .ui-state-default { - border: 1px solid #a6c9e2; - background: #ffffff url(/static/images/ui-bg_flat_100_ffffff_40x100.png) 50% 50% repeat-x; - font-weight: bold; - color: #0088cc; -} -.ui-state-default a, -.ui-state-default a:link, -.ui-state-default a:visited { - color: #0088cc; - text-decoration: none; -} -.ui-state-hover, -.ui-widget-content .ui-state-hover, -.ui-widget-header .ui-state-hover, -.ui-state-focus, -.ui-widget-content .ui-state-focus, -.ui-widget-header .ui-state-focus { - border: 1px solid #e3e3e3; - background: #e5e3e3 url(/static/images/ui-bg_flat_75_e5e3e3_40x100.png) 50% 50% repeat-x; - font-weight: bold; - color: #005580; -} -.ui-state-hover a, -.ui-state-hover a:hover, -.ui-state-hover a:link, -.ui-state-hover a:visited { - color: #005580; - text-decoration: none; -} -.ui-state-active, -.ui-widget-content .ui-state-active, -.ui-widget-header .ui-state-active { - border: 1px solid #e3e3e3; - background: #f5f5f5 url(/static/images/ui-bg_inset-hard_100_f5f5f5_1x100.png) 50% 50% repeat-x; - font-weight: bold; - color: #36454F; -} -.ui-state-active a, -.ui-state-active a:link, -.ui-state-active a:visited { - color: #36454F; - text-decoration: none; -} - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, -.ui-widget-content .ui-state-highlight, -.ui-widget-header .ui-state-highlight { - border: 1px solid #fad42e; - background: #fbec88 url(/static/images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; - color: #363636; -} -.ui-state-highlight a, -.ui-widget-content .ui-state-highlight a, -.ui-widget-header .ui-state-highlight a { - color: #363636; -} -.ui-state-error, -.ui-widget-content .ui-state-error, -.ui-widget-header .ui-state-error { - border: 1px solid #cd0a0a; - background: #fef1ec url(/static/images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; - color: #cd0a0a; -} -.ui-state-error a, -.ui-widget-content .ui-state-error a, -.ui-widget-header .ui-state-error a { - color: #cd0a0a; -} -.ui-state-error-text, -.ui-widget-content .ui-state-error-text, -.ui-widget-header .ui-state-error-text { - color: #cd0a0a; -} -.ui-priority-primary, -.ui-widget-content .ui-priority-primary, -.ui-widget-header .ui-priority-primary { - font-weight: normal; -} -.ui-priority-secondary, -.ui-widget-content .ui-priority-secondary, -.ui-widget-header .ui-priority-secondary { - opacity: .7; - filter:Alpha(Opacity=70); - font-weight: bold; -} -.ui-state-disabled, -.ui-widget-content .ui-state-disabled, -.ui-widget-header .ui-state-disabled { - opacity: .35; - filter:Alpha(Opacity=35); - background-image: none; -} -.ui-state-disabled .ui-icon { - filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ -} - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - width: 16px; - height: 16px; -} -.ui-icon, -.ui-widget-content .ui-icon { - background-image: url(/static/images/ui-icons_469bdd_256x240.png); -} -.ui-widget-header .ui-icon { - background-image: url(/static/images/ui-icons_36454F_256x240.png); -} -.ui-state-default .ui-icon { - background-image: url(/static/images/ui-icons_0088cc_256x240.png); -} -.ui-state-hover .ui-icon, -.ui-state-focus .ui-icon { - background-image: url(/static/images/ui-icons_217bc0_256x240.png); -} -.ui-state-active .ui-icon { - background-image: url(/static/images/ui-icons_36454F_256x240.png); -} -.ui-state-highlight .ui-icon { - background-image: url(/static/images/ui-icons_2e83ff_256x240.png); -} -.ui-state-error .ui-icon, -.ui-state-error-text .ui-icon { - background-image: url(/static/images/ui-icons_cd0a0a_256x240.png); -} - -/* positioning */ -.ui-icon-blank { background-position: 16px 16px; } -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-on { background-position: -96px -144px; } -.ui-icon-radio-off { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, -.ui-corner-top, -.ui-corner-left, -.ui-corner-tl { - border-top-left-radius: 5px; -} -.ui-corner-all, -.ui-corner-top, -.ui-corner-right, -.ui-corner-tr { - border-top-right-radius: 5px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-left, -.ui-corner-bl { - border-bottom-left-radius: 5px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-br { - border-bottom-right-radius: 5px; -} - -/* Overlays */ -.ui-widget-overlay { - background: #aaaaaa url(/static/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .3; - filter: Alpha(Opacity=30); -} -.ui-widget-shadow { - margin: -8px 0 0 -8px; - padding: 8px; - background: #aaaaaa url(/static/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; - opacity: .3; - filter: Alpha(Opacity=30); - border-radius: 8px; -} diff --git a/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.min.css b/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.min.css deleted file mode 100644 index d8794ea158..0000000000 --- a/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.min.css +++ /dev/null @@ -1,358 +0,0 @@ -.ui-helper-hidden{display:none;} -.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;} -.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none;} -.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse;} -.ui-helper-clearfix:after{clear:both;} -.ui-helper-clearfix{min-height:0;} -.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:alpha(opacity=0);} -.ui-front{z-index:100;} -.ui-state-disabled{cursor:default !important;} -.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;} -.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%;} -.ui-resizable{position:relative;} -.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;} -.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none;} -.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0;} -.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0;} -.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%;} -.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%;} -.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px;} -.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px;} -.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px;} -.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px;} -.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black;} -.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0;} -.ui-accordion-header{font-weight:bold;} -.ui-accordion .ui-accordion-icons{padding-left:2.2em;} -.ui-accordion .ui-accordion-noicons{padding-left:.7em;} -.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em;} -.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px;} -.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto;} -.ui-autocomplete{position:absolute;top:0;left:0;cursor:default;} -.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible;} -.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none;} -.ui-button-icon-only{width:2.2em;} -button.ui-button-icon-only{width:2.4em;} -.ui-button-icons-only{width:3.4em;} -button.ui-button-icons-only{width:3.7em;} -.ui-button .ui-button-text{display:block;line-height:normal;} -.ui-button-text-only .ui-button-text{padding:.4em 1em;} -.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px;} -.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em;} -.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em;} -.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em;} -input.ui-button{padding:.4em 1em;} -.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px;} -.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px;} -.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em;} -.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em;} -.ui-buttonset{margin-right:7px;} -.ui-buttonset .ui-button{margin-left:0;margin-right:-0.3em;} -input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0;} -.ui-datepicker{width:17em;padding:.2em .2em 0;display:none;} -.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0;} -.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em;} -.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px;} -.ui-datepicker .ui-datepicker-prev{left:2px;} -.ui-datepicker .ui-datepicker-next{right:2px;} -.ui-datepicker .ui-datepicker-prev-hover{left:1px;} -.ui-datepicker .ui-datepicker-next-hover{right:1px;} -.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px;} -.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center;} -.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0;} -.ui-datepicker select.ui-datepicker-month-year{width:100%;} -.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%;} -.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em;} -.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0;} -.ui-datepicker td{border:0;padding:1px;} -.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none;} -.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0;} -.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible;} -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left;} -.ui-datepicker.ui-datepicker-multi{width:auto;} -.ui-datepicker-multi .ui-datepicker-group{float:left;} -.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em;} -.ui-datepicker-multi-2 .ui-datepicker-group{width:50%;} -.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%;} -.ui-datepicker-multi-4 .ui-datepicker-group{width:25%;} -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0;} -.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left;} -.ui-datepicker-row-break{clear:both;width:100%;font-size:0;} -.ui-datepicker-rtl{direction:rtl;} -.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto;} -.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto;} -.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto;} -.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto;} -.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right;} -.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left;} -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right;} -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px;} -.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0;} -.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative;} -.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis;} -.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px;} -.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;} -.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em;} -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right;} -.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer;} -.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px;} -.ui-draggable .ui-dialog-titlebar{cursor:move;} -.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none;} -.ui-menu .ui-menu{margin-top:-3px;position:absolute;} -.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} -.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0;} -.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal;} -.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px;} -.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5;} -.ui-menu .ui-state-disabled a{cursor:default;} -.ui-menu-icons{position:relative;} -.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em;} -.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em;} -.ui-menu .ui-menu-icon{position:static;float:right;} -.ui-progressbar{height:2em;text-align:left;overflow:hidden;} -.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%;} -.ui-progressbar .ui-progressbar-overlay{background:url("/static/images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25;} -.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none;} -.ui-slider{position:relative;text-align:left;} -.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;} -.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0;} -.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit;} -.ui-slider-horizontal{height:.8em;} -.ui-slider-horizontal .ui-slider-handle{top:-0.3em;margin-left:-0.6em;} -.ui-slider-horizontal .ui-slider-range{top:0;height:100%;} -.ui-slider-horizontal .ui-slider-range-min{left:0;} -.ui-slider-horizontal .ui-slider-range-max{right:0;} -.ui-slider-vertical{width:.8em;height:100px;} -.ui-slider-vertical .ui-slider-handle{left:-0.3em;margin-left:0;margin-bottom:-0.6em;} -.ui-slider-vertical .ui-slider-range{left:0;width:100%;} -.ui-slider-vertical .ui-slider-range-min{bottom:0;} -.ui-slider-vertical .ui-slider-range-max{top:0;} -.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle;} -.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px;} -.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0;} -.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none;} -.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0;} -.ui-spinner-up{top:0;} -.ui-spinner-down{bottom:0;} -.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px;} -.ui-tabs{position:relative;padding:.2em;} -.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0;} -.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap;} -.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none;} -.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px;} -.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text;} -.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer;} -.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none;} -.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa;} -body .ui-tooltip{border-width:2px;} -.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;} -.ui-widget .ui-widget{font-size:1em;} -.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{} -.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url(/static/images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x;color:#36454F;font-weight:normal;} -.ui-widget-content a{color:#0088cc;} -.ui-widget-header{border:1px solid #a6c9e2;background:#ffffff url(/static/images/ui-bg_flat_50_ffffff_40x100.png) 50% 50% repeat-x;color:#36454F;font-weight:bold;} -.ui-widget-header a{color:#36454F;} -.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #a6c9e2;background:#ffffff url(/static/images/ui-bg_flat_100_ffffff_40x100.png) 50% 50% repeat-x;font-weight:bold;color:#0088cc;} -.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#0088cc;text-decoration:none;} -.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #e3e3e3;background:#e5e3e3 url(/static/images/ui-bg_flat_75_e5e3e3_40x100.png) 50% 50% repeat-x;font-weight:bold;color:#005580;} -.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#005580;text-decoration:none;} -.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #e3e3e3;background:#f5f5f5 url(/static/images/ui-bg_inset-hard_100_f5f5f5_1x100.png) 50% 50% repeat-x;font-weight:bold;color:#36454F;} -.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#36454F;text-decoration:none;} -.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fad42e;background:#fbec88 url(/static/images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x;color:#363636;} -.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636;} -.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(/static/images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a;} -.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a;} -.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a;} -.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:normal;} -.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:alpha(opacity=70);font-weight:bold;} -.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:alpha(opacity=35);background-image:none;} -.ui-state-disabled .ui-icon{filter:alpha(opacity=35);} -.ui-icon{width:16px;height:16px;} -.ui-icon,.ui-widget-content .ui-icon{background-image:url(/static/images/ui-icons_469bdd_256x240.png);} -.ui-widget-header .ui-icon{background-image:url(/static/images/ui-icons_36454F_256x240.png);} -.ui-state-default .ui-icon{background-image:url(/static/images/ui-icons_0088cc_256x240.png);} -.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(/static/images/ui-icons_217bc0_256x240.png);} -.ui-state-active .ui-icon{background-image:url(/static/images/ui-icons_36454F_256x240.png);} -.ui-state-highlight .ui-icon{background-image:url(/static/images/ui-icons_2e83ff_256x240.png);} -.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(/static/images/ui-icons_cd0a0a_256x240.png);} -.ui-icon-blank{background-position:16px 16px;} -.ui-icon-carat-1-n{background-position:0 0;} -.ui-icon-carat-1-ne{background-position:-16px 0;} -.ui-icon-carat-1-e{background-position:-32px 0;} -.ui-icon-carat-1-se{background-position:-48px 0;} -.ui-icon-carat-1-s{background-position:-64px 0;} -.ui-icon-carat-1-sw{background-position:-80px 0;} -.ui-icon-carat-1-w{background-position:-96px 0;} -.ui-icon-carat-1-nw{background-position:-112px 0;} -.ui-icon-carat-2-n-s{background-position:-128px 0;} -.ui-icon-carat-2-e-w{background-position:-144px 0;} -.ui-icon-triangle-1-n{background-position:0 -16px;} -.ui-icon-triangle-1-ne{background-position:-16px -16px;} -.ui-icon-triangle-1-e{background-position:-32px -16px;} -.ui-icon-triangle-1-se{background-position:-48px -16px;} -.ui-icon-triangle-1-s{background-position:-64px -16px;} -.ui-icon-triangle-1-sw{background-position:-80px -16px;} -.ui-icon-triangle-1-w{background-position:-96px -16px;} -.ui-icon-triangle-1-nw{background-position:-112px -16px;} -.ui-icon-triangle-2-n-s{background-position:-128px -16px;} -.ui-icon-triangle-2-e-w{background-position:-144px -16px;} -.ui-icon-arrow-1-n{background-position:0 -32px;} -.ui-icon-arrow-1-ne{background-position:-16px -32px;} -.ui-icon-arrow-1-e{background-position:-32px -32px;} -.ui-icon-arrow-1-se{background-position:-48px -32px;} -.ui-icon-arrow-1-s{background-position:-64px -32px;} -.ui-icon-arrow-1-sw{background-position:-80px -32px;} -.ui-icon-arrow-1-w{background-position:-96px -32px;} -.ui-icon-arrow-1-nw{background-position:-112px -32px;} -.ui-icon-arrow-2-n-s{background-position:-128px -32px;} -.ui-icon-arrow-2-ne-sw{background-position:-144px -32px;} -.ui-icon-arrow-2-e-w{background-position:-160px -32px;} -.ui-icon-arrow-2-se-nw{background-position:-176px -32px;} -.ui-icon-arrowstop-1-n{background-position:-192px -32px;} -.ui-icon-arrowstop-1-e{background-position:-208px -32px;} -.ui-icon-arrowstop-1-s{background-position:-224px -32px;} -.ui-icon-arrowstop-1-w{background-position:-240px -32px;} -.ui-icon-arrowthick-1-n{background-position:0 -48px;} -.ui-icon-arrowthick-1-ne{background-position:-16px -48px;} -.ui-icon-arrowthick-1-e{background-position:-32px -48px;} -.ui-icon-arrowthick-1-se{background-position:-48px -48px;} -.ui-icon-arrowthick-1-s{background-position:-64px -48px;} -.ui-icon-arrowthick-1-sw{background-position:-80px -48px;} -.ui-icon-arrowthick-1-w{background-position:-96px -48px;} -.ui-icon-arrowthick-1-nw{background-position:-112px -48px;} -.ui-icon-arrowthick-2-n-s{background-position:-128px -48px;} -.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px;} -.ui-icon-arrowthick-2-e-w{background-position:-160px -48px;} -.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px;} -.ui-icon-arrowthickstop-1-n{background-position:-192px -48px;} -.ui-icon-arrowthickstop-1-e{background-position:-208px -48px;} -.ui-icon-arrowthickstop-1-s{background-position:-224px -48px;} -.ui-icon-arrowthickstop-1-w{background-position:-240px -48px;} -.ui-icon-arrowreturnthick-1-w{background-position:0 -64px;} -.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px;} -.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px;} -.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px;} -.ui-icon-arrowreturn-1-w{background-position:-64px -64px;} -.ui-icon-arrowreturn-1-n{background-position:-80px -64px;} -.ui-icon-arrowreturn-1-e{background-position:-96px -64px;} -.ui-icon-arrowreturn-1-s{background-position:-112px -64px;} -.ui-icon-arrowrefresh-1-w{background-position:-128px -64px;} -.ui-icon-arrowrefresh-1-n{background-position:-144px -64px;} -.ui-icon-arrowrefresh-1-e{background-position:-160px -64px;} -.ui-icon-arrowrefresh-1-s{background-position:-176px -64px;} -.ui-icon-arrow-4{background-position:0 -80px;} -.ui-icon-arrow-4-diag{background-position:-16px -80px;} -.ui-icon-extlink{background-position:-32px -80px;} -.ui-icon-newwin{background-position:-48px -80px;} -.ui-icon-refresh{background-position:-64px -80px;} -.ui-icon-shuffle{background-position:-80px -80px;} -.ui-icon-transfer-e-w{background-position:-96px -80px;} -.ui-icon-transferthick-e-w{background-position:-112px -80px;} -.ui-icon-folder-collapsed{background-position:0 -96px;} -.ui-icon-folder-open{background-position:-16px -96px;} -.ui-icon-document{background-position:-32px -96px;} -.ui-icon-document-b{background-position:-48px -96px;} -.ui-icon-note{background-position:-64px -96px;} -.ui-icon-mail-closed{background-position:-80px -96px;} -.ui-icon-mail-open{background-position:-96px -96px;} -.ui-icon-suitcase{background-position:-112px -96px;} -.ui-icon-comment{background-position:-128px -96px;} -.ui-icon-person{background-position:-144px -96px;} -.ui-icon-print{background-position:-160px -96px;} -.ui-icon-trash{background-position:-176px -96px;} -.ui-icon-locked{background-position:-192px -96px;} -.ui-icon-unlocked{background-position:-208px -96px;} -.ui-icon-bookmark{background-position:-224px -96px;} -.ui-icon-tag{background-position:-240px -96px;} -.ui-icon-home{background-position:0 -112px;} -.ui-icon-flag{background-position:-16px -112px;} -.ui-icon-calendar{background-position:-32px -112px;} -.ui-icon-cart{background-position:-48px -112px;} -.ui-icon-pencil{background-position:-64px -112px;} -.ui-icon-clock{background-position:-80px -112px;} -.ui-icon-disk{background-position:-96px -112px;} -.ui-icon-calculator{background-position:-112px -112px;} -.ui-icon-zoomin{background-position:-128px -112px;} -.ui-icon-zoomout{background-position:-144px -112px;} -.ui-icon-search{background-position:-160px -112px;} -.ui-icon-wrench{background-position:-176px -112px;} -.ui-icon-gear{background-position:-192px -112px;} -.ui-icon-heart{background-position:-208px -112px;} -.ui-icon-star{background-position:-224px -112px;} -.ui-icon-link{background-position:-240px -112px;} -.ui-icon-cancel{background-position:0 -128px;} -.ui-icon-plus{background-position:-16px -128px;} -.ui-icon-plusthick{background-position:-32px -128px;} -.ui-icon-minus{background-position:-48px -128px;} -.ui-icon-minusthick{background-position:-64px -128px;} -.ui-icon-close{background-position:-80px -128px;} -.ui-icon-closethick{background-position:-96px -128px;} -.ui-icon-key{background-position:-112px -128px;} -.ui-icon-lightbulb{background-position:-128px -128px;} -.ui-icon-scissors{background-position:-144px -128px;} -.ui-icon-clipboard{background-position:-160px -128px;} -.ui-icon-copy{background-position:-176px -128px;} -.ui-icon-contact{background-position:-192px -128px;} -.ui-icon-image{background-position:-208px -128px;} -.ui-icon-video{background-position:-224px -128px;} -.ui-icon-script{background-position:-240px -128px;} -.ui-icon-alert{background-position:0 -144px;} -.ui-icon-info{background-position:-16px -144px;} -.ui-icon-notice{background-position:-32px -144px;} -.ui-icon-help{background-position:-48px -144px;} -.ui-icon-check{background-position:-64px -144px;} -.ui-icon-bullet{background-position:-80px -144px;} -.ui-icon-radio-on{background-position:-96px -144px;} -.ui-icon-radio-off{background-position:-112px -144px;} -.ui-icon-pin-w{background-position:-128px -144px;} -.ui-icon-pin-s{background-position:-144px -144px;} -.ui-icon-play{background-position:0 -160px;} -.ui-icon-pause{background-position:-16px -160px;} -.ui-icon-seek-next{background-position:-32px -160px;} -.ui-icon-seek-prev{background-position:-48px -160px;} -.ui-icon-seek-end{background-position:-64px -160px;} -.ui-icon-seek-start{background-position:-80px -160px;} -.ui-icon-seek-first{background-position:-80px -160px;} -.ui-icon-stop{background-position:-96px -160px;} -.ui-icon-eject{background-position:-112px -160px;} -.ui-icon-volume-off{background-position:-128px -160px;} -.ui-icon-volume-on{background-position:-144px -160px;} -.ui-icon-power{background-position:0 -176px;} -.ui-icon-signal-diag{background-position:-16px -176px;} -.ui-icon-signal{background-position:-32px -176px;} -.ui-icon-battery-0{background-position:-48px -176px;} -.ui-icon-battery-1{background-position:-64px -176px;} -.ui-icon-battery-2{background-position:-80px -176px;} -.ui-icon-battery-3{background-position:-96px -176px;} -.ui-icon-circle-plus{background-position:0 -192px;} -.ui-icon-circle-minus{background-position:-16px -192px;} -.ui-icon-circle-close{background-position:-32px -192px;} -.ui-icon-circle-triangle-e{background-position:-48px -192px;} -.ui-icon-circle-triangle-s{background-position:-64px -192px;} -.ui-icon-circle-triangle-w{background-position:-80px -192px;} -.ui-icon-circle-triangle-n{background-position:-96px -192px;} -.ui-icon-circle-arrow-e{background-position:-112px -192px;} -.ui-icon-circle-arrow-s{background-position:-128px -192px;} -.ui-icon-circle-arrow-w{background-position:-144px -192px;} -.ui-icon-circle-arrow-n{background-position:-160px -192px;} -.ui-icon-circle-zoomin{background-position:-176px -192px;} -.ui-icon-circle-zoomout{background-position:-192px -192px;} -.ui-icon-circle-check{background-position:-208px -192px;} -.ui-icon-circlesmall-plus{background-position:0 -208px;} -.ui-icon-circlesmall-minus{background-position:-16px -208px;} -.ui-icon-circlesmall-close{background-position:-32px -208px;} -.ui-icon-squaresmall-plus{background-position:-48px -208px;} -.ui-icon-squaresmall-minus{background-position:-64px -208px;} -.ui-icon-squaresmall-close{background-position:-80px -208px;} -.ui-icon-grip-dotted-vertical{background-position:0 -224px;} -.ui-icon-grip-dotted-horizontal{background-position:-16px -224px;} -.ui-icon-grip-solid-vertical{background-position:-32px -224px;} -.ui-icon-grip-solid-horizontal{background-position:-48px -224px;} -.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px;} -.ui-icon-grip-diagonal-se{background-position:-80px -224px;} -.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px;} -.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px;} -.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px;} -.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px;} -.ui-widget-overlay{background:#aaaaaa url(/static/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:alpha(opacity=30);} -.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaaaaa url(/static/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:alpha(opacity=30);border-radius:8px;} diff --git a/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.min.css.old b/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.min.css.old deleted file mode 100644 index 73cc2d3547..0000000000 --- a/awx/ui/client/assets/custom-theme/jquery-ui-1.10.3.custom.min.css.old +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery UI - v1.10.3 - 2013-06-26 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=normal&fsDefault=14px&cornerRadius=5px&bgColorHeader=%23ffffff&bgTextureHeader=flat&bgImgOpacityHeader=50&borderColorHeader=%23a6c9e2&fcHeader=%2336454F&iconColorHeader=%2336454F&bgColorContent=%23fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=%23a6c9e2&fcContent=%23222222&iconColorContent=%23469bdd&bgColorDefault=%23ffffff&bgTextureDefault=flat&bgImgOpacityDefault=100&borderColorDefault=%23a6c9e2&fcDefault=%230088cc&iconColorDefault=%230088cc&bgColorHover=%23e5e3e3&bgTextureHover=flat&bgImgOpacityHover=75&borderColorHover=%23e3e3e3&fcHover=%23005580&iconColorHover=%23217bc0&bgColorActive=%23f5f5f5&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=%23e3e3e3&fcActive=%2336454F&iconColorActive=%2336454F&bgColorHighlight=%23fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=%23fad42e&fcHighlight=%23363636&iconColorHighlight=%232e83ff&bgColorError=%23fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=%23cd0a0a&fcError=%23cd0a0a&iconColorError=%23cd0a0a&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:14px}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #a6c9e2;background:#fff url(images/ui-bg_flat_50_ffffff_40x100.png) 50% 50% repeat-x;color:#36454F;font-weight:bold}.ui-widget-header a{color:#36454F}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #a6c9e2;background:#fff url(images/ui-bg_flat_100_ffffff_40x100.png) 50% 50% repeat-x;font-weight:normal;color:#08c}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#08c;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #e3e3e3;background:#e5e3e3 url(images/ui-bg_flat_75_e5e3e3_40x100.png) 50% 50% repeat-x;font-weight:normal;color:#005580}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#005580;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #e3e3e3;background:#f5f5f5 url(images/ui-bg_inset-hard_100_f5f5f5_1x100.png) 50% 50% repeat-x;font-weight:normal;color:#36454F}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#36454F;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fad42e;background:#fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_469bdd_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_36454F_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_0088cc_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_217bc0_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_36454F_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/awx/ui/client/assets/favicon.ico b/awx/ui/client/assets/favicon.ico deleted file mode 100644 index 2f009cfad0..0000000000 Binary files a/awx/ui/client/assets/favicon.ico and /dev/null differ diff --git a/awx/ui/client/assets/fontcustom/.fontcustom-manifest.json b/awx/ui/client/assets/fontcustom/.fontcustom-manifest.json deleted file mode 100644 index c50d13abe3..0000000000 --- a/awx/ui/client/assets/fontcustom/.fontcustom-manifest.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "checksum": { - "previous": "3dfbafd778b214fc5df2a64fe14fbfb30ba40e33282eedf0d98b5a613786db88", - "current": "3dfbafd778b214fc5df2a64fe14fbfb30ba40e33282eedf0d98b5a613786db88" - }, - "fonts": [ - "./fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.ttf", - "./fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.svg", - "./fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.woff", - "./fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.eot" - ], - "glyphs": { - "activity-stream": { - "codepoint": 61697, - "source": "new_icons/activity-stream.svg" - }, - "google": { - "codepoint": 61698, - "source": "new_icons/google.svg" - }, - "launch": { - "codepoint": 61699, - "source": "new_icons/launch.svg" - }, - "microsoft": { - "codepoint": 61700, - "source": "new_icons/microsoft.svg" - }, - "saml-02": { - "codepoint": 61701, - "source": "new_icons/saml-02.svg" - }, - "user": { - "codepoint": 61702, - "source": "new_icons/user.svg" - } - }, - "options": { - "autowidth": false, - "config": false, - "css_selector": ".icon-{{glyph}}", - "debug": false, - "font_ascent": 448, - "font_descent": 64, - "font_design_size": 16, - "font_em": 512, - "font_name": "fontcustom", - "force": false, - "input": { - "templates": "new_icons/", - "vectors": "new_icons/" - }, - "no_hash": false, - "output": { - "css": ".", - "fonts": ".", - "preview": "." - }, - "preprocessor_path": null, - "quiet": false, - "templates": [ - "css", - "preview" - ] - }, - "templates": [ - "./fontcustom.css", - "./fontcustom-preview.html" - ] -} \ No newline at end of file diff --git a/awx/ui/client/assets/fontcustom/fontcustom-preview.html b/awx/ui/client/assets/fontcustom/fontcustom-preview.html deleted file mode 100644 index bda47533ba..0000000000 --- a/awx/ui/client/assets/fontcustom/fontcustom-preview.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - fontcustom glyphs preview - - - - - - - - - -
-
-

fontcustom contains 6 glyphs:

- Toggle Preview Characters -
- - -
-
- PpPpPpPpPpPpPpPpPpPp -
-
- 12141618212436486072 -
-
- - -
-
- -
-
- PpPpPpPpPpPpPpPpPpPp -
-
- 12141618212436486072 -
-
- - -
-
- -
-
- PpPpPpPpPpPpPpPpPpPp -
-
- 12141618212436486072 -
-
- - -
-
- -
-
- PpPpPpPpPpPpPpPpPpPp -
-
- 12141618212436486072 -
-
- - -
-
- -
-
- PpPpPpPpPpPpPpPpPpPp -
-
- 12141618212436486072 -
-
- - -
-
- -
-
- PpPpPpPpPpPpPpPpPpPp -
-
- 12141618212436486072 -
-
- - -
-
- - - -
- - diff --git a/awx/ui/client/assets/fontcustom/fontcustom.css b/awx/ui/client/assets/fontcustom/fontcustom.css deleted file mode 100644 index 839abf9c98..0000000000 --- a/awx/ui/client/assets/fontcustom/fontcustom.css +++ /dev/null @@ -1,51 +0,0 @@ -/* - Icon Font: fontcustom -*/ - -@font-face { - font-family: "fontcustom"; - src: url("/static/fonts/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.eot"); - src: url("/static/fonts/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.eot?#iefix") format("embedded-opentype"), - url("/static/fonts/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.woff") format("woff"), - url("/static/fonts/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.ttf") format("truetype"), - url("/static/fonts/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.svg#fontcustom") format("svg"); - font-weight: normal; - font-style: normal; -} - -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: "fontcustom"; - src: url("/static/fonts/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.svg#fontcustom") format("svg"); - } -} - -[data-icon]:before { content: attr(data-icon); } - -[data-icon]:before, -.icon-activity-stream:before, -.icon-google:before, -.icon-launch:before, -.icon-microsoft:before, -.icon-saml-02:before, -.icon-user:before { - display: inline-block; - font-family: "fontcustom"; - font-style: normal; - font-weight: normal; - font-variant: normal; - line-height: 1; - text-decoration: inherit; - text-rendering: optimizeLegibility; - text-transform: none; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-smoothing: antialiased; -} - -.icon-activity-stream:before { content: "\f101"; } -.icon-google:before { content: "\f102"; } -.icon-launch:before { content: "\f103"; } -.icon-microsoft:before { content: "\f104"; } -.icon-saml-02:before { content: "\f105"; } -.icon-user:before { content: "\f106"; } diff --git a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.eot b/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.eot deleted file mode 100644 index 7d890d22c2..0000000000 Binary files a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.eot and /dev/null differ diff --git a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.svg b/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.svg deleted file mode 100644 index 20e687b626..0000000000 --- a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - - - -Created by FontForge 20120731 at Mon Nov 28 21:58:48 2016 - By Chris Church -Created by Chris Church with FontForge 2.0 (http://fontforge.sf.net) - - - - - - - - - - - - - - diff --git a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.ttf b/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.ttf deleted file mode 100644 index b5bb62ffce..0000000000 Binary files a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.ttf and /dev/null differ diff --git a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.woff b/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.woff deleted file mode 100644 index 8fcaf0235f..0000000000 Binary files a/awx/ui/client/assets/fontcustom/fontcustom_3dfbafd778b214fc5df2a64fe14fbfb3.woff and /dev/null differ diff --git a/awx/ui/client/assets/fontcustom/new_icons/.fontcustom-manifest.json b/awx/ui/client/assets/fontcustom/new_icons/.fontcustom-manifest.json deleted file mode 100644 index 3177b52034..0000000000 --- a/awx/ui/client/assets/fontcustom/new_icons/.fontcustom-manifest.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "checksum": { - "previous": "d77a9996ed04d45b02f5c06874cd36db7f5daa9833b1a6c36bef7029a767a34f", - "current": "d77a9996ed04d45b02f5c06874cd36db7f5daa9833b1a6c36bef7029a767a34f" - }, - "fonts": [ - "..//fontcustom_d77a9996ed04d45b02f5c06874cd36db.ttf", - "..//fontcustom_d77a9996ed04d45b02f5c06874cd36db.svg", - "..//fontcustom_d77a9996ed04d45b02f5c06874cd36db.woff", - "..//fontcustom_d77a9996ed04d45b02f5c06874cd36db.eot" - ], - "glyphs": { - "activity-stream": { - "codepoint": 61698, - "source": "./activity-stream.svg" - }, - "google": { - "codepoint": 61696, - "source": "./google.svg" - }, - "launch": { - "codepoint": 61699, - "source": "./launch.svg" - }, - "launch-circle": { - "codepoint": 61701, - "source": "./launch-circle.svg" - }, - "launch-new": { - "codepoint": 61703, - "source": "./launch-new.svg" - }, - "launch2": { - "codepoint": 61702, - "source": "./launch2.svg" - }, - "saml-02": { - "codepoint": 61697, - "source": "./saml-02.svg" - }, - "user": { - "codepoint": 61700, - "source": "./user.svg" - } - }, - "options": { - "autowidth": false, - "config": false, - "css_selector": ".icon-{{glyph}}", - "debug": false, - "font_ascent": 448, - "font_descent": 64, - "font_design_size": 16, - "font_em": 512, - "font_name": "fontcustom", - "force": true, - "input": { - "templates": ".", - "vectors": "." - }, - "no_hash": false, - "output": { - "css": "../", - "fonts": "../", - "preview": "../" - }, - "preprocessor_path": null, - "quiet": false, - "templates": [ - "css", - "preview" - ] - }, - "templates": [ - "../fontcustom.css", - "../fontcustom-preview.html" - ] -} \ No newline at end of file diff --git a/awx/ui/client/assets/fontcustom/new_icons/activity-stream.svg b/awx/ui/client/assets/fontcustom/new_icons/activity-stream.svg deleted file mode 100644 index 2915f904da..0000000000 --- a/awx/ui/client/assets/fontcustom/new_icons/activity-stream.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - diff --git a/awx/ui/client/assets/fontcustom/new_icons/google.svg b/awx/ui/client/assets/fontcustom/new_icons/google.svg deleted file mode 100644 index 530a136d6c..0000000000 --- a/awx/ui/client/assets/fontcustom/new_icons/google.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/awx/ui/client/assets/fontcustom/new_icons/launch.svg b/awx/ui/client/assets/fontcustom/new_icons/launch.svg deleted file mode 100644 index 22eec6bab0..0000000000 --- a/awx/ui/client/assets/fontcustom/new_icons/launch.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/awx/ui/client/assets/fontcustom/new_icons/microsoft.svg b/awx/ui/client/assets/fontcustom/new_icons/microsoft.svg deleted file mode 100644 index 934eb2b4b9..0000000000 --- a/awx/ui/client/assets/fontcustom/new_icons/microsoft.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/awx/ui/client/assets/fontcustom/new_icons/saml-02.svg b/awx/ui/client/assets/fontcustom/new_icons/saml-02.svg deleted file mode 100644 index 1f33a6c8fc..0000000000 --- a/awx/ui/client/assets/fontcustom/new_icons/saml-02.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/awx/ui/client/assets/fontcustom/new_icons/user.svg b/awx/ui/client/assets/fontcustom/new_icons/user.svg deleted file mode 100644 index 7b38db83e6..0000000000 --- a/awx/ui/client/assets/fontcustom/new_icons/user.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/awx/ui/client/assets/help/add_exception.png b/awx/ui/client/assets/help/add_exception.png deleted file mode 100644 index 4ba7bac86f..0000000000 Binary files a/awx/ui/client/assets/help/add_exception.png and /dev/null differ diff --git a/awx/ui/client/assets/help/confirm_exception.png b/awx/ui/client/assets/help/confirm_exception.png deleted file mode 100644 index 93b1fef7fe..0000000000 Binary files a/awx/ui/client/assets/help/confirm_exception.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups001.png b/awx/ui/client/assets/help/groups001.png deleted file mode 100644 index 6a1c6f63aa..0000000000 Binary files a/awx/ui/client/assets/help/groups001.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups002.png b/awx/ui/client/assets/help/groups002.png deleted file mode 100644 index 7476db1903..0000000000 Binary files a/awx/ui/client/assets/help/groups002.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups003.png b/awx/ui/client/assets/help/groups003.png deleted file mode 100644 index c29bc66d37..0000000000 Binary files a/awx/ui/client/assets/help/groups003.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups004.png b/awx/ui/client/assets/help/groups004.png deleted file mode 100644 index bbadb619b6..0000000000 Binary files a/awx/ui/client/assets/help/groups004.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups005.png b/awx/ui/client/assets/help/groups005.png deleted file mode 100644 index 805881f84b..0000000000 Binary files a/awx/ui/client/assets/help/groups005.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups006.png b/awx/ui/client/assets/help/groups006.png deleted file mode 100644 index b4dcac65d5..0000000000 Binary files a/awx/ui/client/assets/help/groups006.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups007.png b/awx/ui/client/assets/help/groups007.png deleted file mode 100644 index 3fbc3f799d..0000000000 Binary files a/awx/ui/client/assets/help/groups007.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups008.png b/awx/ui/client/assets/help/groups008.png deleted file mode 100644 index fb7fef8c24..0000000000 Binary files a/awx/ui/client/assets/help/groups008.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups009.png b/awx/ui/client/assets/help/groups009.png deleted file mode 100644 index bbf962ac33..0000000000 Binary files a/awx/ui/client/assets/help/groups009.png and /dev/null differ diff --git a/awx/ui/client/assets/help/groups010.png b/awx/ui/client/assets/help/groups010.png deleted file mode 100644 index 3ff39ef2da..0000000000 Binary files a/awx/ui/client/assets/help/groups010.png and /dev/null differ diff --git a/awx/ui/client/assets/help/refresh_firefox.png b/awx/ui/client/assets/help/refresh_firefox.png deleted file mode 100644 index 47c4016165..0000000000 Binary files a/awx/ui/client/assets/help/refresh_firefox.png and /dev/null differ diff --git a/awx/ui/client/assets/help/socket_indicator.png b/awx/ui/client/assets/help/socket_indicator.png deleted file mode 100644 index eb37a6bf8c..0000000000 Binary files a/awx/ui/client/assets/help/socket_indicator.png and /dev/null differ diff --git a/awx/ui/client/assets/help/understand_the_risk.png b/awx/ui/client/assets/help/understand_the_risk.png deleted file mode 100644 index d668b2b99e..0000000000 Binary files a/awx/ui/client/assets/help/understand_the_risk.png and /dev/null differ diff --git a/awx/ui/client/assets/i_severity_critical.svg b/awx/ui/client/assets/i_severity_critical.svg deleted file mode 100644 index 996df323a1..0000000000 --- a/awx/ui/client/assets/i_severity_critical.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - -image/svg+xml diff --git a/awx/ui/client/assets/i_severity_high.svg b/awx/ui/client/assets/i_severity_high.svg deleted file mode 100644 index 7bd2ba55c8..0000000000 --- a/awx/ui/client/assets/i_severity_high.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - -image/svg+xml diff --git a/awx/ui/client/assets/i_severity_low.svg b/awx/ui/client/assets/i_severity_low.svg deleted file mode 100644 index 539664987d..0000000000 --- a/awx/ui/client/assets/i_severity_low.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - -image/svg+xml diff --git a/awx/ui/client/assets/i_severity_med.svg b/awx/ui/client/assets/i_severity_med.svg deleted file mode 100644 index 33e3c19c30..0000000000 --- a/awx/ui/client/assets/i_severity_med.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - -image/svg+xml diff --git a/awx/ui/client/assets/merriweather-bold-webfont.woff b/awx/ui/client/assets/merriweather-bold-webfont.woff deleted file mode 100644 index a1b95b5c1f..0000000000 Binary files a/awx/ui/client/assets/merriweather-bold-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-bold-webfont.woff2 b/awx/ui/client/assets/merriweather-bold-webfont.woff2 deleted file mode 100644 index d9bf97ef75..0000000000 Binary files a/awx/ui/client/assets/merriweather-bold-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-bolditalic-webfont.woff b/awx/ui/client/assets/merriweather-bolditalic-webfont.woff deleted file mode 100644 index 1696f92a04..0000000000 Binary files a/awx/ui/client/assets/merriweather-bolditalic-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-bolditalic-webfont.woff2 b/awx/ui/client/assets/merriweather-bolditalic-webfont.woff2 deleted file mode 100644 index 1f7a7ae204..0000000000 Binary files a/awx/ui/client/assets/merriweather-bolditalic-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-heavyitalic-webfont.woff b/awx/ui/client/assets/merriweather-heavyitalic-webfont.woff deleted file mode 100644 index 6b3baeb97b..0000000000 Binary files a/awx/ui/client/assets/merriweather-heavyitalic-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-heavyitalic-webfont.woff2 b/awx/ui/client/assets/merriweather-heavyitalic-webfont.woff2 deleted file mode 100644 index cbce14b28a..0000000000 Binary files a/awx/ui/client/assets/merriweather-heavyitalic-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-italic-webfont.woff b/awx/ui/client/assets/merriweather-italic-webfont.woff deleted file mode 100644 index 987146da8b..0000000000 Binary files a/awx/ui/client/assets/merriweather-italic-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-italic-webfont.woff2 b/awx/ui/client/assets/merriweather-italic-webfont.woff2 deleted file mode 100644 index 6a17eaa263..0000000000 Binary files a/awx/ui/client/assets/merriweather-italic-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-lightitalic-webfont.woff b/awx/ui/client/assets/merriweather-lightitalic-webfont.woff deleted file mode 100644 index 75146e6523..0000000000 Binary files a/awx/ui/client/assets/merriweather-lightitalic-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-lightitalic-webfont.woff2 b/awx/ui/client/assets/merriweather-lightitalic-webfont.woff2 deleted file mode 100644 index 5f42282de1..0000000000 Binary files a/awx/ui/client/assets/merriweather-lightitalic-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-regular-webfont.woff b/awx/ui/client/assets/merriweather-regular-webfont.woff deleted file mode 100644 index 4ca3dc6672..0000000000 Binary files a/awx/ui/client/assets/merriweather-regular-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather-regular-webfont.woff2 b/awx/ui/client/assets/merriweather-regular-webfont.woff2 deleted file mode 100644 index 92a537d069..0000000000 Binary files a/awx/ui/client/assets/merriweather-regular-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/merriweather_light-webfont.woff b/awx/ui/client/assets/merriweather_light-webfont.woff deleted file mode 100644 index c171be2053..0000000000 Binary files a/awx/ui/client/assets/merriweather_light-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather_light-webfont.woff2 b/awx/ui/client/assets/merriweather_light-webfont.woff2 deleted file mode 100644 index 1a200b5582..0000000000 Binary files a/awx/ui/client/assets/merriweather_light-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/merriweather_ultrabold-webfont.woff b/awx/ui/client/assets/merriweather_ultrabold-webfont.woff deleted file mode 100644 index 7a2b768928..0000000000 Binary files a/awx/ui/client/assets/merriweather_ultrabold-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/merriweather_ultrabold-webfont.woff2 b/awx/ui/client/assets/merriweather_ultrabold-webfont.woff2 deleted file mode 100644 index c2008e7b7f..0000000000 Binary files a/awx/ui/client/assets/merriweather_ultrabold-webfont.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/ubuntu-r-webfont.woff b/awx/ui/client/assets/ubuntu-r-webfont.woff deleted file mode 100644 index 96cc74f9b2..0000000000 Binary files a/awx/ui/client/assets/ubuntu-r-webfont.woff and /dev/null differ diff --git a/awx/ui/client/assets/ubuntu.woff2 b/awx/ui/client/assets/ubuntu.woff2 deleted file mode 100644 index 2701e3f6cc..0000000000 Binary files a/awx/ui/client/assets/ubuntu.woff2 and /dev/null differ diff --git a/awx/ui/client/assets/variables.less b/awx/ui/client/assets/variables.less deleted file mode 100644 index 3d8f8af957..0000000000 --- a/awx/ui/client/assets/variables.less +++ /dev/null @@ -1,21 +0,0 @@ -// Default styles for AWX branding - -// Login modal icon -@login-max-width: 150px; -@login-margin: -35px 0px -10px -20px; - -// Main nav bar logo -@main-menu-width: 100px; -@main-menu-margin: 0px 0px 0px 0px; -@main-menu-max-width: initial; -@main-menu-max-height: initial; -@main-menu-height: initial; -@main-menu-margin-top-breakpoint: -20px; - - -// About modal logo -@about-modal-float: left; -@about-modal-width: 150px; -@about-modal-padding-top: initial; -@about-modal-margin-top: -40px; -@about-modal-margin-left: -20px; diff --git a/awx/ui/client/features/_index.less b/awx/ui/client/features/_index.less deleted file mode 100644 index 2769b29de7..0000000000 --- a/awx/ui/client/features/_index.less +++ /dev/null @@ -1,17 +0,0 @@ -@import 'portalMode/_index'; -@import 'output/_index'; -@import 'credentials/_index'; - -/** @define Popup Modal after create new token and applicaiton and save form */ -.PopupModal { - display: flex; -} - -.PopupModal-label { - font-weight: bold; - width: 130px; -} - -.PopupModal-value { - width: 70%; -} \ No newline at end of file diff --git a/awx/ui/client/features/applications/add-applications.controller.js b/awx/ui/client/features/applications/add-applications.controller.js deleted file mode 100644 index d19c853009..0000000000 --- a/awx/ui/client/features/applications/add-applications.controller.js +++ /dev/null @@ -1,118 +0,0 @@ -function AddApplicationsController (models, $state, strings, $scope, Alert, $filter, i18n) { - const vm = this || {}; - - const { application, me, organization } = models; - const omit = [ - 'client_id', - 'client_secret', - 'created', - 'modified', - 'related', - 'skip_authorization', - 'summary_fields', - 'type', - 'url', - 'user' - ]; - - vm.mode = 'add'; - vm.strings = strings; - vm.panelTitle = strings.get('add.PANEL_TITLE'); - - vm.tab = { - details: { _active: true }, - users: { _disabled: true } - }; - - vm.form = application.createFormSchema('post', { omit }); - - vm.form.organization = { - type: 'field', - label: i18n._('Organization'), - id: 'organization' - }; - vm.form.description = { - type: 'String', - label: i18n._('Description'), - id: 'description' - }; - - vm.form.disabled = !application.isCreatable(); - - vm.form.organization._resource = 'organization'; - vm.form.organization._route = 'applications.add.organization'; - vm.form.organization._model = organization; - vm.form.organization._placeholder = strings.get('inputs.ORGANIZATION_PLACEHOLDER'); - - vm.form.name.required = true; - vm.form.organization.required = true; - - delete vm.form.name.help_text; - - vm.form.save = data => { - const hiddenData = { - user: me.get('id') - }; - - const payload = _.merge(data, hiddenData); - - return application.request('post', { data: payload }); - }; - - vm.form.onSaveSuccess = res => { - if (res.data && res.data.client_id) { - const name = res.data.name ? - `
-
- ${strings.get('add.NAME_LABEL')} -
-
- ${$filter('sanitize')(res.data.name)} -
-
` : ''; - const clientId = res.data.client_id ? - `
-
- ${strings.get('add.CLIENT_ID_LABEL')} -
-
- ${res.data.client_id} -
-
` : ''; - const clientSecret = res.data.client_secret ? - `
-
- ${strings.get('add.CLIENT_SECRECT_LABEL')} -
-
- ${res.data.client_secret} -
-
` : ''; - - Alert(strings.get('add.MODAL_HEADER'), ` - ${name} - ${clientId} - ${clientSecret} - `, null, null, null, null, null, true); - } - $state.go('applications.edit', { application_id: res.data.id }, { reload: true }); - }; - - $scope.$watch('organization', () => { - if ($scope.organization) { - vm.form.organization._idFromModal = $scope.organization; - } - }); -} - -AddApplicationsController.$inject = [ - 'resolvedModels', - '$state', - 'ApplicationsStrings', - '$scope', - 'Alert', - '$filter', - 'i18n' -]; - -export default AddApplicationsController; diff --git a/awx/ui/client/features/applications/add-edit-applications.view.html b/awx/ui/client/features/applications/add-edit-applications.view.html deleted file mode 100644 index 8593e537dc..0000000000 --- a/awx/ui/client/features/applications/add-edit-applications.view.html +++ /dev/null @@ -1,30 +0,0 @@ -
- - - - - {{:: vm.strings.get('tab.DETAILS') }} - {{:: vm.strings.get('tab.USERS') }} - - - - - - - - - - - - - - - - - - - - -
-
-
diff --git a/awx/ui/client/features/applications/applications.strings.js b/awx/ui/client/features/applications/applications.strings.js deleted file mode 100644 index 27a05fb0ed..0000000000 --- a/awx/ui/client/features/applications/applications.strings.js +++ /dev/null @@ -1,42 +0,0 @@ -function ApplicationsStrings (BaseString) { - BaseString.call(this, 'applications'); - - const { t } = this; - const ns = this.applications; - - ns.state = { - LIST_BREADCRUMB_LABEL: t.s('APPLICATIONS'), - ADD_BREADCRUMB_LABEL: t.s('CREATE APPLICATION'), - EDIT_BREADCRUMB_LABEL: t.s('EDIT APPLICATION'), - USER_LIST_BREADCRUMB_LABEL: t.s('TOKENS') - }; - - ns.tab = { - DETAILS: t.s('Details'), - USERS: t.s('Tokens') - }; - - ns.add = { - PANEL_TITLE: t.s('NEW APPLICATION'), - CLIENT_ID_LABEL: t.s('CLIENT ID'), - CLIENT_SECRECT_LABEL: t.s('CLIENT SECRET'), - MODAL_HEADER: t.s('APPLICATION INFORMATION'), - NAME_LABEL: t.s('NAME'), - }; - - ns.list = { - PANEL_TITLE: t.s('APPLICATIONS'), - ROW_ITEM_LABEL_EXPIRED: t.s('EXPIRATION'), - ROW_ITEM_LABEL_ORGANIZATION: t.s('ORG'), - ROW_ITEM_LABEL_MODIFIED: t.s('LAST MODIFIED'), - ADD: t.s('Create a new Application') - }; - - ns.inputs = { - ORGANIZATION_PLACEHOLDER: t.s('SELECT AN ORGANIZATION') - }; -} - -ApplicationsStrings.$inject = ['BaseStringService']; - -export default ApplicationsStrings; diff --git a/awx/ui/client/features/applications/edit-applications.controller.js b/awx/ui/client/features/applications/edit-applications.controller.js deleted file mode 100644 index cf53a1abc3..0000000000 --- a/awx/ui/client/features/applications/edit-applications.controller.js +++ /dev/null @@ -1,104 +0,0 @@ -function EditApplicationsController (models, $state, strings, $scope) { - const vm = this || {}; - - const { me, application, organization } = models; - - const omit = [ - 'client_id', - 'client_secret', - 'created', - 'modified', - 'related', - 'skip_authorization', - 'summary_fields', - 'type', - 'url', - 'user' - ]; - const isEditable = application.isEditable(); - - vm.mode = 'edit'; - vm.strings = strings; - vm.panelTitle = application.get('name'); - - vm.tab = { - details: { - _active: true, - _go: 'applications.edit', - _params: { application_id: application.get('id') } - }, - users: { - _go: 'applications.edit.users', - _params: { application_id: application.get('id') } - } - }; - - $scope.$watch('$state.current.name', (value) => { - if (/applications.edit.users/.test(value)) { - vm.tab.details._active = false; - vm.tab.users._active = true; - } else { - vm.tab.details._active = true; - vm.tab.users._active = false; - } - }); - - $scope.$watch('organization', () => { - if ($scope.organization) { - vm.form.organization._idFromModal = $scope.organization; - } - }); - - if (isEditable) { - vm.form = application.createFormSchema('put', { omit }); - } else { - vm.form = application.createFormSchema({ omit }); - vm.form.disabled = !isEditable; - } - - vm.form.disabled = !isEditable; - - vm.form.name.required = true; - - const isOrgAdmin = _.some(me.get('related.admin_of_organizations.results'), (org) => org.id === organization.get('id')); - const isSuperuser = me.get('is_superuser'); - const isCurrentAuthor = Boolean(application.get('summary_fields.created_by.id') === me.get('id')); - vm.form.organization._disabled = true; - - if (isSuperuser || isOrgAdmin || (application.get('organization') === null && isCurrentAuthor)) { - vm.form.organization._disabled = false; - } - - vm.form.organization._resource = 'organization'; - vm.form.organization._model = organization; - vm.form.organization._route = 'applications.edit.organization'; - vm.form.organization._value = application.get('summary_fields.organization.id'); - vm.form.organization._displayValue = application.get('summary_fields.organization.name'); - vm.form.organization._placeholder = strings.get('inputs.ORGANIZATION_PLACEHOLDER'); - vm.form.organization.required = true; - - delete vm.form.name.help_text; - - vm.form.save = data => { - const hiddenData = { - user: me.get('id') - }; - - const payload = _.merge(data, hiddenData); - - return application.request('put', { data: payload }); - }; - - vm.form.onSaveSuccess = () => { - $state.go('applications.edit', { application_id: application.get('id') }, { reload: true }); - }; -} - -EditApplicationsController.$inject = [ - 'resolvedModels', - '$state', - 'ApplicationsStrings', - '$scope' -]; - -export default EditApplicationsController; diff --git a/awx/ui/client/features/applications/index.js b/awx/ui/client/features/applications/index.js deleted file mode 100644 index 9c12d2a3a2..0000000000 --- a/awx/ui/client/features/applications/index.js +++ /dev/null @@ -1,347 +0,0 @@ - -import AddController from './add-applications.controller'; -import EditController from './edit-applications.controller'; -import ListController from './list-applications.controller'; -import UserListController from './list-applications-users.controller'; -import ApplicationsStrings from './applications.strings'; - -const MODULE_NAME = 'at.features.applications'; - -const addEditTemplate = require('~features/applications/add-edit-applications.view.html'); -const listTemplate = require('~features/applications/list-applications.view.html'); -const indexTemplate = require('~features/applications/index.view.html'); -const userListTemplate = require('~features/applications/list-applications-users.view.html'); - -function ApplicationsDetailResolve ( - $q, - $stateParams, - Me, - Application, - Organization, - ProcessErrors, - strings -) { - const id = $stateParams.application_id; - - const promises = { - me: new Me('get').then((me) => me.extend('get', 'admin_of_organizations')) - }; - - if (!id) { - promises.application = new Application('options'); - promises.organization = new Organization(); - - return $q.all(promises); - } - - promises.application = new Application(['get', 'options'], [id, id]); - - return $q.all(promises) - .then(models => { - const orgId = models.application.get('organization'); - - const dependents = { - organization: new Organization('get', orgId) - }; - - return $q.all(dependents) - .then(related => { - models.organization = related.organization; - - return models; - }); - }) - .catch(({ data, status, config }) => { - ProcessErrors(null, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { path: `${config.url}`, status }) - }); - return $q.reject(); - }); -} - -ApplicationsDetailResolve.$inject = [ - '$q', - '$stateParams', - 'MeModel', - 'ApplicationModel', - 'OrganizationModel', - 'ProcessErrors', - 'ApplicationsStrings' -]; - -function ApplicationsRun ($stateExtender, strings) { - $stateExtender.addState({ - name: 'applications', - route: '/applications', - ncyBreadcrumb: { - label: strings.get('state.LIST_BREADCRUMB_LABEL') - }, - data: { - activityStream: true, - activityStreamTarget: 'o_auth2_application' - }, - views: { - '@': { - templateUrl: indexTemplate, - }, - 'list@applications': { - templateUrl: listTemplate, - controller: ListController, - controllerAs: 'vm' - } - }, - searchPrefix: 'application', - params: { - application_search: { - value: { - page_size: 10, - order_by: 'name' - } - } - }, - resolve: { - resolvedModels: [ - 'ApplicationModel', - (Application) => { - const app = new Application(['options']); - return app; - } - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.application_search; - const searchPath = GetBasePath('applications'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => { - Wait('stop'); - }); - } - ], - } - }); - - $stateExtender.addState({ - name: 'applications.add', - route: '/add', - ncyBreadcrumb: { - label: strings.get('state.ADD_BREADCRUMB_LABEL') - }, - data: { - activityStream: true, - activityStreamTarget: 'o_auth2_application' - }, - views: { - 'add@applications': { - templateUrl: addEditTemplate, - controller: AddController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: ApplicationsDetailResolve - } - }); - - $stateExtender.addState({ - name: 'applications.edit', - route: '/:application_id', - ncyBreadcrumb: { - label: strings.get('state.EDIT_BREADCRUMB_LABEL') - }, - data: { - activityStream: true, - activityStreamTarget: 'o_auth2_application', - activityStreamId: 'application_id' - }, - views: { - 'edit@applications': { - templateUrl: addEditTemplate, - controller: EditController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: ApplicationsDetailResolve - } - }); - - $stateExtender.addState({ - name: 'applications.add.organization', - url: '/organization?selected', - searchPrefix: 'organization', - params: { - organization_search: { - value: { - page_size: 5, - order_by: 'name', - role_level: 'admin_role' - }, - dynamic: true, - squash: '' - } - }, - data: { - basePath: 'organizations', - formChildState: true - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'organization@applications.add': { - templateProvider: (ListDefinition, generateList) => { - const html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - - return `${html}`; - } - } - }, - resolve: { - ListDefinition: ['OrganizationList', list => list], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => qs.search( - GetBasePath('organizations'), - $stateParams[`${list.iterator}_search`] - ) - ] - }, - onExit ($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } - }); - - $stateExtender.addState({ - name: 'applications.edit.organization', - url: '/organization?selected', - searchPrefix: 'organization', - params: { - organization_search: { - value: { - page_size: 5, - order_by: 'name', - role_level: 'admin_role' - }, - dynamic: true, - squash: '' - } - }, - data: { - basePath: 'organizations', - formChildState: true - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'organization@applications.edit': { - templateProvider: (ListDefinition, generateList) => { - const html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - - return `${html}`; - } - } - }, - resolve: { - ListDefinition: ['OrganizationList', list => list], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => qs.search( - GetBasePath('organizations'), - $stateParams[`${list.iterator}_search`] - ) - ] - }, - onExit ($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } - }); - - $stateExtender.addState({ - name: 'applications.edit.users', - route: '/users', - ncyBreadcrumb: { - label: strings.get('state.USER_LIST_BREADCRUMB_LABEL'), - parent: 'applications.edit' - }, - data: { - activityStream: true, - activityStreamTarget: 'o_auth2_application' - }, - views: { - 'userList@applications.edit': { - templateUrl: userListTemplate, - controller: UserListController, - controllerAs: 'vm' - } - }, - params: { - user_search: { - value: { - order_by: 'user__username', - page_size: 10 - }, - dynamic: true - } - }, - searchPrefix: 'user', - resolve: { - resolvedModels: [ - 'ApplicationModel', - (Application) => { - const app = new Application(['options']); - return app; - } - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.user_search; - const searchPath = `${GetBasePath('applications')}${$stateParams.application_id}/tokens`; - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => { - Wait('stop'); - }); - } - ], - } - }); -} - -ApplicationsRun.$inject = [ - '$stateExtender', - 'ApplicationsStrings' -]; - -angular - .module(MODULE_NAME, []) - .service('ApplicationsStrings', ApplicationsStrings) - .run(ApplicationsRun); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/applications/index.view.html b/awx/ui/client/features/applications/index.view.html deleted file mode 100644 index b4135fb791..0000000000 --- a/awx/ui/client/features/applications/index.view.html +++ /dev/null @@ -1,3 +0,0 @@ -
-
-
diff --git a/awx/ui/client/features/applications/list-applications-users.controller.js b/awx/ui/client/features/applications/list-applications-users.controller.js deleted file mode 100644 index bb7dc70edd..0000000000 --- a/awx/ui/client/features/applications/list-applications-users.controller.js +++ /dev/null @@ -1,106 +0,0 @@ -/** *********************************************** - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - ************************************************ */ -function ListApplicationsUsersController ( - $filter, - $scope, - Dataset, - strings, - $state, - GetBasePath -) { - const vm = this || {}; - vm.strings = strings; - - // smart-search - const name = 'users'; - const iterator = 'user'; - let paginateQuerySet = {}; - - vm.user_dataset = Dataset.data; - vm.users = Dataset.data.results; - vm.list = { iterator, name, basePath: 'applications' }; - vm.basePath = `${GetBasePath('applications')}${$state.params.application_id}/tokens`; - - $scope.$on('updateDataset', (e, dataset, queryset) => { - vm.user_dataset = dataset; - vm.users = dataset.results; - paginateQuerySet = queryset; - }); - - $scope.$watchCollection('$state.params', () => { - setToolbarSort(); - }); - - const toolbarSortDefault = { - label: `${strings.get('sort.USERNAME_ASCENDING')}`, - value: 'user__username' - }; - - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${strings.get('sort.USERNAME_DESCENDING')}`, value: '-user__username' }, - { label: `${strings.get('sort.CREATED_ASCENDING')}`, value: 'created' }, - { label: `${strings.get('sort.CREATED_DESCENDING')}`, value: '-created' }, - { label: `${strings.get('sort.MODIFIED_ASCENDING')}`, value: 'modified' }, - { label: `${strings.get('sort.MODIFIED_DESCENDING')}`, value: '-modified' }, - { label: `${strings.get('sort.EXPIRES_ASCENDING')}`, value: 'expires' }, - { label: `${strings.get('sort.EXPIRES_DESCENDING')}`, value: '-expires' } - ]; - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'user_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - const queryParams = Object.assign( - {}, - $state.params.user_search, - paginateQuerySet, - { order_by: sort.value } - ); - - // Update URL with params - $state.go('.', { - user_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - vm.getLastUsed = user => { - const lastUsed = _.get(user, 'last_used'); - - if (!lastUsed) { - return undefined; - } - - let html = $filter('longDate')(lastUsed); - - const { username, id } = _.get(user, 'summary_fields.last_used', {}); - - if (username && id) { - html += ` by ${$filter('sanitize')(username)}`; - } - - return html; - }; -} - -ListApplicationsUsersController.$inject = [ - '$filter', - '$scope', - 'Dataset', - 'ApplicationsStrings', - '$state', - 'GetBasePath' -]; - -export default ListApplicationsUsersController; diff --git a/awx/ui/client/features/applications/list-applications-users.view.html b/awx/ui/client/features/applications/list-applications-users.view.html deleted file mode 100644 index 2ad4b85ce4..0000000000 --- a/awx/ui/client/features/applications/list-applications-users.view.html +++ /dev/null @@ -1,43 +0,0 @@ -
- - -
- - - - -
- - - - - - -
-
-
- - diff --git a/awx/ui/client/features/applications/list-applications.controller.js b/awx/ui/client/features/applications/list-applications.controller.js deleted file mode 100644 index 5ac065163c..0000000000 --- a/awx/ui/client/features/applications/list-applications.controller.js +++ /dev/null @@ -1,166 +0,0 @@ -/** *********************************************** - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - ************************************************ */ -function ListApplicationsController ( - $filter, - $scope, - $state, - Dataset, - ProcessErrors, - Prompt, - resolvedModels, - strings, - Wait -) { - const vm = this || {}; - const application = resolvedModels; - let paginateQuerySet = {}; - - vm.strings = strings; - vm.activeId = $state.params.application_id; - - $scope.canAdd = application.options('actions.POST'); - - // smart-search - const name = 'applications'; - const iterator = 'application'; - const key = 'application_dataset'; - - $scope.list = { iterator, name, basePath: 'applications' }; - $scope.collection = { iterator }; - $scope[key] = Dataset.data; - vm.applicationsCount = Dataset.data.count; - $scope[name] = Dataset.data.results; - - $scope.$on('updateDataset', (e, dataset, queryset) => { - $scope[key] = dataset; - $scope[name] = dataset.results; - vm.applicationsCount = dataset.count; - // Remove paginateQuerySet once the page and page_size params - // are represented in the url. - paginateQuerySet = queryset; - }); - - const toolbarSortDefault = { - label: `${strings.get('sort.NAME_ASCENDING')}`, - value: 'name' - }; - - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${strings.get('sort.NAME_DESCENDING')}`, value: '-name' }, - { label: `${strings.get('sort.CREATED_ASCENDING')}`, value: 'created' }, - { label: `${strings.get('sort.CREATED_DESCENDING')}`, value: '-created' } - ]; - - vm.toolbarSortValue = toolbarSortDefault; - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'application_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - $scope.$watch('$state.params', () => { - setToolbarSort(); - }, true); - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - - const queryParams = Object.assign( - {}, - $state.params.application_search, - paginateQuerySet, - { order_by: sort.value } - ); - - // Update URL with params - $state.go('.', { - application_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - vm.getModified = app => { - const modified = _.get(app, 'modified'); - - if (!modified) { - return undefined; - } - - let html = $filter('longDate')(modified); - - const { username, id } = _.get(app, 'summary_fields.modified_by', {}); - - if (username && id) { - html += ` by ${$filter('sanitize')(username)}`; - } - - return html; - }; - - vm.deleteApplication = (app) => { - const action = () => { - $('#prompt-modal').modal('hide'); - Wait('start'); - application.request('delete', app.id) - .then(() => { - let reloadListStateParams = null; - - if ($scope.applications.length === 1 && $state.params.application_search && - !_.isEmpty($state.params.application_search.page) && - $state.params.application_search.page !== '1') { - const page = `${(parseInt(reloadListStateParams - .application_search.page, 10) - 1)}`; - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.application_search.page = page; - } - - if (parseInt($state.params.application_id, 10) === app.id) { - $state.go('applications', reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, { reload: true }); - } - }) - .catch(({ data, status }) => { - ProcessErrors($scope, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { path: `${application.path}${app.id}`, status }) - }); - }) - .finally(() => { - Wait('stop'); - }); - }; - - const deleteModalBody = `
${strings.get('deleteResource.CONFIRM', 'application')}
`; - - Prompt({ - hdr: strings.get('deleteResource.HEADER'), - resourceName: $filter('sanitize')(app.name), - body: deleteModalBody, - action, - actionText: strings.get('DELETE') - }); - }; -} - -ListApplicationsController.$inject = [ - '$filter', - '$scope', - '$state', - 'Dataset', - 'ProcessErrors', - 'Prompt', - 'resolvedModels', - 'ApplicationsStrings', - 'Wait' -]; - -export default ListApplicationsController; diff --git a/awx/ui/client/features/applications/list-applications.view.html b/awx/ui/client/features/applications/list-applications.view.html deleted file mode 100644 index be08782f53..0000000000 --- a/awx/ui/client/features/applications/list-applications.view.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - -
- - -
- -
-
- - - - -
- - - - - - -
-
- - -
-
-
-
- - -
diff --git a/awx/ui/client/features/credentials/_index.less b/awx/ui/client/features/credentials/_index.less deleted file mode 100644 index f968043d3c..0000000000 --- a/awx/ui/client/features/credentials/_index.less +++ /dev/null @@ -1,20 +0,0 @@ -.InputSourceLookup-selectedItem { - display: flex; - flex: 0 0 100%; - align-items: center; - min-height: 50px; - margin-top: 16px; - border-radius: 5px; - background-color: @default-no-items-bord; - border: 1px solid @default-border; -} - -.InputSourceLookup-selectedItemLabel { - color: @default-interface-txt; - text-transform: uppercase; - margin: 0 @at-space-2x; -} - -.InputSourceLookup-selectedItemText { - font-style: italic; -} diff --git a/awx/ui/client/features/credentials/add-edit-credentials.controller.js b/awx/ui/client/features/credentials/add-edit-credentials.controller.js deleted file mode 100644 index 30ecb467e7..0000000000 --- a/awx/ui/client/features/credentials/add-edit-credentials.controller.js +++ /dev/null @@ -1,668 +0,0 @@ -/* eslint camelcase: 0 */ -/* eslint arrow-body-style: 0 */ -function AddEditCredentialsController ( - models, - $state, - $scope, - strings, - componentsStrings, - ConfigService, - ngToast, - Wait, - $filter, - CredentialType, - GetBasePath, - Rest, -) { - const vm = this || {}; - const { - me, - credential, - credentialType, - organization, - isOrgEditableByUser, - sourceCredentials, - } = models; - - const omit = ['user', 'team', 'inputs']; - const isEditable = credential.isEditable(); - const isExternal = credentialType.get('kind') === 'external'; - const mode = $state.current.name.startsWith('credentials.add') ? 'add' : 'edit'; - - vm.isEditable = credential.get('summary_fields.user_capabilities.edit'); - vm.mode = mode; - vm.strings = strings; - - if (mode === 'edit') { - vm.panelTitle = credential.get('name'); - vm.tab = { - details: { - _active: true, - _go: 'credentials.edit', - _params: { credential_id: credential.get('id') } - }, - permissions: { - _go: 'credentials.edit.permissions', - _params: { credential_id: credential.get('id') } - } - }; - - if (isEditable) { - vm.form = credential.createFormSchema('put', { omit }); - } else { - vm.form = credential.createFormSchema({ omit }); - vm.form.disabled = !isEditable; - } - vm.form.disabled = !vm.isEditable; - - vm.form._organization._disabled = !isOrgEditableByUser; - // Only exists for permissions compatibility - $scope.credential_obj = credential.get(); - - // Custom credentials can have input fields named 'name', 'organization', - // 'description', etc. Underscore these variables to make collisions - // less likely to occur. - vm.form._organization._resource = 'organization'; - vm.form._organization._model = organization; - vm.form._organization._route = 'credentials.edit.organization'; - vm.form._organization._value = credential.get('summary_fields.organization.id'); - vm.form._organization._displayValue = credential.get('summary_fields.organization.name'); - vm.form._organization._placeholder = strings.get('inputs.ORGANIZATION_PLACEHOLDER'); - - vm.form.credential_type._resource = 'credential_type'; - vm.form.credential_type._model = credentialType; - vm.form.credential_type._route = 'credentials.edit.credentialType'; - vm.form.credential_type._placeholder = strings.get('inputs.CREDENTIAL_TYPE_PLACEHOLDER'); - vm.form.credential_type._value = credentialType.get('id'); - vm.form.credential_type._displayValue = credentialType.get('name'); - vm.isTestable = (isEditable && credentialType.get('kind') === 'external'); - - if (credential.get('related.input_sources.results').length > 0) { - vm.form.credential_type._disabled = true; - } - - $scope.$watch('$state.current.name', (value) => { - if (/credentials.edit($|\.organization$|\.credentialType$)/.test(value)) { - vm.tab.details._active = true; - vm.tab.permissions._active = false; - } else { - vm.tab.permissions._active = true; - vm.tab.details._active = false; - } - }); - } else if (mode === 'add') { - vm.panelTitle = strings.get('add.PANEL_TITLE'); - vm.tab = { - details: { _active: true }, - permissions: { _disabled: true } - }; - vm.form = credential.createFormSchema('post', { - omit: ['user', 'team', 'inputs'] - }); - - vm.form._formName = 'credential'; - vm.form.disabled = !credential.isCreatable(); - - vm.form._organization._resource = 'organization'; - vm.form._organization._route = 'credentials.add.organization'; - vm.form._organization._model = organization; - vm.form._organization._placeholder = strings.get('inputs.ORGANIZATION_PLACEHOLDER'); - - vm.form.credential_type._resource = 'credential_type'; - vm.form.credential_type._route = 'credentials.add.credentialType'; - vm.form.credential_type._model = credentialType; - vm.form.credential_type._placeholder = strings.get('inputs.CREDENTIAL_TYPE_PLACEHOLDER'); - vm.isTestable = credentialType.get('kind') === 'external'; - } - - $scope.$watch('organization', () => { - if ($scope.organization) { - vm.form._organization._idFromModal = $scope.organization; - } - }); - - $scope.$watch('credential_type', () => { - if ($scope.credential_type) { - vm.form.credential_type._idFromModal = $scope.credential_type; - } - }); - - const gceFileInputSchema = { - id: 'gce_service_account_key', - type: 'file', - label: strings.get('inputs.GCE_FILE_INPUT_LABEL'), - help_text: strings.get('inputs.GCE_FILE_INPUT_HELP_TEXT'), - }; - - let gceFileInputPreEditValues; - - vm.form.inputs = { - _get ({ getSubmitData, check }) { - const apiConfig = ConfigService.get(); - - credentialType.mergeInputProperties(); - const fields = credential.assignInputGroupValues( - apiConfig, - credentialType, - sourceCredentials - ); - - if (credentialType.get('name') === 'Google Compute Engine') { - fields.splice(2, 0, gceFileInputSchema); - $scope.$watch(`vm.form.${gceFileInputSchema.id}._value`, gceOnFileInputChanged); - if (mode === 'edit') { - $scope.$watch('vm.form.ssh_key_data._isBeingReplaced', gceOnReplaceKeyChanged); - } - } - - vm.inputSources.initialItems = credential.get('related.input_sources.results'); - vm.inputSources.items = []; - vm.inputSources.changedInputFields = []; - if (credential.get('credential_type') === credentialType.get('id')) { - vm.inputSources.items = credential.get('related.input_sources.results'); - } - - if (mode === 'add') { - vm.isTestable = (models.me.get('is_superuser') && credentialType.get('kind') === 'external'); - } else { - vm.isTestable = (isEditable && credentialType.get('kind') === 'external'); - } - - vm.getSubmitData = getSubmitData; - vm.checkForm = check; - - return fields; - }, - _onRemoveTag ({ id }) { - vm.onInputSourceClear(id); - }, - _onInputLookup ({ id }) { - vm.onInputSourceOpen(id); - }, - _source: vm.form.credential_type, - _reference: 'vm.form.inputs', - _key: 'inputs', - border: true, - title: true, - }; - - vm.externalTest = { - form: { - inputs: { - _get: () => vm.externalTest.metadataInputs, - _reference: 'vm.form.inputs', - _key: 'inputs', - _source: { _value: {} }, - }, - }, - metadataInputs: null, - }; - vm.inputSources = { - tabs: { - credential: { - _active: true, - _disabled: false, - }, - metadata: { - _active: false, - _disabled: false, - } - }, - form: { - inputs: { - _get: () => vm.inputSources.metadataInputs, - _reference: 'vm.form.inputs', - _key: 'inputs', - _source: { _value: {} }, - }, - }, - field: null, - credentialTypeId: null, - credentialTypeName: null, - credentialId: null, - credentialName: null, - metadataInputs: null, - changedInputFields: [], - initialItems: credential.get('related.input_sources.results'), - items: credential.get('related.input_sources.results'), - }; - - function setInputSourceTab (name) { - const metaIsActive = name === 'metadata'; - vm.inputSources.tabs.credential._active = !metaIsActive; - vm.inputSources.tabs.credential._disabled = false; - vm.inputSources.tabs.metadata._active = metaIsActive; - vm.inputSources.tabs.metadata._disabled = false; - } - - function unsetInputSourceTabs () { - vm.inputSources.tabs.credential._active = false; - vm.inputSources.tabs.credential._disabled = false; - vm.inputSources.tabs.metadata._active = false; - vm.inputSources.tabs.metadata._disabled = false; - } - - vm.onInputSourceClear = (field) => { - vm.form[field].tagMode = true; - vm.form[field].asTag = false; - vm.form[field]._value = ''; - vm.form[field]._tagValue = ''; - vm.form[field]._isValid = true; - vm.form[field]._rejected = false; - vm.inputSources.items = vm.inputSources.items - .filter(({ input_field_name }) => input_field_name !== field); - vm.inputSources.changedInputFields.push(field); - }; - - vm.onInputSourceOpen = (field) => { - // We get here when the input source lookup modal for a field is opened. If source - // credential and metadata values for this field already exist in the initial API data - // or from it being set during a prior visit to the lookup, we initialize the lookup with - // these values here before opening it. - const sourceItem = vm.inputSources.items - .find(({ input_field_name }) => input_field_name === field); - if (sourceItem) { - const { source_credential, summary_fields } = sourceItem; - const { source_credential: { credential_type_id, name } } = summary_fields; - vm.inputSources.credentialId = source_credential; - vm.inputSources.credentialName = name; - vm.inputSources.credentialTypeId = credential_type_id; - vm.inputSources._value = credential_type_id; - } else { - vm.inputSources.credentialId = null; - vm.inputSources.credentialName = null; - vm.inputSources.credentialTypeId = null; - vm.inputSources._value = null; - } - - setInputSourceTab('credential'); - vm.inputSources.field = field; - }; - - vm.onInputSourceClose = () => { - // We get here if the lookup was closed or canceled so we clear the state for the lookup - // and metadata form without storing any changes. - vm.inputSources.field = null; - vm.inputSources.credentialId = null; - vm.inputSources.credentialName = null; - vm.inputSources.metadataInputs = null; - unsetInputSourceTabs(); - }; - - /** - * Extract the current set of input values from the metadata form and reshape them to a - * metadata object that can be sent to the api later or reloaded when re-opening the form. - */ - function getMetadataFormSubmitData ({ inputs }) { - return inputs._group.reduce((metadata, { id, _value }) => { - if (_value !== undefined) { - metadata[id] = _value; - } - return metadata; - }, {}); - } - - vm.onInputSourceNext = () => { - const { field, credentialId, credentialTypeId } = vm.inputSources; - Wait('start'); - new CredentialType('get', credentialTypeId) - .then(model => { - model.mergeInputProperties('metadata'); - vm.inputSources.metadataInputs = model.get('inputs.metadata'); - vm.inputSources.credentialTypeName = model.get('name'); - // Pre-populate the input values for the metadata form if state for this specific - // field_name->source_credential link already exists. This occurs one of two ways: - // - // 1. This field->source_credential link already exists in the API and so we're - // showing the current state as it exists on the backend. - // 2. The metadata form for this specific field->source_credential combination was - // set during a prior visit to this lookup and so we're reflecting the most - // recent set of (unsaved) metadata values provided by the user for this field. - // - // Note: Prior state for a given credential input field is only set for one source - // credential at a time. Linking a field to a source credential will remove all - // other prior input state for that field. - const [metavals] = vm.inputSources.items - .filter(({ input_field_name }) => input_field_name === field) - .filter(({ source_credential }) => source_credential === credentialId) - .map(({ metadata }) => metadata); - Object.keys(metavals || {}).forEach(key => { - const obj = vm.inputSources.metadataInputs.find(o => o.id === key); - if (obj) obj._value = metavals[key]; - }); - setInputSourceTab('metadata'); - }) - .finally(() => Wait('stop')); - }; - - vm.onInputSourceSelect = () => { - const { field, credentialId, credentialName, credentialTypeId } = vm.inputSources; - const metadata = getMetadataFormSubmitData(vm.inputSources.form); - // Remove any input source objects already stored for this field then store the metadata - // and currently selected source credential as a credential input source object that - // can be sent to the api later or reloaded into the form if it is reopened. - vm.inputSources.items = vm.inputSources.items - .filter(({ input_field_name }) => input_field_name !== field) - .concat([{ - metadata, - input_field_name: field, - source_credential: credentialId, - target_credential: credential.get('id'), - summary_fields: { - source_credential: { - name: credentialName, - credential_type_id: credentialTypeId - } - }, - }]); - // Record that this field was changed - vm.inputSources.changedInputFields.push(field); - // Now that we've extracted and stored the selected source credential and metadata values - // for this field, we clear the state for the source credential lookup and metadata form. - vm.inputSources.field = null; - vm.inputSources.metadataInputs = null; - unsetInputSourceTabs(); - // We've linked this field to a credential, so display value as a credential tag - vm.form[field]._value = ''; - vm.form[field]._tagValue = credentialName; - vm.form[field]._isValid = true; - vm.form[field].asTag = true; - vm.checkForm(); - }; - - vm.onInputSourceTabSelect = (name) => { - if (name === 'metadata') { - // Clicking on the metadata tab should have identical behavior to clicking the 'next' - // button, so we pass-through to the same handler here. - vm.onInputSourceNext(); - } else { - setInputSourceTab('credential'); - } - }; - - vm.onInputSourceItemSelect = ({ id, credential_type, name }) => { - vm.inputSources.credentialId = id; - vm.inputSources.credentialName = name; - vm.inputSources.credentialTypeId = credential_type; - vm.inputSources._value = credential_type; - }; - - vm.onInputSourceTest = () => { - // We get here if the test button on the metadata form for the field of a non-external - // credential was used. All input values for the external credential are already stored - // on the backend, so we are only testing how it works with a set of metadata before - // linking it. - const metadata = getMetadataFormSubmitData(vm.inputSources.form); - const name = $filter('sanitize')(vm.inputSources.credentialTypeName); - const endpoint = `${vm.inputSources.credentialId}/test/`; - return runTest({ name, model: credential, endpoint, data: { metadata } }); - }; - - function onExternalTestOpen () { - // We get here if test button on the top-level form for an external credential type was - // used. We load the metadata schema for this particular external credential type and - // use it to generate and open a form for submitting test values. - credentialType.mergeInputProperties('metadata'); - vm.externalTest.metadataInputs = credentialType.get('inputs.metadata'); - } - vm.form.secondary = onExternalTestOpen; - - vm.onExternalTestClose = () => { - // We get here if the metadata test form for an external credential type was canceled or - // closed so we clear the form state and close without submitting any data to the test api, - vm.externalTest.metadataInputs = null; - }; - - vm.onExternalTest = () => { - const name = $filter('sanitize')(credentialType.get('name')); - const { inputs } = vm.getSubmitData(); - const metadata = getMetadataFormSubmitData(vm.externalTest.form); - // We get here if the test button on the top-level form for an external credential type was - // used. We need to see if the currently selected credential type is the one loaded from - // the api when we initialized the view or if its type was changed on the form and hasn't - // been saved. If the credential type hasn't been changed, it means some of the input - // values for the credential may be stored in the backend and not in the form, so we need - // to use the test endpoint for the credential. If the credential type has been changed, - // the user must provide a complete set of input values for the credential to save their - // changes, so we use the generic test endpoint for the credental type as if we were - // testing a completely new and unsaved credential. - let model; - if (credential.get('credential_type') !== credentialType.get('id')) { - model = credentialType; - } else { - model = credential; - } - - const endpoint = `${model.get('id')}/test/`; - return runTest({ name, model, endpoint, data: { inputs, metadata } }); - }; - - vm.filterInputSourceCredentialResults = (data) => { - // If an external credential is changed to have a non-external `credential_type` while - // editing, we avoid showing a self-reference in the list of selectable external - // credentials for input fields by filtering it out here. - if (isExternal) { - data.results = data.results.filter(({ id }) => id !== credential.get('id')); - } - - // only show credentials we can use - data.results = data.results - .filter(({ summary_fields }) => summary_fields.user_capabilities.use); - - return data; - }; - - function runTest ({ name, model, endpoint, data: { inputs, metadata } }) { - return model.http.post({ url: endpoint, data: { inputs, metadata }, replace: false }) - .then(() => { - const icon = 'fa-check-circle'; - const msg = strings.get('edit.TEST_PASSED'); - const content = buildTestNotificationContent({ name, icon, msg }); - ngToast.success({ - content, - dismissButton: false, - dismissOnTimeout: true - }); - }) - .catch(({ data }) => { - const icon = 'fa-exclamation-triangle'; - const msg = data.inputs || strings.get('edit.TEST_FAILED'); - const content = buildTestNotificationContent({ name, icon, msg }); - ngToast.danger({ - content, - dismissButton: false, - dismissOnTimeout: true - }); - }); - } - - function buildTestNotificationContent ({ name, msg, icon }) { - const sanitize = $filter('sanitize'); - const content = `
-
- -
-
- ${sanitize(name)}: ${sanitize(msg)} -
-
`; - return content; - } - - function deleteInputSource ({ id }) { - Rest.setUrl(`${GetBasePath('credential_input_sources')}${id}/`); - return Rest.destroy(); - } - - function createInputSource (data) { - Rest.setUrl(GetBasePath('credential_input_sources')); - return Rest.post(data); - } - - function create (data) { - // can send only one of org, user, team - if (!data.organization && !data.team) { - data.user = me.get('id'); - } - - if (_.get(data.inputs, gceFileInputSchema.id)) { - delete data.inputs[gceFileInputSchema.id]; - } - - const updatedLinkedFieldNames = vm.inputSources.items - .map(({ input_field_name }) => input_field_name); - const sourcesToAssociate = [...vm.inputSources.items]; - - // remove inputs with empty string values - let filteredInputs = _.omit(data.inputs, (value) => value === ''); - // remove inputs that are to be linked to an external credential - filteredInputs = _.omit(filteredInputs, updatedLinkedFieldNames); - data.inputs = filteredInputs; - - return credential.request('post', { data }) - .then(() => { - sourcesToAssociate.forEach(obj => { obj.target_credential = credential.get('id'); }); - return Promise.all(sourcesToAssociate.map(createInputSource)); - }); - } - - /** - * If a credential's `credential_type` is changed while editing, the inputs associated with - * the old type need to be cleared before saving the inputs associated with the new type. - * Otherwise inputs are merged together making the request invalid. - */ - function update (data) { - // can send only one of org, user, team - if (!data.organization && !data.team) { - data.user = me.get('id'); - } - - credential.unset('inputs'); - - if (_.get(data.inputs, gceFileInputSchema.id)) { - delete data.inputs[gceFileInputSchema.id]; - } - - const initialLinkedFieldNames = vm.inputSources.initialItems - .map(({ input_field_name }) => input_field_name); - const updatedLinkedFieldNames = vm.inputSources.items - .map(({ input_field_name }) => input_field_name); - - const fieldsToDisassociate = initialLinkedFieldNames - .filter(name => !updatedLinkedFieldNames.includes(name)) - .concat(updatedLinkedFieldNames) - .filter(name => vm.inputSources.changedInputFields.includes(name)); - const fieldsToAssociate = updatedLinkedFieldNames - .filter(name => vm.inputSources.changedInputFields.includes(name)); - - const sourcesToDisassociate = fieldsToDisassociate - .map(name => vm.inputSources.initialItems - .find(({ input_field_name }) => input_field_name === name)) - .filter(source => source !== undefined); - const sourcesToAssociate = fieldsToAssociate - .map(name => vm.inputSources.items - .find(({ input_field_name }) => input_field_name === name)) - .filter(source => source !== undefined); - - // remove inputs with empty string values - let filteredInputs = _.omit(data.inputs, (value) => value === ''); - // remove inputs that are to be linked to an external credential - filteredInputs = _.omit(filteredInputs, updatedLinkedFieldNames); - data.inputs = filteredInputs; - - return credential.request('put', { data }) - .then(() => Promise.all(sourcesToDisassociate.map(deleteInputSource))) - .then(() => Promise.all(sourcesToAssociate.map(createInputSource))); - } - - vm.form.save = data => { - if (mode === 'edit') { - return update(data); - } - return create(data); - }; - - vm.form.onSaveSuccess = () => { - $state.go('credentials.edit', { credential_id: credential.get('id') }, { reload: true }); - }; - - function gceOnReplaceKeyChanged (value) { - vm.form[gceFileInputSchema.id]._disabled = !value; - } - - function gceOnFileInputChanged (value, oldValue) { - if (value === oldValue) return; - - const gceFileIsLoaded = !!value; - const gceFileInputState = vm.form[gceFileInputSchema.id]; - const { obj, error } = gceParseFileInput(value); - - gceFileInputState._isValid = !error; - gceFileInputState._message = error ? componentsStrings.get('message.INVALID_INPUT') : ''; - - vm.form.project._disabled = gceFileIsLoaded; - vm.form.username._disabled = gceFileIsLoaded; - vm.form.ssh_key_data._disabled = gceFileIsLoaded; - vm.form.ssh_key_data._displayHint = !vm.form.ssh_key_data._disabled; - - if (gceFileIsLoaded) { - gceFileInputPreEditValues = Object.assign({}, { - project: vm.form.project._value, - ssh_key_data: vm.form.ssh_key_data._value, - username: vm.form.username._value - }); - - vm.form.project.asTag = false; - vm.form.project._value = _.get(obj, 'project_id', ''); - vm.inputSources.changedInputFields.push('project'); - vm.inputSources.items = vm.inputSources.items - .filter(({ input_field_name }) => input_field_name !== 'project'); - - vm.form.ssh_key_data.asTag = false; - vm.form.ssh_key_data._value = _.get(obj, 'private_key', ''); - vm.inputSources.changedInputFields.push('ssh_key_data'); - vm.inputSources.items = vm.inputSources.items - .filter(({ input_field_name }) => input_field_name !== 'ssh_key_data'); - - vm.form.username.asTag = false; - vm.form.username._value = _.get(obj, 'client_email', ''); - vm.inputSources.changedInputFields.push('username'); - vm.inputSources.items = vm.inputSources.items - .filter(({ input_field_name }) => input_field_name !== 'username'); - } else { - vm.form.project._value = gceFileInputPreEditValues.project; - vm.form.ssh_key_data._value = gceFileInputPreEditValues.ssh_key_data; - vm.form.username._value = gceFileInputPreEditValues.username; - } - } - - function gceParseFileInput (value) { - let obj; - let error; - - try { - obj = angular.fromJson(value); - } catch (err) { - error = err; - } - - return { obj, error }; - } -} - -AddEditCredentialsController.$inject = [ - 'resolvedModels', - '$state', - '$scope', - 'CredentialsStrings', - 'ComponentsStrings', - 'ConfigService', - 'ngToast', - 'Wait', - '$filter', - 'CredentialTypeModel', - 'GetBasePath', - 'Rest', -]; - -export default AddEditCredentialsController; diff --git a/awx/ui/client/features/credentials/add-edit-credentials.view.html b/awx/ui/client/features/credentials/add-edit-credentials.view.html deleted file mode 100644 index aa3e581b6d..0000000000 --- a/awx/ui/client/features/credentials/add-edit-credentials.view.html +++ /dev/null @@ -1,66 +0,0 @@ -
-
- - - - - {{:: vm.strings.get('tab.DETAILS') }} - {{:: vm.strings.get('tab.PERMISSIONS') }} - - - - - - - - - - - - - - {{:: vm.strings.get('inputs.GROUP_TITLE') }} - - - - - - - - - - - - - - - - {{:: vm.strings.get('tab.DETAILS') }} - {{:: vm.strings.get('tab.PERMISSIONS') }} - - - -
-
-
- - -
diff --git a/awx/ui/client/features/credentials/credentials.strings.js b/awx/ui/client/features/credentials/credentials.strings.js deleted file mode 100644 index 55e19ca152..0000000000 --- a/awx/ui/client/features/credentials/credentials.strings.js +++ /dev/null @@ -1,55 +0,0 @@ -function CredentialsStrings (BaseString) { - BaseString.call(this, 'credentials'); - - const { t } = this; - const ns = this.credentials; - - ns.state = { - ADD_BREADCRUMB_LABEL: t.s('CREATE CREDENTIAL'), - EDIT_BREADCRUMB_LABEL: t.s('EDIT CREDENTIAL') - }; - - ns.tab = { - DETAILS: t.s('Details'), - PERMISSIONS: t.s('Permissions'), - }; - - ns.inputs = { - GROUP_TITLE: t.s('Type Details'), - ORGANIZATION_PLACEHOLDER: t.s('SELECT AN ORGANIZATION'), - CREDENTIAL_TYPE_PLACEHOLDER: t.s('SELECT A CREDENTIAL TYPE'), - GCE_FILE_INPUT_LABEL: t.s('Service Account JSON File'), - GCE_FILE_INPUT_HELP_TEXT: t.s('Provide account information using Google Compute Engine JSON credentials file.') - }; - - ns.externalTest = { - TITLE: t.s('Test External Credential') - }; - - ns.inputSources = { - TITLE: t.s('Set Input Source'), - CREDENTIAL: t.s('CREDENTIAL'), - METADATA: t.s('METADATA'), - NO_MATCH: t.s('No records matched your search.'), - NO_RECORDS: t.s('No external credentials available.'), - SELECTED: t.s('selected'), - NONE_SELECTED: t.s('No credential selected'), - }; - - ns.add = { - PANEL_TITLE: t.s('NEW CREDENTIAL') - }; - - ns.edit = { - TEST_PASSED: t.s('Test passed.'), - TEST_FAILED: t.s('Test failed.') - }; - - ns.permissions = { - TITLE: t.s('CREDENTIALS PERMISSIONS') - }; -} - -CredentialsStrings.$inject = ['BaseStringService']; - -export default CredentialsStrings; diff --git a/awx/ui/client/features/credentials/external-test-modal.component.js b/awx/ui/client/features/credentials/external-test-modal.component.js deleted file mode 100644 index 7b8ac82685..0000000000 --- a/awx/ui/client/features/credentials/external-test-modal.component.js +++ /dev/null @@ -1,27 +0,0 @@ -const templateUrl = require('~features/credentials/external-test-modal.partial.html'); - -function ExternalTestModalController (strings) { - const vm = this || {}; - - vm.strings = strings; - vm.title = strings.get('externalTest.TITLE'); - - vm.$onInit = () => { - vm.form.save = () => vm.onSubmit(); - }; -} - -ExternalTestModalController.$inject = [ - 'CredentialsStrings', -]; - -export default { - templateUrl, - controller: ExternalTestModalController, - controllerAs: 'vm', - bindings: { - onClose: '=', - onSubmit: '=', - form: '=', - }, -}; diff --git a/awx/ui/client/features/credentials/external-test-modal.partial.html b/awx/ui/client/features/credentials/external-test-modal.partial.html deleted file mode 100644 index 5f35774655..0000000000 --- a/awx/ui/client/features/credentials/external-test-modal.partial.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - {{::vm.strings.get('CLOSE')}} - - - {{::vm.strings.get('RUN')}} - - - - diff --git a/awx/ui/client/features/credentials/index.js b/awx/ui/client/features/credentials/index.js deleted file mode 100644 index c0f28f5dc2..0000000000 --- a/awx/ui/client/features/credentials/index.js +++ /dev/null @@ -1,167 +0,0 @@ -import LegacyCredentials from './legacy.credentials'; -import AddEditController from './add-edit-credentials.controller'; -import CredentialsStrings from './credentials.strings'; -import InputSourceLookupComponent from './input-source-lookup.component'; -import ExternalTestModalComponent from './external-test-modal.component'; - -const MODULE_NAME = 'at.features.credentials'; - -const addEditTemplate = require('~features/credentials/add-edit-credentials.view.html'); - -function CredentialsResolve ( - $q, - $stateParams, - Me, - Credential, - CredentialType, - Organization, - ProcessErrors, - strings, - Rest, - GetBasePath, -) { - const id = $stateParams.credential_id; - - const promises = { - me: new Me('get').then((me) => me.extend('get', 'admin_of_organizations')) - }; - - if (!id) { - promises.credential = new Credential('options'); - promises.credentialType = new CredentialType(); - promises.organization = new Organization(); - promises.sourceCredentials = $q.resolve({ data: { count: 0, results: [] } }); - - return $q.all(promises); - } - - promises.credential = new Credential(['get', 'options'], [id, id]); - - return $q.all(promises) - .then(models => { - const typeId = models.credential.get('credential_type'); - - Rest.setUrl(GetBasePath('credentials')); - const params = { target_input_sources__target_credential: id }; - const sourceCredentialsPromise = Rest.get({ params }); - - const dependents = { - credentialType: new CredentialType('get', typeId), - organization: new Organization('get', { - resource: models.credential.get('summary_fields.organization') - }), - credentialInputSources: models.credential.extend('GET', 'input_sources'), - sourceCredentials: sourceCredentialsPromise - }; - - dependents.isOrgCredAdmin = dependents.organization.then((org) => org.search({ role_level: 'credential_admin_role' })); - - return $q.all(dependents) - .then(related => { - models.credentialType = related.credentialType; - models.organization = related.organization; - models.sourceCredentials = related.sourceCredentials; - - const isOrgAdmin = _.some(models.me.get('related.admin_of_organizations.results'), (org) => org.id === models.organization.get('id')); - const isSuperuser = models.me.get('is_superuser'); - const isCurrentAuthor = Boolean(models.credential.get('summary_fields.created_by.id') === models.me.get('id')); - - models.isOrgEditableByUser = (isSuperuser || isOrgAdmin - || related.isOrgCredAdmin - || (models.credential.get('organization') === null && isCurrentAuthor)); - - return models; - }); - }).catch(({ data, status, config }) => { - ProcessErrors(null, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { path: `${config.url}`, status }) - }); - return $q.reject(); - }); -} - -CredentialsResolve.$inject = [ - '$q', - '$stateParams', - 'MeModel', - 'CredentialModel', - 'CredentialTypeModel', - 'OrganizationModel', - 'ProcessErrors', - 'CredentialsStrings', - 'Rest', - 'GetBasePath', -]; - -function CredentialsRun ($stateExtender, legacy, strings) { - $stateExtender.addState({ - name: 'credentials.add', - route: '/add', - ncyBreadcrumb: { - label: strings.get('state.ADD_BREADCRUMB_LABEL') - }, - data: { - activityStream: true, - activityStreamTarget: 'credential' - }, - views: { - 'add@credentials': { - templateUrl: addEditTemplate, - controller: AddEditController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: CredentialsResolve - } - }); - - $stateExtender.addState({ - name: 'credentials.edit', - route: '/:credential_id', - ncyBreadcrumb: { - label: strings.get('state.EDIT_BREADCRUMB_LABEL') - }, - data: { - activityStream: true, - activityStreamTarget: 'credential', - activityStreamId: 'credential_id' - }, - views: { - 'edit@credentials': { - templateUrl: addEditTemplate, - controller: AddEditController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: CredentialsResolve - } - }); - - $stateExtender.addState(legacy.getStateConfiguration('list')); - $stateExtender.addState(legacy.getStateConfiguration('edit-permissions')); - $stateExtender.addState(legacy.getStateConfiguration('add-permissions')); - $stateExtender.addState(legacy.getStateConfiguration('add-organization')); - $stateExtender.addState(legacy.getStateConfiguration('edit-organization')); - $stateExtender.addState(legacy.getStateConfiguration('add-credential-type')); - $stateExtender.addState(legacy.getStateConfiguration('edit-credential-type')); -} - -CredentialsRun.$inject = [ - '$stateExtender', - 'LegacyCredentialsService', - 'CredentialsStrings' -]; - -angular - .module(MODULE_NAME, []) - .controller('AddEditController', AddEditController) - .service('LegacyCredentialsService', LegacyCredentials) - .service('CredentialsStrings', CredentialsStrings) - .component('atInputSourceLookup', InputSourceLookupComponent) - .component('atExternalCredentialTest', ExternalTestModalComponent) - .run(CredentialsRun); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/credentials/index.view.html b/awx/ui/client/features/credentials/index.view.html deleted file mode 100644 index 964941c53d..0000000000 --- a/awx/ui/client/features/credentials/index.view.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
- -
-
-
diff --git a/awx/ui/client/features/credentials/input-source-lookup.component.js b/awx/ui/client/features/credentials/input-source-lookup.component.js deleted file mode 100644 index b76baf043b..0000000000 --- a/awx/ui/client/features/credentials/input-source-lookup.component.js +++ /dev/null @@ -1,42 +0,0 @@ -const templateUrl = require('~features/credentials/input-source-lookup.partial.html'); - -function InputSourceLookupController (strings, wait) { - const vm = this || {}; - - vm.strings = strings; - vm.title = strings.get('inputSources.TITLE'); - - vm.$onInit = () => { - wait('start'); - vm.form.save = () => vm.onTest(); - }; - - vm.onReady = () => { - vm.isReady = true; - wait('stop'); - }; -} - -InputSourceLookupController.$inject = [ - 'CredentialsStrings', - 'Wait', -]; - -export default { - templateUrl, - controller: InputSourceLookupController, - controllerAs: 'vm', - bindings: { - tabs: '=', - onClose: '=', - onNext: '=', - onSelect: '=', - onTabSelect: '=', - onItemSelect: '=', - onTest: '=', - selectedId: '=', - selectedName: '=', - form: '=', - resultsFilter: '=', - }, -}; diff --git a/awx/ui/client/features/credentials/input-source-lookup.partial.html b/awx/ui/client/features/credentials/input-source-lookup.partial.html deleted file mode 100644 index dc9461ba31..0000000000 --- a/awx/ui/client/features/credentials/input-source-lookup.partial.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - {{::vm.strings.get('inputSources.CREDENTIAL')}} - - - {{::vm.strings.get('inputSources.METADATA')}} - - -
-
- {{::vm.strings.get('inputSources.SELECTED')}} -
- -
- -
-
- {{::vm.strings.get('inputSources.NONE_SELECTED')}} -
-
-
- - - - - - - - {{::vm.strings.get('TEST')}} - - - {{::vm.strings.get('CANCEL')}} - - - {{::vm.strings.get('NEXT')}} - - - {{::vm.strings.get('OK')}} - - - -
diff --git a/awx/ui/client/features/credentials/legacy.credentials.js b/awx/ui/client/features/credentials/legacy.credentials.js deleted file mode 100644 index 6707272201..0000000000 --- a/awx/ui/client/features/credentials/legacy.credentials.js +++ /dev/null @@ -1,355 +0,0 @@ -import ListController from '../../src/credentials/list/credentials-list.controller'; -import { N_ } from '../../src/i18n'; - -const indexTemplate = require('~features/credentials/index.view.html'); - -function LegacyCredentialsService () { - this.list = { - name: 'credentials', - route: '/credentials', - ncyBreadcrumb: { - label: N_('CREDENTIALS') - }, - data: { - activityStream: true, - activityStreamTarget: 'credential' - }, - views: { - '@': { - templateUrl: indexTemplate - }, - 'list@credentials': { - templateProvider (CredentialList, generateList) { - const html = generateList.build({ - list: CredentialList, - mode: 'edit' - }); - - return html; - }, - controller: ListController - } - }, - searchPrefix: 'credential', - resolve: { - Dataset: ['CredentialList', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => { - const path = GetBasePath(list.basePath) || GetBasePath(list.name); - - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - credentialType: ['CredentialTypeModel', CredentialType => new CredentialType('get')] - } - }; - - this.editPermissions = { - name: 'credentials.edit.permissions', - url: '/permissions?{permission_search:queryset}', - resolve: { - ListDefinition: () => ({ - name: 'permissions', - disabled: 'organization === undefined', - ngClick: 'organization === undefined || $state.go(\'credentials.edit.permissions\')', - awToolTip: '{{permissionsTooltip}}', - dataTipWatch: 'permissionsTooltip', - awToolTipTabEnabledInEditMode: true, - dataPlacement: 'right', - basePath: 'api/v2/credentials/{{$stateParams.id}}/access_list/', - search: { - order_by: 'username' - }, - type: 'collection', - title: N_('Permissions'), - iterator: 'permission', - index: false, - open: false, - actions: { - add: { - ngClick: '$state.go(\'.add\')', - label: N_('Add'), - awToolTip: N_('Add a permission'), - actionClass: 'at-Button--add', - actionId: 'button-add--permission', - ngShow: '(credential_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - fields: { - username: { - key: true, - label: N_('User'), - linkBase: 'users', - columnClass: 'col-lg-3 col-md-3 col-sm-3 col-xs-4' - }, - role: { - label: N_('Role'), - type: 'role', - nosort: true, - columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-4' - }, - team_roles: { - label: N_('Team Roles'), - type: 'team_roles', - nosort: true, - columnClass: 'col-lg-5 col-md-5 col-sm-5 col-xs-4' - } - } - }), - Dataset: ['QuerySet', '$stateParams', (qs, $stateParams) => { - const id = $stateParams.credential_id; - const path = `api/v2/credentials/${id}/access_list/`; - - return qs.search(path, $stateParams.permission_search); - }] - }, - params: { - permission_search: { - value: { - page_size: '20', - order_by: 'username' - }, - dynamic: true, - squash: '' - } - }, - ncyBreadcrumb: { - parent: 'credentials.edit', - label: N_('PERMISSIONS') - }, - views: { - related: { - templateProvider (CredentialForm, GenerateForm) { - const html = GenerateForm.buildCollection({ - mode: 'edit', - related: 'permissions', - form: typeof (CredentialForm) === 'function' ? - CredentialForm() : CredentialForm - }); - return html; - }, - controller: 'PermissionsList' - } - } - }; - - this.addPermissions = { - name: 'credentials.edit.permissions.add', - url: '/add-permissions', - resolve: { - usersDataset: [ - 'addPermissionsUsersList', - 'QuerySet', - '$stateParams', - 'GetBasePath', - 'resourceData', - (list, qs, $stateParams, GetBasePath, resourceData) => { - let path; - - if (resourceData.data.organization) { - path = `${GetBasePath('organizations')}${resourceData.data.organization}/users`; - } else { - path = list.basePath || GetBasePath(list.name); - } - - return qs.search(path, $stateParams.user_search); - } - ], - teamsDataset: [ - 'addPermissionsTeamsList', - 'QuerySet', - '$stateParams', - 'GetBasePath', - 'resourceData', - (list, qs, $stateParams, GetBasePath, resourceData) => { - const path = GetBasePath(list.basePath) || GetBasePath(list.name); - const org = resourceData.data.organization; - - if (!org) { - return null; - } - - $stateParams[`${list.iterator}_search`].organization = org; - - return qs.search(path, $stateParams.team_search); - } - ], - resourceData: ['CredentialModel', '$stateParams', (Credential, $stateParams) => - new Credential('get', $stateParams.credential_id) - .then(credential => ({ data: credential.get() })) - ] - }, - params: { - user_search: { - value: { - order_by: 'username', - page_size: 5, - is_superuser: false - }, - dynamic: true - }, - team_search: { - value: { - order_by: 'name', - page_size: 5 - }, - dynamic: true - } - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'modal@credentials.edit': { - template: ` - - ` - } - }, - onExit: $state => { - if ($state.transition) { - $('#add-permissions-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } - }; - - this.lookupTemplateProvider = (ListDefinition, generateList) => { - const html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - - return `${html}`; - }; - - this.organization = { - url: '/organization?selected', - searchPrefix: 'organization', - params: { - organization_search: { - value: { - page_size: 5, - order_by: 'name', - role_level: 'credential_admin_role' - }, - dynamic: true, - squash: '' - } - }, - data: { - basePath: 'organizations', - formChildState: true - }, - ncyBreadcrumb: { - skip: true - }, - views: {}, - resolve: { - ListDefinition: ['OrganizationList', list => list], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => qs.search( - GetBasePath('organizations'), - $stateParams[`${list.iterator}_search`] - ) - ] - }, - onExit ($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } - }; - - this.credentialType = { - url: '/credential_type?selected', - searchPrefix: 'credential_type', - params: { - credential_type_search: { - value: { - page_size: 5, - order_by: 'name' - }, - dynamic: true, - squash: '' - } - }, - data: { - basePath: 'credential_types', - formChildState: true - }, - ncyBreadcrumb: { - skip: true - }, - views: {}, - resolve: { - ListDefinition: ['CredentialTypesList', list => list], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => qs.search( - GetBasePath('credential_types'), - $stateParams[`${list.iterator}_search`] - ) - ] - }, - onExit ($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } - }; - - this.getStateConfiguration = (name) => { - switch (name) { - case 'list': - return this.list; - case 'edit-permissions': - return this.editPermissions; - case 'add-permissions': - return this.addPermissions; - case 'add-organization': - this.organization.name = 'credentials.add.organization'; - this.organization.views['organization@credentials.add'] = { - templateProvider: this.lookupTemplateProvider - }; - - return this.organization; - case 'edit-organization': - this.organization.name = 'credentials.edit.organization'; - this.organization.views['organization@credentials.edit'] = { - templateProvider: this.lookupTemplateProvider - }; - - return this.organization; - case 'add-credential-type': - this.credentialType.name = 'credentials.add.credentialType'; - this.credentialType.views['credential_type@credentials.add'] = { - templateProvider: this.lookupTemplateProvider - }; - - return this.credentialType; - case 'edit-credential-type': - this.credentialType.name = 'credentials.edit.credentialType'; - this.credentialType.views['credential_type@credentials.edit'] = { - templateProvider: this.lookupTemplateProvider - }; - - return this.credentialType; - - default: - throw new Error(N_(`Legacy state configuration for ${name} does not exist`)); - } - }; -} - -export default LegacyCredentialsService; diff --git a/awx/ui/client/features/index.js b/awx/ui/client/features/index.js deleted file mode 100644 index b816d2c65d..0000000000 --- a/awx/ui/client/features/index.js +++ /dev/null @@ -1,31 +0,0 @@ -import atLibServices from '~services'; -import atLibComponents from '~components'; -import atLibModels from '~models'; - -import atFeaturesApplications from '~features/applications'; -import atFeaturesCredentials from '~features/credentials'; -import atFeaturesOutput from '~features/output'; -import atFeaturesTemplates from '~features/templates'; -import atFeaturesUsers from '~features/users'; -import atFeaturesJobs from '~features/jobs'; -import atFeaturesPortalMode from '~features/portalMode'; -import atFeaturesProjects from '~features/projects'; - -const MODULE_NAME = 'at.features'; - -angular.module(MODULE_NAME, [ - atLibServices, - atLibComponents, - atLibModels, - atFeaturesApplications, - atFeaturesCredentials, - atFeaturesTemplates, - atFeaturesUsers, - atFeaturesJobs, - atFeaturesOutput, - atFeaturesTemplates, - atFeaturesPortalMode, - atFeaturesProjects -]); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/jobs/index.controller.js b/awx/ui/client/features/jobs/index.controller.js deleted file mode 100644 index f0ab4e2315..0000000000 --- a/awx/ui/client/features/jobs/index.controller.js +++ /dev/null @@ -1,19 +0,0 @@ -function IndexJobsController ($scope, strings, dataset) { - const vm = this; - vm.strings = strings; - vm.count = dataset.data.count; - - $scope.$on('updateCount', (e, count) => { - if (typeof count === 'number') { - vm.count = count; - } - }); -} - -IndexJobsController.$inject = [ - '$scope', - 'JobsStrings', - 'Dataset' -]; - -export default IndexJobsController; diff --git a/awx/ui/client/features/jobs/index.js b/awx/ui/client/features/jobs/index.js deleted file mode 100644 index 99d91515d5..0000000000 --- a/awx/ui/client/features/jobs/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import JobsStrings from './jobs.strings'; -import jobsRoute from './routes/jobs.route'; -import { jobsSchedulesRoute, jobsSchedulesEditRoute } from '../../src/scheduler/schedules.route'; -import jobsListController from './jobsList.controller'; - -const MODULE_NAME = 'at.features.jobs'; - -angular - .module(MODULE_NAME, []) - .service('JobsStrings', JobsStrings) - .controller('jobsListController', jobsListController) - .run(['$stateExtender', ($stateExtender) => { - $stateExtender.addState(jobsRoute); - $stateExtender.addState(jobsSchedulesRoute); - $stateExtender.addState(jobsSchedulesEditRoute); - }]); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/jobs/index.view.html b/awx/ui/client/features/jobs/index.view.html deleted file mode 100644 index a1fa58df9e..0000000000 --- a/awx/ui/client/features/jobs/index.view.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
- -
-
- - -
-
-
-
-
-
diff --git a/awx/ui/client/features/jobs/jobs.strings.js b/awx/ui/client/features/jobs/jobs.strings.js deleted file mode 100644 index dbdfa0c69c..0000000000 --- a/awx/ui/client/features/jobs/jobs.strings.js +++ /dev/null @@ -1,35 +0,0 @@ -function JobsStrings (BaseString) { - BaseString.call(this, 'jobs'); - - const { t } = this; - const ns = this.jobs; - - ns.list = { - PANEL_TITLE: t.s('JOBS'), - ROW_ITEM_LABEL_STARTED: t.s('Started'), - ROW_ITEM_LABEL_FINISHED: t.s('Finished'), - ROW_ITEM_LABEL_WORKFLOW_JOB: t.s('Workflow Job'), - ROW_ITEM_LABEL_LAUNCHED_BY: t.s('Launched By'), - ROW_ITEM_LABEL_JOB_TEMPLATE: t.s('Job Template'), - ROW_ITEM_LABEL_INVENTORY: t.s('Inventory'), - ROW_ITEM_LABEL_PROJECT: t.s('Project'), - ROW_ITEM_LABEL_CREDENTIALS: t.s('Credentials'), - ROW_ITEM_LABEL_WEBHOOK: t.s('Webhook'), - NO_RUNNING: t.s('There are no running jobs.'), - JOB: t.s('Job'), - STATUS_TOOLTIP: status => t.s('Job {{status}}. Click for details.', { status }), - SLICE_JOB: t.s('Slice Job'), - NEW: t.s('new'), - PENDING: t.s('pending'), - WAITING: t.s('waiting'), - RUNNING: t.s('running'), - SUCCESSFUL: t.s('successful'), - FAILED: t.s('failed'), - ERROR: t.s('error'), - CANCELED: t.s('canceled') - }; -} - -JobsStrings.$inject = ['BaseStringService']; - -export default JobsStrings; diff --git a/awx/ui/client/features/jobs/jobsList.controller.js b/awx/ui/client/features/jobs/jobsList.controller.js deleted file mode 100644 index 5720a53b80..0000000000 --- a/awx/ui/client/features/jobs/jobsList.controller.js +++ /dev/null @@ -1,393 +0,0 @@ -/** *********************************************** - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - ************************************************ */ -const mapChoices = choices => Object.assign(...choices.map(([k, v]) => ({ [k]: v }))); - -function ListJobsController ( - $scope, - $state, - Dataset, - resolvedModels, - strings, - qs, - Prompt, - $filter, - ProcessErrors, - Wait, - Rest, - SearchBasePath, - $timeout -) { - const vm = this || {}; - const [unifiedJob] = resolvedModels; - - vm.strings = strings; - - let newJobs = []; - - // smart-search - const name = 'jobs'; - const iterator = 'job'; - let paginateQuerySet = {}; - - let launchModalOpen = false; - let newJobsTimerRunning = false; - - vm.searchBasePath = SearchBasePath; - - vm.list = { iterator, name }; - vm.job_dataset = Dataset.data; - vm.jobs = Dataset.data.results; - - $scope.$watch('$state.params', () => { - setToolbarSort(); - }, true); - - const toolbarSortDefault = { - label: `${strings.get('sort.FINISH_TIME_DESCENDING')}`, - value: '-finished' - }; - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'job_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - vm.toolbarSortOptions = [ - { label: `${strings.get('sort.NAME_ASCENDING')}`, value: 'name' }, - { label: `${strings.get('sort.NAME_DESCENDING')}`, value: '-name' }, - { label: `${strings.get('sort.FINISH_TIME_ASCENDING')}`, value: 'finished' }, - toolbarSortDefault, - { label: `${strings.get('sort.START_TIME_ASCENDING')}`, value: 'started' }, - { label: `${strings.get('sort.START_TIME_DESCENDING')}`, value: '-started' }, - { label: `${strings.get('sort.LAUNCHED_BY_ASCENDING')}`, value: 'created_by__id' }, - { label: `${strings.get('sort.LAUNCHED_BY_DESCENDING')}`, value: '-created_by__id' }, - { label: `${strings.get('sort.PROJECT_ASCENDING')}`, value: 'unified_job_template__project__id' }, - { label: `${strings.get('sort.PROJECT_DESCENDING')}`, value: '-unified_job_template__project__id' } - ]; - - vm.toolbarSortValue = toolbarSortDefault; - - // Temporary hack to retrieve $scope.querySet from the paginate directive. - // Remove this event listener once the page and page_size params - // are represented in the url. - $scope.$on('updateDataset', (event, dataset, queryset) => { - paginateQuerySet = queryset; - vm.jobs = dataset.results; - vm.job_dataset = dataset; - }); - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - - const queryParams = Object.assign( - {}, - $state.params.job_search, - paginateQuerySet, - { order_by: sort.value } - ); - - // Update URL with params - $state.go('.', { - job_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - $scope.$watch('vm.job_dataset.count', () => { - $scope.$emit('updateCount', vm.job_dataset.count, 'jobs'); - }); - - const canAddRowsDynamically = () => { - const orderByValue = _.get($state.params, 'job_search.order_by'); - const pageValue = _.get($state.params, 'job_search.page'); - const idInValue = _.get($state.params, 'job_search.id__in'); - - return (!idInValue && (!pageValue || pageValue === '1') - && (orderByValue === '-finished' || orderByValue === '-started')); - }; - - const updateJobRow = (msg) => { - // Loop across the jobs currently shown and update the row - // if it exists - for (let i = 0; i < vm.jobs.length; i++) { - if (vm.jobs[i].id === msg.unified_job_id) { - // Update the job status. - vm.jobs[i].status = msg.status; - if (msg.finished) { - vm.jobs[i].finished = msg.finished; - const orderByValue = _.get($state.params, 'job_search.order_by'); - if (orderByValue === '-finished') { - // Attempt to sort the rows in the list by their finish - // timestamp in descending order - vm.jobs.sort((a, b) => - (!b.finished) - (!a.finished) - || new Date(b.finished) - new Date(a.finished)); - } - } - break; - } - } - }; - - $scope.$on('ws-jobs', (e, msg) => { - if (msg.status === 'pending' && canAddRowsDynamically()) { - newJobs.push(msg.unified_job_id); - if (!launchModalOpen && !newJobsTimerRunning) { - fetchNewJobs(); - } - } else if (!newJobs.includes(msg.unified_job_id)) { - updateJobRow(msg); - } - }); - - $scope.$on('launchModalOpen', (evt, isOpen) => { - evt.stopPropagation(); - if (!isOpen && newJobs.length > 0) { - fetchNewJobs(); - } - launchModalOpen = isOpen; - }); - - if ($state.includes('instanceGroups')) { - vm.emptyListReason = strings.get('list.NO_RUNNING'); - } - - vm.isPortalMode = $state.includes('portalMode'); - - vm.jobTypes = mapChoices(unifiedJob.options('actions.GET.type.choices')); - - vm.buildCredentialTags = (credentials) => - credentials.map(credential => { - const icon = `${credential.kind}`; - const link = `/#/credentials/${credential.id}`; - const value = $filter('sanitize')(credential.name); - - return { icon, link, value }; - }); - - vm.getSecondaryTagLabel = (job) => { - if (job.job_slice_number && job.job_slice_count && job.job_slice_count > 1) { - return `${strings.get('list.SLICE_JOB')} ${job.job_slice_number}/${job.job_slice_count}`; - } - if (job.launch_type === 'webhook') { - return strings.get('list.ROW_ITEM_LABEL_WEBHOOK'); - } - return null; - }; - - vm.getTranslatedStatusString = (status) => { - switch (status) { - case 'new': - return strings.get('list.NEW'); - case 'pending': - return strings.get('list.PENDING'); - case 'waiting': - return strings.get('list.WAITING'); - case 'running': - return strings.get('list.RUNNING'); - case 'successful': - return strings.get('list.SUCCESSFUL'); - case 'failed': - return strings.get('list.FAILED'); - case 'error': - return strings.get('list.ERROR'); - case 'canceled': - return strings.get('list.CANCELED'); - default: - return status; - } - }; - - vm.getSref = ({ type, id }) => { - let sref; - - switch (type) { - case 'job': - sref = `output({type: 'playbook', id: ${id}})`; - break; - case 'ad_hoc_command': - sref = `output({type: 'command', id: ${id}})`; - break; - case 'system_job': - sref = `output({type: 'system', id: ${id}})`; - break; - case 'project_update': - sref = `output({type: 'project', id: ${id}})`; - break; - case 'inventory_update': - sref = `output({type: 'inventory', id: ${id}})`; - break; - case 'workflow_job': - sref = `workflowResults({id: ${id}})`; - break; - default: - sref = ''; - break; - } - - return sref; - }; - - vm.deleteJob = (job) => { - const action = () => { - $('#prompt-modal').modal('hide'); - Wait('start'); - Rest.setUrl(job.url); - Rest.destroy() - .then(() => { - let reloadListStateParams = null; - - if (vm.jobs.length === 1 && $state.params.job_search && - _.has($state, 'params.job_search.page') && - $state.params.job_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.job_search.page = - (parseInt(reloadListStateParams.job_search.page, 10) - 1).toString(); - } - - $state.go('.', reloadListStateParams, { reload: true }); - }) - .catch(({ data, status }) => { - ProcessErrors($scope, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { path: `${job.url}`, status }) - }); - }) - .finally(() => { - Wait('stop'); - }); - }; - - const deleteModalBody = `
${strings.get('deleteResource.CONFIRM', 'job')}
`; - - Prompt({ - hdr: strings.get('deleteResource.HEADER'), - resourceName: $filter('sanitize')(job.name), - body: deleteModalBody, - action, - actionText: strings.get('DELETE'), - }); - }; - - vm.cancelJob = (job) => { - const action = () => { - $('#prompt-modal').modal('hide'); - Wait('start'); - Rest.setUrl(job.related.cancel); - Rest.post() - .then(() => { - let reloadListStateParams = null; - - if (vm.jobs.length === 1 && $state.params.job_search && - !_.isEmpty($state.params.job_search.page) && - $state.params.job_search.page !== '1') { - const page = `${(parseInt(reloadListStateParams - .job_search.page, 10) - 1)}`; - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.job_search.page = page; - } - - $state.go('.', reloadListStateParams, { reload: true }); - }) - .catch(({ data, status }) => { - ProcessErrors($scope, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { path: `${job.url}`, status }) - }); - }) - .finally(() => { - Wait('stop'); - }); - }; - - const deleteModalBody = `
${strings.get('cancelJob.SUBMIT_REQUEST')}
`; - - Prompt({ - hdr: strings.get('cancelJob.HEADER'), - resourceName: $filter('sanitize')(job.name), - body: deleteModalBody, - action, - actionText: strings.get('cancelJob.CANCEL_JOB'), - cancelText: strings.get('cancelJob.RETURN') - }); - }; - - const fetchNewJobs = () => { - newJobsTimerRunning = true; - const newJobIdsFilter = newJobs.join(','); - newJobs = []; - const newJobsSearchParams = Object.assign({}, $state.params.job_search); - newJobsSearchParams.count_disabled = 1; - newJobsSearchParams.id__in = newJobIdsFilter; - delete newJobsSearchParams.page_size; - const stringifiedSearchParams = qs.encodeQueryset(newJobsSearchParams, false); - Rest.setUrl(`${vm.searchBasePath}${stringifiedSearchParams}`); - Rest.get() - .then(({ data }) => { - vm.job_dataset.count += data.results.length; - const pageSize = parseInt($state.params.job_search.page_size, 10) || 20; - const joinedJobs = data.results.concat(vm.jobs); - vm.jobs = joinedJobs.length > pageSize - ? joinedJobs.slice(0, pageSize) - : joinedJobs; - $timeout(() => { - if (canAddRowsDynamically()) { - if (newJobs.length > 0 && !launchModalOpen) { - fetchNewJobs(); - } else { - newJobsTimerRunning = false; - } - } else { - // Bail out - one of [order_by, page, id__in] params has changed since we - // received these new job messages - newJobs = []; - newJobsTimerRunning = false; - } - }, 5000); - }) - .catch(({ data, status }) => { - ProcessErrors($scope, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { - path: `${vm.searchBasePath}${stringifiedSearchParams}`, - status - }) - }); - }); - }; - - vm.isCollapsed = true; - - vm.onCollapse = () => { - vm.isCollapsed = true; - }; - - vm.onExpand = () => { - vm.isCollapsed = false; - }; -} - -ListJobsController.$inject = [ - '$scope', - '$state', - 'Dataset', - 'resolvedModels', - 'JobsStrings', - 'QuerySet', - 'Prompt', - '$filter', - 'ProcessErrors', - 'Wait', - 'Rest', - 'SearchBasePath', - '$timeout' -]; - -export default ListJobsController; diff --git a/awx/ui/client/features/jobs/jobsList.view.html b/awx/ui/client/features/jobs/jobsList.view.html deleted file mode 100644 index 50b25c1aff..0000000000 --- a/awx/ui/client/features/jobs/jobsList.view.html +++ /dev/null @@ -1,113 +0,0 @@ - -
- - -
- - - - - -
- -
- - -
- - - - - - -
-
-
- - - - - - - - - - - - - - -
-
- - - - - -
-
-
-
- - -
diff --git a/awx/ui/client/features/jobs/routes/hostCompletedJobs.route.js b/awx/ui/client/features/jobs/routes/hostCompletedJobs.route.js deleted file mode 100644 index 6d4034aa28..0000000000 --- a/awx/ui/client/features/jobs/routes/hostCompletedJobs.route.js +++ /dev/null @@ -1,69 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import jobsListController from '../jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); - -export default { - url: '/completed_jobs', - params: { - job_search: { - value: { - page_size: '20', - job__hosts: '', - order_by: '-id' - }, - dynamic: true, - squash: '' - } - }, - data: { - socket: { - groups: { - jobs: ['status_changed'] - } - } - }, - ncyBreadcrumb: { - label: N_('COMPLETED JOBS') - }, - views: { - related: { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const hostId = $stateParams.host_id; - - const searchParam = _.assign($stateParams - .job_search, { job__hosts: hostId }); - - const searchPath = GetBasePath('unified_jobs'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - 'GetBasePath', - (GetBasePath) => GetBasePath('unified_jobs') - ] - } -}; diff --git a/awx/ui/client/features/jobs/routes/instanceGroupJobs.route.js b/awx/ui/client/features/jobs/routes/instanceGroupJobs.route.js deleted file mode 100644 index 91de83b254..0000000000 --- a/awx/ui/client/features/jobs/routes/instanceGroupJobs.route.js +++ /dev/null @@ -1,131 +0,0 @@ -import listContainerController from '~src/instance-groups/jobs/instanceGroupsJobsListContainer.controller'; -import { N_ } from '../../../src/i18n'; -import jobsListController from '../jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); -const listContainerTemplate = require('~src/instance-groups/jobs/instanceGroupsJobsListContainer.partial.html'); - -const instanceGroupJobsRoute = { - name: 'instanceGroups.jobs', - url: '/:instance_group_id/jobs', - ncyBreadcrumb: { - parent: 'instanceGroups.edit', - label: N_('JOBS') - }, - params: { - job_search: { - value: { - page_size: '10', - order_by: '-finished' - }, - dynamic: true - } - }, - views: { - 'instanceGroupsJobsContainer@instanceGroups': { - templateUrl: listContainerTemplate, - controller: listContainerController, - controllerAs: 'vm' - }, - 'jobsList@instanceGroups.jobs': { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - }, - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const groupId = $stateParams.instance_group_id; - - const searchParam = $stateParams.job_search; - - const searchPath = `api/v2/instance_groups/${groupId}/jobs`; - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - '$stateParams', - ($stateParams) => `api/v2/instance_groups/${$stateParams.instance_group_id}/jobs` - ], - } -}; - -const containerGroupJobsRoute = { - name: 'instanceGroups.containerGroupJobs', - url: '/container_groups/:instance_group_id/jobs', - ncyBreadcrumb: { - parent: 'instanceGroups.editContainerGroup', - label: N_('JOBS') - }, - params: { - job_search: { - value: { - page_size: '10', - order_by: '-finished' - }, - dynamic: true - } - }, - views: { - 'containerGroupJobs@instanceGroups': { - templateUrl: listContainerTemplate, - controller: listContainerController, - controllerAs: 'vm' - }, - 'jobsList@instanceGroups.containerGroupJobs': { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - }, - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'QuerySet', - ($stateParams, Wait, qs) => { - const groupId = $stateParams.instance_group_id; - - const searchParam = $stateParams.job_search; - - const searchPath = `api/v2/instance_groups/${groupId}/jobs`; - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - '$stateParams', - ($stateParams) => `api/v2/instance_groups/${$stateParams.instance_group_id}/jobs` - ], - } -}; - -export { instanceGroupJobsRoute, containerGroupJobsRoute }; diff --git a/awx/ui/client/features/jobs/routes/instanceJobs.route.js b/awx/ui/client/features/jobs/routes/instanceJobs.route.js deleted file mode 100644 index b88bbb4cd8..0000000000 --- a/awx/ui/client/features/jobs/routes/instanceJobs.route.js +++ /dev/null @@ -1,68 +0,0 @@ -import listContainerController from '~src/instance-groups/jobs/instanceJobsListContainer.controller'; -import { N_ } from '../../../src/i18n'; -import jobsListController from '../jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); -const listContainerTemplate = require('~src/instance-groups/jobs/instanceJobsListContainer.partial.html'); - -export default { - name: 'instanceGroups.instanceJobs', - url: '/:instance_group_id/instances/:instance_id/jobs', - ncyBreadcrumb: { - parent: 'instanceGroups.instances', - label: N_('JOBS') - }, - views: { - 'instanceJobsContainer@instanceGroups': { - templateUrl: listContainerTemplate, - controller: listContainerController, - controllerAs: 'vm' - }, - 'jobsList@instanceGroups.instanceJobs': { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - }, - }, - params: { - job_search: { - value: { - page_size: '10', - order_by: '-finished' - }, - dynamic: true - }, - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const instanceId = $stateParams.instance_id; - - const searchParam = $stateParams.job_search; - - const searchPath = `api/v2/instances/${instanceId}/jobs`; - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - '$stateParams', - ($stateParams) => `api/v2/instances/${$stateParams.instance_id}/jobs` - ] - } -}; diff --git a/awx/ui/client/features/jobs/routes/inventoryCompletedJobs.route.js b/awx/ui/client/features/jobs/routes/inventoryCompletedJobs.route.js deleted file mode 100644 index 531e663909..0000000000 --- a/awx/ui/client/features/jobs/routes/inventoryCompletedJobs.route.js +++ /dev/null @@ -1,76 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import jobsListController from '../jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); - -export default { - url: '/completed_jobs', - params: { - job_search: { - value: { - page_size: '20', - or__job__inventory: '', - or__adhoccommand__inventory: '', - or__inventoryupdate__inventory_source__inventory: '', - order_by: '-id' - }, - dynamic: true, - squash: '' - } - }, - data: { - socket: { - groups: { - jobs: ['status_changed'] - } - } - }, - ncyBreadcrumb: { - label: N_('JOBS') - }, - views: { - related: { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const inventoryId = $stateParams.inventory_id ? - $stateParams.inventory_id : $stateParams.smartinventory_id; - - const searchParam = _.assign($stateParams.job_search, { - or__job__inventory: inventoryId, - or__adhoccommand__inventory: inventoryId, - or__inventoryupdate__inventory_source__inventory: inventoryId, - or__workflowjob__inventory: inventoryId, - }); - - const searchPath = GetBasePath('unified_jobs'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - 'GetBasePath', - (GetBasePath) => GetBasePath('unified_jobs') - ] - } -}; diff --git a/awx/ui/client/features/jobs/routes/jobs.route.js b/awx/ui/client/features/jobs/routes/jobs.route.js deleted file mode 100644 index 427d7d165d..0000000000 --- a/awx/ui/client/features/jobs/routes/jobs.route.js +++ /dev/null @@ -1,75 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import indexController from '../index.controller'; - -const indexTemplate = require('~features/jobs/index.view.html'); -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); - -export default { - searchPrefix: 'job', - name: 'jobs', - url: '/jobs', - ncyBreadcrumb: { - label: N_('JOBS') - }, - params: { - job_search: { - value: { - not__launch_type: 'sync', - order_by: '-finished' - }, - dynamic: true, - squash: false - } - }, - data: { - activityStream: true, - activityStreamTarget: 'job', - socket: { - groups: { - jobs: ['status_changed'], - schedules: ['changed'] - } - } - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.job_search; - const searchPath = GetBasePath('unified_jobs'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - 'GetBasePath', - (GetBasePath) => GetBasePath('unified_jobs') - ] - }, - views: { - '@': { - templateUrl: indexTemplate, - controller: indexController, - controllerAs: 'vm' - }, - 'jobsList@jobs': { - templateUrl: jobsListTemplate, - controller: 'jobsListController', - controllerAs: 'vm' - } - } -}; diff --git a/awx/ui/client/features/jobs/routes/templateCompletedJobs.route.js b/awx/ui/client/features/jobs/routes/templateCompletedJobs.route.js deleted file mode 100644 index e1323714cc..0000000000 --- a/awx/ui/client/features/jobs/routes/templateCompletedJobs.route.js +++ /dev/null @@ -1,71 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import jobsListController from '../jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); - -export default { - url: '/completed_jobs', - name: 'templates.editJobTemplate.completed_jobs', - params: { - job_search: { - value: { - page_size: '20', - job__job_template: '', - order_by: '-id' - }, - dynamic: true, - squash: '' - } - }, - data: { - socket: { - groups: { - jobs: ['status_changed'] - } - } - }, - ncyBreadcrumb: { - label: N_('COMPLETED JOBS') - }, - views: { - related: { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const templateId = $stateParams.job_template_id ? - $stateParams.job_template_id : $stateParams.job_template_id; - - const searchParam = _.assign($stateParams - .job_search, { job__job_template: templateId }); - - const searchPath = GetBasePath('unified_jobs'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - 'GetBasePath', - (GetBasePath) => GetBasePath('unified_jobs') - ] - } -}; diff --git a/awx/ui/client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js b/awx/ui/client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js deleted file mode 100644 index 258cf325d4..0000000000 --- a/awx/ui/client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js +++ /dev/null @@ -1,70 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import jobsListController from '../jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); - -export default { - url: '/completed_jobs', - name: 'templates.editWorkflowJobTemplate.completed_jobs', - params: { - job_search: { - value: { - page_size: '20', - workflow_job__workflow_job_template: '', - order_by: '-id' - }, - dynamic: true, - squash: '' - } - }, - data: { - socket: { - groups: { - jobs: ['status_changed'] - } - } - }, - ncyBreadcrumb: { - label: N_('COMPLETED JOBS') - }, - views: { - related: { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const templateId = $stateParams.workflow_job_template_id; - - const searchParam = _.assign($stateParams - .job_search, { workflow_job__workflow_job_template: templateId }); - - const searchPath = GetBasePath('unified_jobs'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - 'GetBasePath', - (GetBasePath) => GetBasePath('unified_jobs') - ] - } -}; diff --git a/awx/ui/client/features/output/_index.less b/awx/ui/client/features/output/_index.less deleted file mode 100644 index a4bef87569..0000000000 --- a/awx/ui/client/features/output/_index.less +++ /dev/null @@ -1,474 +0,0 @@ -@import 'host-event/_index'; -.at-Stdout { - &-menuTop { - color: @at-gray-646972; - border: 1px solid @at-gray-b7; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: none; - margin-top: 15px; - - & > div { - user-select: none; - } - } - - &-menuIconGroup { - & > p { - margin: 0; - } - - & > p:first-child { - font-size: 20px; - margin-right: 8px; - } - - & > p:last-child { - margin-top: 9px; - } - } - - &-menuIcon { - font-size: 12px; - padding: 10px; - cursor: pointer; - - &:hover { - color: @at-blue; - } - } - - &-menuIcon--md { - font-size: 14px; - padding: 10px; - cursor: pointer; - - &:hover { - color: @at-blue; - } - } - - &-menuIcon--lg { - font-size: 22px; - line-height: 12px; - font-weight: bold; - padding: 10px; - cursor: pointer; - - &:hover { - color: @at-blue; - } - } - - &-menuIcon--active { - font-size: 22px; - line-height: 12px; - font-weight: bold; - padding: 10px; - cursor: pointer; - color: @at-blue; - } - - &-row { - display: flex; - - &:hover { - background-color: white; - } - - &:hover div { - background-color: white; - } - - &--hidden { - display: none; - } - } - - &-row--clickable { - cursor: pointer; - } - - &-toggle { - background-color: @at-gray-eb; - color: @at-gray-646972; - display: flex; - flex: 0 0 30px; - font-size: 18px; - justify-content: center; - line-height: 12px; - - & > i { - cursor: pointer; - } - - user-select: none; - } - - &-line { - color: @at-gray-161b1f; - background-color: @at-gray-eb; - flex: 0 0 45px; - text-align: right; - vertical-align: top; - padding-right: 5px; - border-right: 1px solid @at-gray-b7; - user-select: none; - } - - &-line--clickable { - cursor: pointer; - } - - &-event { - .at-mixin-event(); - } - - &-time { - padding-right: 2ch; - font-size: 12px; - text-align: right; - user-select: none; - width: 11ch; - - & > span { - background-color: white; - border-radius: 4px; - padding: 1px 2px; - } - } - - &-wrapper { - display: flex; - flex-flow: column nowrap; - height: 100%; - } - - &-container { - background-color: @at-gray-f2; - border-radius: 0 0 4px 4px; - border: 1px solid @at-gray-b7; - color: @at-gray-161b1f; - display: flex; - flex-direction: column; - flex: 1; - font-family: monospace; - font-size: 15px; - height: 100%; - margin: 0; - overflow-y: scroll; - padding: 0; - - @media screen and (max-width: @breakpoint-md) { - max-height: calc(100vh - 30px); - } - } - - &-borderHeader { - .at-mixin-stdoutBorder(); - height: 10px; - } - - &-borderFooter { - .at-mixin-stdoutBorder(); - flex: 1; - } - - &--fullscreen { - grid-column-start: 1; - grid-column-end: 3; - } - - /* The ng-transclude tag that gets injected as a part of at-Panel was throwing off the height - of the panel after Bootstrap's move to display: flex. This seemed like the most concise fix*/ - ng-transclude { - display: flex; - flex-flow: column nowrap; - height: 100%; - } -} - -.at-mixin-event() { - padding: 0 10px; - white-space: pre-wrap; - word-break: break-all; - word-wrap: break-word; -} - -.at-mixin-stdoutBorder() { - background-color: @at-gray-eb; - border-right: 1px solid @at-gray-b7; - width: 75px; -} - -// Search --------------------------------------------------------------------------------- -@at-jobz-top-search-key: @at-space-2x; -@at-jobz-bottom-search-key: @at-space-3x; - -.jobz-searchKeyPaneContainer { - margin-top: @at-jobz-top-search-key; - margin-bottom: @at-jobz-bottom-search-key; -} - -.jobz-searchKeyPane { - // background-color: @at-gray-f6; - background-color: @login-notice-bg; - color: @login-notice-text; - border-radius: @at-border-radius; - border: 1px solid @at-gray-b7; - // color: @at-gray-646972; - padding: 6px @at-padding-input 6px @at-padding-input; -} - -.jobz-searchClearAllContainer { - .at-mixin-VerticallyCenter(); -} - -.jobz-searchClearAll { - font-size: 10px; -} - -.jobz-Button-searchKey { - .at-mixin-Button(); - - background-color: @at-blue; - border-color: at-color-button-border-default; - color: @at-white; - - &:hover, &:active { - color: @at-white; - background-color: @at-blue-hover; - box-shadow: none; - } - - &:focus { - color: @at-white; - } -} - -.jobz-tagz { - margin-top: @at-space; - display: flex; - width: 100%; - flex-wrap: wrap; - margin-left: -5px; -} - -// Status Bar ----------------------------------------------------------------------------- -.HostStatusBar { - display: flex; - flex: 0 0 auto; - width: 100%; - margin-bottom: 15px; -} - -.HostStatusBar-ok, -.HostStatusBar-changed, -.HostStatusBar-dark, -.HostStatusBar-failures, -.HostStatusBar-skipped, -.HostStatusBar-noData { - height: 15px; - border-top: 5px solid @default-bg; - border-bottom: 5px solid @default-bg; -} - -.HostStatusBar-ok { - background-color: @default-succ; - display: flex; - flex: 0 0 auto; -} - -.HostStatusBar-changed { - background-color: @default-warning; - flex: 0 0 auto; -} - -.HostStatusBar-dark { - background-color: @default-unreachable; - flex: 0 0 auto; -} - -.HostStatusBar-failures { - background-color: @default-err; - flex: 0 0 auto; -} - -.HostStatusBar-skipped { - background-color: @default-link; - flex: 0 0 auto; -} - -.HostStatusBar-noData { - background-color: @default-icon-hov; - flex: 1 0 auto; -} - -.HostStatusBar-tooltipLabel { - text-transform: uppercase; - margin-right: 15px; -} - -.HostStatusBar-tooltipBadge { - border-radius: 5px; - border: 1px solid @default-bg; -} - -.HostStatusBar-tooltipBadge--ok { - background-color: @default-succ; -} - -.HostStatusBar-tooltipBadge--dark { - background-color: @default-unreachable; -} - -.HostStatusBar-tooltipBadge--skipped { - background-color: @default-link; -} - -.HostStatusBar-tooltipBadge--changed { - background-color: @default-warning; -} - -.HostStatusBar-tooltipBadge--failures { - background-color: @default-err; - -} - -.HostStatusBar-tooltip.top { - margin-top: 4px; -} - -// Job Details --------------------------------------------------------------------------------- - -@breakpoint-md: 1200px; - -.JobResults-container { - display: grid; - grid-gap: 20px; - grid-template-columns: minmax(400px, 1fr) minmax(500px, 2fr); - grid-template-rows: minmax(500px, ~"calc(100vh - 130px)"); - - .at-Panel { - min-width: 0; - overflow-y: auto; - } -} - -.JobResults-detailsPanel { - display: flex; - flex-direction: column; -} - -.JobResults-panelHeader { - display: flex; - height: 30px; -} - -.JobResults-panelHeaderText { - color: @default-interface-txt; - flex: 1 0 auto; - font-size: 14px; - font-weight: bold; - margin-right: 10px; - text-transform: uppercase; -} - -.JobResults-panelHeaderButtonActions { - display: flex; -} - -.JobResults-resultRow { - width: 100%; - display: flex; - padding-bottom: 10px; - flex-wrap: wrap; -} - -.JobResults-resultRow div[id$='variables-container'] { - width: 100%; -} - -.JobResults-resultRowLabel { - text-transform: uppercase; - color: @default-interface-txt; - font-size: 12px; - font-weight: normal!important; - width: 30%; - margin-right: 20px; - - @media screen and (max-width: @breakpoint-md) { - flex: 2.5 0 auto; - } -} - -.JobResults-resultRowLabel--fullWidth { - width: 100%; - margin-right: 0px; -} - -.JobResults-resultRowText { - display: flex; - flex-flow: row wrap; - width: ~"calc(70% - 20px)"; - flex: 1 0 auto; - text-transform: none; - word-wrap: break-word; -} - -.JobResults-resultRowText--fullWidth { - width: 100%; -} - -.JobResults-expandArrow { - color: #D7D7D7; - font-size: 14px; - font-weight: bold; - margin-right: 10px; - text-transform: uppercase; - margin-left: 10px; -} - -.JobResults-resultRowText--instanceGroup { - display: flex; -} - -.JobResults-isolatedBadge { - align-items: center; - background-color: @default-list-header-bg; - border-radius: 5px; - color: @default-stdout-txt; - display: flex; - font-size: 10px; - height: 16px; - margin: 3px 0 0 10px; - padding: 0 10px; - text-transform: uppercase; -} - -.JobResults-statusResultIcon { - padding-left: 0px; - padding-right: 10px; -} - -.StandardOut-panelHeader { - flex: initial; -} - -.JobResults-seeMoreLess { - color: #337AB7; - margin: 4px 0px; - text-transform: uppercase; - padding: 2px 0px; - cursor: pointer; - border-radius: 5px; - font-size: 11px; -} - -@media screen and (max-width: @breakpoint-md) { - .JobResults-container { - display: flex; - flex-direction: column; - min-width: 400px; - } -} diff --git a/awx/ui/client/features/output/api.events.service.js b/awx/ui/client/features/output/api.events.service.js deleted file mode 100644 index 9da4f34ba8..0000000000 --- a/awx/ui/client/features/output/api.events.service.js +++ /dev/null @@ -1,137 +0,0 @@ -import { - API_MAX_PAGE_SIZE, - OUTPUT_ORDER_BY, - OUTPUT_PAGE_SIZE, -} from './constants'; - -const BASE_PARAMS = { - page_size: OUTPUT_PAGE_SIZE, - order_by: OUTPUT_ORDER_BY, -}; - -const merge = (...objs) => _.merge({}, ...objs); - -function JobEventsApiService ($http, $q) { - this.init = (endpoint, params) => { - this.endpoint = endpoint; - this.params = merge(BASE_PARAMS, params); - - this.state = { count: 0, maxCounter: 0 }; - this.cache = {}; - }; - - this.fetch = () => this.getLast() - .then(results => { - this.cache.last = results; - - return this; - }); - - this.clearCache = () => { - Object.keys(this.cache).forEach(key => { - delete this.cache[key]; - }); - }; - - this.pushMaxCounter = events => { - const maxCounter = Math.max(...events.map(({ counter }) => counter)); - - if (maxCounter > this.state.maxCounter) { - this.state.maxCounter = maxCounter; - } - - return maxCounter; - }; - - this.getFirst = () => { - const params = merge(this.params, { page: 1 }); - - return $http.get(this.endpoint, { params }) - .then(({ data }) => { - const { results, count } = data; - - this.state.count = count; - this.pushMaxCounter(results); - - return results; - }); - }; - - this.getPage = number => { - if (number < 1 || number > this.getLastPageNumber()) { - return $q.resolve([]); - } - - const params = merge(this.params, { page: number }); - - return $http.get(this.endpoint, { params }) - .then(({ data }) => { - const { results, count } = data; - - this.state.count = count; - this.pushMaxCounter(results); - - return results; - }); - }; - - this.getLast = () => { - if (this.cache.last) { - return $q.resolve(this.cache.last); - } - - const params = merge(this.params, { page: 1, order_by: `-${OUTPUT_ORDER_BY}` }); - - return $http.get(this.endpoint, { params }) - .then(({ data }) => { - const { results, count } = data; - - let rotated = results; - - if (count > OUTPUT_PAGE_SIZE) { - rotated = results.splice(count % OUTPUT_PAGE_SIZE); - - if (results.length > 0) { - rotated = results; - } - } - - this.state.count = count; - this.pushMaxCounter(results); - - return rotated; - }); - }; - - this.getRange = range => { - if (!range) { - return $q.resolve([]); - } - - const [low, high] = range; - - if (low > high) { - return $q.resolve([]); - } - - const params = merge(this.params, { counter__gte: [low], counter__lte: [high] }); - - params.page_size = API_MAX_PAGE_SIZE; - - return $http.get(this.endpoint, { params }) - .then(({ data }) => { - const { results } = data; - - this.pushMaxCounter(results); - - return results; - }); - }; - - this.getLastPageNumber = () => Math.ceil(this.state.count / OUTPUT_PAGE_SIZE); - this.getMaxCounter = () => this.state.maxCounter; -} - -JobEventsApiService.$inject = ['$http', '$q']; - -export default JobEventsApiService; diff --git a/awx/ui/client/features/output/constants.js b/awx/ui/client/features/output/constants.js deleted file mode 100644 index d82bafd17c..0000000000 --- a/awx/ui/client/features/output/constants.js +++ /dev/null @@ -1,51 +0,0 @@ -export const API_MAX_PAGE_SIZE = 200; -export const API_ROOT = '/api/v2/'; - -export const EVENT_START_TASK = 'playbook_on_task_start'; -export const EVENT_START_PLAY = 'playbook_on_play_start'; -export const EVENT_START_PLAYBOOK = 'playbook_on_start'; -export const EVENT_STATS_PLAY = 'playbook_on_stats'; - -export const HOST_STATUS_KEYS = ['dark', 'failures', 'changed', 'ok', 'skipped']; - -export const JOB_STATUS_COMPLETE = ['successful', 'failed', 'unknown']; -export const JOB_STATUS_INCOMPLETE = ['canceled', 'error']; -export const JOB_STATUS_UNSUCCESSFUL = ['failed'].concat(JOB_STATUS_INCOMPLETE); -export const JOB_STATUS_FINISHED = JOB_STATUS_COMPLETE.concat(JOB_STATUS_INCOMPLETE); - -export const OUTPUT_ANSI_COLORMAP = { - 0: '#000', - 1: '#A00', - 2: '#080', - 3: '#F0AD4E', - 4: '#00A', - 5: '#A0A', - 6: '#0AA', - 7: '#AAA', - 8: '#555', - 9: '#F55', - 10: '#5F5', - 11: '#FF5', - 12: '#55F', - 13: '#F5F', - 14: '#5FF', - 15: '#FFF' -}; -export const OUTPUT_ELEMENT_CONTAINER = '.at-Stdout-container'; -export const OUTPUT_ELEMENT_TBODY = '#atStdoutResultTable'; -export const OUTPUT_ELEMENT_LAST = '#atStdoutMenuLast'; -export const OUTPUT_MAX_BUFFER_LENGTH = 1000; -export const OUTPUT_MAX_LAG = 120; -export const OUTPUT_NO_COUNT_JOB_TYPES = ['ad_hoc_command', 'system_job', 'inventory_update']; -export const OUTPUT_ORDER_BY = 'start_line'; -export const OUTPUT_PAGE_CACHE = true; -export const OUTPUT_PAGE_LIMIT = 5; -export const OUTPUT_PAGE_SIZE = 50; -export const OUTPUT_SCROLL_DELAY = 100; -export const OUTPUT_SCROLL_THRESHOLD = 0.1; -export const OUTPUT_SEARCH_DOCLINK = 'https://docs.ansible.com/ansible-tower/latest/html/userguide/search_sort.html'; -export const OUTPUT_SEARCH_FIELDS = ['changed', 'created', 'failed', 'host_name', 'stdout', 'task', 'role', 'playbook', 'play', 'start_line', 'end_line']; -export const OUTPUT_SEARCH_KEY_EXAMPLES = ['host_name:localhost', 'task:set', 'created:>=2000-01-01', 'start_line:>=9000']; -export const OUTPUT_EVENT_LIMIT = OUTPUT_PAGE_LIMIT * OUTPUT_PAGE_SIZE; - -export const WS_PREFIX = 'ws'; diff --git a/awx/ui/client/features/output/details.component.js b/awx/ui/client/features/output/details.component.js deleted file mode 100644 index 8f1c8ef361..0000000000 --- a/awx/ui/client/features/output/details.component.js +++ /dev/null @@ -1,935 +0,0 @@ -const templateUrl = require('~features/output/details.partial.html'); - -let $http; -let $filter; -let $state; - -let error; -let parse; -let prompt; -let resource; -let strings; -let wait; - -let vm; - -function mapChoices (choices) { - if (!choices) return {}; - return Object.assign(...choices.map(([k, v]) => ({ [k]: v }))); -} - -function getStatusDetails (jobStatus) { - const unmapped = jobStatus || resource.model.get('status'); - - if (!unmapped) { - return null; - } - - const choices = mapChoices(resource.model.options('actions.GET.status.choices')); - const label = strings.get('labels.STATUS'); - - let icon; - let value; - - if (unmapped === 'unknown') { - icon = 'fa icon-job-pending'; - value = strings.get('details.UNKNOWN'); - } else { - icon = `fa icon-job-${unmapped}`; - value = choices[unmapped]; - } - - return { unmapped, label, icon, value }; -} - -function getStartDetails (started) { - const unfiltered = started || resource.model.get('started'); - const label = strings.get('labels.STARTED'); - - let value; - - if (unfiltered) { - value = $filter('longDate')(unfiltered); - } else { - value = strings.get('details.NOT_STARTED'); - } - - return { label, value }; -} - -function getFinishDetails (finished) { - const unfiltered = finished || resource.model.get('finished'); - const label = strings.get('labels.FINISHED'); - - let value; - - if (unfiltered) { - value = $filter('longDate')(unfiltered); - } else { - value = strings.get('details.NOT_FINISHED'); - } - - return { label, value }; -} - -function getModuleArgDetails () { - const value = resource.model.get('module_args'); - const label = strings.get('labels.MODULE_ARGS'); - - if (!value) { - return null; - } - - return { label, value }; -} - -function getJobTypeDetails () { - const unmapped = resource.model.get('job_type'); - - if (!unmapped) { - return null; - } - - const choices = mapChoices(resource.model.options('actions.GET.job_type.choices')); - - const label = strings.get('labels.JOB_TYPE'); - const value = choices[unmapped]; - - return { label, value }; -} - -function getVerbosityDetails () { - const verbosity = resource.model.get('verbosity'); - - if (!verbosity) { - return null; - } - - const choices = mapChoices(resource.model.options('actions.GET.verbosity.choices')); - - const label = strings.get('labels.VERBOSITY'); - const value = choices[verbosity]; - - return { label, value }; -} - -function getEnvironmentDetails (virtualenv) { - const customVirtualenv = virtualenv || resource.model.get('custom_virtualenv'); - - if (!customVirtualenv || customVirtualenv === '') { - return null; - } - - const label = strings.get('labels.ENVIRONMENT'); - const value = $filter('sanitize')(customVirtualenv); - - return { label, value }; -} - -function getSourceWorkflowJobDetails () { - const sourceWorkflowJob = resource.model.get('summary_fields.source_workflow_job'); - - if (!sourceWorkflowJob) { - return null; - } - - const label = strings.get('labels.SOURCE_WORKFLOW_JOB'); - const value = sourceWorkflowJob.name; - const link = `/#/workflows/${sourceWorkflowJob.id}`; - const tooltip = strings.get('tooltips.SOURCE_WORKFLOW_JOB'); - - return { label, value, link, tooltip }; -} - -function getSliceJobDetails () { - const count = resource.model.get('job_slice_count'); - - if (!count) { - return null; - } - - if (count === 1) { - return null; - } - - const number = resource.model.get('job_slice_number'); - - if (!number) { - return null; - } - - const label = strings.get('labels.SLICE_JOB'); - const offset = `${number}/${count}`; - const tooltip = strings.get('tooltips.SLICE_JOB_DETAILS'); - - if (label && offset && tooltip) { - return { label, offset, tooltip }; - } - return null; -} - -function getJobTemplateDetails () { - const jobTemplate = resource.model.get('summary_fields.job_template'); - - if (!jobTemplate) { - return null; - } - - const label = strings.get('labels.JOB_TEMPLATE'); - const link = `/#/templates/job_template/${jobTemplate.id}`; - const value = $filter('sanitize')(jobTemplate.name); - const tooltip = strings.get('tooltips.JOB_TEMPLATE'); - - return { label, link, value, tooltip }; -} - -function getInventorySourceDetails () { - if (!resource.model.has('summary_fields.inventory_source.source')) { - return null; - } - - if (resource.model.get('summary_fields.inventory_source.source') === 'scm') { - // we already show a SOURCE PROJECT item for scm inventory updates, so we - // skip the display of the standard source details item. - return null; - } - - const { source } = resource.model.get('summary_fields.inventory_source'); - const choices = mapChoices(resource.model.options('actions.GET.source.choices')); - - const label = strings.get('labels.SOURCE'); - const value = choices[source]; - - return { label, value }; -} - -function getOverwriteDetails () { - if (!resource.model.has('overwrite')) { - return null; - } - - const label = strings.get('labels.OVERWRITE'); - const value = resource.model.get('overwrite'); - - return { label, value }; -} - -function getOverwriteVarsDetails () { - if (!resource.model.has('overwrite_vars')) { - return null; - } - - const label = strings.get('labels.OVERWRITE_VARS'); - const value = resource.model.get('overwrite_vars'); - - return { label, value }; -} - -function getLicenseErrorDetails () { - if (!resource.model.has('license_error')) { - return null; - } - - const label = strings.get('labels.LICENSE_ERROR'); - const value = resource.model.get('license_error'); - - return { label, value }; -} - -function getHostLimitErrorDetails () { - if (!resource.model.has('org_host_limit_error')) { - return null; - } - - const label = strings.get('labels.HOST_LIMIT_ERROR'); - const tooltip = strings.get('tooltips.HOST_LIMIT'); - const value = resource.model.get('org_host_limit_error'); - - return { tooltip, label, value }; -} - -function getLaunchedByDetails () { - const createdBy = resource.model.get('summary_fields.created_by'); - const jobTemplate = resource.model.get('summary_fields.job_template'); - const workflowJobTemplate = resource.model.get('summary_fields.workflow_job_template'); - const relatedSchedule = resource.model.get('related.schedule'); - const schedule = resource.model.get('summary_fields.schedule'); - const launchType = resource.model.get('launch_type'); - - if (!createdBy && !schedule && !launchType) { - return null; - } - - const label = strings.get('labels.LAUNCHED_BY'); - - let link; - let tooltip; - let value; - - if (launchType === 'webhook' && jobTemplate) { - tooltip = strings.get('tooltips.WEBHOOK_JOB_TEMPLATE'); - link = `/#/templates/job_template/${jobTemplate.id}`; - value = strings.get('details.WEBHOOK'); - } else if (launchType === 'webhook' && workflowJobTemplate) { - tooltip = strings.get('tooltips.WEBHOOK_WORKFLOW_JOB_TEMPLATE'); - link = `/#/templates/workflow_job_template/${workflowJobTemplate.id}`; - value = strings.get('details.WEBHOOK'); - } else if (createdBy) { - tooltip = strings.get('tooltips.USER'); - link = `/#/users/${createdBy.id}`; - value = $filter('sanitize')(createdBy.username); - } else if (relatedSchedule && jobTemplate) { - tooltip = strings.get('tooltips.SCHEDULE'); - link = `/#/templates/job_template/${jobTemplate.id}/schedules/${schedule.id}`; - value = $filter('sanitize')(schedule.name); - } else if (schedule) { - tooltip = null; - link = null; - value = $filter('sanitize')(schedule.name); - } else { - return null; - } - - return { label, link, tooltip, value }; -} - -function getInventoryDetails () { - const inventory = resource.model.get('summary_fields.inventory'); - - if (!inventory) { - return null; - } - - const label = strings.get('labels.INVENTORY'); - const tooltip = strings.get('tooltips.INVENTORY'); - const value = $filter('sanitize')(inventory.name); - - let link; - - if (inventory.kind === 'smart') { - link = `/#/inventories/smart/${inventory.id}`; - } else { - link = `/#/inventories/inventory/${inventory.id}`; - } - - return { label, link, tooltip, value }; -} - -function getProjectDetails () { - const project = resource.model.get('summary_fields.project'); - - if (!project) { - return null; - } - - const label = strings.get('labels.PROJECT'); - const link = `/#/projects/${project.id}`; - const value = project.name; - const tooltip = strings.get('tooltips.PROJECT'); - - return { label, link, value, tooltip }; -} - -function getProjectStatusDetails (projectStatus) { - const project = resource.model.get('summary_fields.project'); - const jobStatus = projectStatus || resource.model.get('summary_fields.project_update.status'); - - if (!project) { - return null; - } - - return jobStatus; -} - -function getProjectUpdateDetails (updateId) { - const project = resource.model.get('summary_fields.project'); - const jobId = updateId || resource.model.get('summary_fields.project_update.id'); - - if (!project) { - return null; - } - - const link = `/#/jobs/project/${jobId}`; - const tooltip = strings.get('tooltips.PROJECT_UPDATE'); - - return { link, tooltip }; -} - -function getSCMBranchDetails (scmBranch) { - const label = strings.get('labels.SCM_BRANCH'); - const value = scmBranch || resource.model.get('scm_branch'); - - if (!value) { - return null; - } - - return { label, value }; -} - -function getSCMRefspecDetails (scmRefspec) { - const label = strings.get('labels.SCM_REFSPEC'); - const value = scmRefspec || resource.model.get('scm_refspec'); - - if (!value) { - return null; - } - - return { label, value }; -} - -function getInventoryScmDetails (updateId, updateStatus) { - const projectId = resource.model.get('summary_fields.source_project.id'); - const projectName = resource.model.get('summary_fields.source_project.name'); - const jobId = updateId || resource.model.get('source_project_update'); - const status = updateStatus || resource.model.get('summary_fields.inventory_source.status'); - - if (!projectId || !projectName) { - return null; - } - - const label = strings.get('labels.INVENTORY_SCM'); - const jobLink = `/#/jobs/project/${jobId}`; - const link = `/#/projects/${projectId}`; - const jobTooltip = strings.get('tooltips.INVENTORY_SCM_JOB'); - const tooltip = strings.get('tooltips.INVENTORY_SCM'); - const value = $filter('sanitize')(projectName); - - let icon; - - if (status === 'unknown') { - icon = 'fa icon-job-pending'; - } else { - icon = `fa icon-job-${status}`; - } - - return { label, link, icon, jobLink, jobTooltip, tooltip, value }; -} - -function getSCMRevisionDetails () { - const label = strings.get('labels.SCM_REVISION'); - const value = resource.model.get('scm_revision'); - - if (!value) { - return null; - } - - return { label, value }; -} - -function getPlaybookDetails () { - const label = strings.get('labels.PLAYBOOK'); - const value = resource.model.get('playbook'); - - if (!value) { - return null; - } - - return { label, value }; -} - -function getJobExplanationDetails () { - const explanation = resource.model.get('job_explanation'); - - if (!explanation) { - return null; - } - - const limit = 150; - const label = strings.get('labels.JOB_EXPLANATION'); - - let more = explanation; - - if (explanation.split(':')[0] === 'Previous Task Failed') { - const taskStringIndex = explanation.split(':')[0].length + 1; - const task = JSON.parse(explanation.substring(taskStringIndex)); - - more = `${task.job_type} failed for ${task.job_name} with ID ${task.job_id}`; - } - - const less = $filter('limitTo')(more, limit); - - const showMore = false; - const hasMoreToShow = more.length > limit; - - return { label, less, more, showMore, hasMoreToShow }; -} - -function getResultTracebackDetails (resultTraceback) { - const traceback = resultTraceback || resource.model.get('result_traceback'); - - if (!traceback) { - return null; - } - - const limit = 150; - const label = strings.get('labels.RESULT_TRACEBACK'); - - const more = traceback; - const less = $filter('limitTo')(more, limit); - - const showMore = false; - const hasMoreToShow = more.length > limit; - - return { label, less, more, showMore, hasMoreToShow }; -} - -function getCredentialDetails () { - let credentials = []; - let credentialTags = []; - - if (resource.model.get('type') === 'job') { - credentials = resource.model.get('summary_fields.credentials'); - } else { - const credential = resource.model.get('summary_fields.credential'); - if (credential) { - credentials.push(credential); - } - } - - if (!credentials || credentials.length < 1) { - return null; - } - - credentialTags = credentials.map((cred) => buildCredentialDetails(cred)); - - const label = strings.get('labels.CREDENTIAL'); - const value = credentialTags; - - return { label, value }; -} - -function buildCredentialDetails (credential) { - let icon; - if (credential.cloud) { - icon = 'cloud'; - } else { - icon = `${credential.kind}`; - } - - const link = `/#/credentials/${credential.id}`; - const tooltip = strings.get('tooltips.CREDENTIAL'); - const value = $filter('sanitize')(credential.name); - - return { icon, link, tooltip, value }; -} - -function getForkDetails () { - const label = strings.get('labels.FORKS'); - const value = resource.model.get('forks'); - - if (!value) { - return null; - } - - return { label, value }; -} - -function getLimitDetails () { - const label = strings.get('labels.LIMIT'); - const value = resource.model.get('limit'); - - if (!value) { - return null; - } - - return { label, value }; -} - -function getExecutionNodeDetails (node) { - const executionNode = node || resource.model.get('execution_node'); - - if (!executionNode) { - return null; - } - - const label = strings.get('labels.EXECUTION_NODE'); - const value = $filter('sanitize')(executionNode); - - return { label, value }; -} - -function getInstanceGroupDetails () { - const instanceGroup = resource.model.get('summary_fields.instance_group'); - - if (!instanceGroup) { - return null; - } - - const value = $filter('sanitize')(instanceGroup.name); - - let label = strings.get('labels.INSTANCE_GROUP'); - let link = `/#/instance_groups/${instanceGroup.id}`; - if (instanceGroup.is_containerized) { - label = strings.get('labels.CONTAINER_GROUP'); - link = `/#/instance_groups/container_group/${instanceGroup.id}`; - } - - let isolated = null; - if (instanceGroup.controller_id) { - isolated = strings.get('details.ISOLATED'); - } - - return { label, value, isolated, link }; -} - -function getJobTagDetails () { - const tagString = resource.model.get('job_tags'); - - let jobTags; - - if (tagString) { - jobTags = tagString.split(',').filter(tag => tag !== ''); - } else { - jobTags = []; - } - - if (jobTags.length < 1) { - return null; - } - - const label = strings.get('labels.JOB_TAGS'); - const more = false; - - const value = jobTags.map($filter('sanitize')); - - return { label, more, value }; -} - -function getSkipTagDetails () { - const tagString = resource.model.get('skip_tags'); - - let skipTags; - - if (tagString) { - skipTags = tagString.split(',').filter(tag => tag !== ''); - } else { - skipTags = []; - } - - if (skipTags.length < 1) { - return null; - } - - const more = false; - const label = strings.get('labels.SKIP_TAGS'); - const value = skipTags.map($filter('sanitize')); - - return { label, more, value }; -} - -function getExtraVarsDetails () { - const extraVars = resource.model.get('extra_vars'); - - if (!extraVars) { - return null; - } - - const label = strings.get('labels.EXTRA_VARS'); - const tooltip = strings.get('tooltips.EXTRA_VARS'); - const value = parse(extraVars); - const disabled = true; - const name = 'extra_vars'; - - return { label, tooltip, value, disabled, name }; -} - -function getArtifactsDetails (val) { - const artifacts = val || resource.model.get('artifacts'); - if (!artifacts || (Object.entries(artifacts).length === 0 && - artifacts.constructor === Object)) { - return null; - } - - const label = strings.get('labels.ARTIFACTS'); - const tooltip = strings.get('tooltips.ARTIFACTS'); - const value = parse(artifacts); - const disabled = true; - const name = 'artifacts'; - - return { label, tooltip, value, disabled, name }; -} - -function getLabelDetails () { - const jobLabels = _.get(resource.model.get('summary_fields.labels'), 'results', []); - - if (jobLabels.length < 1) { - return null; - } - - const label = strings.get('labels.LABELS'); - const more = false; - const value = jobLabels.map(({ name }) => name).map($filter('sanitize')); - const truncate = true; - const truncateLength = 5; - const hasMoreToShow = jobLabels.length > truncateLength; - - return { label, more, hasMoreToShow, value, truncate, truncateLength }; -} - -function createErrorHandler (path, action) { - return res => { - const hdr = strings.get('error.HEADER'); - const msg = strings.get('error.CALL', { path, action, status: res.status }); - - error(null, res.data, res.status, null, { hdr, msg }); - }; -} - -const ELEMENT_LABELS = '#job-results-labels'; -const ELEMENT_JOB_TAGS = '#job-results-job-tags'; -const ELEMENT_SKIP_TAGS = '#job-results-skip-tags'; -const ELEMENT_PROMPT_MODAL = '#prompt-modal'; -const TAGS_SLIDE_DISTANCE = 200; - -function showLabels () { - this.labels.truncate = !this.labels.truncate; - - const jobLabelsCount = _.get(resource.model.get('summary_fields.labels'), 'count'); - const maxCount = 50; - - if (this.labels.value.length === jobLabelsCount || this.labels.value.length >= maxCount) { - return; - } - - const config = { - params: { - page_size: maxCount - } - }; - - wait('start'); - resource.model.extend('get', 'labels', config) - .then((model) => { - const jobLabels = _.get(model.get('related.labels'), 'results', []); - this.labels.value = jobLabels.map(({ name }) => name).map($filter('sanitize')); - }) - .catch(createErrorHandler('get labels', 'GET')) - .finally(() => wait('stop')); -} - -function toggleLabels () { - if (!this.labels.more) { - $(ELEMENT_LABELS).slideUp(TAGS_SLIDE_DISTANCE); - this.labels.more = true; - } else { - $(ELEMENT_LABELS).slideDown(TAGS_SLIDE_DISTANCE); - this.labels.more = false; - } -} - -function toggleJobTags () { - if (!this.jobTags.more) { - $(ELEMENT_JOB_TAGS).slideUp(TAGS_SLIDE_DISTANCE); - this.jobTags.more = true; - } else { - $(ELEMENT_JOB_TAGS).slideDown(TAGS_SLIDE_DISTANCE); - this.jobTags.more = false; - } -} - -function toggleSkipTags () { - if (!this.skipTags.more) { - $(ELEMENT_SKIP_TAGS).slideUp(TAGS_SLIDE_DISTANCE); - this.skipTags.more = true; - } else { - $(ELEMENT_SKIP_TAGS).slideDown(TAGS_SLIDE_DISTANCE); - this.skipTags.more = false; - } -} - -function cancelJob () { - const actionText = strings.get('cancelJob.CANCEL_JOB'); - const hdr = strings.get('cancelJob.HEADER'); - const warning = strings.get('cancelJob.SUBMIT_REQUEST'); - const cancelText = strings.get('cancelJob.RETURN'); - - const id = resource.model.get('id'); - const name = $filter('sanitize')(resource.model.get('name')); - - const body = `
${warning}
`; - const resourceName = `#${id} ${name}`; - - const method = 'POST'; - const url = `${resource.model.path}${id}/cancel/`; - - const errorHandler = createErrorHandler('cancel job', method); - - const action = () => { - wait('start'); - $http({ method, url }) - .catch(errorHandler) - .finally(() => { - $(ELEMENT_PROMPT_MODAL).modal('hide'); - wait('stop'); - }); - }; - - prompt({ hdr, resourceName, body, actionText, action, cancelText }); -} - -function deleteJob () { - const actionText = strings.get('DELETE'); - const hdr = strings.get('deleteResource.HEADER'); - const warning = strings.get('deleteResource.CONFIRM', 'job'); - - const id = resource.model.get('id'); - const name = $filter('sanitize')(resource.model.get('name')); - - const body = `
${warning}
`; - const resourceName = `#${id} ${name}`; - - const method = 'DELETE'; - const url = `${resource.model.path}${id}/`; - - const errorHandler = createErrorHandler('delete job', method); - - const action = () => { - wait('start'); - $http({ method, url }) - .then(() => $state.go('jobs')) - .catch(errorHandler) - .finally(() => { - $(ELEMENT_PROMPT_MODAL).modal('hide'); - wait('stop'); - }); - }; - - prompt({ hdr, resourceName, body, actionText, action }); -} - -function JobDetailsController ( - _$http_, - _$filter_, - _$state_, - _error_, - _prompt_, - _strings_, - _wait_, - _parse_, - { subscribe }, -) { - vm = this || {}; - - $http = _$http_; - $filter = _$filter_; - $state = _$state_; - error = _error_; - - parse = _parse_; - prompt = _prompt_; - strings = _strings_; - wait = _wait_; - - let unsubscribe; - - vm.$onInit = () => { - resource = this.resource; // eslint-disable-line prefer-destructuring - vm.strings = strings; - - vm.status = getStatusDetails(); - vm.started = getStartDetails(); - vm.finished = getFinishDetails(); - vm.moduleArgs = getModuleArgDetails(); - vm.jobType = getJobTypeDetails(); - vm.jobTemplate = getJobTemplateDetails(); - vm.sourceWorkflowJob = getSourceWorkflowJobDetails(); - vm.sliceJobDetails = getSliceJobDetails(); - vm.inventory = getInventoryDetails(); - vm.project = getProjectDetails(); - vm.projectUpdate = getProjectUpdateDetails(); - vm.projectStatus = getProjectStatusDetails(); - vm.scmBranch = getSCMBranchDetails(); - vm.scmRefspec = getSCMRefspecDetails(); - vm.scmRevision = getSCMRevisionDetails(); - vm.inventoryScm = getInventoryScmDetails(); - vm.playbook = getPlaybookDetails(); - vm.resultTraceback = getResultTracebackDetails(); - vm.launchedBy = getLaunchedByDetails(); - vm.jobExplanation = getJobExplanationDetails(); - vm.verbosity = getVerbosityDetails(); - vm.environment = getEnvironmentDetails(); - vm.credentials = getCredentialDetails(); - vm.forks = getForkDetails(); - vm.limit = getLimitDetails(); - vm.executionNode = getExecutionNodeDetails(); - vm.instanceGroup = getInstanceGroupDetails(); - vm.jobTags = getJobTagDetails(); - vm.skipTags = getSkipTagDetails(); - vm.extraVars = getExtraVarsDetails(); - vm.artifacts = getArtifactsDetails(); - vm.labels = getLabelDetails(); - vm.inventorySource = getInventorySourceDetails(); - vm.overwrite = getOverwriteDetails(); - vm.overwriteVars = getOverwriteVarsDetails(); - vm.licenseError = getLicenseErrorDetails(); - vm.hostLimitError = getHostLimitErrorDetails(); - - // Relaunch and Delete Components - vm.job = angular.copy(_.get(resource.model, 'model.GET', {})); - vm.canDelete = resource.model.get('summary_fields.user_capabilities.delete'); - - vm.cancelJob = cancelJob; - vm.deleteJob = deleteJob; - vm.toggleJobTags = toggleJobTags; - vm.toggleSkipTags = toggleSkipTags; - vm.toggleLabels = toggleLabels; - vm.showLabels = showLabels; - - unsubscribe = subscribe(({ - status, - started, - finished, - scm, - scmBranch, - scmRefspec, - inventoryScm, - scmRevision, - instanceGroup, - environment, - artifacts, - executionNode, - resultTraceback - }) => { - vm.started = getStartDetails(started); - vm.finished = getFinishDetails(finished); - vm.projectUpdate = getProjectUpdateDetails(scm.id); - vm.projectStatus = getProjectStatusDetails(scm.status); - vm.scmBranch = getSCMBranchDetails(scmBranch); - vm.scmRefspec = getSCMRefspecDetails(scmRefspec); - vm.environment = getEnvironmentDetails(environment); - vm.artifacts = getArtifactsDetails(artifacts); - vm.executionNode = getExecutionNodeDetails(executionNode); - vm.inventoryScm = getInventoryScmDetails(inventoryScm.id, inventoryScm.status); - vm.resultTraceback = getResultTracebackDetails(resultTraceback); - vm.scmRevision = getSCMRevisionDetails(scmRevision); - vm.instanceGroup = getInstanceGroupDetails(instanceGroup); - vm.status = getStatusDetails(status); - vm.job.status = status; - }); - }; - - vm.$onDestroy = () => { - unsubscribe(); - }; -} - -JobDetailsController.$inject = [ - '$http', - '$filter', - '$state', - 'ProcessErrors', - 'Prompt', - 'OutputStrings', - 'Wait', - 'ParseVariableString', - 'OutputStatusService', -]; - -export default { - templateUrl, - controller: JobDetailsController, - controllerAs: 'vm', - bindings: { - resource: '<' - }, -}; diff --git a/awx/ui/client/features/output/details.partial.html b/awx/ui/client/features/output/details.partial.html deleted file mode 100644 index abcb281298..0000000000 --- a/awx/ui/client/features/output/details.partial.html +++ /dev/null @@ -1,479 +0,0 @@ - - -
-
{{:: vm.strings.get('details.HEADER')}}
- -
- - - - - - - - -
-
- - - -
- -
- - {{ vm.status.value }} -
-
- - -
- -
- {{ vm.jobExplanation.less }} - ... - - {{:: vm.strings.get('details.SHOW_MORE') }} - -
-
- {{ vm.jobExplanation.more }} - - {{:: vm.strings.get('details.SHOW_LESS') }} - -
-
- - -
- -
- {{ vm.licenseError.value }} -
-
- - -
- -
- {{ vm.hostLimitError.value }} -
-
- - -
- -
- {{ vm.started.value }} -
-
- - -
- -
- {{ vm.finished.value }} -
-
- - -
- -
{{ vm.moduleArgs.value }}
-
- - -
- -
- {{ vm.resultTraceback.less }} - ... - - {{:: vm.strings.get('details.SHOW_MORE') }} - -
-
- {{ vm.resultTraceback.more }} - - {{:: vm.strings.get('details.SHOW_LESS') }} - -
-
- - -
- -
- - {{ vm.jobTemplate.value }} - - - - W - -
-
- - -
- -
{{ vm.jobType.value }}
-
- - -
- -
{{ vm.sliceJobDetails.offset }}
-
- - -
- -
- - {{ vm.launchedBy.value }} - -
-
- {{ vm.launchedBy.value }} -
-
- - -
- -
- - {{ vm.inventory.value }} - -
-
- - -
- -
- - - - - {{ vm.project.value }} - -
-
- - -
- -
{{ vm.scmBranch.value }}
-
- - -
- -
{{ vm.scmRefspec.value }}
-
- - -
- -
- - - - - - - - {{ vm.inventoryScm.value }} - - -
-
- - -
- - -
- - -
- -
{{ vm.playbook.value }}
-
- - -
- -
- - -
-
- - -
- -
- {{ vm.inventorySource.value }} -
-
- - -
- -
- {{ vm.overwrite.value }} -
-
- - -
- -
- {{ vm.overwriteVars.value }} -
-
- - -
- -
{{ vm.forks.value }}
-
- - -
- -
{{ vm.limit.value }}
-
- - -
- -
{{ vm.verbosity.value }}
-
- - -
- -
{{ vm.environment.value }}
-
- - -
- -
{{ vm.executionNode.value }}
-
- - -
- -
- - {{ vm.instanceGroup.value }} - - - {{ vm.instanceGroup.isolated }} - -
-
- - -
- -
- - {{ vm.sourceWorkflowJob.value }} - -
-
- - - - - - - - - - -
-
- - {{ vm.labels.label }} - - - - {{ vm.labels.label }} - - -
-
-
-
-
{{ label }}
-
- - {{:: vm.strings.get('details.SHOW_MORE') }} - -
-
-
-
{{ label }}
-
- - {{:: vm.strings.get('details.SHOW_LESS') }} - -
-
-
- - -
-
- - {{ vm.jobTags.label }} - - - - {{ vm.jobTags.label }} - - -
-
-
-
{{ tag }}
-
-
-
- - -
-
- - {{ vm.skipTags.label }} - - - - {{ vm.skipTags.label }} - - -
-
-
-
{{ tag }}
-
-
-
diff --git a/awx/ui/client/features/output/host-event/_index.less b/awx/ui/client/features/output/host-event/_index.less deleted file mode 100644 index f93f80a56d..0000000000 --- a/awx/ui/client/features/output/host-event/_index.less +++ /dev/null @@ -1,193 +0,0 @@ -.noselect { - -webkit-touch-callout: none; /* iOS Safari */ - -webkit-user-select: none; /* Chrome/Safari/Opera */ - -khtml-user-select: none; /* Konqueror */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* Internet Explorer/Edge */ - user-select: none; /* Non-prefixed version, currently - not supported by any browser */ -} - -@media screen and (min-width: 768px){ - .HostEvent .modal-dialog{ - width: 700px; - } -} -.HostEvent .CodeMirror{ - overflow-x: hidden; - max-height: none!important; -} - -.HostEvent-close:hover{ - color: @btn-txt; - background-color: @btn-bg-hov; -} - -.HostEvent-body{ - margin-bottom: 20px; -} -.HostEvent-tab { - color: @btn-txt; - background-color: @btn-bg; - font-size: 12px; - border: 1px solid @btn-bord; - height: 30px; - border-radius: 5px; - margin-right: 20px; - padding-left: 10px; - padding-right: 10px; - padding-bottom: 5px; - padding-top: 5px; - transition: background-color 0.2s; - text-transform: uppercase; - text-align: center; - white-space: nowrap; - .noselect; -} -.HostEvent-tab:hover { - color: @btn-txt; - background-color: @btn-bg-hov; - cursor: pointer; -} -.HostEvent-tab--selected{ - color: @btn-txt-sel!important; - background-color: @default-icon!important; - border-color: @default-icon!important; -} -.HostEvent-view--container{ - width: 100%; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: space-between; -} -.HostEvent .modal-footer{ - border: 0; - margin-top: 0px; - padding-top: 5px; -} -.HostEvent-controls{ - float: right; - button { - margin-left: 10px; - } -} -.HostEvent-status--ok{ - color: @green; -} -.HostEvent-status--unreachable{ - color: @unreachable; -} -.HostEvent-status--changed{ - color: @changed; -} -.HostEvent-status--failed{ - color: @default-err; -} -.HostEvent-status--skipped{ - color: @skipped; -} -.HostEvent-header{ - padding-bottom: 15px; -} -.HostEvent-title{ - color: @default-interface-txt; - font-weight: 600; - margin-bottom: 8px; -} -.HostEvent .modal-body{ - padding: 0px!important; - overflow-y: auto; -} -.HostEvent-nav{ - padding-top: 12px; - padding-bottom: 20px; -} -.HostEvent-field{ - margin-bottom: 8px; - flex: 0 1 12em; -} -.HostEvent-field--label{ - text-transform: uppercase; - flex: 0 1 80px; - max-width: 80px; - min-width: 80px; - font-size: 12px; - word-wrap: break-word; -} -.HostEvent-field{ - .OnePlusTwo-left--detailsRow; -} -.HostEvent-field--content{ - word-wrap: break-word; -} -.HostEvent-field--monospaceContent{ - font-family: monospace; -} -.HostEvent-button:disabled { - pointer-events: all!important; -} - -.HostEvent-stdout{ - height:200px; - width:100% -} - -.HostEvent-stdoutContainer { - height:200px; - overflow-y: scroll; - overflow-x: hidden; - border-radius: 5px; - border: 1px solid #ccc; - font-style: normal; - background-color: @default-no-items-bord; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; -} - -.HostEvent-numberColumnPreload { - background-color: @default-list-header-bg; - height: 198px; - border-right: 1px solid #ccc; - width: 30px; - position: fixed; -} - -.HostEvent-numberColumn { - background-color: @default-list-header-bg; - border-right: 1px solid #ccc; - border-bottom-left-radius: 5px; - color: #999; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - position: fixed; - padding: 4px 3px 0 5px; - text-align: right; - white-space: nowrap; - width: 30px; -} - -.HostEvent-numberColumn--second{ - padding-top:0px; -} - -.HostEvent-stdoutColumn{ - overflow-y: hidden; - overflow-x: auto; - margin-left: 46px; - padding-top: 4px; - white-space: pre-wrap; - word-break: break-all; - word-wrap: break-word; -} - -.HostEvent-noJson{ - align-items: center; - background-color: @default-no-items-bord; - border: 1px solid @default-icon-hov; - border-radius: 5px; - color: @b7grey; - display: flex; - height: 200px; - justify-content: center; - text-transform: uppercase; - width: 100%; -} diff --git a/awx/ui/client/features/output/host-event/host-event-codemirror.partial.html b/awx/ui/client/features/output/host-event/host-event-codemirror.partial.html deleted file mode 100644 index e766c768a5..0000000000 --- a/awx/ui/client/features/output/host-event/host-event-codemirror.partial.html +++ /dev/null @@ -1,3 +0,0 @@ - -
No JSON data returned by the module
diff --git a/awx/ui/client/features/output/host-event/host-event-modal.partial.html b/awx/ui/client/features/output/host-event/host-event-modal.partial.html deleted file mode 100644 index 1557334d04..0000000000 --- a/awx/ui/client/features/output/host-event/host-event-modal.partial.html +++ /dev/null @@ -1,70 +0,0 @@ - diff --git a/awx/ui/client/features/output/host-event/host-event-stderr.partial.html b/awx/ui/client/features/output/host-event/host-event-stderr.partial.html deleted file mode 100644 index e775d17681..0000000000 --- a/awx/ui/client/features/output/host-event/host-event-stderr.partial.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
-
1
-
-
-
- diff --git a/awx/ui/client/features/output/host-event/host-event-stdout.partial.html b/awx/ui/client/features/output/host-event/host-event-stdout.partial.html deleted file mode 100644 index 96df87b163..0000000000 --- a/awx/ui/client/features/output/host-event/host-event-stdout.partial.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
-
1
-
-
-
- diff --git a/awx/ui/client/features/output/host-event/host-event.controller.js b/awx/ui/client/features/output/host-event/host-event.controller.js deleted file mode 100644 index 87f698db9d..0000000000 --- a/awx/ui/client/features/output/host-event/host-event.controller.js +++ /dev/null @@ -1,177 +0,0 @@ -function HostEventsController ( - $scope, - $state, - $filter, - HostEventService, - hostEvent, - OutputStrings -) { - $scope.processEventStatus = HostEventService.processEventStatus; - $scope.processResults = processResults; - $scope.isActiveState = isActiveState; - $scope.getActiveHostIndex = getActiveHostIndex; - $scope.closeHostEvent = closeHostEvent; - $scope.strings = OutputStrings; - - const sanitize = $filter('sanitize'); - - function init () { - hostEvent.event_name = hostEvent.event; - $scope.event = _.cloneDeep(hostEvent); - - // grab standard out & standard error if present from the host - // event's 'res' object, for things like Ansible modules. Small - // wrinkle in this implementation is that the stdout/stderr tabs - // should be shown if the `res` object has stdout/stderr keys, even - // if they're a blank string. The presence of these keys is - // potentially significant to a user. - if (_.has(hostEvent.event_data, 'task_action')) { - $scope.module_name = hostEvent.event_data.task_action; - } else if (!_.has(hostEvent.event_data, 'task_action')) { - $scope.module_name = 'No result found'; - } - - if (_.has(hostEvent.event_data, 'res.stdout')) { - if (hostEvent.event_data.res.stdout === '') { - $scope.stdout = ' '; - } else { - $scope.stdout = sanitize(hostEvent.event_data.res.stdout); - } - } - - if (_.has(hostEvent.event_data, 'res.stderr')) { - if (hostEvent.event_data.res.stderr === '') { - $scope.stderr = ' '; - } else { - $scope.stderr = sanitize(hostEvent.event_data.res.stderr); - } - } - - if (_.has(hostEvent.event_data, 'res')) { - $scope.json = hostEvent.event_data.res; - } - - if ($scope.module_name === 'debug' && - _.has(hostEvent.event_data, 'res.result.stdout')) { - $scope.stdout = sanitize(hostEvent.event_data.res.result.stdout); - } - if ($scope.module_name === 'yum' && - _.has(hostEvent.event_data, 'res.results') && - _.isArray(hostEvent.event_data.res.results)) { - const event = hostEvent.event_data.res.results; - $scope.stdout = sanitize(event[0]);// eslint-disable-line prefer-destructuring - } - // instantiate Codemirror - if ($state.current.name === 'output.host-event.json') { - try { - if (_.has(hostEvent.event_data, 'res')) { - initCodeMirror( - 'HostEvent-codemirror', - JSON.stringify($scope.json, null, 4), - { name: 'javascript', json: true } - ); - resize(); - } else { - $scope.no_json = true; - } - } catch (err) { - // element with id HostEvent-codemirror is not the view - // controlled by this instance of HostEventController - } - } else if ($state.current.name === 'output.host-event.stdout') { - try { - resize(); - } catch (err) { - // element with id HostEvent-codemirror is not the view - // controlled by this instance of HostEventController - } - } else if ($state.current.name === 'output.host-event.stderr') { - try { - resize(); - } catch (err) { - // element with id HostEvent-codemirror is not the view - // controlled by this instance of HostEventController - } - } - $('#HostEvent').modal('show'); - $('.modal-content').resizable({ - minHeight: 523, - minWidth: 600 - }); - $('.modal-dialog').draggable({ - cancel: '.HostEvent-view--container' - }); - - function resize () { - if ($state.current.name === 'output.host-event.json') { - const editor = $('.CodeMirror')[0].CodeMirror; - const height = $('.modal-dialog').height() - $('.HostEvent-header').height() - $('.HostEvent-details').height() - $('.HostEvent-nav').height() - $('.HostEvent-controls').height() - 120; - editor.setSize('100%', height); - } else if ($state.current.name === 'output.host-event.stdout' || $state.current.name === 'output.host-event.stderr') { - const height = $('.modal-dialog').height() - $('.HostEvent-header').height() - $('.HostEvent-details').height() - $('.HostEvent-nav').height() - $('.HostEvent-controls').height() - 120; - $('.HostEvent-stdout').width('100%'); - $('.HostEvent-stdout').height(height); - $('.HostEvent-stdoutContainer').height(height); - $('.HostEvent-numberColumnPreload').height(height); - } - } - - $('.modal-dialog').on('resize', resize); - - $('#HostEvent').on('hidden.bs.modal', $scope.closeHostEvent); - } - - function processResults (value) { - if (typeof value === 'object') { - return false; - } - return true; - } - - function initCodeMirror (el, data, mode) { - const container = document.getElementById(el); - const options = {}; - options.lineNumbers = true; - options.mode = mode; - options.readOnly = true; - options.scrollbarStyle = null; - const editor = CodeMirror.fromTextArea(// eslint-disable-line no-undef - container, - options - ); - editor.setSize('100%', 200); - editor.getDoc().setValue(data); - } - - function isActiveState (name) { - return $state.current.name === name; - } - - function getActiveHostIndex () { - function hostResultfilter (obj) { - return obj.id === $scope.event.id; - } - const result = $scope.hostResults.filter(hostResultfilter); - return $scope.hostResults.indexOf(result[0]); - } - - function closeHostEvent () { - // Unbind the listener so it doesn't fire when we close the modal via navigation - $('#HostEvent').off('hidden.bs.modal'); - $('#HostEvent').modal('hide'); - $state.go('output'); - } - $scope.init = init; - $scope.init(); -} - -HostEventsController.$inject = [ - '$scope', - '$state', - '$filter', - 'HostEventService', - 'hostEvent', - 'OutputStrings' -]; - -module.exports = HostEventsController; diff --git a/awx/ui/client/features/output/host-event/host-event.route.js b/awx/ui/client/features/output/host-event/host-event.route.js deleted file mode 100644 index aba9273327..0000000000 --- a/awx/ui/client/features/output/host-event/host-event.route.js +++ /dev/null @@ -1,72 +0,0 @@ -const HostEventModalTemplate = require('~features/output/host-event/host-event-modal.partial.html'); -const HostEventCodeMirrorTemplate = require('~features/output/host-event/host-event-codemirror.partial.html'); -const HostEventStdoutTemplate = require('~features/output/host-event/host-event-stdout.partial.html'); -const HostEventStderrTemplate = require('~features/output/host-event/host-event-stderr.partial.html'); - -function exit () { - // close the modal - // using an onExit event to handle cases where the user navs away - // using the url bar / back and not modal "X" - $('#HostEvent').modal('hide'); - // hacky way to handle user browsing away via URL bar - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); -} - -function HostEventResolve (HostEventService, $stateParams) { - return HostEventService.getRelatedJobEvents($stateParams.id, $stateParams.type, { - id: $stateParams.eventId - }).then((response) => response.data.results[0]); -} - -HostEventResolve.$inject = [ - 'HostEventService', - '$stateParams', -]; - -const hostEventModal = { - name: 'output.host-event', - url: '/host-event/:eventId', - controller: 'HostEventsController', - templateUrl: HostEventModalTemplate, - abstract: false, - ncyBreadcrumb: { - skip: true - }, - resolve: { - hostEvent: HostEventResolve - }, - onExit: exit -}; - -const hostEventJson = { - name: 'output.host-event.json', - url: '/json', - controller: 'HostEventsController', - templateUrl: HostEventCodeMirrorTemplate, - ncyBreadcrumb: { - skip: true - }, -}; - -const hostEventStdout = { - name: 'output.host-event.stdout', - url: '/stdout', - controller: 'HostEventsController', - templateUrl: HostEventStdoutTemplate, - ncyBreadcrumb: { - skip: true - }, -}; - -const hostEventStderr = { - name: 'output.host-event.stderr', - url: '/stderr', - controller: 'HostEventsController', - templateUrl: HostEventStderrTemplate, - ncyBreadcrumb: { - skip: true - }, -}; - -export { hostEventJson, hostEventModal, hostEventStdout, hostEventStderr }; diff --git a/awx/ui/client/features/output/host-event/host-event.service.js b/awx/ui/client/features/output/host-event/host-event.service.js deleted file mode 100644 index 4709c1055f..0000000000 --- a/awx/ui/client/features/output/host-event/host-event.service.js +++ /dev/null @@ -1,92 +0,0 @@ -function HostEventService ( - Rest, - ProcessErrors, - GetBasePath, - $rootScope -) { - this.getUrl = (id, type, params) => { - const queryString = this.stringifyParams(params); - - let baseUrl; - let related; - - if (type === 'playbook') { - baseUrl = GetBasePath('jobs'); - related = 'job_events'; - } - - if (type === 'command') { - baseUrl = GetBasePath('ad_hoc_commands'); - related = 'events'; - } - - if (type === 'project') { - baseUrl = GetBasePath('project_updates'); - related = 'events'; - } - - return `${baseUrl}${id}/${related}/?${queryString}`; - }; - - // GET events related to a job run - // e.g. - // ?event=playbook_on_stats - // ?parent=206&event__startswith=runner&page_size=200&order=host_name,counter - this.getRelatedJobEvents = (id, type, params) => { - const url = this.getUrl(id, type, params); - Rest.setUrl(url); - return Rest.get() - .then(response => response) - .catch(({ data, status }) => { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: `Call to ${url}. GET returned: ${status}` }); - }); - }; - - this.stringifyParams = params => { - function reduceFunction (result, value, key) { - return `${result}${key}=${value}&`; - } - return _.reduce(params, reduceFunction, ''); - }; - - // Generate a helper class for job_event statuses - // the stack for which status to display is - // unreachable > failed > changed > ok - // uses the API's runner events and convenience properties .failed .changed to determine status. - // see: job_event_callback.py for more filters to support - this.processEventStatus = event => { - const obj = {}; - if (event.event === 'runner_on_unreachable') { - obj.class = 'HostEvent-status--unreachable'; - obj.status = 'unreachable'; - } - // equiv to 'runner_on_error' && 'runner on failed' - if (event.failed) { - obj.class = 'HostEvent-status--failed'; - obj.status = 'failed'; - } - if (event.event === 'runner_on_ok' || event.event === 'runner_on_async_ok') { - obj.class = 'HostEvent-status--ok'; - obj.status = 'ok'; - } - // if both 'changed' and 'ok' are true, show 'changed' status - if (event.changed) { - obj.class = 'HostEvent-status--changed'; - obj.status = 'changed'; - } - if (event.event === 'runner_on_skipped') { - obj.class = 'HostEvent-status--skipped'; - obj.status = 'skipped'; - } - return obj; - }; -} - -HostEventService.$inject = [ - 'Rest', - 'ProcessErrors', - 'GetBasePath', - '$rootScope' -]; -export default HostEventService; diff --git a/awx/ui/client/features/output/host-event/index.js b/awx/ui/client/features/output/host-event/index.js deleted file mode 100644 index f00b0b36b4..0000000000 --- a/awx/ui/client/features/output/host-event/index.js +++ /dev/null @@ -1,26 +0,0 @@ -import { - hostEventModal, - hostEventJson, - hostEventStdout, - hostEventStderr -} from './host-event.route'; -import controller from './host-event.controller'; -import service from './host-event.service'; - -const MODULE_NAME = 'hostEvents'; - -function hostEventRun ($stateExtender) { - $stateExtender.addState(hostEventModal); - $stateExtender.addState(hostEventJson); - $stateExtender.addState(hostEventStdout); - $stateExtender.addState(hostEventStderr); -} -hostEventRun.$inject = [ - '$stateExtender' -]; - -angular.module(MODULE_NAME, []) - .controller('HostEventsController', controller) - .service('HostEventService', service) - .run(hostEventRun); -export default MODULE_NAME; diff --git a/awx/ui/client/features/output/index.controller.js b/awx/ui/client/features/output/index.controller.js deleted file mode 100644 index 7f171f728a..0000000000 --- a/awx/ui/client/features/output/index.controller.js +++ /dev/null @@ -1,881 +0,0 @@ -/* eslint camelcase: 0 */ -import { - EVENT_START_PLAY, - EVENT_START_TASK, - OUTPUT_ELEMENT_LAST, - OUTPUT_PAGE_SIZE, -} from './constants'; - -let $q; -let $scope; -let $state; - -let resource; -let render; -let scroll; -let status; -let slide; -let stream; -let page; - -let vm; -const listeners = []; -let lockFrames = false; - -function onFrames (events) { - events = slide.pushFrames(events); - - if (lockFrames) { - return $q.resolve(); - } - - const popCount = events.length - render.getCapacity(); - - if (!vm.isFollowing && canStartFollowing()) { - startFollowing(); - } - - if (!vm.isFollowing && popCount > 0) { - return $q.resolve(); - } - - scroll.pause(); - - if (vm.isFollowing) { - scroll.scrollToBottom(); - } - - return render.popBack(popCount) - .then(() => { - if (vm.isFollowing) { - scroll.scrollToBottom(); - } - - return render.pushFront(events); - }) - .then(() => { - if (vm.isFollowing) { - scroll.scrollToBottom(); - } - - scroll.resume(); - - return $q.resolve(); - }); -} - -// -// Menu Controls (Running) -// - -function firstRange () { - if (scroll.isPaused()) { - return $q.resolve(); - } - - stopFollowing(); - lockFollow = true; - - if (slide.isOnFirstPage()) { - scroll.resetScrollPosition(); - - return $q.resolve(); - } - - scroll.pause(); - lockFrames = true; - - return render.clear() - .then(() => slide.getFirst()) - .then(results => render.pushFront(results)) - .then(() => slide.getNext()) - .then(results => { - const popCount = results.length - render.getCapacity(); - - return render.popBack(popCount) - .then(() => render.pushFront(results)); - }) - .finally(() => { - render.compile(); - scroll.resume(); - lockFollow = false; - }); -} - -function nextRange () { - if (vm.isFollowing) { - scroll.scrollToBottom(); - - return $q.resolve(); - } - - if (scroll.isPaused()) { - return $q.resolve(); - } - - scroll.pause(); - lockFrames = true; - - return slide.getNext() - .then(results => { - const popCount = results.length - render.getCapacity(); - - return render.popBack(popCount) - .then(() => render.pushFront(results)); - }) - .finally(() => { - render.compile(); - scroll.resume(); - lockFrames = false; - - return $q.resolve(); - }); -} - -function previousRange () { - if (scroll.isPaused()) { - return $q.resolve(); - } - - scroll.pause(); - stopFollowing(); - lockFrames = true; - - let initialPosition; - let popHeight; - - return slide.getPrevious() - .then(results => { - const popCount = results.length - render.getCapacity(); - initialPosition = scroll.getScrollPosition(); - - return render.popFront(popCount) - .then(() => { - popHeight = scroll.getScrollHeight(); - - return render.pushBack(results); - }); - }) - .then(() => { - const currentHeight = scroll.getScrollHeight(); - scroll.setScrollPosition(currentHeight - popHeight + initialPosition); - - return $q.resolve(); - }) - .finally(() => { - render.compile(); - scroll.resume(); - lockFrames = false; - - return $q.resolve(); - }); -} - -function lastRange () { - if (scroll.isPaused()) { - return $q.resolve(); - } - - scroll.pause(); - lockFrames = true; - - return render.clear() - .then(() => slide.getLast()) - .then(results => render.pushFront(results)) - .then(() => { - stream.setMissingCounterThreshold(slide.getTailCounter() + 1); - - scroll.scrollToBottom(); - lockFrames = false; - - return $q.resolve(); - }) - .finally(() => { - render.compile(); - scroll.resume(); - - return $q.resolve(); - }); -} - -function menuLastRange () { - if (vm.isFollowing) { - lockFollow = true; - stopFollowing(); - - return $q.resolve(); - } - - lockFollow = false; - - return lastRange() - .then(() => { - startFollowing(); - - return $q.resolve(); - }); -} - -let followOnce; -let lockFollow; -function canStartFollowing () { - if (lockFollow) { - return false; - } - - if (slide.isOnLastPage() && scroll.isBeyondLowerThreshold()) { - followOnce = false; - - return true; - } - - if (followOnce && // one-time activation from top of first page - scroll.isBeyondUpperThreshold()) { - followOnce = false; - - return true; - } - - return false; -} - -function startFollowing () { - if (vm.isFollowing) { - return; - } - - vm.isFollowing = true; - vm.followTooltip = vm.strings.get('tooltips.MENU_FOLLOWING'); -} - -function stopFollowing () { - if (!vm.isFollowing) { - return; - } - - scroll.unlock(); - scroll.unhide(); - - vm.isFollowing = false; - vm.followTooltip = vm.strings.get('tooltips.MENU_LAST'); -} - -// -// Menu Controls (Page Mode) -// - -function firstPage () { - if (scroll.isPaused()) { - return $q.resolve(); - } - - scroll.pause(); - - return render.clear() - .then(() => page.getFirst()) - .then(results => render.pushFront(results)) - .then(() => page.getNext()) - .then(results => { - const popCount = page.trimHead(); - - return render.popBack(popCount) - .then(() => render.pushFront(results)); - }) - .finally(() => { - render.compile(); - scroll.resume(); - - return $q.resolve(); - }); -} - -function lastPage () { - if (scroll.isPaused()) { - return $q.resolve(); - } - - scroll.pause(); - - return render.clear() - .then(() => page.getLast()) - .then(results => render.pushBack(results)) - .then(() => page.getPrevious()) - .then(results => { - const popCount = page.trimTail(); - - return render.popFront(popCount) - .then(() => render.pushBack(results)); - }) - .then(() => { - scroll.scrollToBottom(); - - return $q.resolve(); - }) - .finally(() => { - render.compile(); - scroll.resume(); - - return $q.resolve(); - }); -} - -function nextPage () { - if (scroll.isPaused()) { - return $q.resolve(); - } - - scroll.pause(); - - return page.getNext() - .then(results => { - const popCount = page.trimHead(); - - return render.popBack(popCount) - .then(() => render.pushFront(results)); - }) - .finally(() => { - render.compile(); - scroll.resume(); - }); -} - -function previousPage () { - if (scroll.isPaused()) { - return $q.resolve(); - } - - scroll.pause(); - - let initialPosition; - let popHeight; - - return page.getPrevious() - .then(results => { - const popCount = page.trimTail(); - initialPosition = scroll.getScrollPosition(); - - return render.popFront(popCount) - .then(() => { - popHeight = scroll.getScrollHeight(); - - return render.pushBack(results); - }); - }) - .then(() => { - const currentHeight = scroll.getScrollHeight(); - scroll.setScrollPosition(currentHeight - popHeight + initialPosition); - - return $q.resolve(); - }) - .finally(() => { - render.compile(); - scroll.resume(); - - return $q.resolve(); - }); -} - -// -// Menu Controls -// - -function first () { - if (vm.isProcessingFinished) { - return firstPage(); - } - - return firstRange(); -} - -function last () { - if (vm.isProcessingFinished) { - return lastPage(); - } - - return lastRange() - .then(() => previousRange()); -} - -function next () { - if (vm.isProcessingFinished) { - return nextPage(); - } - - return nextRange(); -} - -function previous () { - if (vm.isProcessingFinished) { - return previousPage(); - } - - return previousRange(); -} - -function menuLast () { - if (vm.isProcessingFinished) { - return lastPage(); - } - - return menuLastRange(); -} - -function down () { - scroll.moveDown(); - - if (scroll.isBeyondLowerThreshold()) { - next(); - } -} - -function up () { - scroll.moveUp(); - - if (scroll.isBeyondUpperThreshold()) { - previous(); - } -} - -function togglePanelExpand () { - vm.isPanelExpanded = !vm.isPanelExpanded; -} - -// -// Line Interaction -// - -const iconCollapsed = 'fa-angle-right'; -const iconExpanded = 'fa-angle-down'; -const iconSelector = '.at-Stdout-toggle > i'; -const lineCollapsed = 'at-Stdout-row--hidden'; - -function toggleCollapseAll () { - if (scroll.isPaused()) return; - - const records = Object.keys(render.records).map(key => render.records[key]); - const plays = records.filter(({ name }) => name === EVENT_START_PLAY); - const tasks = records.filter(({ name }) => name === EVENT_START_TASK); - - const orphanLines = records - .filter(({ level }) => level === 3) - .filter(({ parents }) => !records[parents[0]]); - - const orphanLineParents = orphanLines - .map(({ parents }) => ({ uuid: parents[0] })); - - plays.concat(tasks).forEach(({ uuid }) => { - const icon = $(`#${uuid} ${iconSelector}`); - - if (vm.isMenuCollapsed) { - icon.removeClass(iconCollapsed); - icon.addClass(iconExpanded); - } else { - icon.removeClass(iconExpanded); - icon.addClass(iconCollapsed); - } - }); - - tasks.concat(orphanLineParents).forEach(({ uuid }) => { - const lines = $(`.child-of-${uuid}`); - - if (vm.isMenuCollapsed) { - lines.removeClass(lineCollapsed); - } else { - lines.addClass(lineCollapsed); - } - }); - - vm.isMenuCollapsed = !vm.isMenuCollapsed; - render.setCollapseAll(vm.isMenuCollapsed); -} - -function toggleCollapse (uuid) { - if (scroll.isPaused()) return; - - const record = render.records[uuid]; - - if (record.name === EVENT_START_PLAY) { - togglePlayCollapse(uuid); - } - - if (record.name === EVENT_START_TASK) { - toggleTaskCollapse(uuid); - } -} - -function togglePlayCollapse (uuid) { - const record = render.records[uuid]; - const descendants = record.children || []; - - const icon = $(`#${uuid} ${iconSelector}`); - const lines = $(`.child-of-${uuid}`); - const taskIcons = $(`#${descendants.join(', #')}`).find(iconSelector); - - const isCollapsed = icon.hasClass(iconCollapsed); - - if (isCollapsed) { - icon.removeClass(iconCollapsed); - icon.addClass(iconExpanded); - - taskIcons.removeClass(iconExpanded); - taskIcons.addClass(iconCollapsed); - lines.removeClass(lineCollapsed); - - descendants - .map(item => $(`.child-of-${item}`)) - .forEach(line => line.addClass(lineCollapsed)); - } else { - icon.removeClass(iconExpanded); - icon.addClass(iconCollapsed); - - taskIcons.removeClass(iconExpanded); - taskIcons.addClass(iconCollapsed); - - lines.addClass(lineCollapsed); - - descendants - .map(item => $(`.child-of-${item}`)) - .forEach(line => line.addClass(lineCollapsed)); - } - - descendants - .map(item => render.records[item]) - .filter((descRecord) => descRecord && descRecord.name === EVENT_START_TASK) - .forEach(rec => { render.records[rec.uuid].isCollapsed = true; }); - - render.records[uuid].isCollapsed = !isCollapsed; -} - -function toggleTaskCollapse (uuid) { - const icon = $(`#${uuid} ${iconSelector}`); - const lines = $(`.child-of-${uuid}`); - - const isCollapsed = icon.hasClass(iconCollapsed); - - if (isCollapsed) { - icon.removeClass(iconCollapsed); - icon.addClass(iconExpanded); - lines.removeClass(lineCollapsed); - } else { - icon.removeClass(iconExpanded); - icon.addClass(iconCollapsed); - lines.addClass(lineCollapsed); - } - - render.records[uuid].isCollapsed = !isCollapsed; -} - -function showHostDetails (id, uuid) { - $state.go('output.host-event.json', { eventId: id, taskUuid: uuid }); -} - -function showMissingEvents (uuid) { - const record = render.records[uuid]; - - const min = Math.min(...record.counters); - const max = Math.min(Math.max(...record.counters), min + OUTPUT_PAGE_SIZE); - - const selector = `#${uuid}`; - const clicked = $(selector); - - return resource.events.getRange([min, max]) - .then(results => { - const counters = results.map(({ counter }) => counter); - - for (let i = min; i <= max; i++) { - if (counters.indexOf(i) < 0) { - results = results.filter(({ counter }) => counter < i); - break; - } - } - - let lines = 0; - let untrusted = ''; - - for (let i = 0; i <= results.length - 1; i++) { - const { html, count } = render.transformEvent(results[i]); - - lines += count; - untrusted += html; - - const shifted = render.records[uuid].counters.shift(); - delete render.uuids[shifted]; - } - - const trusted = render.trustHtml(untrusted); - const elements = angular.element(trusted); - - return render - .requestAnimationFrame(() => { - elements.insertBefore(clicked); - - if (render.records[uuid].counters.length === 0) { - clicked.remove(); - delete render.records[uuid]; - } - }) - .then(() => render.compile()) - .then(() => lines); - }); -} - -// -// Event Handling -// - -let streaming; -function stopListening () { - streaming = null; - - listeners.forEach(deregister => deregister()); - listeners.length = 0; -} - -function startListening () { - stopListening(); - - listeners.push($scope.$on(resource.ws.events, (scope, data) => handleJobEvent(data))); - listeners.push($scope.$on(resource.ws.status, (scope, data) => handleStatusEvent(data))); - - if (resource.model.get('type') === 'job') return; - if (resource.model.get('type') === 'project_update') return; - - listeners.push($scope.$on(resource.ws.summary, (scope, data) => handleSummaryEvent(data))); -} - -function handleJobEvent (data) { - streaming = streaming || resource.events - .getRange([Math.max(1, data.counter - 50), data.counter + 50]) - .then(results => { - results.push(data); - - const counters = results.map(({ counter }) => counter); - const min = Math.min(...counters); - const max = Math.max(...counters); - - const missing = []; - for (let i = min; i <= max; i++) { - if (counters.indexOf(i) < 0) { - missing.push(i); - } - } - - if (missing.length > 0) { - const maxMissing = Math.max(...missing); - results = results.filter(({ counter }) => counter > maxMissing); - } - - results.forEach(item => { - stream.pushJobEvent(item); - status.pushJobEvent(item); - }); - - stream.setMissingCounterThreshold(min); - - return $q.resolve(); - }); - - streaming - .then(() => { - stream.pushJobEvent(data); - status.pushJobEvent(data); - }); -} - -function handleStatusEvent (data) { - status.pushStatusEvent(data); -} - -function handleSummaryEvent (data) { - if (resource.model.get('id') !== data.unified_job_id) return; - if (!data.final_counter) return; - - stream.setFinalCounter(data.final_counter); -} - -// -// Search -// - -function reloadState (params) { - params.isPanelExpanded = vm.isPanelExpanded; - - return $state.transitionTo($state.current, params, { inherit: false, location: 'replace' }); -} - -// -// Debug Mode -// - -function clear () { - stopListening(); - render.clear(); - - followOnce = true; - lockFollow = false; - lockFrames = false; - - stream.bufferInit(); - status.init(resource); - slide.init(resource.events, render); - status.subscribe(data => { vm.status = data.status; }); - - startListening(); -} - -function OutputIndexController ( - _$q_, - _$scope_, - _$state_, - _resource_, - _scroll_, - _page_, - _render_, - _status_, - _slide_, - _stream_, - $filter, - strings, - $stateParams, -) { - const { isPanelExpanded, _debug } = $stateParams; - const isProcessingFinished = !_debug && _resource_.model.get('event_processing_finished'); - - $q = _$q_; - $scope = _$scope_; - $state = _$state_; - - resource = _resource_; - scroll = _scroll_; - render = _render_; - status = _status_; - stream = _stream_; - slide = _slide_; - page = _page_; - - vm = this || {}; - - // Panel - vm.title = $filter('sanitize')(resource.model.get('name')); - vm.status = resource.model.get('status'); - vm.strings = strings; - vm.resource = resource; - vm.reloadState = reloadState; - vm.isPanelExpanded = isPanelExpanded; - vm.isProcessingFinished = isProcessingFinished; - vm.togglePanelExpand = togglePanelExpand; - - // Stdout Navigation - vm.menu = { last: menuLast, first, down, up, clear }; - vm.isMenuCollapsed = false; - vm.isFollowing = false; - vm.toggleCollapseAll = toggleCollapseAll; - vm.toggleCollapse = toggleCollapse; - vm.showHostDetails = showHostDetails; - vm.showMissingEvents = showMissingEvents; - vm.toggleLineEnabled = resource.model.get('type') === 'job'; - vm.followTooltip = vm.strings.get('tooltips.MENU_LAST'); - vm.debug = _debug; - - render.requestAnimationFrame(() => { - render.init($scope, { toggles: vm.toggleLineEnabled }); - - status.init(resource); - page.init(resource.events); - slide.init(resource.events, render); - - scroll.init({ - next, - previous, - onThresholdLeave () { - followOnce = false; - lockFollow = false; - stopFollowing(); - - return $q.resolve(); - }, - }); - - let showFollowTip = true; - const rates = []; - stream.init({ - onFrames, - onFrameRate (rate) { - rates.push(rate); - rates.splice(0, rates.length - 5); - - if (rates.every(value => value === 1)) { - scroll.unlock(); - scroll.unhide(); - } - - if (rate > 1 && vm.isFollowing) { - scroll.lock(); - scroll.hide(); - - if (showFollowTip) { - showFollowTip = false; - $(OUTPUT_ELEMENT_LAST).trigger('mouseenter'); - } - } - }, - onStop () { - lockFollow = true; - stopFollowing(); - status.updateStats(); - status.dispatch(); - status.sync(); - scroll.unlock(); - scroll.unhide(); - render.compile(); - } - }); - - if (isProcessingFinished) { - followOnce = false; - lockFollow = true; - lockFrames = true; - stopListening(); - } else { - followOnce = true; - lockFollow = false; - lockFrames = false; - resource.events.clearCache(); - status.subscribe(data => { vm.status = data.status; }); - startListening(); - } - - if (_debug) { - return render.clear(); - } - - return last(); - }); - - $scope.$on('$destroy', () => { - stopListening(); - - render.clear(); - render.el.remove(); - slide.clear(); - stream.bufferInit(); - }); -} - -OutputIndexController.$inject = [ - '$q', - '$scope', - '$state', - 'resource', - 'OutputScrollService', - 'OutputPageService', - 'OutputRenderService', - 'OutputStatusService', - 'OutputSlideService', - 'OutputStreamService', - '$filter', - 'OutputStrings', - '$stateParams', -]; - -module.exports = OutputIndexController; diff --git a/awx/ui/client/features/output/index.js b/awx/ui/client/features/output/index.js deleted file mode 100644 index 0109877d9b..0000000000 --- a/awx/ui/client/features/output/index.js +++ /dev/null @@ -1,249 +0,0 @@ -/* eslint camelcase: 0 */ -import atLibModels from '~models'; -import atLibComponents from '~components'; - -import Strings from '~features/output/output.strings'; -import Controller from '~features/output/index.controller'; -import RenderService from '~features/output/render.service'; -import ScrollService from '~features/output/scroll.service'; -import StreamService from '~features/output/stream.service'; -import StatusService from '~features/output/status.service'; -import MessageService from '~features/output/message.service'; -import EventsApiService from '~features/output/api.events.service'; -import PageService from '~features/output/page.service'; -import SlideService from '~features/output/slide.service'; -import LegacyRedirect from '~features/output/legacy.route'; - -import DetailsComponent from '~features/output/details.component'; -import SearchComponent from '~features/output/search.component'; -import StatsComponent from '~features/output/stats.component'; -import HostEvent from './host-event/index'; - -import { - API_ROOT, - OUTPUT_ORDER_BY, - OUTPUT_PAGE_SIZE, - WS_PREFIX, -} from './constants'; - -const MODULE_NAME = 'at.features.output'; -const Template = require('~features/output/index.view.html'); - -function resolveResource ( - $state, - $stateParams, - Job, - ProjectUpdate, - AdHocCommand, - SystemJob, - WorkflowJob, - InventoryUpdate, - qs, - Wait, - Events, -) { - const { id, type, handleErrors, job_event_search } = $stateParams; - const { name, key } = getWebSocketResource(type); - - let Resource; - let related; - - switch (type) { - case 'project': - Resource = ProjectUpdate; - related = `project_updates/${id}/events/`; - break; - case 'playbook': - Resource = Job; - related = `jobs/${id}/job_events/`; - break; - case 'command': - Resource = AdHocCommand; - related = `ad_hoc_commands/${id}/events/`; - break; - case 'system': - Resource = SystemJob; - related = `system_jobs/${id}/events/`; - break; - case 'inventory': - Resource = InventoryUpdate; - related = `inventory_updates/${id}/events/`; - break; - // case 'workflow': - // todo: integrate workflow chart components into this view - // break; - default: - // Redirect - return null; - } - - const params = { - page_size: OUTPUT_PAGE_SIZE, - order_by: OUTPUT_ORDER_BY, - }; - - if (job_event_search) { - const query = qs.encodeQuerysetObject(qs.decodeArr(job_event_search)); - Object.assign(params, query); - } - - Events.init(`${API_ROOT}${related}`, params); - - Wait('start'); - const promise = Promise.all([new Resource(['get', 'options'], [id, id]), Events.fetch()]) - .then(([model, events]) => ({ - id, - type, - model, - events, - ws: { - events: `${WS_PREFIX}-${key}-${id}`, - status: `${WS_PREFIX}-${name}`, - summary: `${WS_PREFIX}-${name}-summary`, - }, - })); - - if (!handleErrors) { - return promise - .finally(() => Wait('stop')); - } - - return promise - .catch(({ data, status }) => { - qs.error(data, status); - - return $state.go($state.current, $state.params, { reload: true }); - }) - .finally(() => Wait('stop')); -} - -function resolveWebSocketConnection ($stateParams, SocketService) { - const { type, id } = $stateParams; - const { name, key } = getWebSocketResource(type); - - const state = { - data: { - socket: { - groups: { - [name]: ['status_changed', 'summary'], - [key]: [] - } - } - } - }; - - SocketService.addStateResolve(state, id); -} - -function getWebSocketResource (type) { - let name; - let key; - - switch (type) { - case 'system': - name = 'jobs'; - key = 'system_job_events'; - break; - case 'project': - name = 'jobs'; - key = 'project_update_events'; - break; - case 'command': - name = 'jobs'; - key = 'ad_hoc_command_events'; - break; - case 'inventory': - name = 'jobs'; - key = 'inventory_update_events'; - break; - case 'playbook': - name = 'jobs'; - key = 'job_events'; - break; - default: - throw new Error('Unsupported WebSocket type'); - } - - return { name, key }; -} - -function JobsRun ($stateRegistry, $filter, strings) { - const parent = 'jobs'; - const ncyBreadcrumb = { parent, label: strings.get('state.BREADCRUMB_DEFAULT') }; - const sanitize = $filter('sanitize'); - - const state = { - url: '/:type/:id?job_event_search?_debug', - name: 'output', - parent, - ncyBreadcrumb, - params: { - handleErrors: true, - isPanelExpanded: false, - }, - data: { - activityStream: false, - }, - views: { - '@': { - templateUrl: Template, - controller: Controller, - controllerAs: 'vm' - }, - }, - resolve: { - webSocketConnection: [ - '$stateParams', - 'SocketService', - resolveWebSocketConnection - ], - resource: [ - '$state', - '$stateParams', - 'JobModel', - 'ProjectUpdateModel', - 'AdHocCommandModel', - 'SystemJobModel', - 'WorkflowJobModel', - 'InventoryUpdateModel', - 'QuerySet', - 'Wait', - 'JobEventsApiService', - resolveResource - ], - breadcrumbLabel: [ - 'resource', - ({ model }) => { - ncyBreadcrumb.label = `${model.get('id')} - ${sanitize(model.get('name'))}`; - } - ], - }, - }; - - $stateRegistry.register(state); -} - -JobsRun.$inject = ['$stateRegistry', '$filter', 'OutputStrings']; - -angular - .module(MODULE_NAME, [ - atLibModels, - atLibComponents, - HostEvent - ]) - .service('OutputStrings', Strings) - .service('OutputScrollService', ScrollService) - .service('OutputRenderService', RenderService) - .service('OutputStreamService', StreamService) - .service('OutputStatusService', StatusService) - .service('OutputMessageService', MessageService) - .service('JobEventsApiService', EventsApiService) - .service('OutputPageService', PageService) - .service('OutputSlideService', SlideService) - .component('atJobSearch', SearchComponent) - .component('atJobStats', StatsComponent) - .component('atJobDetails', DetailsComponent) - .run(JobsRun) - .run(LegacyRedirect); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/output/index.view.html b/awx/ui/client/features/output/index.view.html deleted file mode 100644 index ea6c31c2fc..0000000000 --- a/awx/ui/client/features/output/index.view.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
- - - - - - -
-
- - {{ vm.title }} -
- - - - -
-
- -
-
- - -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
-
-
-
-
diff --git a/awx/ui/client/features/output/legacy.route.js b/awx/ui/client/features/output/legacy.route.js deleted file mode 100644 index 838cc5c25d..0000000000 --- a/awx/ui/client/features/output/legacy.route.js +++ /dev/null @@ -1,108 +0,0 @@ -function LegacyRedirect ($http, $stateRegistry) { - const destination = 'output'; - const routes = [ - { - name: 'legacyJobResult', - url: '/jobs/:id?job_event_search', - redirectTo: (trans) => { - const { - id, - job_event_search // eslint-disable-line camelcase - } = trans.params(); - - return { state: destination, params: { type: 'playbook', id, job_event_search } }; - } - }, - { - name: 'legacyAdHocJobStdout', - url: '/ad_hoc_commands/:id', - redirectTo: (trans) => { - const { id } = trans.params(); - return { state: destination, params: { type: 'command', id } }; - } - }, - { - name: 'legacyInventorySyncStdout', - url: '/inventory_sync/:id', - redirectTo: (trans) => { - const { id } = trans.params(); - return { state: destination, params: { type: 'inventory', id } }; - } - }, - { - name: 'legacyManagementJobStdout', - url: '/management_jobs/:id', - redirectTo: (trans) => { - const { id } = trans.params(); - return { state: destination, params: { type: 'system', id } }; - } - }, - { - name: 'legacyScmUpdateStdout', - url: '/scm_update/:id', - redirectTo: (trans) => { - const { id } = trans.params(); - return { state: destination, params: { type: 'project', id } }; - } - }, - { - name: 'legacySchedulesList', - url: '/jobs/schedules?schedule_search', - redirectTo: (trans) => { - const { - schedule_search // eslint-disable-line camelcase - } = trans.params(); - return { state: 'schedules', params: { schedule_search } }; - } - }, - { - name: 'legacySchedule', - url: '/jobs/schedules/:schedule_id?schedule_search', - redirectTo: (trans) => { - const { - schedule_id, // eslint-disable-line camelcase - schedule_search // eslint-disable-line camelcase - } = trans.params(); - return { state: 'schedules.edit', params: { schedule_id, schedule_search } }; - } - }, - { - name: 'workflowNodeRedirect', - url: '/workflow_node_results/:id', - redirectTo: (trans) => { - // The workflow job viewer uses this route for playbook job nodes. The provided id - // is used to lookup the corresponding unified job, which is then inspected to - // determine if we need to redirect to a split (workflow) job or a playbook job. - const { id } = trans.params(); - const endpoint = '/api/v2/unified_jobs/'; - - return $http.get(endpoint, { params: { id } }) - .then(({ data }) => { - const { results } = data; - const [obj] = results; - - if (obj) { - if (obj.type === 'workflow_job') { - return { state: 'workflowResults', params: { id } }; - } else if (obj.type === 'job') { - return { state: 'output', params: { type: 'playbook', id } }; - } else if (obj.type === 'inventory_update') { - return { state: 'output', params: { type: 'inventory', id } }; - } else if (obj.type === 'project_update') { - return { state: 'output', params: { type: 'project', id } }; - } - } - - return { state: 'jobs' }; - }) - .catch(() => ({ state: 'dashboard' })); - } - }, - ]; - - routes.forEach(state => $stateRegistry.register(state)); -} - -LegacyRedirect.$inject = ['$http', '$stateRegistry']; - -export default LegacyRedirect; diff --git a/awx/ui/client/features/output/message.service.js b/awx/ui/client/features/output/message.service.js deleted file mode 100644 index 7e15ff302f..0000000000 --- a/awx/ui/client/features/output/message.service.js +++ /dev/null @@ -1,41 +0,0 @@ -function MessageService () { - const listeners = {}; - const registry = {}; - - this.subscribe = (key, listener) => { - registry[key] = registry[key] || 0; - - listeners[key] = listeners[key] || {}; - listeners[key][registry[key]] = listener; - - const unsubscribe = this.createCallback(key, registry[key]); - - registry[key]++; - - return unsubscribe; - }; - - this.dispatch = (key, data) => { - if (!listeners[key]) { - return; - } - - const indices = Object.keys(listeners[key]); - - for (let i = 0; i < indices.length; i++) { - listeners[key][indices[i]](data); - } - }; - - this.createCallback = (key, index) => { - const callback = () => { - if (listeners[key]) { - delete listeners[key][index]; - } - }; - - return callback; - }; -} - -export default MessageService; diff --git a/awx/ui/client/features/output/output.strings.js b/awx/ui/client/features/output/output.strings.js deleted file mode 100644 index caa53e9fa7..0000000000 --- a/awx/ui/client/features/output/output.strings.js +++ /dev/null @@ -1,148 +0,0 @@ -function OutputStrings (BaseString) { - BaseString.call(this, 'output'); - - const { t } = this; - const ns = this.output; - - ns.state = { - BREADCRUMB_DEFAULT: t.s('RESULTS'), - }; - - ns.status = { - RUNNING: t.s('The host status bar will update when the job is complete.'), - UNAVAILABLE: t.s('Host status information for this job is unavailable.'), - }; - - ns.tooltips = { - ARTIFACTS: t.s('Read-only view of artifacts added to the job template'), - CANCEL: t.s('Cancel'), - COLLAPSE_OUTPUT: t.s('Collapse Output'), - DELETE: t.s('Delete'), - DOWNLOAD_OUTPUT: t.s('Download Output'), - CREDENTIAL: t.s('View the Credential'), - EXPAND_OUTPUT: t.s('Expand Output'), - EXTRA_VARS: t.s('Read-only view of extra variables added to the job template'), - HOST_LIMIT: t.s('When this field is true, the job\'s inventory belongs to an organization that has exceeded it\'s limit of hosts as defined by the system administrator.'), - INVENTORY: t.s('View the Inventory'), - INVENTORY_SCM: t.s('View the Project'), - INVENTORY_SCM_JOB: t.s('View Project checkout results'), - JOB_TEMPLATE: t.s('View the Job Template'), - SLICE_JOB_DETAILS: t.s('Job is one of several from a JT that slices on inventory'), - PROJECT: t.s('View the Project'), - PROJECT_UPDATE: t.s('View Project checkout results'), - SCHEDULE: t.s('View the Schedule'), - SOURCE_WORKFLOW_JOB: t.s('View the source Workflow Job'), - USER: t.s('View the User'), - MENU_FIRST: t.s('Go to first page'), - MENU_DOWN: t.s('Get next page'), - MENU_UP: t.s('Get previous page'), - MENU_LAST: t.s('Go to last page of available output'), - MENU_FOLLOWING: t.s('Currently following output as it arrives. Click to unfollow'), - WEBHOOK_JOB_TEMPLATE: t.s('View the webhook configuration on the job template.'), - WEBHOOK_WORKFLOW_JOB_TEMPLATE: t.s('View the webhook configuration on the workflow job template.'), - }; - - ns.details = { - HEADER: t.s('Details'), - ISOLATED: t.s('Isolated'), - NOT_FINISHED: t.s('Not Finished'), - NOT_STARTED: t.s('Not Started'), - SHOW_LESS: t.s('Show Less'), - SHOW_MORE: t.s('Show More'), - UNKNOWN: t.s('Finished'), - WEBHOOK: t.s('Webhook'), - CANCEL_JOB: t.s('Cancel Job'), - DELETE_JOB: t.s('Delete Job'), - }; - - ns.labels = { - ARTIFACTS: t.s('Artifacts'), - CREDENTIAL: t.s('Credential'), - ENVIRONMENT: t.s('Environment'), - EXECUTION_NODE: t.s('Execution Node'), - EXTRA_VARS: t.s('Extra Variables'), - FINISHED: t.s('Finished'), - FORKS: t.s('Forks'), - HOST_LIMIT_ERROR: t.s('Host Limit Error'), - INSTANCE_GROUP: t.s('Instance Group'), - CONTAINER_GROUP: t.s('Container Group'), - INVENTORY: t.s('Inventory'), - INVENTORY_SCM: t.s('Source Project'), - JOB_EXPLANATION: t.s('Explanation'), - JOB_TAGS: t.s('Job Tags'), - JOB_TEMPLATE: t.s('Job Template'), - SLICE_JOB: t.s('Slice Job'), - JOB_TYPE: t.s('Job Type'), - LABELS: t.s('Labels'), - LAUNCHED_BY: t.s('Launched By'), - LICENSE_ERROR: t.s('License Error'), - LIMIT: t.s('Limit'), - MACHINE_CREDENTIAL: t.s('Machine Credential'), - MODULE_ARGS: t.s('Module Args'), - NAME: t.s('Name'), - OVERWRITE: t.s('Overwrite'), - OVERWRITE_VARS: t.s('Overwrite Vars'), - PLAYBOOK: t.s('Playbook'), - PROJECT: t.s('Project'), - SCM_BRANCH: t.s('Branch'), - SCM_REFSPEC: t.s('Refspec'), - RESULT_TRACEBACK: t.s('Error Details'), - SCM_REVISION: t.s('Revision'), - SKIP_TAGS: t.s('Skip Tags'), - SOURCE: t.s('Source'), - SOURCE_CREDENTIAL: t.s('Source Credential'), - SOURCE_WORKFLOW_JOB: t.s('Source Workflow'), - STARTED: t.s('Started'), - STATUS: t.s('Status'), - VERBOSITY: t.s('Verbosity'), - }; - - ns.search = { - ADDITIONAL_INFORMATION_HEADER: t.s('ADDITIONAL_INFORMATION'), - ADDITIONAL_INFORMATION: t.s('For additional information on advanced search syntax please see the Ansible Tower'), - CLEAR_ALL: t.s('CLEAR ALL'), - DOCUMENTATION: t.s('documentation'), - EXAMPLES: t.s('EXAMPLES'), - FIELDS: t.s('FIELDS'), - KEY: t.s('KEY'), - PLACEHOLDER_DEFAULT: t.s('SEARCH'), - PLACEHOLDER_RUNNING: t.s('JOB IS STILL RUNNING'), - REJECT_DEFAULT: t.s('Failed to update search results.'), - REJECT_INVALID: t.s('Invalid search filter provided.'), - SUBMIT: t.s('Submit search') - }; - - ns.stats = { - ELAPSED: t.s('Elapsed'), - PLAYS: t.s('Plays'), - TASKS: t.s('Tasks'), - HOSTS: t.s('Hosts'), - TOGGLE_EXPANDED_OUTPUT: t.s('Toggle expanded output') - }; - - ns.stdout = { - BACK_TO_TOP: t.s('Back to Top'), - }; - - ns.host_event_modal = { - CREATED: t.s('CREATED'), - ID: t.s('ID'), - PLAY: t.s('PLAY'), - TASK: t.s('TASK'), - MODULE: t.s('MODULE'), - NO_RESULT_FOUND: t.s('No result found'), - STANDARD_OUT: t.s('Standard Out'), - STANDARD_ERROR: t.s('Standard Error'), - CLOSE_HOST_EVENT_MODAL: t.s('Close host event modal') - }; - - ns.workflow_status = { - SUCCESSFUL: t.s('SUCCESSFUL'), - FAILED: t.s('FAILED'), - NO_JOBS_FINISHED: t.s('NO JOBS FINISHED') - }; -} - -OutputStrings.$inject = ['BaseStringService']; - -export default OutputStrings; diff --git a/awx/ui/client/features/output/page.service.js b/awx/ui/client/features/output/page.service.js deleted file mode 100644 index 1502d39a63..0000000000 --- a/awx/ui/client/features/output/page.service.js +++ /dev/null @@ -1,156 +0,0 @@ -/* eslint camelcase: 0 */ -import { OUTPUT_PAGE_LIMIT } from './constants'; - -function PageService ($q) { - this.init = ({ getPage, getFirst, getLast, getLastPageNumber }) => { - this.api = { - getPage, - getFirst, - getLast, - getLastPageNumber, - }; - this.pages = {}; - this.state = { head: 0, tail: 0 }; - }; - - this.getNext = () => { - const lastPageNumber = this.api.getLastPageNumber(); - const number = Math.min(this.state.tail + 1, lastPageNumber); - - if (number < 1) { - return $q.resolve([]); - } - - if (number > lastPageNumber) { - return $q.resolve([]); - } - - let promise; - - if (this.pages[number]) { - promise = $q.resolve(this.pages[number]); - } else { - promise = this.api.getPage(number); - } - - return promise - .then(results => { - if (results.length <= 0) { - return $q.resolve([]); - } - - this.state.tail = number; - this.pages[number] = results; - - return $q.resolve(results); - }); - }; - - this.getPrevious = () => { - const number = Math.max(this.state.head - 1, 1); - - if (number < 1) { - return $q.resolve([]); - } - - if (number > this.api.getLastPageNumber()) { - return $q.resolve([]); - } - - let promise; - - if (this.pages[number]) { - promise = $q.resolve(this.pages[number]); - } else { - promise = this.api.getPage(number); - } - - return promise - .then(results => { - if (results.length <= 0) { - return $q.resolve([]); - } - - this.state.head = number; - this.pages[number] = results; - - return $q.resolve(results); - }); - }; - - this.getLast = () => this.api.getLast() - .then(results => { - if (results.length <= 0) { - return $q.resolve([]); - } - - const number = this.api.getLastPageNumber(); - - this.state.head = number; - this.state.tail = number; - this.pages[number] = results; - - return $q.resolve(results); - }); - - this.getFirst = () => this.api.getFirst() - .then(results => { - if (results.length <= 0) { - return $q.resolve([]); - } - - this.state.head = 1; - this.state.tail = 1; - this.pages[1] = results; - - return $q.resolve(results); - }); - - this.trimTail = () => { - const { tail, head } = this.state; - let popCount = 0; - - for (let i = tail; i > head; i--) { - if (!this.isOverCapacity()) { - break; - } - - if (this.pages[i]) { - popCount += this.pages[i].length; - } - - delete this.pages[i]; - - this.state.tail--; - } - - return popCount; - }; - - this.trimHead = () => { - const { head, tail } = this.state; - let popCount = 0; - - for (let i = head; i < tail; i++) { - if (!this.isOverCapacity()) { - break; - } - - if (this.pages[i]) { - popCount += this.pages[i].length; - } - - delete this.pages[i]; - - this.state.head++; - } - - return popCount; - }; - - this.isOverCapacity = () => this.state.tail - this.state.head > OUTPUT_PAGE_LIMIT; -} - -PageService.$inject = ['$q']; - -export default PageService; diff --git a/awx/ui/client/features/output/render.service.js b/awx/ui/client/features/output/render.service.js deleted file mode 100644 index 437dec589a..0000000000 --- a/awx/ui/client/features/output/render.service.js +++ /dev/null @@ -1,636 +0,0 @@ -import Ansi from 'ansi-to-html'; -import Entities from 'html-entities'; - -import { - EVENT_START_PLAY, - EVENT_STATS_PLAY, - EVENT_START_TASK, - OUTPUT_ANSI_COLORMAP, - OUTPUT_ELEMENT_TBODY, - OUTPUT_EVENT_LIMIT, -} from './constants'; - -const EVENT_GROUPS = [ - EVENT_START_TASK, - EVENT_START_PLAY, -]; - -const TIME_EVENTS = [ - EVENT_START_TASK, - EVENT_START_PLAY, - EVENT_STATS_PLAY, -]; - -const ansi = new Ansi({ stream: true, colors: OUTPUT_ANSI_COLORMAP }); -const entities = new Entities.AllHtmlEntities(); - -// https://github.com/chalk/ansi-regex -const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' -].join('|'); - -const re = new RegExp(pattern); -const hasAnsi = input => re.test(input); - -let $scope; - -function JobRenderService ($q, $compile, $sce, $window) { - this.init = (_$scope_, { toggles }) => { - $scope = _$scope_; - this.setScope(); - - this.el = $(OUTPUT_ELEMENT_TBODY); - this.parent = null; - - this.state = { - head: 0, - tail: 0, - collapseAll: false, - toggleMode: toggles, - }; - - this.records = {}; - this.uuids = {}; - }; - - this.setCollapseAll = value => { - this.state.collapseAll = value; - Object.keys(this.records).forEach(key => { - this.records[key].isCollapsed = value; - }); - }; - - this.sortByCounter = (a, b) => { - if (a.counter > b.counter) { - return 1; - } - - if (a.counter < b.counter) { - return -1; - } - - return 0; - }; - - // - // Event Data Transformation / HTML Building - // - - this.appendEventGroup = events => { - let lines = 0; - let html = ''; - - events.sort(this.sortByCounter); - - for (let i = 0; i <= events.length - 1; i++) { - const current = events[i]; - - if (this.state.tail && current.counter !== this.state.tail + 1) { - const missing = this.appendMissingEventGroup(current); - - html += missing.html; - lines += missing.count; - } - - const eventLines = this.transformEvent(current); - - html += eventLines.html; - lines += eventLines.count; - } - - return { html, lines }; - }; - - this.appendMissingEventGroup = event => { - const tailUUID = this.uuids[this.state.tail]; - const tailRecord = this.records[tailUUID]; - - if (!tailRecord) { - return { html: '', count: 0 }; - } - - let uuid; - - if (tailRecord.isMissing) { - uuid = tailUUID; - } else { - uuid = `${event.counter}-${tailUUID}`; - this.records[uuid] = { uuid, counters: [], lineCount: 1, isMissing: true }; - } - - for (let i = this.state.tail + 1; i < event.counter; i++) { - this.records[uuid].counters.push(i); - this.uuids[i] = uuid; - } - - if (tailRecord.isMissing) { - return { html: '', count: 0 }; - } - - if (tailRecord.end === event.start_line) { - return { html: '', count: 0 }; - } - - const html = this.buildRowHTML(this.records[uuid]); - const count = 1; - - return { html, count }; - }; - - this.prependEventGroup = events => { - let lines = 0; - let html = ''; - - events.sort(this.sortByCounter); - - for (let i = events.length - 1; i >= 0; i--) { - const current = events[i]; - - if (this.state.head && current.counter !== this.state.head - 1) { - const missing = this.prependMissingEventGroup(current); - - html = missing.html + html; - lines += missing.count; - } - - const eventLines = this.transformEvent(current); - - html = eventLines.html + html; - lines += eventLines.count; - } - - return { html, lines }; - }; - - this.prependMissingEventGroup = event => { - const headUUID = this.uuids[this.state.head]; - const headRecord = this.records[headUUID]; - - if (!headRecord) { - return { html: '', count: 0 }; - } - - let uuid; - - if (headRecord.isMissing) { - uuid = headUUID; - } else { - uuid = `${headUUID}-${event.counter}`; - this.records[uuid] = { uuid, counters: [], lineCount: 1, isMissing: true }; - } - - for (let i = this.state.head - 1; i > event.counter; i--) { - this.records[uuid].counters.unshift(i); - this.uuids[i] = uuid; - } - - if (headRecord.isMissing) { - return { html: '', count: 0 }; - } - - if (event.end_line === headRecord.start) { - return { html: '', count: 0 }; - } - - const html = this.buildRowHTML(this.records[uuid]); - const count = 1; - - return { html, count }; - }; - - this.transformEvent = event => { - if (!event || event.stdout === null || event.stdout === undefined) { - return { html: '', count: 0 }; - } - - if (event.uuid && this.records[event.uuid] && !this.records[event.uuid]._isIncomplete) { - return { html: '', count: 0 }; - } - - const stdout = this.sanitize(event.stdout); - const lines = stdout.split('\r\n'); - const record = this.createRecord(event, lines); - - if (lines.length === 1 && lines[0] === '') { - // runner_on_start, runner_on_ok, and a few other events have an actual line count - // of 1 (stdout = '') and a claimed line count of 0 (end_line - start_line = 0). - // Since a zero-length string has an actual line count of 1, they'll still get - // rendered as blank lines unless we intercept them and add some special - // handling to remove them. - // - // Although we're not going to render the blank line, the actual line count of - // the zero-length stdout string, which is 1, has already been recorded at this - // point so we must also go back and set the event's recorded line length to 0 - // in order to avoid deleting too many lines when we need to pop or shift a - // page that contains this event off of the view. - this.records[record.uuid].lineCount = 0; - return { html: '', count: 0 }; - } - - let html = ''; - let count = lines.length; - let ln = event.start_line; - - for (let i = 0; i <= lines.length - 1; i++) { - ln++; - - const line = lines[i]; - const isLastLine = i === lines.length - 1; - - let row = this.buildRowHTML(record, ln, line); - - if (record && record.isTruncated && isLastLine) { - row += this.buildRowHTML(record); - count++; - } - - html += row; - } - - if (this.records[event.uuid]) { - this.records[event.uuid].lineCount = count; - } - - return { html, count }; - }; - - this.createRecord = (event, lines) => { - if (!event.counter) { - return null; - } - - if (!this.state.head || event.counter < this.state.head) { - this.state.head = event.counter; - } - - if (!this.state.tail || event.counter > this.state.tail) { - this.state.tail = event.counter; - } - - if (!event.uuid) { - this.uuids[event.counter] = event.counter; - this.records[event.counter] = { counters: [event.counter], lineCount: lines.length }; - - return this.records[event.counter]; - } - - let isClickable = false; - if (typeof event.host === 'number' || event.event_data && event.event_data.res) { - isClickable = true; - } else if (event.type === 'project_update_event' && - event.event !== 'runner_on_skipped' && - event.event_data.host) { - isClickable = true; - } - - const children = (this.records[event.uuid] && this.records[event.uuid].children) - ? this.records[event.uuid].children : []; - - const record = { - isClickable, - id: event.id, - line: event.start_line + 1, - name: event.event, - uuid: event.uuid, - level: event.event_level, - start: event.start_line, - end: event.end_line, - isTruncated: (event.end_line - event.start_line) > lines.length, - lineCount: lines.length, - isCollapsed: this.state.collapseAll, - counters: [event.counter], - children - }; - - if (event.parent_uuid) { - record.parents = this.getParentEvents(event.parent_uuid); - if (this.records[event.parent_uuid]) { - record.isCollapsed = this.records[event.parent_uuid].isCollapsed; - } - } - - if (record.isTruncated) { - record.truncatedAt = event.start_line + lines.length; - } - - if (EVENT_GROUPS.includes(event.event)) { - record.isParent = true; - - if (event.event_level === 1) { - this.parent = event.uuid; - } - - if (event.parent_uuid) { - if (this.records[event.parent_uuid]) { - if (this.records[event.parent_uuid].children) { - if (!this.records[event.parent_uuid].children.includes(event.uuid)) { - this.records[event.parent_uuid].children.push(event.uuid); - } - } else { - this.records[event.parent_uuid].children = [event.uuid]; - } - } else { - this.records[event.parent_uuid] = { - _isIncomplete: true, - children: [event.uuid] - }; - } - } - } - - if (TIME_EVENTS.includes(event.event)) { - record.time = this.getTimestamp(event.created); - record.line++; - } - - this.records[event.uuid] = record; - this.uuids[event.counter] = event.uuid; - - return record; - }; - - this.getParentEvents = (uuid, list) => { - list = list || []; - // always push its parent if exists - list.push(uuid); - // if we can get grandparent in current visible lines, we also push it - if (this.records[uuid] && this.records[uuid].parents) { - list = list.concat(this.records[uuid].parents); - } - - return list; - }; - - this.buildRowHTML = (record, ln, content) => { - let id = ''; - let icon = ''; - let timestamp = ''; - let tdToggle = ''; - let tdEvent = ''; - let classList = ''; - let directives = ''; - - if (record.isMissing) { - return `
-
-
...
`; - } - - content = content || ''; - - if (hasAnsi(content)) { - content = ansi.toHtml(content); - } - - if (record) { - if (this.state.toggleMode && record.isParent && record.line === ln) { - id = record.uuid; - - if (record.isCollapsed) { - icon = 'fa-angle-right'; - } else { - icon = 'fa-angle-down'; - } - - tdToggle = `
`; - } - - if (record.time && record.line === ln) { - timestamp = `${record.time}`; - } - - if (record.parents) { - classList = record.parents.reduce((list, uuid) => `${list} child-of-${uuid}`, ''); - } - } - - if (!tdEvent) { - tdEvent = `
${content}
`; - } - - if (!tdToggle) { - tdToggle = '
'; - } - - if (!ln) { - ln = '...'; - } - - if (record && record.isCollapsed) { - if (record.level === 3 || record.level === 0) { - classList += ' at-Stdout-row--hidden'; - } - } - - if (record && record.isClickable) { - classList += ' at-Stdout-row--clickable'; - directives = `ng-click="vm.showHostDetails('${record.id}', '${record.uuid}')"`; - } - - return ` -
- ${tdToggle} -
${ln}
-
${content}
-
${timestamp}
-
- `; - }; - - this.getTimestamp = created => { - const date = new Date(created); - const hour = date.getHours() < 10 ? `0${date.getHours()}` : date.getHours(); - const minute = date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes(); - const second = date.getSeconds() < 10 ? `0${date.getSeconds()}` : date.getSeconds(); - - return `${hour}:${minute}:${second}`; - }; - - // - // Element Operations - // - - this.remove = elements => this.requestAnimationFrame(() => elements.remove()); - - this.requestAnimationFrame = fn => $q(resolve => { - $window.requestAnimationFrame(() => { - if (fn) { - fn(); - } - - return resolve(); - }); - }); - - this.setScope = () => { - if (this.scope) this.scope.$destroy(); - delete this.scope; - - this.scope = $scope.$new(); - }; - - this.compile = () => { - this.setScope(); - $compile(this.el)(this.scope); - - return this.requestAnimationFrame(); - }; - - this.removeAll = () => { - const elements = this.el.contents(); - return this.remove(elements); - }; - - this.shift = lines => { - // We multiply by two here under the assumption that one element and one text node - // is generated for each line of output. - const count = (2 * lines) + 1; - const elements = this.el.contents().slice(0, count); - - return this.remove(elements); - }; - - this.pop = lines => { - // We multiply by two here under the assumption that one element and one text node - // is generated for each line of output. - const count = (2 * lines) + 1; - const elements = this.el.contents().slice(-count); - - return this.remove(elements); - }; - - this.prepend = events => { - if (events.length < 1) { - return $q.resolve(); - } - - const result = this.prependEventGroup(events); - const html = this.trustHtml(result.html); - - return this.requestAnimationFrame(() => this.el.prepend(html)) - .then(() => result.lines); - }; - - this.append = events => { - if (events.length < 1) { - return $q.resolve(); - } - - const result = this.appendEventGroup(events); - const html = this.trustHtml(result.html); - - return this.requestAnimationFrame(() => this.el.append(html)) - .then(() => result.lines); - }; - - this.trustHtml = html => $sce.getTrustedHtml($sce.trustAsHtml(html)); - this.sanitize = html => entities.encode(html); - - // - // Event Counter Methods - External code should prefer these. - // - - this.clear = () => this.removeAll() - .then(() => { - const head = this.getHeadCounter(); - const tail = this.getTailCounter(); - - for (let i = head; i <= tail; ++i) { - const uuid = this.uuids[i]; - - if (uuid) { - delete this.records[uuid]; - delete this.uuids[i]; - } - } - - this.state.head = 0; - this.state.tail = 0; - - return $q.resolve(); - }); - - this.pushFront = events => { - const tail = this.getTailCounter(); - - return this.append(events.filter(({ counter }) => counter > tail)); - }; - - this.pushBack = events => { - const head = this.getHeadCounter(); - const tail = this.getTailCounter(); - - return this.prepend(events.filter(({ counter }) => counter < head || counter > tail)); - }; - - this.popFront = count => { - if (!count || count <= 0) { - return $q.resolve(); - } - - const max = this.state.tail; - const min = max - count + 1; - - let lines = 0; - - for (let i = max; i >= min; --i) { - const uuid = this.uuids[i]; - - if (!uuid) { - continue; - } - - this.records[uuid].counters.pop(); - delete this.uuids[i]; - - if (this.records[uuid].counters.length === 0) { - lines += this.records[uuid].lineCount; - - delete this.records[uuid]; - this.state.tail--; - } - } - - return this.pop(lines); - }; - - this.popBack = count => { - if (!count || count <= 0) { - return $q.resolve(); - } - - const min = this.state.head; - const max = min + count - 1; - - let lines = 0; - - for (let i = min; i <= max; ++i) { - const uuid = this.uuids[i]; - - if (!uuid) { - continue; - } - - this.records[uuid].counters.shift(); - delete this.uuids[i]; - - if (this.records[uuid].counters.length === 0) { - lines += this.records[uuid].lineCount; - - delete this.records[uuid]; - this.state.head++; - } - } - - return this.shift(lines); - }; - - this.getHeadCounter = () => this.state.head; - this.getTailCounter = () => this.state.tail; - this.getCapacity = () => OUTPUT_EVENT_LIMIT - (this.getTailCounter() - this.getHeadCounter()); -} - -JobRenderService.$inject = ['$q', '$compile', '$sce', '$window']; - -export default JobRenderService; diff --git a/awx/ui/client/features/output/scroll.service.js b/awx/ui/client/features/output/scroll.service.js deleted file mode 100644 index b8b7444928..0000000000 --- a/awx/ui/client/features/output/scroll.service.js +++ /dev/null @@ -1,228 +0,0 @@ -import { - OUTPUT_ELEMENT_CONTAINER, - OUTPUT_ELEMENT_TBODY, - OUTPUT_SCROLL_DELAY, - OUTPUT_SCROLL_THRESHOLD, -} from './constants'; - -function JobScrollService ($q, $timeout) { - this.init = ({ next, previous, onThresholdLeave }) => { - this.el = $(OUTPUT_ELEMENT_CONTAINER); - this.chain = $q.resolve(); - this.timer = null; - - this.position = { - previous: 0, - current: 0 - }; - - this.threshold = { - previous: 0, - current: 0, - }; - - this.hooks = { - next, - previous, - onThresholdLeave, - }; - - this.state = { - paused: false, - locked: false, - hover: false, - thrash: 0, - }; - - this.el.scroll(this.listen); - this.el.mouseenter(this.onMouseEnter); - this.el.mouseleave(this.onMouseLeave); - }; - - this.onMouseEnter = () => { - this.state.hover = true; - }; - - this.onMouseLeave = () => { - this.state.hover = false; - }; - - this.listen = () => { - if (this.isPaused()) { - return; - } - - if (this.isLocked()) { - return; - } - - if (!this.state.hover) { - return; - } - - if (this.timer) { - $timeout.cancel(this.timer); - } - - this.timer = $timeout(this.register, OUTPUT_SCROLL_DELAY); - }; - - this.register = () => { - const position = this.getScrollPosition(); - const viewport = this.getScrollHeight() - this.getViewableHeight(); - - const threshold = position / viewport; - const downward = position > this.position.previous; - - const isBeyondUpperThreshold = threshold < OUTPUT_SCROLL_THRESHOLD; - const isBeyondLowerThreshold = (1 - threshold) < OUTPUT_SCROLL_THRESHOLD; - - const wasBeyondUpperThreshold = this.threshold.previous < OUTPUT_SCROLL_THRESHOLD; - const wasBeyondLowerThreshold = (1 - this.threshold.previous) < OUTPUT_SCROLL_THRESHOLD; - - const enteredUpperThreshold = isBeyondUpperThreshold && !wasBeyondUpperThreshold; - const enteredLowerThreshold = isBeyondLowerThreshold && !wasBeyondLowerThreshold; - const leftLowerThreshold = !isBeyondLowerThreshold && wasBeyondLowerThreshold; - - const transitions = []; - - if (position <= 0 || enteredUpperThreshold) { - transitions.push(this.hooks.onThresholdLeave); - transitions.push(this.hooks.previous); - } - - if (leftLowerThreshold) { - transitions.push(this.hooks.onThresholdLeave); - } - - if (threshold >= 1 || enteredLowerThreshold) { - transitions.push(this.hooks.next); - } - - if (!downward) { - transitions.reverse(); - } - - this.position.current = position; - this.threshold.current = threshold; - - transitions.forEach(promise => { - this.chain = this.chain.then(() => promise()); - }); - - return this.chain - .then(() => { - this.setScrollPosition(this.getScrollPosition()); - - return $q.resolve(); - }); - }; - - /** - * Move scroll position up by one page of visible content. - */ - this.moveUp = () => { - const position = this.getScrollPosition() - this.getViewableHeight(); - - this.setScrollPosition(position); - }; - - /** - * Move scroll position down by one page of visible content. - */ - this.moveDown = () => { - const position = this.getScrollPosition() + this.getViewableHeight(); - - this.setScrollPosition(position); - }; - - this.getScrollHeight = () => this.el[0].scrollHeight; - this.getViewableHeight = () => this.el[0].offsetHeight; - - /** - * Get the vertical scroll position. - * - * @returns {Number} - The number of pixels that are hidden from view above the scrollable area. - */ - this.getScrollPosition = () => this.el[0].scrollTop; - - this.setScrollPosition = position => { - const viewport = this.getScrollHeight() - this.getViewableHeight(); - - this.position.previous = this.position.current; - this.threshold.previous = this.position.previous / viewport; - this.position.current = position; - - this.el[0].scrollTop = position; - }; - - this.resetScrollPosition = () => { - this.threshold.previous = 0; - this.position.previous = 0; - this.position.current = 0; - - this.el[0].scrollTop = 0; - }; - - this.scrollToBottom = () => { - this.setScrollPosition(this.getScrollHeight()); - }; - - this.lock = () => { - this.state.locked = true; - }; - - this.unlock = () => { - this.state.locked = false; - }; - - this.pause = () => { - this.state.paused = true; - }; - - this.resume = () => { - this.state.paused = false; - }; - - this.hide = () => { - if (this.state.hidden) { - return; - } - - this.state.hidden = true; - this.el.css('overflow-y', 'hidden'); - }; - - this.unhide = () => { - if (!this.state.hidden) { - return; - } - - this.state.hidden = false; - this.el.css('overflow-y', 'auto'); - }; - - this.isBeyondLowerThreshold = () => { - const position = this.getScrollPosition(); - const viewport = this.getScrollHeight() - this.getViewableHeight(); - const threshold = position / viewport; - - return (1 - threshold) < OUTPUT_SCROLL_THRESHOLD; - }; - - this.isBeyondUpperThreshold = () => { - const position = this.getScrollPosition(); - const viewport = this.getScrollHeight() - this.getViewableHeight(); - const threshold = position / viewport; - - return threshold < OUTPUT_SCROLL_THRESHOLD; - }; - - this.isPaused = () => this.state.paused; - this.isLocked = () => this.state.locked; - this.isMissing = () => $(OUTPUT_ELEMENT_TBODY)[0].clientHeight < this.getViewableHeight(); -} - -JobScrollService.$inject = ['$q', '$timeout']; - -export default JobScrollService; diff --git a/awx/ui/client/features/output/search.component.js b/awx/ui/client/features/output/search.component.js deleted file mode 100644 index cb8299be89..0000000000 --- a/awx/ui/client/features/output/search.component.js +++ /dev/null @@ -1,147 +0,0 @@ -/* eslint camelcase: 0 */ -import { - OUTPUT_SEARCH_DOCLINK, - OUTPUT_SEARCH_FIELDS, - OUTPUT_SEARCH_KEY_EXAMPLES, -} from './constants'; - -const templateUrl = require('~features/output/search.partial.html'); - -let $state; -let qs; -let strings; - -let vm; - -function toggleSearchKey () { - vm.key = !vm.key; -} - -function getCurrentQueryset () { - const { job_event_search } = $state.params; - - return qs.decodeArr(job_event_search); -} - -function getSearchTags (queryset) { - return qs.createSearchTagsFromQueryset(queryset) - .filter(tag => !tag.startsWith('event')) - .filter(tag => !tag.startsWith('-event')) - .filter(tag => !tag.startsWith('page_size')) - .filter(tag => !tag.startsWith('order_by')); -} - -function reloadQueryset (queryset, rejection = strings.get('search.REJECT_DEFAULT')) { - const params = angular.copy($state.params); - const currentTags = vm.tags; - - params.handleErrors = false; - params.job_event_search = qs.encodeArr(queryset); - - vm.disabled = true; - vm.message = ''; - vm.tags = getSearchTags(queryset); - - return vm.reload(params) - .catch(() => { - vm.tags = currentTags; - vm.message = rejection; - vm.rejected = true; - vm.disabled = false; - }); -} - -const isFilterable = term => { - const field = term[0].split('.')[0].replace(/^-/, ''); - return (OUTPUT_SEARCH_FIELDS.indexOf(field) > -1); -}; - -function removeSearchTag (index) { - const searchTerm = vm.tags[index]; - - const currentQueryset = getCurrentQueryset(); - const modifiedQueryset = qs.removeTermsFromQueryset(currentQueryset, searchTerm, isFilterable); - - reloadQueryset(modifiedQueryset); -} - -function submitSearch () { - // empty input, not submit new search, return. - if (!vm.value) { - return; - } - - const currentQueryset = getCurrentQueryset(); - // check duplicate , see if search input already exists in current search tags - if (currentQueryset.search) { - if (currentQueryset.search.includes(vm.value)) { - return; - } - } - - const searchInputQueryset = qs.getSearchInputQueryset(vm.value, isFilterable); - const modifiedQueryset = qs.mergeQueryset(currentQueryset, searchInputQueryset); - - reloadQueryset(modifiedQueryset, strings.get('search.REJECT_INVALID')); -} - -function clearSearch () { - reloadQueryset(); -} - -function JobSearchController (_$state_, _qs_, _strings_, { subscribe }) { - $state = _$state_; - qs = _qs_; - strings = _strings_; - - vm = this || {}; - vm.strings = strings; - - vm.examples = OUTPUT_SEARCH_KEY_EXAMPLES; - vm.fields = OUTPUT_SEARCH_FIELDS; - vm.docLink = OUTPUT_SEARCH_DOCLINK; - vm.relatedFields = []; - - vm.clearSearch = clearSearch; - vm.toggleSearchKey = toggleSearchKey; - vm.removeSearchTag = removeSearchTag; - vm.submitSearch = submitSearch; - - let unsubscribe; - - vm.$onInit = () => { - vm.value = ''; - vm.message = ''; - vm.key = false; - vm.rejected = false; - vm.disabled = true; - vm.isJobActive = false; - vm.tags = getSearchTags(getCurrentQueryset()); - - unsubscribe = subscribe(({ running, event_processing_finished }) => { - const isJobActive = running || !event_processing_finished; - vm.disabled = isJobActive; - vm.isJobActive = isJobActive; - }); - }; - - vm.$onDestroy = () => { - unsubscribe(); - }; -} - -JobSearchController.$inject = [ - '$state', - 'QuerySet', - 'OutputStrings', - 'OutputStatusService', -]; - -export default { - templateUrl, - controller: JobSearchController, - controllerAs: 'vm', - bindings: { - reload: '=', - }, -}; diff --git a/awx/ui/client/features/output/search.partial.html b/awx/ui/client/features/output/search.partial.html deleted file mode 100644 index d7d91ac493..0000000000 --- a/awx/ui/client/features/output/search.partial.html +++ /dev/null @@ -1,75 +0,0 @@ - - -
-
- - - - - - -
-

{{ vm.message }}

-
- -
-
- -
-
- {{:: vm.strings.get('search.CLEAR_ALL') }} - -
-
- -
-
-
-
-
- {{:: vm.strings.get('search.EXAMPLES') }}: -
- -
-
-
- {{:: vm.strings.get('search.FIELDS') }}: - {{ field }}, -
-
- {{:: vm.strings.get('search.ADDITIONAL_INFORMATION_HEADER') }}: - {{:: vm.strings.get('search.ADDITIONAL_INFORMATION') }} - - {{:: vm.strings.get('search.DOCUMENTATION') }}. - -
-
-
diff --git a/awx/ui/client/features/output/slide.service.js b/awx/ui/client/features/output/slide.service.js deleted file mode 100644 index da1d9a4047..0000000000 --- a/awx/ui/client/features/output/slide.service.js +++ /dev/null @@ -1,164 +0,0 @@ -/* eslint camelcase: 0 */ -import { - OUTPUT_MAX_BUFFER_LENGTH, - OUTPUT_PAGE_SIZE, -} from './constants'; - -function SlidingWindowService ($q) { - this.init = ({ getRange, getFirst, getLast, getMaxCounter }, storage) => { - const { getHeadCounter, getTailCounter } = storage; - - this.api = { - getRange, - getFirst, - getLast, - getMaxCounter, - }; - - this.storage = { - getHeadCounter, - getTailCounter, - }; - - this.buffer = { - events: [], - min: 0, - max: 0, - count: 0, - }; - - this.cache = { - first: null - }; - }; - - this.getBoundedRange = range => { - const bounds = [1, this.getMaxCounter()]; - - return [Math.max(range[0], bounds[0]), Math.min(range[1], bounds[1])]; - }; - - this.getNextRange = displacement => { - const tail = this.getTailCounter(); - - return this.getBoundedRange([tail + 1, tail + 1 + displacement]); - }; - - this.getPreviousRange = displacement => { - const head = this.getHeadCounter(); - - return this.getBoundedRange([head - 1 - displacement, head - 1]); - }; - - this.getNext = (displacement = OUTPUT_PAGE_SIZE) => { - const next = this.getNextRange(displacement); - - return this.api.getRange(next); - }; - - this.getPrevious = (displacement = OUTPUT_PAGE_SIZE) => { - const previous = this.getPreviousRange(displacement); - - return this.api.getRange(previous); - }; - - this.getFirst = () => { - if (this.cache.first) { - return $q.resolve(this.cache.first); - } - - return this.api.getFirst() - .then(events => { - if (events.length === OUTPUT_PAGE_SIZE) { - this.cache.first = events; - } - - return $q.resolve(events); - }); - }; - - this.getLast = () => this.getFrames() - .then(frames => { - if (frames.length > 0) { - return $q.resolve(frames); - } - - return this.api.getLast(); - }); - - this.pushFrames = events => { - const head = this.getHeadCounter(); - const tail = this.getTailCounter(); - const frames = this.buffer.events.concat(events); - - let min; - let max; - let count = 0; - - for (let i = frames.length - 1; i >= 0; i--) { - count++; - - if (count > OUTPUT_MAX_BUFFER_LENGTH) { - frames.splice(i, 1); - - count--; - continue; - } - - if (!min || frames[i].counter < min) { - min = frames[i].counter; - } - - if (!max || frames[i].counter > max) { - max = frames[i].counter; - } - } - - this.buffer.events.length = 0; - delete this.buffer.events; - - this.buffer.events = frames; - this.buffer.min = min; - this.buffer.max = max; - this.buffer.count = count; - - if (tail - head === 0) { - return frames; - } - - return frames.filter(({ counter }) => counter > tail); - }; - - this.clear = () => { - this.buffer.events.length = 0; - this.buffer.min = 0; - this.buffer.max = 0; - this.buffer.count = 0; - }; - - this.getFrames = () => $q.resolve(this.buffer.events); - - this.getMaxCounter = () => { - if (this.buffer.max && this.buffer.max > 1) { - return this.buffer.max; - } - - return this.api.getMaxCounter(); - }; - - this.isOnLastPage = () => { - if (this.buffer.min) { - return this.getTailCounter() >= this.buffer.min - 1; - } - - return this.getTailCounter() >= this.getMaxCounter() - OUTPUT_PAGE_SIZE; - }; - - this.isOnFirstPage = () => this.getHeadCounter() === 1; - this.getTailCounter = () => this.storage.getTailCounter(); - this.getHeadCounter = () => this.storage.getHeadCounter(); -} - -SlidingWindowService.$inject = ['$q']; - -export default SlidingWindowService; diff --git a/awx/ui/client/features/output/stats.component.js b/awx/ui/client/features/output/stats.component.js deleted file mode 100644 index 61f86d6709..0000000000 --- a/awx/ui/client/features/output/stats.component.js +++ /dev/null @@ -1,84 +0,0 @@ -import { OUTPUT_NO_COUNT_JOB_TYPES } from './constants'; - -const templateUrl = require('~features/output/stats.partial.html'); - -let vm; - -function createStatsBarTooltip (key, count) { - const label = `${key}`; - const badge = `${count}`; - - return `${label}${badge}`; -} - -function JobStatsController (strings, { subscribe }) { - vm = this || {}; - vm.strings = strings; - - let unsubscribe; - - vm.tooltips = { - running: strings.get('status.RUNNING'), - unavailable: strings.get('status.UNAVAILABLE'), - }; - - vm.$onInit = () => { - vm.hideCounts = OUTPUT_NO_COUNT_JOB_TYPES.includes(vm.resource.model.get('type')); - vm.download = vm.resource.model.get('related.stdout'); - vm.tooltips.toggleExpand = vm.expanded ? - strings.get('tooltips.COLLAPSE_OUTPUT') : - strings.get('tooltips.EXPAND_OUTPUT'); - - unsubscribe = subscribe(({ running, elapsed, counts, hosts }) => { - vm.plays = counts.plays; - vm.tasks = counts.tasks; - vm.hosts = counts.hosts; - vm.elapsed = elapsed; - vm.running = running; - vm.setHostStatusCounts(hosts); - }); - }; - - vm.$onDestroy = () => { - unsubscribe(); - }; - - vm.setHostStatusCounts = counts => { - let statsAreAvailable; - - Object.keys(counts).forEach(key => { - const count = counts[key]; - const statusBarElement = $(`.HostStatusBar-${key}`); - - statusBarElement.css('flex', `${count} 0 auto`); - - vm.tooltips[key] = createStatsBarTooltip(key, count); - - if (count) statsAreAvailable = true; - }); - - vm.statsAreAvailable = statsAreAvailable; - }; - - vm.toggleExpanded = () => { - vm.expanded = !vm.expanded; - vm.tooltips.toggleExpand = vm.expanded ? - strings.get('tooltips.COLLAPSE_OUTPUT') : - strings.get('tooltips.EXPAND_OUTPUT'); - }; -} - -JobStatsController.$inject = [ - 'OutputStrings', - 'OutputStatusService', -]; - -export default { - templateUrl, - controller: JobStatsController, - controllerAs: 'vm', - bindings: { - resource: '<', - expanded: '=', - }, -}; diff --git a/awx/ui/client/features/output/stats.partial.html b/awx/ui/client/features/output/stats.partial.html deleted file mode 100644 index 18debf63b9..0000000000 --- a/awx/ui/client/features/output/stats.partial.html +++ /dev/null @@ -1,88 +0,0 @@ - -
- {{:: vm.strings.get('stats.PLAYS')}} - ... - {{ vm.plays || 0 }} - - {{:: vm.strings.get('stats.TASKS')}} - ... - {{ vm.tasks || 0 }} - - {{:: vm.strings.get('stats.HOSTS')}} - ... - {{ vm.hosts || 1 }} - - {{:: vm.strings.get('stats.ELAPSED') }} - - {{ (vm.elapsed * 1000 || 0) | duration: "hh:mm:ss"}} - - - - - - - -
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/awx/ui/client/features/output/status.service.js b/awx/ui/client/features/output/status.service.js deleted file mode 100644 index f661d5b491..0000000000 --- a/awx/ui/client/features/output/status.service.js +++ /dev/null @@ -1,371 +0,0 @@ -/* eslint camelcase: 0 */ -import { - EVENT_START_PLAYBOOK, - EVENT_STATS_PLAY, - EVENT_START_PLAY, - EVENT_START_TASK, - HOST_STATUS_KEYS, - JOB_STATUS_COMPLETE, - JOB_STATUS_INCOMPLETE, - JOB_STATUS_UNSUCCESSFUL, - JOB_STATUS_FINISHED, -} from './constants'; - -function JobStatusService (moment, message) { - this.dispatch = () => message.dispatch('status', this.state); - this.subscribe = listener => message.subscribe('status', listener); - - this.init = ({ model }) => { - this.model = model; - this.created = model.get('created'); - this.job = model.get('id'); - this.jobType = model.get('type'); - this.project = model.get('project'); - - this.active = false; - this.latestTime = null; - this.counter = -1; - - this.state = { - running: false, - anyFailed: false, - counts: { - plays: 0, - tasks: 0, - hosts: 0, - }, - hosts: {}, - status: model.get('status'), - elapsed: model.get('elapsed'), - started: model.get('started'), - finished: model.get('finished'), - environment: model.get('custom_virtualenv'), - artifacts: model.get('artifacts'), - scm: { - id: model.get('summary_fields.project_update.id'), - status: model.get('summary_fields.project_update.status') - }, - scmBranch: model.get('scm_branch'), - scmRefspec: model.get('scm_refspec'), - inventoryScm: { - id: model.get('source_project_update'), - status: model.get('summary_fields.inventory_source.status') - }, - event_processing_finished: model.get('event_processing_finished'), - }; - - this.initHostStatusCounts({ model }); - this.initPlaybookCounts({ model }); - - this.updateRunningState(); - this.dispatch(); - }; - - this.initHostStatusCounts = ({ model }) => { - if (model.has('host_status_counts')) { - this.setHostStatusCounts(model.get('host_status_counts')); - } else { - const hostStatusCounts = this.createHostStatusCounts(this.state.status); - - this.setHostStatusCounts(hostStatusCounts); - } - }; - - this.initPlaybookCounts = ({ model }) => { - if (model.has('playbook_counts')) { - this.setPlaybookCounts(model.get('playbook_counts')); - } else { - this.setPlaybookCounts({ task_count: 1, play_count: 1 }); - } - }; - - this.createHostStatusCounts = status => { - if (JOB_STATUS_UNSUCCESSFUL.includes(status)) { - return { failures: 1 }; - } - - if (JOB_STATUS_COMPLETE.includes(status)) { - return { ok: 1 }; - } - - return null; - }; - - this.pushStatusEvent = data => { - const isJobStatusEvent = (this.job === data.unified_job_id); - const isProjectStatusEvent = (this.project && (this.project === data.project_id)); - const isInventoryScmStatus = (this.model.get('source_project_update') === data.unified_job_id); - - if (isJobStatusEvent) { - this.setJobStatus(data.status); - if (JOB_STATUS_FINISHED.includes(data.status)) { - this.sync(); - } - this.dispatch(); - } else if (isProjectStatusEvent) { - this.setProjectStatus(data.status); - this.setProjectUpdateId(data.unified_job_id); - this.dispatch(); - } else if (isInventoryScmStatus) { - this.setInventoryScmStatus(data.status); - this.setInventoryScmId(data.unified_job_id); - this.dispatch(); - } - }; - - this.pushJobEvent = data => { - const isLatest = ((!this.counter) || (data.counter > this.counter)); - - let changed = false; - - if (!this.active && !(data.event === EVENT_STATS_PLAY)) { - this.active = true; - this.setJobStatus('running'); - changed = true; - } - - if (isLatest) { - this.counter = data.counter; - this.latestTime = data.created; - this.setElapsed(moment(data.created).diff(this.created, 'seconds')); - changed = true; - } - - if (data.event === EVENT_START_PLAYBOOK) { - this.setStarted(this.state.started || data.created); - changed = true; - } - - if (data.event === EVENT_START_PLAY) { - this.state.counts.plays++; - changed = true; - } - - if (data.event === EVENT_START_TASK) { - this.state.counts.tasks++; - changed = true; - } - - if (data.event === EVENT_STATS_PLAY) { - this.setStatsEvent(data); - changed = true; - } - - if (data.failed) { - this.state.anyFailed = true; - } - - if (changed) { - this.dispatch(); - } - }; - - this.isExpectingStatsEvent = () => (this.jobType === 'job') || - (this.jobType === 'project_update') || - (this.jobType === 'ad_hoc_command'); - - this.updateStats = () => { - this.updateHostCounts(); - - if (this.statsEvent) { - this.setFinished(this.statsEvent.created); - - const failures = _.get(this.statsEvent, ['event_data', 'failures'], {}); - const dark = _.get(this.statsEvent, ['event_data', 'dark'], {}); - - if (this.statsEvent.failed || - Object.keys(failures).length > 0 || - Object.keys(dark).length > 0) { - this.setJobStatus('failed'); - } else { - this.setJobStatus('successful'); - } - } else if (this.state.counter > -1) { - this.setJobStatus(this.state.anyFailed ? 'failed' : 'unknown'); - } else { - this.setJobStatus('unknown'); - } - }; - - this.updateRunningState = () => { - this.state.running = (Boolean(this.state.started) && !this.state.finished) || - (this.state.status === 'running') || - (this.state.status === 'pending') || - (this.state.status === 'waiting'); - }; - - this.updateHostCounts = () => { - const countedHostNames = []; - - const counts = Object.assign(...HOST_STATUS_KEYS.map(key => ({ [key]: 0 }))); - - HOST_STATUS_KEYS.forEach(key => { - const hostData = _.get(this.statsEvent, ['event_data', key], {}); - - Object.keys(hostData).forEach(hostName => { - const isAlreadyCounted = (countedHostNames.indexOf(hostName) > -1); - const shouldBeCounted = ((!isAlreadyCounted) && hostData[hostName] > 0); - - if (shouldBeCounted) { - countedHostNames.push(hostName); - counts[key]++; - } - }); - }); - - this.state.counts.hosts = countedHostNames.length; - this.setHostStatusCounts(counts); - }; - - this.setJobStatus = status => { - const isExpectingStats = this.isExpectingStatsEvent(); - const isIncomplete = JOB_STATUS_INCOMPLETE.includes(status); - const isFinished = JOB_STATUS_FINISHED.includes(status); - const isAlreadyFinished = JOB_STATUS_FINISHED.includes(this.state.status); - - if (isAlreadyFinished && !isFinished) { - return; - } - - if ((isExpectingStats && isIncomplete) || (!isExpectingStats && isFinished)) { - if (this.latestTime) { - if (!this.state.finished) { - this.setFinished(this.latestTime); - } - - if (!this.state.started && this.state.elapsed) { - this.setStarted(moment(this.latestTime) - .subtract(this.state.elapsed, 'seconds')); - } - } - } - - this.state.status = status; - this.updateRunningState(); - }; - - this.setElapsed = elapsed => { - if (!elapsed) return; - - this.state.elapsed = elapsed; - }; - - this.setStarted = started => { - if (!started) return; - - this.state.started = started; - this.updateRunningState(); - }; - - this.setProjectStatus = status => { - this.state.scm.status = status; - }; - - this.setProjectUpdateId = id => { - this.state.scm.id = id; - }; - - this.setInventoryScmStatus = status => { - this.state.inventoryScm.status = status; - }; - - this.setInventoryScmId = id => { - this.state.inventoryScm.id = id; - }; - - this.setFinished = time => { - if (!time) return; - - this.state.finished = time; - this.updateRunningState(); - }; - - this.setEnvironment = env => { - if (!env) return; - - this.state.environment = env; - }; - - this.setArtifacts = val => { - if (!val) return; - - this.state.artifacts = val; - }; - - this.setExecutionNode = node => { - if (!node) return; - - this.state.executionNode = node; - }; - - this.setStatsEvent = data => { - if (!data) return; - - this.statsEvent = data; - }; - - this.setResultTraceback = traceback => { - if (!traceback) return; - - this.state.resultTraceback = traceback; - }; - - this.setEventProcessingFinished = val => { - this.state.event_processing_finished = val; - }; - - this.setHostStatusCounts = counts => { - counts = counts || {}; - - HOST_STATUS_KEYS.forEach(key => { - counts[key] = counts[key] || 0; - }); - - if (!this.state.counts.hosts) { - this.state.counts.hosts = Object.keys(counts) - .reduce((sum, key) => sum + counts[key], 0); - } - - this.state.hosts = counts; - }; - - this.setPlaybookCounts = ({ play_count, task_count }) => { - this.state.counts.plays = play_count; - this.state.counts.tasks = task_count; - }; - - this.resetCounts = () => { - this.state.counts.plays = 0; - this.state.counts.tasks = 0; - this.state.counts.hosts = 0; - }; - - this.sync = () => { - const { model } = this; - - return model.http.get({ resource: model.get('id') }) - .then(() => { - this.setFinished(model.get('finished')); - this.setElapsed(model.get('elapsed')); - this.setStarted(model.get('started')); - this.setJobStatus(model.get('status')); - this.setEnvironment(model.get('custom_virtualenv')); - this.setArtifacts(model.get('artifacts')); - this.setExecutionNode(model.get('execution_node')); - this.setResultTraceback(model.get('result_traceback')); - this.setEventProcessingFinished(model.get('event_processing_finished')); - - this.initHostStatusCounts({ model }); - this.initPlaybookCounts({ model }); - - this.dispatch(); - }); - }; -} - -JobStatusService.$inject = [ - 'moment', - 'OutputMessageService', -]; - -export default JobStatusService; diff --git a/awx/ui/client/features/output/stream.service.js b/awx/ui/client/features/output/stream.service.js deleted file mode 100644 index c3cfa10622..0000000000 --- a/awx/ui/client/features/output/stream.service.js +++ /dev/null @@ -1,250 +0,0 @@ -/* eslint camelcase: 0 */ -import { - EVENT_STATS_PLAY, - OUTPUT_MAX_BUFFER_LENGTH, - OUTPUT_MAX_LAG, - OUTPUT_PAGE_SIZE, - OUTPUT_EVENT_LIMIT, -} from './constants'; - -const rx = []; - -function OutputStream ($q) { - this.init = ({ onFrames, onFrameRate, onStop }) => { - this.hooks = { - onFrames, - onFrameRate, - onStop, - }; - - this.bufferInit(); - }; - - this.bufferInit = () => { - rx.length = 0; - - this.counters = { - min: 1, - max: -1, - ready: -1, - final: null, - used: [], - missing: [], - total: 0, - length: 0, - }; - - this.state = { - ending: false, - ended: false, - overflow: false, - }; - - this.lag = 0; - this.chain = $q.resolve(); - - this.factors = this.calcFactors(OUTPUT_EVENT_LIMIT); - this.setFramesPerRender(); - }; - - this.calcFactors = size => { - const factors = [1]; - - if (size !== parseInt(size, 10) || size <= 1) { - return factors; - } - - for (let i = 2; i <= size / 2; i++) { - if (size % i === 0) { - factors.push(i); - } - } - - factors.push(size); - - return factors; - }; - - this.setFramesPerRender = () => { - const index = Math.floor((this.lag / OUTPUT_MAX_LAG) * this.factors.length); - const boundedIndex = Math.min(this.factors.length - 1, index); - - this.framesPerRender = this.factors[boundedIndex]; - this.hooks.onFrameRate(this.framesPerRender); - }; - - this.setMissingCounterThreshold = counter => { - if (counter > this.counters.min) { - this.counters.min = counter; - } - }; - - this.bufferAdd = event => { - const { counter } = event; - - if (counter > this.counters.max) { - this.counters.max = counter; - } - - let ready; - const used = []; - const missing = []; - - for (let i = this.counters.min; i <= this.counters.max; i++) { - if (this.counters.used.indexOf(i) === -1) { - if (i === counter) { - rx.push(event); - used.push(i); - this.counters.length += 1; - } else { - missing.push(i); - } - } else { - used.push(i); - } - } - - const excess = this.counters.length - OUTPUT_MAX_BUFFER_LENGTH; - this.state.overflow = (excess > 0); - - if (missing.length === 0) { - ready = this.counters.max; - } else if (this.state.overflow) { - ready = this.counters.min + this.framesPerRender; - } else { - ready = missing[0] - 1; - } - - this.counters.total += 1; - this.counters.ready = ready; - this.counters.used = used; - this.counters.missing = missing; - - if (!window.liveUpdates) { - this.counters.ready = event.counter; - } - }; - - this.bufferEmpty = threshold => { - let removed = []; - - for (let i = rx.length - 1; i >= 0; i--) { - if (rx[i].counter <= threshold) { - removed = removed.concat(rx.splice(i, 1)); - } - } - - this.counters.min = threshold + 1; - this.counters.used = this.counters.used.filter(c => c > threshold); - this.counters.length = rx.length; - - return removed; - }; - - this.isReadyToRender = () => { - const { total } = this.counters; - const readyCount = this.getReadyCount(); - - if (!window.liveUpdates) { - return true; - } - - if (readyCount <= 0) { - return false; - } - - if (this.state.ending) { - return true; - } - - if (total % this.framesPerRender === 0) { - return true; - } - - if (total < OUTPUT_PAGE_SIZE) { - if (readyCount % this.framesPerRender === 0) { - return true; - } - } - - return false; - }; - - this.pushJobEvent = data => { - this.lag++; - - this.chain = this.chain - .then(() => { - if (data.event === EVENT_STATS_PLAY) { - this.state.ending = true; - this.counters.final = data.counter; - } - - this.bufferAdd(data); - - if (this.counters.total % OUTPUT_PAGE_SIZE === 0) { - this.setFramesPerRender(); - } - - if (!this.isReadyToRender()) { - return $q.resolve(); - } - - const isLast = this.state.ending && (this.counters.ready >= this.counters.final); - const events = this.bufferEmpty(this.counters.ready); - - if (events.length > 0) { - return this.emitFrames(events, isLast); - } - - return $q.resolve(); - }) - .then(() => --this.lag); - - return this.chain; - }; - - this.setFinalCounter = counter => { - this.chain = this.chain - .then(() => { - this.state.ending = true; - this.counters.final = counter; - - if (counter > this.counters.ready) { - return $q.resolve(); - } - - const readyCount = this.getReadyCount(); - - let events = []; - if (readyCount > 0) { - events = this.bufferEmpty(this.counters.ready); - - return this.emitFrames(events, true); - } - - return $q.resolve(); - }); - - return this.chain; - }; - - this.emitFrames = (events, last) => this.hooks.onFrames(events) - .then(() => { - if (last) { - this.state.ending = false; - this.state.ended = true; - - this.hooks.onStop(); - } - - return $q.resolve(); - }); - - this.getMaxCounter = () => this.counters.max; - this.getReadyCount = () => this.counters.ready - this.counters.min + 1; -} - -OutputStream.$inject = ['$q']; - -export default OutputStream; diff --git a/awx/ui/client/features/portalMode/_index.less b/awx/ui/client/features/portalMode/_index.less deleted file mode 100644 index 418095942c..0000000000 --- a/awx/ui/client/features/portalMode/_index.less +++ /dev/null @@ -1,69 +0,0 @@ -.PortalMode-container{ - display: flex; - flex-direction: row; - @media screen and(max-width: 900px){ - flex-direction: column; - height: 100%; - } -} - -.PortalMode-panel--left{ - .OnePlusOne-panel--left; -} - -.PortalMode-panel--right{ - .OnePlusOne-panel--right; - .List-tableHeader:last-of-type{ - text-align:left; - } -} - -.PortalMode-panel .List-header { - height: 14px; - margin-bottom: 20px; -} - -.PortalMode-panelHeader{ - .OnePlusOne-panelHeader; -} - - -.PortalMode-headerContainer { - display: flex; - align-items: center; - margin-bottom: 20px; - - .at-Panel-heading { - margin-bottom: 0; - } - - .FormToggle-container { - padding-bottom: 0; - } -} - -.PortalMode-filterHolder { - position: absolute; - right: 1px; - margin-right: 10px; - display: flex; - align-items: center; - justify-content: center; - - .btn.btn-xs { - padding: 1px 10px; - } -} - -.PortalMode-filterButton--edges { - &:first-child { - border-right: none; - } - &:last-child { - border-left: none; - } -} - -.PortalMode-refresh { - margin-left: 10px; -} diff --git a/awx/ui/client/features/portalMode/index.controller.js b/awx/ui/client/features/portalMode/index.controller.js deleted file mode 100644 index 05889bf1a5..0000000000 --- a/awx/ui/client/features/portalMode/index.controller.js +++ /dev/null @@ -1,27 +0,0 @@ -function IndexTemplatesController ($scope, $state, strings) { - const vm = this; - vm.strings = strings; - - $scope.filterUser = () => { - $state.go('portalMode.myJobs'); - }; - $scope.filterAll = () => { - $state.go('portalMode.allJobs'); - }; - - $scope.$on('updateCount', (e, count, resource) => { - if (resource === 'jobs') { - vm.jobsCount = count; - } else if (resource === 'templates') { - vm.templatesCount = count; - } - }); -} - -IndexTemplatesController.$inject = [ - '$scope', - '$state', - 'PortalModeStrings', -]; - -export default IndexTemplatesController; diff --git a/awx/ui/client/features/portalMode/index.js b/awx/ui/client/features/portalMode/index.js deleted file mode 100644 index e09c6e35e1..0000000000 --- a/awx/ui/client/features/portalMode/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import PortalModeStrings from './portalMode.strings'; - -import templatesRoute from './routes/portalModeTemplatesList.route'; -import myJobsRoute from './routes/portalModeMyJobs.route'; -import allJobsRoute from './routes/portalModeAllJobs.route'; - -const MODULE_NAME = 'at.features.portalMode'; - -angular - .module(MODULE_NAME, []) - .service('PortalModeStrings', PortalModeStrings) - .run(['$stateExtender', ($stateExtender) => { - $stateExtender.addState(templatesRoute); - $stateExtender.addState(myJobsRoute); - $stateExtender.addState(allJobsRoute); - }]); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/portalMode/index.view.html b/awx/ui/client/features/portalMode/index.view.html deleted file mode 100644 index e463df464c..0000000000 --- a/awx/ui/client/features/portalMode/index.view.html +++ /dev/null @@ -1,56 +0,0 @@ -
-
-
- -
- - -
-
-
-
- -
-
- - -
-
-
- - -
-
-
- -
-
-
-
-
-
-
-
-
-
diff --git a/awx/ui/client/features/portalMode/portalMode.strings.js b/awx/ui/client/features/portalMode/portalMode.strings.js deleted file mode 100644 index c1cdd893fd..0000000000 --- a/awx/ui/client/features/portalMode/portalMode.strings.js +++ /dev/null @@ -1,15 +0,0 @@ -function PortalModeStrings (BaseString) { - BaseString.call(this, 'portalMode'); - - const { t } = this; - const ns = this.portalMode; - - ns.list = { - TEMPLATES_PANEL_TITLE: t.s('JOB TEMPLATES'), - JOBS_PANEL_TITLE: t.s('JOBS'), - }; -} - -PortalModeStrings.$inject = ['BaseStringService']; - -export default PortalModeStrings; diff --git a/awx/ui/client/features/portalMode/routes/portalModeAllJobs.route.js b/awx/ui/client/features/portalMode/routes/portalModeAllJobs.route.js deleted file mode 100644 index fa2396b4df..0000000000 --- a/awx/ui/client/features/portalMode/routes/portalModeAllJobs.route.js +++ /dev/null @@ -1,57 +0,0 @@ -import jobsListController from '../../jobs/jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); - -export default { - name: 'portalMode.allJobs', - url: '/alljobs?{job_search:queryset}', - ncyBreadcrumb: { - skip: true - }, - params: { - job_search: { - value: { - page_size: '20', - order_by: '-finished' - }, - dynamic: true - } - }, - views: { - 'jobs@portalMode': { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.job_search; - - const searchPath = GetBasePath('unified_jobs'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - 'GetBasePath', - (GetBasePath) => GetBasePath('unified_jobs') - ] - } -}; diff --git a/awx/ui/client/features/portalMode/routes/portalModeMyJobs.route.js b/awx/ui/client/features/portalMode/routes/portalModeMyJobs.route.js deleted file mode 100644 index 61de256d40..0000000000 --- a/awx/ui/client/features/portalMode/routes/portalModeMyJobs.route.js +++ /dev/null @@ -1,60 +0,0 @@ -import jobsListController from '../../jobs/jobsList.controller'; - -const jobsListTemplate = require('~features/jobs/jobsList.view.html'); - -export default { - name: 'portalMode.myJobs', - url: '/myjobs?{job_search:queryset}', - ncyBreadcrumb: { - skip: true - }, - params: { - job_search: { - value: { - page_size: '20', - order_by: '-finished', - created_by: null - }, - dynamic: true - } - }, - views: { - 'jobs@portalMode': { - templateUrl: jobsListTemplate, - controller: jobsListController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'UnifiedJobModel', - (UnifiedJob) => { - const models = [ - new UnifiedJob(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - '$rootScope', - ($stateParams, Wait, GetBasePath, qs, $rootScope) => { - const searchParam = _.assign($stateParams.job_search, { - created_by: $rootScope.current_user.id }); - - const searchPath = GetBasePath('unified_jobs'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - SearchBasePath: [ - 'GetBasePath', - (GetBasePath) => GetBasePath('unified_jobs') - ] - } -}; diff --git a/awx/ui/client/features/portalMode/routes/portalModeTemplatesList.route.js b/awx/ui/client/features/portalMode/routes/portalModeTemplatesList.route.js deleted file mode 100644 index 8255cfb169..0000000000 --- a/awx/ui/client/features/portalMode/routes/portalModeTemplatesList.route.js +++ /dev/null @@ -1,70 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import templatesListController from '../../templates/templatesList.controller'; -import indexController from '../index.controller'; - -const templatesListTemplate = require('~features/templates/templatesList.view.html'); -const indexTemplate = require('~features/portalMode/index.view.html'); - -export default { - name: 'portalMode', - url: '/portal', - reloadOnSearch: true, - ncyBreadcrumb: { - label: N_('MY VIEW') - }, - data: { - socket: { - groups: { - jobs: ['status_changed'] - } - } - }, - params: { - template_search: { - dynamic: true, - value: { - type: 'workflow_job_template,job_template', - }, - } - }, - searchPrefix: 'template', - views: { - '@': { - templateUrl: indexTemplate, - controller: indexController, - controllerAs: 'vm' - }, - 'templates@portalMode': { - templateUrl: templatesListTemplate, - controller: templatesListController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'JobTemplateModel', - 'WorkflowJobTemplateModel', - (JobTemplate, WorkflowJobTemplate) => { - const models = [ - new JobTemplate(['options']), - new WorkflowJobTemplate(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.template_search; - const searchPath = GetBasePath('unified_job_templates'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - } -}; diff --git a/awx/ui/client/features/projects/index.controller.js b/awx/ui/client/features/projects/index.controller.js deleted file mode 100644 index 4722753e97..0000000000 --- a/awx/ui/client/features/projects/index.controller.js +++ /dev/null @@ -1,19 +0,0 @@ -function IndexProjectsController ($scope, strings, dataset) { - const vm = this; - vm.strings = strings; - vm.count = dataset.data.count; - - $scope.$on('updateCount', (e, count) => { - if (typeof count === 'number') { - vm.count = count; - } - }); -} - -IndexProjectsController.$inject = [ - '$scope', - 'ProjectsStrings', - 'Dataset', -]; - -export default IndexProjectsController; diff --git a/awx/ui/client/features/projects/index.js b/awx/ui/client/features/projects/index.js deleted file mode 100644 index c9e51f7fbc..0000000000 --- a/awx/ui/client/features/projects/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import ProjectsStrings from './projects.strings'; - -const MODULE_NAME = 'at.features.projects'; - -angular - .module(MODULE_NAME, []) - .service('ProjectsStrings', ProjectsStrings); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/projects/index.view.html b/awx/ui/client/features/projects/index.view.html deleted file mode 100644 index 13e18dfb28..0000000000 --- a/awx/ui/client/features/projects/index.view.html +++ /dev/null @@ -1,12 +0,0 @@ -
-
- -
- - -
-
-
diff --git a/awx/ui/client/features/projects/projects.strings.js b/awx/ui/client/features/projects/projects.strings.js deleted file mode 100644 index 612806febf..0000000000 --- a/awx/ui/client/features/projects/projects.strings.js +++ /dev/null @@ -1,55 +0,0 @@ -function ProjectsStrings (BaseString) { - BaseString.call(this, 'projects'); - - const { t } = this; - const ns = this.projects; - - ns.list = { - PANEL_TITLE: t.s('PROJECTS'), - ROW_ITEM_LABEL_DESCRIPTION: t.s('DESCRIPTION'), - ROW_ITEM_LABEL_REVISION: t.s('REVISION'), - ROW_ITEM_LABEL_ORGANIZATION: t.s('ORGANIZATION'), - ROW_ITEM_LABEL_MODIFIED: t.s('LAST MODIFIED'), - ROW_ITEM_LABEL_USED: t.s('LAST USED'), - ADD: t.s('Add a new project') - }; - - ns.update = { - GET_LATEST: t.s('Get latest SCM revision'), - UPDATE_RUNNING: t.s('SCM update currently running'), - MANUAL_PROJECT_NO_UPDATE: t.s('Manual projects do not require an SCM update'), - CANCEL_UPDATE_REQUEST: t.s('Your request to cancel the update was submitted to the task manager.'), - NO_UPDATE_INFO: t.s('There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project.'), - NO_PROJ_SCM_CONFIG: t.s('The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update.'), - NO_ACCESS_OR_COMPLETED_UPDATE: t.s('Either you do not have access or the SCM update process completed'), - NO_RUNNING_UPDATE: t.s('An SCM update does not appear to be running for project: '), - }; - - ns.alert = { - NO_UPDATE: t.s('No Updates Available'), - UPDATE_CANCEL: t.s('SCM Update Cancel'), - CANCEL_NOT_ALLOWED: t.s('Cancel Not Allowed'), - NO_SCM_CONFIG: t.s('No SCM Configuration'), - UPDATE_NOT_FOUND: t.s('Update Not Found'), - }; - - ns.status = { - NOT_CONFIG: t.s('Not configured for SCM'), - NEVER_UPDATE: t.s('No SCM updates have run for this project'), - UPDATE_QUEUED: t.s('Update queued. Click for details'), - UPDATE_RUNNING: t.s('Update running. Click for details'), - UPDATE_SUCCESS: t.s('Update succeeded. Click for details'), - UPDATE_FAILED: t.s('Update failed. Click for details'), - UPDATE_MISSING: t.s('Update missing. Click for details'), - UPDATE_CANCELED: t.s('Update canceled. Click for details'), - }; - - ns.error = { - HEADER: this.error.HEADER, - CALL: this.error.CALL, - }; -} - -ProjectsStrings.$inject = ['BaseStringService']; - -export default ProjectsStrings; diff --git a/awx/ui/client/features/projects/projectsList.controller.js b/awx/ui/client/features/projects/projectsList.controller.js deleted file mode 100644 index df06920f60..0000000000 --- a/awx/ui/client/features/projects/projectsList.controller.js +++ /dev/null @@ -1,503 +0,0 @@ -/** *********************************************** - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - ************************************************ */ - -const mapChoices = choices => Object.assign(...choices.map(([k, v]) => ({ [k]: v.toUpperCase() }))); - -function projectsListController ( - $filter, $scope, $rootScope, $state, $log, Dataset, Alert, Rest, - ProcessErrors, resolvedModels, strings, Wait, ngToast, - Prompt, GetBasePath, qs, ProjectUpdate, -) { - const vm = this || {}; - const [ProjectModel] = resolvedModels; - let paginateQuerySet = {}; - $scope.canAdd = ProjectModel.options('actions.POST'); - - vm.strings = strings; - vm.scm_choices = ProjectModel.options('actions.GET.scm_type.choices'); - vm.projectTypes = mapChoices(vm.scm_choices); - - // smart-search - vm.list = { - iterator: 'project', - name: 'projects', - basePath: 'projects', - }; - vm.dataset = Dataset.data; - vm.projects = Dataset.data.results; - - $scope.$watch('vm.dataset.count', () => { - $scope.$emit('updateCount', vm.dataset.count, 'projects'); - }); - // build tooltips - _.forEach(vm.projects, buildTooltips); - $rootScope.flashMessage = null; - - // when a project is added/deleted, rebuild tooltips - $scope.$watchCollection('vm.projects', () => { - _.forEach(vm.projects, buildTooltips); - }); - // show active item in the list - $scope.$watch('$state.params', () => { - const projectId = _.get($state.params, 'project_id'); - if ((projectId)) { - vm.activeId = parseInt($state.params.project_id, 10); - } else { - vm.activeId = ''; - } - setToolbarSort(); - }, true); - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'project_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - const toolbarSortDefault = { - label: `${strings.get('sort.NAME_ASCENDING')}`, - value: 'name' - }; - - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${strings.get('sort.NAME_DESCENDING')}`, value: '-name' }, - { label: `${strings.get('sort.MODIFIED_ASCENDING')}`, value: 'modified' }, - { label: `${strings.get('sort.MODIFIED_DESCENDING')}`, value: '-modified' }, - { label: `${strings.get('sort.LAST_USED_ASCENDING')}`, value: 'last_job_run' }, - { label: `${strings.get('sort.LAST_USED_DESCENDING')}`, value: '-last_job_run' }, - { label: `${strings.get('sort.ORGANIZATION_ASCENDING')}`, value: 'organization' }, - { label: `${strings.get('sort.ORGANIZATION_DESCENDING')}`, value: '-organization' } - ]; - - vm.toolbarSortValue = toolbarSortDefault; - - // Temporary hack to retrieve $scope.querySet from the paginate directive. - // Remove this event listener once the page and page_size params - // are represented in the url. - $scope.$on('updateDataset', (event, dataset, queryset) => { - vm.dataset = dataset; - vm.projects = dataset.results; - paginateQuerySet = queryset; - }); - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - - const queryParams = Object.assign( - {}, - $state.params.project_search, - paginateQuerySet, - { order_by: sort.value } - ); - - // Update URL with params - $state.go('.', { - project_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - $scope.$on('ws-jobs', (e, data) => { - $log.debug(data); - if (vm.projects) { - // Assuming we have a list of projects available - const project = vm.projects.find((p) => p.id === data.project_id); - if (project) { - // And we found the affected project - $log.debug(`Received event for project: ${project.name}`); - $log.debug(`Status changed to: ${data.status}`); - project.status = data.status; - buildTooltips(project); - } - } - }); - - if ($scope.removeGoTojobResults) { - $scope.removeGoTojobResults(); - } - - $scope.removeGoTojobResults = $scope.$on('GoTojobResults', (e, data) => { - if (data.summary_fields.current_update || data.summary_fields.last_update) { - Wait('start'); - // Grab the id from summary_fields - const updateJobid = (data.summary_fields.current_update) ? - data.summary_fields.current_update.id : data.summary_fields.last_update.id; - - $state.go('output', { id: updateJobid, type: 'project' }, { reload: true }); - } else { - Alert(vm.strings.get('alert.NO_UPDATE'), vm.strings.get('update.NO_UPDATE_INFO'), 'alert-info'); - } - }); - - if ($scope.removeCancelUpdate) { - $scope.removeCancelUpdate(); - } - - $scope.removeCancelUpdate = $scope.$on('Cancel_Update', (e, url) => { - // Cancel the project update process - Rest.setUrl(url); - Rest.post() - .then(() => { - Alert(vm.strings.get('alert.UPDATE_CANCEL'), vm.strings.get('update.CANCEL_UPDATE_REQUEST'), 'alert-info'); - }) - .catch(createErrorHandler(url, 'POST')); - }); - - if ($scope.removeCheckCancel) { - $scope.removeCheckCancel(); - } - - $scope.removeCheckCancel = $scope.$on('Check_Cancel', (e, projectData) => { - // Check that we 'can' cancel the update - const url = projectData.related.cancel; - Rest.setUrl(url); - Rest.get() - .then(({ data }) => { - if (data.can_cancel) { - $scope.$emit('Cancel_Update', url); - } else { - Alert(vm.strings.get('alert.CANCEL_NOT_ALLOWED'), vm.strings.get('update.NO_ACCESS_OR_COMPLETED_UPDATE'), 'alert-info', null, null, null, null, true); - } - }) - .catch(createErrorHandler(url, 'GET')); - }); - - vm.showSCMStatus = (id) => { - // Refresh the project list - const project = vm.projects.find((p) => p.id === id); - - if ((!project.scm_type) || project.scm_type === 'Manual') { - Alert(vm.strings.get('alert.NO_SCM_CONFIG'), vm.strings.get('update.NO_PROJ_SCM_CONFIG'), 'alert-info'); - } else { - // Refresh what we have in memory - // to insure we're accessing the most recent status record - Rest.setUrl(project.url); - Rest.get() - .then(({ data }) => { - $scope.$emit('GoTojobResults', data); - }) - .catch(createErrorHandler(project.url, 'GET')); - } - }; - - vm.getLastModified = project => { - const modified = _.get(project, 'modified'); - - if (!modified) { - return undefined; - } - - const html = $filter('longDate')(modified); - - // NEED api to add field project.summary_fields.modified_by - - // const { username, id } = _.get(project, 'summary_fields.modified_by', {}); - - // if (username && id) { - // html += ` by ${$filter('sanitize')(username)}`; - // } - - return html; - }; - - vm.getLastUsed = project => { - const modified = _.get(project, 'last_job_run'); - - if (!modified) { - return undefined; - } - - const html = $filter('longDate')(modified); - - // NEED api to add last_job user information such as launch_by - - // const { id } = _.get(project, 'summary_fields.last_job', {}); - // if (id) { - // html += ` by - // ${$filter('sanitize')('placehoder')}`; - // } - return html; - }; - - vm.copyProject = project => { - Wait('start'); - ProjectModel - .create('get', project.id) - .then(model => model.copy()) - .then((copiedProj) => { - ngToast.success({ - content: ` -
-
- -
-
- ${vm.strings.get('SUCCESSFUL_CREATION', copiedProj.name)} -
-
`, - dismissButton: false, - dismissOnTimeout: true - }); - reloadList(); - }) - .catch(createErrorHandler('copy project', 'GET')) - .finally(() => Wait('stop')); - }; - - vm.deleteProject = (id, name) => { - const action = () => { - $('#prompt-modal').modal('hide'); - Wait('start'); - ProjectModel - .request('delete', id) - .then(() => { - let reloadListStateParams = null; - - if (vm.projects.length === 1 - && $state.params.project_search - && _.has($state, 'params.project_search.page') - && $state.params.project_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.project_search.page = - (parseInt(reloadListStateParams.project_search.page, 10) - 1).toString(); - } - - if (parseInt($state.params.project_id, 10) === id) { - $state.go('^', reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, { reload: true }); - } - }) - .catch(createErrorHandler(`${ProjectModel.path}${id}/`, 'DELETE')) - .finally(() => { - Wait('stop'); - }); - }; - - ProjectModel.getDependentResourceCounts(id) - .then((counts) => { - const invalidateRelatedLines = []; - let deleteModalBody = `
${vm.strings.get('deleteResource.CONFIRM', 'project')}
`; - - counts.forEach(countObj => { - if (countObj.count && countObj.count > 0) { - invalidateRelatedLines.push(`
${countObj.label}${countObj.count}
`); - } - }); - - if (invalidateRelatedLines && invalidateRelatedLines.length > 0) { - deleteModalBody = `
${vm.strings.get('deleteResource.USED_BY', 'project')} ${vm.strings.get('deleteResource.CONFIRM', 'project')}
`; - invalidateRelatedLines.forEach(invalidateRelatedLine => { - deleteModalBody += invalidateRelatedLine; - }); - } - - Prompt({ - hdr: vm.strings.get('DELETE'), - resourceName: $filter('sanitize')(name), - body: deleteModalBody, - action, - actionText: vm.strings.get('DELETE'), - }); - }); - }; - - vm.cancelUpdate = (project) => { - project.pending_cancellation = true; - Rest.setUrl(GetBasePath('projects') + project.id); - Rest.get() - .then(({ data }) => { - if (data.related.current_update) { - cancelSCMUpdate(data); - } else { - Alert(vm.strings.get('update.UPDATE_NOT_FOUND'), vm.strings.get('update.NO_RUNNING_UPDATE') + $filter('sanitize')(project.name), 'alert-info', undefined, undefined, undefined, undefined, true); - } - }) - .catch(createErrorHandler('get project', 'GET')); - }; - - vm.SCMUpdate = (id, event) => { - try { - $(event.target).tooltip('hide'); - } catch (e) { - // ignore - } - vm.projects.forEach((project) => { - if (project.id === id) { - if (project.scm_type === 'Manual' || (!project.scm_type)) { - // Do not respond. Button appears greyed out as if it is disabled. - // Not disabled though, because we need mouse over event - // to work. So user can click, but we just won't do anything. - // Alert('Missing SCM Setup', 'Before running an SCM update, - // edit the project and provide the SCM access information.', 'alert-info'); - } else if (project.status === 'updating' || project.status === 'running' || project.status === 'pending') { - // Alert('Update in Progress', 'The SCM update process is running. - // Use the Refresh button to monitor the status.', 'alert-info'); - } else { - ProjectUpdate({ scope: $scope, project_id: project.id }); - } - } - }); - }; - - function buildTooltips (project) { - project.statusIcon = getJobStatusIcon(project); - project.statusTip = getStatusTooltip(project); - project.scm_update_tooltip = vm.strings.get('update.GET_LATEST'); - project.scm_update_disabled = false; - - if (project.status === 'pending' || project.status === 'waiting') { - project.scm_update_disabled = true; - } - - if (project.status === 'failed' && project.summary_fields.last_update && project.summary_fields.last_update.status === 'canceled') { - project.statusTip = vm.strings.get('status.UPDATE_CANCELED'); - project.scm_update_disabled = true; - } - - if (project.status === 'running' || project.status === 'updating') { - project.scm_update_tooltip = vm.strings.get('update.UPDATE_RUNNING'); - project.scm_update_disabled = true; - } - - if (project.scm_type === 'manual') { - project.statusIcon = 'none'; - project.statusTip = vm.strings.get('status.NOT_CONFIG'); - project.scm_update_tooltip = vm.strings.get('update.MANUAL_PROJECT_NO_UPDATE'); - project.scm_update_disabled = true; - } - } - - function cancelSCMUpdate (projectData) { - Rest.setUrl(projectData.related.current_update); - Rest.get() - .then(({ data }) => { - $scope.$emit('Check_Cancel', data); - }) - .catch(createErrorHandler(projectData.related.current_update, 'GET')); - } - - function reloadList () { - Wait('start'); - const path = GetBasePath(vm.list.basePath) || GetBasePath(vm.list.name); - qs.search(path, $state.params.project_search) - .then((searchResponse) => { - vm.dataset = searchResponse.data; - vm.projects = vm.dataset.results; - }) - .finally(() => Wait('stop')); - } - - function createErrorHandler (path, action) { - return ({ data, status }) => { - const hdr = strings.get('error.HEADER'); - const msg = strings.get('error.CALL', { path, action, status }); - ProcessErrors($scope, data, status, null, { hdr, msg }); - }; - } - - function getJobStatusIcon (project) { - let icon = 'none'; - switch (project.status) { - case 'n/a': - case 'ok': - case 'never updated': - icon = 'none'; - break; - case 'pending': - case 'waiting': - case 'new': - icon = 'none'; - break; - case 'updating': - case 'running': - icon = 'running'; - break; - case 'successful': - icon = 'success'; - break; - case 'failed': - case 'missing': - case 'canceled': - icon = 'error'; - break; - default: - break; - } - return icon; - } - - function getStatusTooltip (project) { - let tooltip = ''; - switch (project.status) { - case 'n/a': - case 'ok': - case 'never updated': - tooltip = vm.strings.get('status.NEVER_UPDATE'); - break; - case 'pending': - case 'waiting': - case 'new': - tooltip = vm.strings.get('status.UPDATE_QUEUED'); - break; - case 'updating': - case 'running': - tooltip = vm.strings.get('status.UPDATE_RUNNING'); - break; - case 'successful': - tooltip = vm.strings.get('status.UPDATE_SUCCESS'); - break; - case 'failed': - tooltip = vm.strings.get('status.UPDATE_FAILED'); - break; - case 'missing': - tooltip = vm.strings.get('status.UPDATE_MISSING'); - break; - case 'canceled': - tooltip = vm.strings.get('status.UPDATE_CANCELED'); - break; - default: - break; - } - return tooltip; - } - - vm.isCollapsed = true; - - vm.onCollapse = () => { - vm.isCollapsed = true; - }; - - vm.onExpand = () => { - vm.isCollapsed = false; - }; -} - -projectsListController.$inject = [ - '$filter', - '$scope', - '$rootScope', - '$state', - '$log', - 'Dataset', - 'Alert', - 'Rest', - 'ProcessErrors', - 'resolvedModels', - 'ProjectsStrings', - 'Wait', - 'ngToast', - 'Prompt', - 'GetBasePath', - 'QuerySet', - 'ProjectUpdate', -]; - -export default projectsListController; diff --git a/awx/ui/client/features/projects/projectsList.view.html b/awx/ui/client/features/projects/projectsList.view.html deleted file mode 100644 index 1889e48d7b..0000000000 --- a/awx/ui/client/features/projects/projectsList.view.html +++ /dev/null @@ -1,111 +0,0 @@ - -
- - -
- -
-
- - - - -
-
- - -
-
-
- -
-
- - - - - - -
-
-
-
-
- {{ :: vm.strings.get('list.ROW_ITEM_LABEL_REVISION') }} -
- -
- - - - - - - - -
-
-
-
- - -
\ No newline at end of file diff --git a/awx/ui/client/features/projects/routes/projectsList.route.js b/awx/ui/client/features/projects/routes/projectsList.route.js deleted file mode 100644 index d89b80c3f1..0000000000 --- a/awx/ui/client/features/projects/routes/projectsList.route.js +++ /dev/null @@ -1,90 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import projectsListController from '../projectsList.controller'; -import indexController from '../index.controller'; - -const indexTemplate = require('~features/projects/index.view.html'); -const projectsListTemplate = require('~features/projects/projectsList.view.html'); - -export default { - searchPrefix: 'project', - name: 'projects', - route: '/projects', - ncyBreadcrumb: { - label: N_('PROJECTS') - }, - data: { - activityStream: true, - activityStreamTarget: 'project', - socket: { - groups: { - jobs: ['status_changed'] - } - } - }, - params: { - project_search: { - dynamic: true, - } - }, - views: { - '@': { - templateUrl: indexTemplate, - controller: indexController, - controllerAs: 'vm' - }, - 'projectsList@projects': { - templateUrl: projectsListTemplate, - controller: projectsListController, - controllerAs: 'vm', - } - }, - resolve: { - CredentialTypes: ['Rest', '$stateParams', 'GetBasePath', 'ProcessErrors', - (Rest, $stateParams, GetBasePath, ProcessErrors) => { - const path = GetBasePath('credential_types'); - Rest.setUrl(path); - return Rest.get() - .then((data) => data.data.results) - .catch((response) => { - ProcessErrors(null, response.data, response.status, null, { - hdr: 'Error!', - msg: `Failed to get credential types. GET returned status: ${response.status}`, - }); - }); - } - ], - ConfigData: ['ConfigService', 'ProcessErrors', - (ConfigService, ProcessErrors) => ConfigService - .getConfig() - .then(response => response) - .catch(({ data, status }) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: `Failed to get config. GET returned status: status: ${status}`, - }); - })], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.project_search; - const searchPath = GetBasePath('projects'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - resolvedModels: [ - 'ProjectModel', - (Project) => { - const models = [ - new Project(['options']), - ]; - return Promise.all(models); - }, - ], - } -}; diff --git a/awx/ui/client/features/templates/index.controller.js b/awx/ui/client/features/templates/index.controller.js deleted file mode 100644 index bfbfeb84fd..0000000000 --- a/awx/ui/client/features/templates/index.controller.js +++ /dev/null @@ -1,19 +0,0 @@ -function IndexTemplatesController ($scope, strings, dataset) { - const vm = this; - vm.strings = strings; - vm.count = dataset.data.count; - - $scope.$on('updateCount', (e, count) => { - if (typeof count === 'number') { - vm.count = count; - } - }); -} - -IndexTemplatesController.$inject = [ - '$scope', - 'TemplatesStrings', - 'Dataset' -]; - -export default IndexTemplatesController; diff --git a/awx/ui/client/features/templates/index.js b/awx/ui/client/features/templates/index.js deleted file mode 100644 index fd0a49b45a..0000000000 --- a/awx/ui/client/features/templates/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import TemplatesStrings from './templates.strings'; - -const MODULE_NAME = 'at.features.templates'; - -angular - .module(MODULE_NAME, []) - .service('TemplatesStrings', TemplatesStrings); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/templates/index.view.html b/awx/ui/client/features/templates/index.view.html deleted file mode 100644 index 90cab8f608..0000000000 --- a/awx/ui/client/features/templates/index.view.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
- -
- - -
-
- - -
-
-
diff --git a/awx/ui/client/features/templates/routes/organizationsTemplatesList.route.js b/awx/ui/client/features/templates/routes/organizationsTemplatesList.route.js deleted file mode 100644 index 4d306b2857..0000000000 --- a/awx/ui/client/features/templates/routes/organizationsTemplatesList.route.js +++ /dev/null @@ -1,73 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import templatesListController from '../templatesList.controller'; -import indexController from '../index.controller'; - -const indexTemplate = require('~features/templates/index.view.html'); -const templatesListTemplate = require('~features/templates/templatesList.view.html'); - -export default { - url: "/:organization_id/job_templates", - name: 'organizations.job_templates', - data: { - activityStream: true, - activityStreamTarget: 'template' - }, - params: { - template_search: { - dynamic: true, - value: { - type: 'job_template', - order_by: 'name', - page_size: '20', - or__jobtemplate__project__organization: null, - or__jobtemplate__inventory__organization: null - }, - } - }, - ncyBreadcrumb: { - label: N_("JOB TEMPLATES") - }, - views: { - 'form': { - templateUrl: indexTemplate, - controller: indexController, - controllerAs: 'vm' - }, - 'templatesList@organizations.job_templates': { - controller: templatesListController, - templateUrl: templatesListTemplate, - controllerAs: 'vm', - } - }, - resolve: { - resolvedModels: [ - 'JobTemplateModel', - 'WorkflowJobTemplateModel', - (JobTemplate, WorkflowJobTemplate) => { - const models = [ - new JobTemplate(['options']), - new WorkflowJobTemplate(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchPath = GetBasePath('unified_job_templates'); - - const searchParam = Object.assign( - $stateParams.template_search, { - or__jobtemplate__project__organization: $stateParams.organization_id, - or__jobtemplate__inventory__organization: $stateParams.organization_id} - ); - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - } -}; diff --git a/awx/ui/client/features/templates/routes/projectsTemplatesList.route.js b/awx/ui/client/features/templates/routes/projectsTemplatesList.route.js deleted file mode 100644 index be10a69b0d..0000000000 --- a/awx/ui/client/features/templates/routes/projectsTemplatesList.route.js +++ /dev/null @@ -1,67 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import templatesListController from '../templatesList.controller'; - -const templatesListTemplate = require('~features/templates/templatesList.view.html'); - -export default { - url: "/templates", - name: 'projects.edit.templates', - searchPrefix: 'template', - params: { - template_search: { - dynamic: true, - value: { - type: 'job_template', - order_by: 'name', - page_size: '20', - jobtemplate__project: null - }, - } - }, - data: { - socket: { - groups: { - jobs: ['status_changed'] - } - } - }, - ncyBreadcrumb: { - label: N_("JOB TEMPLATES") - }, - views: { - 'related': { - controller: templatesListController, - templateUrl: templatesListTemplate, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: [ - 'JobTemplateModel', - 'WorkflowJobTemplateModel', - (JobTemplate, WorkflowJobTemplate) => { - const models = [ - new JobTemplate(['options']), - new WorkflowJobTemplate(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchPath = GetBasePath('unified_job_templates'); - - const searchParam = _.assign($stateParams.template_search, { - jobtemplate__project: $stateParams.project_id }); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - } -}; diff --git a/awx/ui/client/features/templates/routes/templatesList.route.js b/awx/ui/client/features/templates/routes/templatesList.route.js deleted file mode 100644 index 4b17ab471d..0000000000 --- a/awx/ui/client/features/templates/routes/templatesList.route.js +++ /dev/null @@ -1,68 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import templatesListController from '../templatesList.controller'; -import indexController from '../index.controller'; - -const indexTemplate = require('~features/templates/index.view.html'); -const templatesListTemplate = require('~features/templates/templatesList.view.html'); - -export default { - name: 'templates', - route: '/templates', - ncyBreadcrumb: { - label: N_("TEMPLATES") - }, - data: { - activityStream: true, - activityStreamTarget: 'template' - }, - params: { - template_search: { - dynamic: true, - value: { - type: 'workflow_job_template,job_template', - order_by: 'name', - page_size: '20' - }, - } - }, - searchPrefix: 'template', - views: { - '@': { - templateUrl: indexTemplate, - controller: indexController, - controllerAs: 'vm' - }, - 'templatesList@templates': { - controller: templatesListController, - templateUrl: templatesListTemplate, - controllerAs: 'vm', - } - }, - resolve: { - resolvedModels: [ - 'JobTemplateModel', - 'WorkflowJobTemplateModel', - (JobTemplate, WorkflowJobTemplate) => { - const models = [ - new JobTemplate(['options']), - new WorkflowJobTemplate(['options']), - ]; - return Promise.all(models); - }, - ], - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.template_search; - const searchPath = GetBasePath('unified_job_templates'); - - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => Wait('stop')); - } - ], - } -}; diff --git a/awx/ui/client/features/templates/templates.strings.js b/awx/ui/client/features/templates/templates.strings.js deleted file mode 100644 index e3bdb18efb..0000000000 --- a/awx/ui/client/features/templates/templates.strings.js +++ /dev/null @@ -1,167 +0,0 @@ -function TemplatesStrings (BaseString) { - BaseString.call(this, 'templates'); - - const { t } = this; - const ns = this.templates; - - ns.state = { - LIST_BREADCRUMB_LABEL: t.s('TEMPLATES') - }; - - ns.list = { - PANEL_TITLE: t.s('TEMPLATES'), - ADD_DD_JT_LABEL: t.s('Job Template'), - ADD_DD_WF_LABEL: t.s('Workflow Template'), - OPEN_WORKFLOW_VISUALIZER: t.s('Click here to open the workflow visualizer'), - ROW_ITEM_LABEL_ORGANIZATION: t.s('Organization'), - ROW_ITEM_LABEL_DESCRIPTION: t.s('Description'), - ROW_ITEM_LABEL_ACTIVITY: t.s('Activity'), - ROW_ITEM_LABEL_INVENTORY: t.s('Inventory'), - ROW_ITEM_LABEL_PROJECT: t.s('Project'), - ROW_ITEM_LABEL_CREDENTIALS: t.s('Credentials'), - ROW_ITEM_LABEL_MODIFIED: t.s('Last Modified'), - ROW_ITEM_LABEL_RAN: t.s('Last Ran'), - ADD: t.s('Add a new template') - }; - - ns.prompt = { - INVENTORY: t.s('Inventory'), - CREDENTIAL: t.s('Credential'), - PROMPT: t.s('PROMPT'), - OTHER_PROMPTS: t.s('Other Prompts'), - SURVEY: t.s('Survey'), - PREVIEW: t.s('Preview'), - LAUNCH: t.s('LAUNCH'), - CONFIRM: t.s('CONFIRM'), - SELECTED: t.s('SELECTED'), - NO_CREDENTIALS_SELECTED: t.s('No credentials selected'), - NO_INVENTORY_SELECTED: t.s('No inventory selected'), - REVERT: t.s('REVERT'), - CREDENTIAL_TYPE: t.s('Credential Type'), - CREDENTIAL_PASSWORD_WARNING: t.s('Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:'), - PASSWORDS_REQUIRED_HELP: t.s('Launching this job requires the passwords listed below. Enter each password before continuing.'), - PLEASE_ENTER_PASSWORD: t.s('Please enter a password.'), - credential_passwords: { - SSH_PASSWORD: t.s('SSH Password'), - PRIVATE_KEY_PASSPHRASE: t.s('Private Key Passphrase'), - PRIVILEGE_ESCALATION_PASSWORD: t.s('Privilege Escalation Password'), - VAULT_PASSWORD: t.s('Vault Password') - }, - SHOW_CHANGES: t.s('Show Changes'), - SHOW_CHANGES_HELP: t.s('If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode.'), - SKIP_TAGS: t.s('Skip Tags'), - SKIP_TAGS_HELP: t.s('Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags.'), - JOB_TAGS: t.s('Job Tags'), - JOB_TAGS_HELP: t.s('Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags.'), - LIMIT: t.s('Limit'), - LIMIT_HELP: t.s('Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns.'), - JOB_TYPE: t.s('Job Type'), - JOB_TYPE_HELP: t.s('For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook.'), - VERBOSITY: t.s('Verbosity'), - VERBOSITY_HELP: t.s('Control the level of output ansible will produce as the playbook executes.'), - CHOOSE_JOB_TYPE: t.s('Choose a job type'), - CHOOSE_VERBOSITY: t.s('Choose a verbosity'), - EXTRA_VARIABLES: t.s('Extra Variables'), - EXTRA_VARIABLES_HELP: t.s('

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
'), - PLEASE_ENTER_ANSWER: t.s('Please enter an answer.'), - PLEASE_SELECT_VALUE: t.s('Please select a value'), - VALID_INTEGER: t.s('Please enter an answer that is a valid integer.'), - VALID_DECIMAL: t.s('Please enter an answer that is a decimal number.'), - PLAYBOOK_RUN: t.s('Playbook Run'), - SCM_BRANCH: t.s('SCM Branch'), - SCM_BRANCH_HELP: t.s('Branch to use in job run. Project default used if blank.'), - CHECK: t.s('Check'), - NO_CREDS_MATCHING_TYPE: t.s('No Credentials Matching This Type Have Been Created'), - CREDENTIAL_TYPE_MISSING: typeLabel => t.s('This job template has a default {{typeLabel}} credential which must be included or replaced before proceeding.', { typeLabel }) - }; - - ns.alert = { - MISSING_PARAMETER: t.s('Template parameter is missing.'), - NO_PERMISSION: t.s('You do not have permission to perform this action.'), - UNKNOWN_COPY: t.s('Unable to determine this template\'s type while copying.'), - UNKNOWN_DELETE: t.s('Unable to determine this template\'s type while deleting.'), - UNKNOWN_EDIT: t.s('Unable to determine this template\'s type while editing.'), - UNKNOWN_LAUNCH: t.s('Unable to determine this template\'s type while launching.'), - UNKNOWN_SCHEDULE: t.s('Unable to determine this template\'s type while scheduling.'), - }; - - ns.error = { - HEADER: this.error.HEADER, - CALL: this.error.CALL, - EDIT: t.s('Unable to edit template.'), - DELETE: t.s('Unable to delete template.'), - LAUNCH: t.s('Unable to launch template.'), - UNKNOWN: t.s('Unable to determine template type.'), - SCHEDULE: t.s('Unable to schedule job.'), - COPY: t.s('Unable to copy template.'), - INVALID: t.s('Resources are missing from this template.') - }; - - ns.warnings = { - WORKFLOW_RESTRICTED_COPY: t.s('You do not have access to all resources used by this workflow. Resources that you don\'t have access to will not be copied and will result in an incomplete workflow.') - }; - - ns.workflows = { - INVALID_JOB_TEMPLATE: t.s('This Job Template is missing a default inventory or project. This must be addressed in the Job Template form before this node can be saved.'), - CREDENTIAL_WITH_PASS: t.s('This Job Template has a credential that requires a password. Credentials requiring passwords on launch are not permitted on workflow nodes.') - }; - - ns.workflow_maker = { - DELETE_NODE_PROMPT_TEXT: t.s('Are you sure you want to delete this workflow node?'), - KEY: t.s('KEY'), - ON_SUCCESS: t.s('On Success'), - ON_FAILURE: t.s('On Failure'), - ALWAYS: t.s('Always'), - PAUSE: t.s('Wait For Approval'), - JOB_TEMPLATE: t.s('Job Template'), - PROJECT_SYNC: t.s('Project Sync'), - INVENTORY_SYNC: t.s('Inventory Sync'), - WORKFLOW: t.s('Workflow'), - TEMPLATE: t.s('Template'), - WARNING: t.s('Warning'), - TOTAL_NODES: t.s('TOTAL NODES'), - ADD_A_NODE: t.s('ADD A NODE'), - EDIT_TEMPLATE: t.s('EDIT TEMPLATE'), - JOBS: t.s('Jobs'), - PLEASE_CLICK_THE_START_BUTTON: t.s('Please click the start button to build your workflow.'), - PLEASE_HOVER_OVER_A_TEMPLATE: t.s('Please hover over a template for additional options.'), - EDIT_LINK_TOOLTIP: t.s('Click to edit link'), - VIEW_LINK_TOOLTIP: t.s('Click to view link'), - RUN: t.s('RUN'), - CHECK: t.s('CHECK'), - SELECT: t.s('SELECT'), - DELETED: t.s('DELETED'), - START: t.s('START'), - DETAILS: t.s('DETAILS'), - TITLE: t.s('WORKFLOW VISUALIZER'), - INVENTORY_WILL_OVERRIDE: t.s('The inventory of this node will be overridden by the parent workflow inventory.'), - INVENTORY_WILL_NOT_OVERRIDE: t.s('The inventory of this node will not be overridden by the parent workflow inventory.'), - INVENTORY_PROMPT_WILL_OVERRIDE: t.s('The inventory of this node will be overridden if a parent workflow inventory is provided at launch.'), - INVENTORY_PROMPT_WILL_NOT_OVERRIDE: t.s('The inventory of this node will not be overridden if a parent workflow inventory is provided at launch.'), - ADD_LINK: t.s('ADD LINK'), - EDIT_LINK: t.s('EDIT LINK'), - VIEW_LINK: t.s('VIEW LINK'), - NEW_LINK: t.s('Please click on an available node to form a new link.'), - UNLINK: t.s('UNLINK'), - READ_ONLY_PROMPT_VALUES: t.s('The following promptable values were provided when this node was created:'), - READ_ONLY_NO_PROMPT_VALUES: t.s('No promptable values were provided when this node was created.'), - UNSAVED_CHANGES_HEADER: t.s('WARNING: UNSAVED CHANGES'), - UNSAVED_CHANGES_PROMPT_TEXT: t.s('Are you sure you want to exit the Workflow Creator without saving your changes?'), - EXIT: t.s('EXIT'), - CANCEL: t.s('CANCEL'), - SAVE_AND_EXIT: t.s('SAVE & EXIT'), - APPROVAL: t.s('Approval'), - TIMEOUT_POPOVER: t.s('The amount of time to wait before this approval step is automatically denied. Defaults to 0 for no timeout.'), - TIMED_OUT: t.s('APPROVAL TIMED OUT'), - TIMEOUT: t.s('Timeout'), - APPROVED: t.s('APPROVED'), - DENIED: t.s('DENIED'), - CONVERGENCE: t.s('Convergence'), - ALL: t.s('All'), - ANY: t.s('Any'), - }; -} - -TemplatesStrings.$inject = ['BaseStringService']; - -export default TemplatesStrings; diff --git a/awx/ui/client/features/templates/templatesList.controller.js b/awx/ui/client/features/templates/templatesList.controller.js deleted file mode 100644 index 2500a78816..0000000000 --- a/awx/ui/client/features/templates/templatesList.controller.js +++ /dev/null @@ -1,489 +0,0 @@ -/** *********************************************** - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - ************************************************ */ -const JOB_TEMPLATE_ALIASES = ['job_template', 'Job Template']; -const WORKFLOW_TEMPLATE_ALIASES = ['workflow_job_template', 'Workflow Job Template']; - -const isJobTemplate = ({ type }) => JOB_TEMPLATE_ALIASES.indexOf(type) > -1; -const isWorkflowTemplate = ({ type }) => WORKFLOW_TEMPLATE_ALIASES.indexOf(type) > -1; -const mapChoices = choices => Object.assign(...choices.map(([k, v]) => ({[k]: v}))); - -function ListTemplatesController( - $filter, - $scope, - $state, - Alert, - Dataset, - ProcessErrors, - Prompt, - resolvedModels, - strings, - Wait, - qs, - GetBasePath, - ngToast, -) { - const vm = this || {}; - const [jobTemplate, workflowTemplate] = resolvedModels; - - const choices = workflowTemplate.options('actions.GET.type.choices') - .concat(jobTemplate.options('actions.GET.type.choices')); - - let paginateQuerySet = {}; - - vm.strings = strings; - vm.templateTypes = mapChoices(choices); - vm.activeId = parseInt($state.params.job_template_id || $state.params.workflow_job_template_id); - vm.invalidTooltip = { - popover: { - text: strings.get('error.INVALID'), - on: 'mouseenter', - icon: 'fa-exclamation', - position: 'right', - arrowHeight: 15 - } - }; - - $scope.canAddJobTemplate = jobTemplate.options('actions.POST'); - $scope.canAddWorkflowJobTemplate = workflowTemplate.options('actions.POST'); - $scope.canAdd = ($scope.canAddJobTemplate || $scope.canAddWorkflowJobTemplate); - - // smart-search - vm.list = { - iterator: 'template', - name: 'templates' - }; - vm.dataset = Dataset.data; - vm.templates = Dataset.data.results; - vm.defaultParams = $state.params.template_search; - - const toolbarSortDefault = { - label: `${strings.get('sort.NAME_ASCENDING')}`, - value: 'name' - }; - - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${strings.get('sort.NAME_DESCENDING')}`, value: '-name' }, - { label: `${strings.get('sort.MODIFIED_ASCENDING')}`, value: 'modified' }, - { label: `${strings.get('sort.MODIFIED_DESCENDING')}`, value: '-modified' }, - { label: `${strings.get('sort.LAST_JOB_RUN_ASCENDING')}`, value: 'last_job_run' }, - { label: `${strings.get('sort.LAST_JOB_RUN_DESCENDING')}`, value: '-last_job_run' }, - { label: `${strings.get('sort.INVENTORY_ASCENDING')}`, value: 'job_template__inventory__id' }, - { label: `${strings.get('sort.INVENTORY_DESCENDING')}`, value: '-job_template__inventory__id' }, - { label: `${strings.get('sort.PROJECT_ASCENDING')}`, value: 'jobtemplate__project__id' }, - { label: `${strings.get('sort.PROJECT_DESCENDING')}`, value: '-jobtemplate__project__id' }, - ]; - - vm.toolbarSortValue = toolbarSortDefault; - - $scope.$on('updateDataset', (event, dataset, queryset) => { - paginateQuerySet = queryset; - }); - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - - const queryParams = Object.assign( - {}, - $state.params.template_search, - paginateQuerySet, - { order_by: sort.value } - ); - - // Update params - $state.go('.', { - template_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - $scope.$watch('vm.dataset.count', () => { - $scope.$emit('updateCount', vm.dataset.count, 'templates'); - }); - - $scope.$watch('$state.params', function(newValue, oldValue) { - const job_template_id = _.get($state.params, 'job_template_id'); - const workflow_job_template_id = _.get($state.params, 'workflow_job_template_id'); - - if((job_template_id || workflow_job_template_id)) { - vm.activeId = parseInt($state.params.job_template_id || $state.params.workflow_job_template_id); - } else { - vm.activeId = ""; - } - setToolbarSort(); - }, true); - - $scope.$on(`ws-jobs`, (e, msg) => { - if (msg.unified_job_template_id && vm.templates) { - const template = vm.templates.find((t) => t.id === msg.unified_job_template_id); - if (template) { - if (msg.status === 'pending') { - // This is a new job - add it to the front of the - // recent_jobs array - if (template.summary_fields.recent_jobs.length === 10) { - template.summary_fields.recent_jobs.pop(); - } - - template.summary_fields.recent_jobs.unshift({ - id: msg.unified_job_id, - status: msg.status, - type: msg.type - }); - } else { - // This is an update to an existing job. Check to see - // if we have it in our array of recent_jobs - for (let i=0; i { - if(isJobTemplate(template)) { - return template.project === null || (template.inventory === null && template.ask_inventory_on_launch === false); - } else { - return false; - } - }; - - vm.isPortalMode = $state.includes('portalMode'); - - vm.openWorkflowVisualizer = template => { - const name = 'templates.editWorkflowJobTemplate.workflowMaker'; - const params = { workflow_job_template_id: template.id }; - const options = { reload: true }; - - $state.go(name, params, options); - }; - - vm.deleteTemplate = template => { - if (!template) { - Alert(strings.get('error.DELETE'), strings.get('alert.MISSING_PARAMETER')); - return; - } - - if (isWorkflowTemplate(template)) { - displayWorkflowTemplateDeletePrompt(template); - } else if (isJobTemplate(template)) { - jobTemplate.getDependentResourceCounts(template.id) - .then(counts => displayJobTemplateDeletePrompt(template, counts)); - } else { - Alert(strings.get('error.UNKNOWN'), strings.get('alert.UNKNOWN_DELETE')); - } - }; - - vm.copyTemplate = template => { - if (!template) { - Alert(strings.get('error.COPY'), strings.get('alert.MISSING_PARAMETER')); - return; - } - - if (isJobTemplate(template)) { - copyJobTemplate(template); - } else if (isWorkflowTemplate(template)) { - copyWorkflowTemplate(template); - } else { - Alert(strings.get('error.UNKNOWN'), strings.get('alert.UNKNOWN_COPY')); - } - }; - - vm.getModified = template => { - const modified = _.get(template, 'modified'); - - if (!modified) { - return undefined; - } - - let html = $filter('longDate')(modified); - - const { username, id } = _.get(template, 'summary_fields.modified_by', {}); - - if (username && id) { - html += ` by ${$filter('sanitize')(username)}`; - } - - return html; - }; - - vm.buildCredentialTags = (credentials) => { - return credentials.map(credential => { - const icon = `${credential.kind}`; - const link = `/#/credentials/${credential.id}`; - const tooltip = strings.get('tooltips.VIEW_THE_CREDENTIAL'); - const value = $filter('sanitize')(credential.name); - - return { icon, link, tooltip, value }; - }); - }; - - vm.getLastRan = template => { - const lastJobRun = _.get(template, 'last_job_run'); - - if (!lastJobRun) { - return undefined; - } - - let html = $filter('longDate')(lastJobRun); - - // TODO: uncomment and update when last job run user is returned by api - // const { username, id } = _.get(template, 'summary_fields.last_job_run_by', {}); - - // if (username && id) { - // html += ` by ${$filter('sanitize')(username)}`; - //} - - return html; - }; - - vm.getType = template => { - if(isJobTemplate(template)) { - return strings.get('list.ADD_DD_JT_LABEL'); - } else { - return strings.get('list.ADD_DD_WF_LABEL');; - } - }; - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'template_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - function refreshTemplates() { - Wait('start'); - let path = GetBasePath('unified_job_templates'); - qs.search(path, $state.params.template_search, { 'X-WS-Session-Quiet': true }) - .then(function(searchResponse) { - vm.dataset = searchResponse.data; - vm.templates = vm.dataset.results; - }) - .finally(() => Wait('stop')); - } - - function createErrorHandler(path, action) { - return ({ data, status }) => { - const hdr = strings.get('error.HEADER'); - const msg = strings.get('error.CALL', { path, action, status }); - ProcessErrors($scope, data, status, null, { hdr, msg }); - }; - } - - function copyJobTemplate(template) { - Wait('start'); - jobTemplate - .create('get', template.id) - .then(model => model.copy()) - .then((copiedJT) => { - ngToast.success({ - content: ` -
-
- -
-
- ${strings.get('SUCCESSFUL_CREATION', copiedJT.name)} -
-
`, - dismissButton: false, - dismissOnTimeout: true - }); - refreshTemplates(); - }) - .catch(createErrorHandler('copy job template', 'POST')) - .finally(() => Wait('stop')); - } - - function copyWorkflowTemplate(template) { - Wait('start'); - workflowTemplate - .create('get', template.id) - .then(model => model.extend('get', 'copy')) - .then(model => { - const action = () => { - $('#prompt-modal').modal('hide'); - Wait('start'); - model.copy() - .then((copiedWFJT) => { - ngToast.success({ - content: ` -
-
- -
-
- ${strings.get('SUCCESSFUL_CREATION', copiedWFJT.name)} -
-
`, - dismissButton: false, - dismissOnTimeout: true - }); - refreshTemplates(); - }) - .catch(createErrorHandler('copy workflow', 'POST')) - .finally(() => Wait('stop')); - }; - - if (model.get('related.copy.can_copy_without_user_input')) { - action(); - } else if (model.get('related.copy.can_copy')) { - Prompt({ - action, - actionText: strings.get('COPY'), - body: buildWorkflowCopyPromptHTML(model.get('related.copy')), - class: 'Modal-primaryButton', - hdr: strings.get('listActions.COPY', template.name), - }); - } else { - Alert(strings.get('error.COPY'), strings.get('alert.NO_PERMISSION')); - } - }) - .catch(createErrorHandler('copy workflow', 'GET')) - .finally(() => Wait('stop')); - } - - function handleSuccessfulDelete(template) { - const { page } = _.get($state.params, 'template_search'); - let reloadListStateParams = null; - - if (vm.templates.length === 1 && page && page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - const pageNumber = (parseInt(reloadListStateParams.template_search.page, 0) - 1); - reloadListStateParams.template_search.page = pageNumber.toString(); - } - - if (parseInt($state.params.job_template_id, 0) === template.id) { - $state.go('templates', reloadListStateParams, { reload: true }); - } else if (parseInt($state.params.workflow_job_template_id, 0) === template.id) { - $state.go('templates', reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, { reload: true }); - } - } - - function displayJobTemplateDeletePrompt(template, counts) { - Prompt({ - action() { - $('#prompt-modal').modal('hide'); - Wait('start'); - jobTemplate - .request('delete', template.id) - .then(() => handleSuccessfulDelete(template)) - .catch(createErrorHandler('delete template', 'DELETE')) - .finally(() => Wait('stop')); - }, - hdr: strings.get('DELETE'), - resourceName: $filter('sanitize')(template.name), - body: buildJobTemplateDeletePromptHTML(counts), - }); - } - - function displayWorkflowTemplateDeletePrompt(template) { - Prompt({ - action() { - $('#prompt-modal').modal('hide'); - Wait('start'); - workflowTemplate - .request('delete', template.id) - .then(() => handleSuccessfulDelete(template)) - .catch(createErrorHandler('delete template', 'DELETE')) - .finally(() => Wait('stop')); - }, - hdr: strings.get('DELETE'), - resourceName: $filter('sanitize')(template.name), - body: strings.get('deleteResource.CONFIRM', 'workflow template'), - }); - } - - function buildJobTemplateDeletePromptHTML(counts) { - const buildCount = count => `${count}`; - const buildLabel = label => ` - ${$filter('sanitize')(label)}`; - const buildCountLabel = ({ count, label }) => `
- ${buildLabel(label)}${buildCount(count)}
`; - - const displayedCounts = counts.filter(({ count }) => count > 0); - - const html = ` - ${displayedCounts.length ? strings.get('deleteResource.USED_BY', 'job template') : ''} - ${strings.get('deleteResource.CONFIRM', 'job template')} - ${displayedCounts.map(buildCountLabel).join('')} - `; - - return html; - } - - function buildWorkflowCopyPromptHTML(data) { - const pull = (data, param) => _.get(data, param, []).map($filter('sanitize')); - - const credentials = pull(data, 'credentials_unable_to_copy'); - const inventories = pull(data, 'inventories_unable_to_copy'); - const templates = pull(data, 'templates_unable_to_copy'); - - const html = ` -
- ${strings.get('warnings.WORKFLOW_RESTRICTED_COPY')} -
-
- ${templates.length ? `
Unified Job Templates
    ` : ''} - ${templates.map(item => `
  • ${item}
  • `).join('')} - ${templates.length ? `
` : ''} -
-
- ${credentials.length ? `
Credentials
    ` : ''} - ${credentials.map(item => `
  • ${item}
  • `).join('')} - ${credentials.length ? `
` : ''} -
-
- ${inventories.length ? `
Inventories
    ` : ''} - ${inventories.map(item => `
  • ${item}
  • `).join('')} - ${inventories.length ? `
` : ''} -
- `; - - return html; - } - - vm.isCollapsed = true; - - vm.onCollapse = () => { - vm.isCollapsed = true; - }; - - vm.onExpand = () => { - vm.isCollapsed = false; - }; -} - -ListTemplatesController.$inject = [ - '$filter', - '$scope', - '$state', - 'Alert', - 'Dataset', - 'ProcessErrors', - 'Prompt', - 'resolvedModels', - 'TemplatesStrings', - 'Wait', - 'QuerySet', - 'GetBasePath', - 'ngToast' -]; - -export default ListTemplatesController; diff --git a/awx/ui/client/features/templates/templatesList.view.html b/awx/ui/client/features/templates/templatesList.view.html deleted file mode 100644 index 52c9337382..0000000000 --- a/awx/ui/client/features/templates/templatesList.view.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - -
-
-
- - - - - - -
-
- - - - - - - - -
-
-
- - - - - - - - - - - - -
-
- - - - - -
-
-
-
- - -
diff --git a/awx/ui/client/features/users/index.js b/awx/ui/client/features/users/index.js deleted file mode 100644 index b8f6a8052f..0000000000 --- a/awx/ui/client/features/users/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import atFeaturesUsersTokens from '~features/users/tokens'; - -const MODULE_NAME = 'at.features.users'; - -angular - .module(MODULE_NAME, [atFeaturesUsersTokens]); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/users/tokens/index.js b/awx/ui/client/features/users/tokens/index.js deleted file mode 100644 index 6d635b572d..0000000000 --- a/awx/ui/client/features/users/tokens/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import TokensStrings from './tokens.strings'; - -const MODULE_NAME = 'at.features.users.tokens'; - -angular - .module(MODULE_NAME, []) - .service('TokensStrings', TokensStrings); - -export default MODULE_NAME; diff --git a/awx/ui/client/features/users/tokens/tokens.strings.js b/awx/ui/client/features/users/tokens/tokens.strings.js deleted file mode 100644 index 55ee772f2f..0000000000 --- a/awx/ui/client/features/users/tokens/tokens.strings.js +++ /dev/null @@ -1,49 +0,0 @@ -function TokensStrings (BaseString) { - BaseString.call(this, 'tokens'); - - const { t } = this; - const ns = this.tokens; - - ns.state = { - LIST_BREADCRUMB_LABEL: t.s('TOKENS'), - ADD_BREADCRUMB_LABEL: t.s('CREATE TOKEN'), - USER_LIST_BREADCRUMB_LABEL: t.s('TOKENS') - }; - - ns.tab = { - DETAILS: t.s('Details') - }; - - ns.add = { - PANEL_TITLE: t.s('CREATE TOKEN'), - APP_PLACEHOLDER: t.s('SELECT AN APPLICATION'), - SCOPE_HELP_TEXT: t.s('Specify a scope for the token\'s access'), - TOKEN_MODAL_HEADER: t.s('TOKEN INFORMATION'), - TOKEN_LABEL: t.s('TOKEN'), - REFRESH_TOKEN_LABEL: t.s('REFRESH TOKEN'), - TOKEN_EXPIRES_LABEL: t.s('EXPIRES'), - ERROR_HEADER: t.s('COULD NOT CREATE TOKEN'), - ERROR_BODY_LABEL: t.s('Returned status:'), - LAST_USED_LABEL: t.s('by'), - DELETE_ACTION_LABEL: t.s('DELETE'), - SCOPE_PLACEHOLDER: t.s('Select a scope'), - SCOPE_READ_LABEL: t.s('Read'), - SCOPE_WRITE_LABEL: t.s('Write'), - APPLICATION_HELP_TEXT: t.s('Leaving this field blank will result in the creation of a Personal Access Token which is not linked to an Application.') - }; - - ns.list = { - ROW_ITEM_LABEL_DESCRIPTION: t.s('DESCRIPTION'), - ROW_ITEM_LABEL_EXPIRED: t.s('EXPIRATION'), - ROW_ITEM_LABEL_USED: t.s('LAST USED'), - ROW_ITEM_LABEL_SCOPE: t.s('SCOPE'), - ROW_ITEM_LABEL_APPLICATION: t.s('APPLICATION'), - PERSONAL_ACCESS_TOKEN: t.s('Personal Access Token'), - HEADER: appName => t.s('{{ appName }} Token', { appName }), - ADD: t.s('Add a new token') - }; -} - -TokensStrings.$inject = ['BaseStringService']; - -export default TokensStrings; diff --git a/awx/ui/client/features/users/tokens/users-tokens-add-application.route.js b/awx/ui/client/features/users/tokens/users-tokens-add-application.route.js deleted file mode 100644 index 05e8a6dfec..0000000000 --- a/awx/ui/client/features/users/tokens/users-tokens-add-application.route.js +++ /dev/null @@ -1,72 +0,0 @@ -export default { - name: 'users.edit.tokens.add.application', - url: '/application?selected', - searchPrefix: 'application', - params: { - application_search: { - value: { - page_size: 5, - order_by: 'name' - }, - dynamic: true, - squash: '' - } - }, - data: { - basePath: 'applications' - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'application@users.edit.tokens.add': { - templateProvider: (ListDefinition, generateList) => { - const html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - - return `${html}`; - } - } - }, - resolve: { - ListDefinition: [() => ({ - name: 'applications', - iterator: 'application', - hover: true, - index: false, - fields: { - name: { - key: true, - label: 'Name', - columnClass: 'col-sm-6', - awToolTip: '{{application.description | sanitize}}', - dataPlacement: 'top' - }, - organization: { - label: 'Organization', - columnClass: 'col-sm-6', - key: false, - ngBind: 'application.summary_fields.organization.name', - sourceModel: 'organization', - includeModal: true - } - } - })], - Dataset: ['QuerySet', 'GetBasePath', '$stateParams', 'ListDefinition', - (qs, GetBasePath, $stateParams, list) => qs.search( - GetBasePath('applications'), - $stateParams[`${list.iterator}_search`] - ) - ] - }, - onExit ($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } -}; diff --git a/awx/ui/client/features/users/tokens/users-tokens-add.controller.js b/awx/ui/client/features/users/tokens/users-tokens-add.controller.js deleted file mode 100644 index dcd47d2e37..0000000000 --- a/awx/ui/client/features/users/tokens/users-tokens-add.controller.js +++ /dev/null @@ -1,123 +0,0 @@ -function AddTokensController ( - models, $state, strings, Alert, Wait, - $filter, ProcessErrors, $scope, i18n -) { - const vm = this || {}; - const { application, token, user } = models; - - vm.mode = 'add'; - vm.strings = strings; - vm.panelTitle = strings.get('add.PANEL_TITLE'); - - vm.form = { - application: { - type: 'field', - label: i18n._('Application'), - id: 'application', - required: false, - help_text: strings.get('add.APPLICATION_HELP_TEXT'), - _resource: 'application', - _route: 'users.edit.tokens.add.application', - _model: application, - _placeholder: strings.get('add.APP_PLACEHOLDER') - }, - description: { - type: 'String', - label: i18n._('Description'), - id: 'description', - required: false - }, - scope: { - choices: [ - [null, ''], - ['read', strings.get('add.SCOPE_READ_LABEL')], - ['write', strings.get('add.SCOPE_WRITE_LABEL')] - ], - help_text: strings.get('add.SCOPE_HELP_TEXT'), - id: 'scope', - label: i18n._('Scope'), - required: true, - _component: 'at-input-select', - _data: [ - [null, ''], - ['read', strings.get('add.SCOPE_READ_LABEL')], - ['write', strings.get('add.SCOPE_WRITE_LABEL')] - ], - _exp: 'choice[1] for (index, choice) in state._data', - _format: 'selectFromOptions' - } - }; - - vm.form.save = payload => { - const postToken = _.has(payload, 'application') ? - user.postAuthorizedTokens({ - id: $state.params.user_id, - payload - }) : token.request('post', { data: payload }); - - return postToken - .then(({ data }) => { - const refreshHTML = data.refresh_token ? - `
-
- ${strings.get('add.REFRESH_TOKEN_LABEL')} -
-
- ${data.refresh_token} -
-
` : ''; - - Alert(strings.get('add.TOKEN_MODAL_HEADER'), ` -
-
- ${strings.get('add.TOKEN_LABEL')} -
-
- ${data.token} -
-
- ${refreshHTML} -
-
- ${strings.get('add.TOKEN_EXPIRES_LABEL')} -
-
- ${$filter('longDate')(data.expires)} -
-
- `, null, null, null, null, null, true); - Wait('stop'); - }) - .catch(({ data, status }) => { - ProcessErrors(null, data, status, null, { - hdr: strings.get('add.ERROR_HEADER'), - msg: `${strings.get('add.ERROR_BODY_LABEL')} ${status}` - }); - Wait('stop'); - }); - }; - - vm.form.onSaveSuccess = () => { - $state.go('^', { user_id: $state.params.user_id }, { reload: true }); - }; - - $scope.$watch('application', () => { - if ($scope.application) { - vm.form.application._idFromModal = $scope.application; - } - }); -} - -AddTokensController.$inject = [ - 'resolvedModels', - '$state', - 'TokensStrings', - 'Alert', - 'Wait', - '$filter', - 'ProcessErrors', - '$scope', - 'i18n' -]; - -export default AddTokensController; diff --git a/awx/ui/client/features/users/tokens/users-tokens-add.partial.html b/awx/ui/client/features/users/tokens/users-tokens-add.partial.html deleted file mode 100644 index 25bd01a21a..0000000000 --- a/awx/ui/client/features/users/tokens/users-tokens-add.partial.html +++ /dev/null @@ -1,17 +0,0 @@ -
- - - - - - - - - - - - - - - - diff --git a/awx/ui/client/features/users/tokens/users-tokens-add.route.js b/awx/ui/client/features/users/tokens/users-tokens-add.route.js deleted file mode 100644 index 43a663433f..0000000000 --- a/awx/ui/client/features/users/tokens/users-tokens-add.route.js +++ /dev/null @@ -1,62 +0,0 @@ -import { N_ } from '../../../src/i18n'; -import AddController from './users-tokens-add.controller'; - -const addTemplate = require('~features/users/tokens/users-tokens-add.partial.html'); - -function TokensDetailResolve ($q, Application, Token, User) { - const promises = {}; - - promises.application = new Application('options'); - promises.token = new Token('options'); - promises.user = new User('options'); - - return $q.all(promises); -} - -TokensDetailResolve.$inject = [ - '$q', - 'ApplicationModel', - 'TokenModel', - 'UserModel' -]; - -function isMeResolve ($rootScope, $stateParams, $state) { - // The user should not be able to add tokens for users other than - // themselves. Adding this redirect so that a user is not able to - // visit the add-token URL directly for a different user. - if (_.has($stateParams, 'user_id') && Number($stateParams.user_id) !== $rootScope.current_user.id) { - $state.go('users'); - } -} - -isMeResolve.$inject = [ - '$rootScope', - '$stateParams', - '$state' -]; - -export default { - url: '/add-token', - name: 'users.edit.tokens.add', - params: { - }, - data: { - activityStream: true, - activityStreamTarget: 'o_auth2_access_token', - noActivityStreamID: true - }, - ncyBreadcrumb: { - label: N_('CREATE TOKEN') - }, - views: { - 'preFormView@users': { - templateUrl: addTemplate, - controller: AddController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: TokensDetailResolve, - isMe: isMeResolve - } -}; diff --git a/awx/ui/client/features/users/tokens/users-tokens-list.controller.js b/awx/ui/client/features/users/tokens/users-tokens-list.controller.js deleted file mode 100644 index 27ae0514c5..0000000000 --- a/awx/ui/client/features/users/tokens/users-tokens-list.controller.js +++ /dev/null @@ -1,174 +0,0 @@ -/** *********************************************** - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - ************************************************ */ -function ListTokensController ( - $filter, - $scope, - $state, - Dataset, - strings, - ProcessErrors, - GetBasePath, - Prompt, - Wait, - models -) { - const vm = this || {}; - const { token } = models; - - vm.strings = strings; - vm.activeId = $state.params.token_id; - - $scope.canAdd = true; - - // smart-search - const name = 'tokens'; - const iterator = 'token'; - let paginateQuerySet = {}; - - vm.token_dataset = Dataset.data; - vm.tokens = Dataset.data.results; - vm.list = { iterator, name, basePath: 'tokens' }; - vm.basePath = `${GetBasePath('users')}${$state.params.user_id}/tokens`; - - $scope.$on('updateDataset', (e, dataset, queryset) => { - vm.token_dataset = dataset; - vm.tokens = dataset.results; - paginateQuerySet = queryset; - }); - - $scope.$watchCollection('$state.params', () => { - setToolbarSort(); - }); - - const toolbarSortDefault = { - label: `${strings.get('sort.NAME_ASCENDING')}`, - value: 'application__name' - }; - - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${strings.get('sort.NAME_DESCENDING')}`, value: '-application__name' }, - { label: `${strings.get('sort.CREATED_ASCENDING')}`, value: 'created' }, - { label: `${strings.get('sort.CREATED_DESCENDING')}`, value: '-created' }, - { label: `${strings.get('sort.MODIFIED_ASCENDING')}`, value: 'modified' }, - { label: `${strings.get('sort.MODIFIED_DESCENDING')}`, value: '-modified' }, - { label: `${strings.get('sort.EXPIRES_ASCENDING')}`, value: 'expires' }, - { label: `${strings.get('sort.EXPIRES_DESCENDING')}`, value: '-expires' } - ]; - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'token_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - const queryParams = Object.assign( - {}, - $state.params.token_search, - paginateQuerySet, - { order_by: sort.value } - ); - - // Update URL with params - $state.go('.', { - token_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - vm.getScopeString = str => { - if (str === 'Read') { - return vm.strings.get('add.SCOPE_READ_LABEL'); - } else if (str === 'Write') { - return vm.strings.get('add.SCOPE_WRITE_LABEL'); - } - - return undefined; - }; - - vm.getLastUsed = tokenToCheck => { - const lastUsed = _.get(tokenToCheck, 'last_used'); - - if (!lastUsed) { - return undefined; - } - - let html = $filter('longDate')(lastUsed); - - const { username, id } = _.get(tokenToCheck, 'summary_fields.last_used', {}); - - if (username && id) { - html += ` ${strings.get('add.LAST_USED_LABEL')} ${$filter('sanitize')(username)}`; - } - - return html; - }; - - vm.deleteToken = (tok) => { - const action = () => { - $('#prompt-modal').modal('hide'); - Wait('start'); - token.request('delete', tok.id) - .then(() => { - let reloadListStateParams = null; - - if ($scope.vm.tokens.length === 1 && $state.params.token_search && - !_.isEmpty($state.params.token_search.page) && - $state.params.token_search.page !== '1') { - const page = `${(parseInt(reloadListStateParams - .token_search.page, 10) - 1)}`; - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.token_search.page = page; - } - - if (parseInt($state.params.token_id, 10) === tok.id) { - $state.go('^', reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, { reload: true }); - } - }).catch(({ data, status }) => { - ProcessErrors($scope, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { path: `${GetBasePath('tokens')}${tok.id}`, status }) - }); - }).finally(() => { - Wait('stop'); - }); - }; - - const deleteModalBody = `
${strings.get('deleteResource.CONFIRM', 'token')}
`; - - Prompt({ - hdr: strings.get('deleteResource.HEADER'), - resourceName: _.has(tok, 'summary_fields.application.name') ? - strings.get('list.HEADER', tok.summary_fields.application.name) : - strings.get('list.PERSONAL_ACCESS_TOKEN'), - body: deleteModalBody, - action, - actionText: strings.get('add.DELETE_ACTION_LABEL') - }); - }; -} - -ListTokensController.$inject = [ - '$filter', - '$scope', - '$state', - 'Dataset', - 'TokensStrings', - 'ProcessErrors', - 'GetBasePath', - 'Prompt', - 'Wait', - 'resolvedModels' -]; - -export default ListTokensController; diff --git a/awx/ui/client/features/users/tokens/users-tokens-list.partial.html b/awx/ui/client/features/users/tokens/users-tokens-list.partial.html deleted file mode 100644 index 5f0c0d2fa7..0000000000 --- a/awx/ui/client/features/users/tokens/users-tokens-list.partial.html +++ /dev/null @@ -1,73 +0,0 @@ -
- - -
- -
-
- - - - -
- - - - - - - - - - - - -
-
- - -
-
-
- - \ No newline at end of file diff --git a/awx/ui/client/features/users/tokens/users-tokens-list.route.js b/awx/ui/client/features/users/tokens/users-tokens-list.route.js deleted file mode 100644 index e370f6fb24..0000000000 --- a/awx/ui/client/features/users/tokens/users-tokens-list.route.js +++ /dev/null @@ -1,65 +0,0 @@ -import { N_ } from '../../../src/i18n'; - -import ListController from './users-tokens-list.controller'; - -const listTemplate = require('~features/users/tokens/users-tokens-list.partial.html'); - -function TokensListResolve ($q, Token) { - const promises = {}; - - promises.token = new Token('options'); - - return $q.all(promises); -} - -TokensListResolve.$inject = [ - '$q', - 'TokenModel', -]; - -export default { - url: '/tokens', - name: 'users.edit.tokens', - ncyBreadcrumb: { - label: N_('TOKENS') - }, - views: { - related: { - templateUrl: listTemplate, - controller: ListController, - controllerAs: 'vm' - } - }, - data: { - activityStream: true, - activityStreamTarget: 'o_auth2_access_token', - noActivityStreamID: true - }, - searchPrefix: 'token', - params: { - token_search: { - value: { - page_size: 10, - order_by: 'application__name' - } - } - }, - resolve: { - resolvedModels: TokensListResolve, - Dataset: [ - '$stateParams', - 'Wait', - 'GetBasePath', - 'QuerySet', - ($stateParams, Wait, GetBasePath, qs) => { - const searchParam = $stateParams.token_search; - const searchPath = `${GetBasePath('users')}${$stateParams.user_id}/tokens`; - Wait('start'); - return qs.search(searchPath, searchParam) - .finally(() => { - Wait('stop'); - }); - } - ], - } -}; diff --git a/awx/ui/client/index.template.ejs b/awx/ui/client/index.template.ejs deleted file mode 100644 index 2e9c343f60..0000000000 --- a/awx/ui/client/index.template.ejs +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - <% htmlWebpackPlugin.files.css.forEach(file => {%> - - <% }) %> - <% htmlWebpackPlugin.files.js.forEach(file => {%> - - <% }) %> - - - - {% verbatim %} - - - -
-
-
-
- - - - - - - - - - - - - - - - -
-
-

working...

-
-
-
- {% endverbatim %} - - - diff --git a/awx/ui/client/installing.template.ejs b/awx/ui/client/installing.template.ejs deleted file mode 100644 index 3c19d76e9d..0000000000 --- a/awx/ui/client/installing.template.ejs +++ /dev/null @@ -1,40 +0,0 @@ - - - - {% load staticfiles %} - - - - - - - <% htmlWebpackPlugin.files.css.forEach(file => {%> - - <% }) %> - <% htmlWebpackPlugin.files.js.forEach(file => {%> - - <% }) %> - - - -
- - is Upgrading - - -

is currently upgrading.

-

This page will refresh when complete.

-
-
- - \ No newline at end of file diff --git a/awx/ui/client/legacy/styles/angular-scheduler.less b/awx/ui/client/legacy/styles/angular-scheduler.less deleted file mode 100644 index 10216c2056..0000000000 --- a/awx/ui/client/legacy/styles/angular-scheduler.less +++ /dev/null @@ -1,220 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2015 Ansible, Inc. - * - * Styling for angular-scheduler - * - */ - - /* - #schedules-form-container -inventory group add/edit dialog - */ - -#schedules-tab { - position: relative; - top: 0; - left: 0; -} - -#schedules-overlay { - display: none; - position: absolute; - top: 0; - left: 0; - z-index: 100; - background-color: @black; - opacity: 0; -} - -#schedules-list { - overflow-x: hidden; - overflow-y: auto; -} - -#schedules-form-container { - position: absolute; - top: 0; - left: 0; - display: none; - border: 1px solid #e5e5e5; - border-radius: 4px; - box-shadow: 3px 3px 6px 0 #666; - padding: 0 10px 15px 8px; - background-color: @white; - z-index: 200; -} - -#schedules-title { - border-bottom: 1px solid #e5e5e5; - padding-bottom: 8px; - margin-bottom: 10px; - margin-top: 0; - h4 { - display: inline-block; - margin: 0; - } - button { - display: inline-block; - } -} - -#schedules-form-container-body { - overflow-x: hidden; - overflow-y: auto; -} - -#schedules-form .form-group { - margin-bottom: 15px; -} - -#schedules-buttons { - height: 46px; - padding-top: 10px; - text-align: right; - border-top: 1px solid #A6C9E2; - margin-top: 5px; - a { - margin-right: 8px; - font-size: 12px; - } -} - -#schedules-detail { - display: none; -} - -#scheduler-modal-dialog, #schedules-form-container { - display: none; - overflow-x: hidden; - overflow-y: auto; - padding-top: 25px; - - form { - width: 100%; - } - - .sublabel { - font-weight: normal; - } - - #occurrence-label { - display: inline-block; - } - - .occurrence-list { - border: 1px solid @well-border; - padding: 8px 10px; - border-radius: 4px; - background-color: @well; - list-style: none; - margin-bottom: 5px; - } - - #date-choice { - display: inline-block; - margin-left: 15px; - font-size: 12px; - - .label-inline { - display: inline-block; - vertical-align: middle; - } - input { - margin-bottom: 2px; - height: 11px; - width: 10px; - } - .label-inline:first-child { - padding-bottom: 2px; - margin-right: 10px; - } - .label-inline:nth-child(3) { - margin-right: 10px; - } - } - - .ui-widget input { - font-size: 12px; - font-weight: normal; - text-align: center; - } - .scheduler-time-spinner { - width: 40px; - height: 24px; - } - .scheduler-spinner { - width: 50px; - height: 24px; - } - .fmt-help { - font-size: 12px; - font-weight: normal; - color: #999; - padding-left: 10px; - } - .error { - color: #dd1b16; - font-size: 12px; - margin-bottom: 0; - margin-top: 0; - padding-top: 3px; - } - .error-pull-up { - position: relative; - top: -20px; - } - .red-text { - color: #dd1b16; - } - .help-text { - font-size: 12px; - font-weight: normal; - color: #999; - margin-top: 5px; - } - .inline-label { - margin-left: 10px; - } - #scheduler-buttons { - margin-top: 20px; - } - .no-label { - padding-top: 25px; - } - .padding-top-slim { - padding-top: 5px; - } - .option-pad-left { - padding-left: 15px; - } - .option-pad-top { - padding-top: 15px; - } - .option-pad-bottom { - padding-bottom: 15px; - } - #monthlyOccurrence, #monthlyWeekDay { - margin-top: 5px; - } - select { - width: 100%; - } - .occurrence-list { - border: 1px solid @well-border; - padding: 8px 10px; - border-radius: 4px; - background-color: @well; - list-style: none; - margin-bottom: 5px; - } - - #weekdaySelect .btn-default:hover, - #weekdaySelect .btn-default:focus { - background-color: #fff; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - } - - #weekdaySelect .btn-default.active:hover { - background-color: #e0e0e0; - } -} diff --git a/awx/ui/client/legacy/styles/animations.less b/awx/ui/client/legacy/styles/animations.less deleted file mode 100644 index 98a5a1f6f8..0000000000 --- a/awx/ui/client/legacy/styles/animations.less +++ /dev/null @@ -1,27 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * animations.css - * - * custom animation mixins for ansible-ui - * - */ - - -.pulsate(@duration: 1.5s) { - -webkit-animation:pulsate @duration linear infinite alternate; - -moz-animation:pulsate @duration linear infinite alternate; - animation:pulsate @duration linear infinite alternate; -} -@-webkit-keyframes pulsate { - 0% { -moz-transform: scale(.3); opacity: .2; } - 100% { -moz-transform: scale(1.1); opacity: 1; } -} -@-webkit-keyframes pulsate { - 0% { -webkit-transform: scale(.3); opacity: .2; } - 100% { -webkit-transform: scale(1.1); opacity: 1; } -} -@keyframes pulsate { - 0% { -webkit-transform: scale(.3); transform:scale(.3); opacity: .2;} - 100% { -webkit-transform: scale(1.1); transform:scale(1.1); opacity: 1;} -} diff --git a/awx/ui/client/legacy/styles/ansible-ui.less b/awx/ui/client/legacy/styles/ansible-ui.less deleted file mode 100644 index 6b8b788c4c..0000000000 --- a/awx/ui/client/legacy/styles/ansible-ui.less +++ /dev/null @@ -1,2268 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * ansible-ui.css - * - * custom styles for ansible-ui - * - */ - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url(/static/assets/OpenSans-Regular.ttf); -} - -@font-face { - font-family: 'Open Sans'; - font-style: bold; - font-weight: 600; - src: url(/static/assets/OpenSans-Bold.ttf); -} - -/* Helper Classes */ -.pad-right-sm { padding-right: 10px; } -.pad-left-md { padding-left: 30px; } -.pad-left-sm { padding-left: 10px; } -.pad-left-lg { padding-left: 50px; } -.normal-weight { font-weight: normal; } -.small-text { font-size: 12px; font-weight: normal; } -.no-bullets { list-style: none; } -.nowrap { white-space: nowrap; } -.capitalize { text-transform: capitalize; } -.grey-txt { color: @grey; } -.text-center { text-align: center !important; } -.cursor-pointer { cursor: pointer } - -.red-txt, -a.red-txt:visited, -a.red-txt:hover, -a.red-txt:active { - color: @red; -} - -/* Used on inventory groups/hosts lists for long names */ -.ellipsis { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -blockquote { - font-size: 14px; -} - -.group-name { - display: inline-block; - width: 85%; -} - -a { - color: @blue-link; - text-decoration: none; -} - -a:hover, -a:focus { - color: @blue-dark; - text-decoration: none; -} -.btn{ - text-transform: uppercase; -} -/* Old style TB default button with grey background */ -.btn-grey { - color: @default-data-txt; - background-color: @d7grey; - border-color: @d7grey; -} - -.btn-grey:hover { - background-color: @default-bg; -} - -#cowsay { - padding-left: 30px; - max-width: 340px; - background-color: white; - border-style: none; -} - - -#about-modal-titlelogo{ - margin-bottom: 10px; - width: 160px; - height: 53px; -} - -#copyright-text{ - margin-top: 10px; - margin-bottom: 10px; -} - -/* Make buttons appear to be disabled, but allow mouse events */ -.btn-disabled { - opacity: 1; - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-disabled { - cursor: not-allowed; -} - -/* Bring primary (blue) buttons in line with link colors */ -.btn-primary { - background-color: @default-link; -} - -.btn-primary:hover { - background-color: @default-link-hov; -} - -/* List Actions column */ -.actions { - a { - font-size: 18px; - } - a:last-child { - margin-right: 0; - } - a:hover { - cursor: pointer; - } - .dropdown .caret { - border-top-color: @blue-link; - } -} - -// removing all the pesky outlines on buttons/links/etc. -a:focus, -a:active, -button:focus, -button:active, -i:focus, -i:active, -.btn:focus, -.btn:active:focus { - outline: 0; -} - -.jqstooltip{ - background-color: black !important; - border-radius:4px; - border: 1px solid black; -} - -.smart-status-tooltip{ - font-size: 12px; - font-family: 'Open Sans'; - background-color: black; - border-radius:4px; - span { - padding: 3px; - } -} - -.IdleModal-remainingSeconds{ - color: @default-err; -} - -#configure-schedules-tab { - position: relative; - top: 0; - left: 0; -} - -#configure-schedules-overlay { - display: none; - position: absolute; - top: 0; - left: 0; - z-index: 100; - background-color: @black; - opacity: 0; - } - -#configure-schedules-buttons{ - height: 46px; - padding-top: 10px; - text-align: right; - border-top: 1px solid @default-border; - margin-top: 5px; - a { - margin-right: 8px; - font-size: 12px; - } -} - -#configure-schedules-form-container { - position: absolute; - top: 0; - left: 0; - display: none; - border: 1px solid @default-border; - border-radius: 4px; - box-shadow: 3px 3px 6px 0 @default-dark; - padding: 0 10px 15px 8px; - background-color: @white; - z-index: 200; -} - -#configure-schedules-title { - border-bottom: 1px solid @default-border; - padding-bottom: 8px; - margin-bottom: 10px; - margin-top: 0; - h4 { - display: inline-block; - margin: 0; - } - button { - display: inline-block; - } -} - -#configure-schedules-list { - overflow-x: hidden; - overflow-y: auto; -} - -#configure-schedules-overlay { - display: none; - position: absolute; - top: 0; - left: 0; - z-index: 100; - background-color: @black; - opacity: 0; -} - -#configure-dialog, #configure-schedules-form-container { - display: none; - overflow-x: hidden; - overflow-y: auto; - padding-top: 25px; - - form { - width: 100%; - } - - .sublabel { - font-weight: normal; - } - - #occurrence-label { - display: inline-block; - } - - .occurrence-list { - border: 1px solid @well-border; - padding: 8px 10px; - border-radius: 4px; - background-color: @well; - list-style: none; - margin-bottom: 5px; - } - - #date-choice { - display: inline-block; - margin-left: 15px; - font-size: 12px; - - .label-inline { - display: inline-block; - vertical-align: middle; - } - input { - margin-bottom: 2px; - height: 11px; - width: 10px; - } - .label-inline:first-child { - padding-bottom: 2px; - margin-right: 10px; - } - .label-inline:nth-child(3) { - margin-right: 10px; - } - } -} -#home_groups_table .actions .cancel { padding-right: 3px; } - -.success-badge { - color: @default-bg; - background-color: @default-succ; -} - -/* Disable textarea re-sizing as a general rule */ -textarea { - resize: none; -} - -textarea.allowresize { - resize: both; -} - -/* Working... spinner */ -.spinny { - display: none; - position: fixed; - z-index: 2000; - width: 138px; - height: 50px; - text-align:center; - color: @d7grey; - background-color: @black; - border: 1px solid @grey; - border-radius: 6px; - padding-top: 10px; - - p { - padding-top: 0px; - font-size: 18px; - text-align: right; - margin-right: 10px; - } - - i { - float: left; - margin-left: 10px; - } -} - -.subtitle { - font-size: 16px; -} - -.license-version { - font-size: 18px; - color: @grey-txt; -} - -// #license_eula{ -// white-space: nowrap; -// } - -.modal-dialog .ui-accordion .ui-accordion-content { - overflow: hidden; -} - -.overlay { - display: none; - position: absolute; - top: 0; - left: 0; - z-index: 1080; - background-color: @black; - opacity: 0; -} - -/* TB tooltip overrides */ - .popover-body { - width: 100%; - padding: 0; - color: @default-bg; - - .table>tbody>tr>td { - padding-left: 0; - border-top: 1px solid @b7grey; - } - .popover-body_code-snippet{ - padding: 0 3px; - } - } - h3.popover-header, .popover-body, .popover-body blockquote, .popover-body a { - font-family: 'Open Sans', sans-serif; - font-size: 12px; - } - .flyout { - margin-bottom: 0; - } - .flyout thead> tr> th, .flyout tbody> tr> td, .flyout tbody> tr> td> a { - font-size: 12px; - } - .flyout tbody > tr:last-child > td { - padding-bottom: 0; - } - .popover-header { - padding: 0 0 5px 0; - background-color: @default-interface-txt; - color: @default-bg; - font-weight: 600; - border-bottom: none; - text-transform: uppercase; - } - .popover { - z-index: 2000; - min-width: 200px; - max-width: 325px; - background-color: @default-interface-txt; - color: @default-bg; //white - text-align: left; - padding: 10px; - font-weight: 400; - - code { - color: @default-data-txt; - background-color: @default-white-button-bord; - line-height: 18px; - } - - a { - color: @default-warning; - &:hover { - color: @default-warning-hov; - } - } - - p { - font-weight: 400; - } - - p:last-child { - margin-bottom: 0; - } - - table { - color: @default-bg; //white - } - } - .popover.right>.arrow:after { - border-right-color: @default-interface-txt; - } - .popover.left>.arrow:after { - border-left-color: @default-interface-txt; - } - .popover.bottom>.arrow:after { - border-bottom-color: @default-interface-txt; - } - .popover.top>.arrow:after { - border-top-color: @default-interface-txt; - } - .popover pre { - white-space: pre-wrap; - } - .popover-footer { - font-size: 12px; - margin-top: 10px; - text-align: right; - color: @grey; - .key { - color: @white; - background-color: @grey; - padding: 0 1px 1px 1px; - border-radius: 3px; - } - } - -.alert { - margin-top: 15px; - margin-bottom: 15px; -} - -hr { - border-color: @default-border; -} - -.help { - display: inline-block; -} - -.help-auto-off { - margin-top: 15px; - margin-bottom: 15px; - margin-left: 10px; - label { - font-weight: normal; - } -} - -.tab-content { - padding-top: 15px; -} - -.btn .caret { - border-top-color: @default-icon; -} - -.btn-light { - color: @default-data-txt; - background-color: @d7grey; - border-color: @d7grey; -} - -.refresh-grp { - display: inline-block; - text-align: right; - margin-left: 0; - margin-top: 0; - padding: 0; - line-height: normal; - - .refresh-msg { - font-size: 10px; - } -} - -.btn-light:hover { - color: @d7grey; - background-color: @default-icon; - border-color: @default-icon; -} - -/* Make a div or any element behave like pre. Use in conjunction with .mono-space */ -.pre { - white-space: pre; -} - - -dd { - margin-left: 15px; -} - -/* Use code-breakable in pop-over text to indent and wrap code segments */ - -.code-breakable { - padding-left: 10px; - word-wrap: break-word; -} - -.break { - word-break: break-all; -} - -.controls { - min-height: 15px; -} - -#navbar-container, .main-menu { - width: 100%; - background-color: @default-dark; -} - -.text-justify { - text-align: justify; -} - -.help-link, -.help-link:active, -.help-link:visited, -.ui-widget-content a.help-link, -.ui-widget-content a.help-link:active, -.ui-widget-content a.help-link:visited { - color: @default-icon; - text-decoration: none; - padding-left: 5px; -} - -.help-link:hover, -.ui-widget-content a.help-link:hover { - color: @default-interface-txt; - text-decoration: none; -} - -.login-header img { - width: 60%; -} - -.form-title { - display: inline-block; - width: 100%; - vertical-align: middle; - font-weight: bold; - padding-left: 15px; - margin-bottom: 10px; -} - -.form-cancel { - float: right; - margin-right: 10px; -} - -.form-title-hr { - margin-bottom: 20px; -} - -.form-horizontal .buttons { - margin-top: 25px; -} - -.label-text { - padding-right: 10px; -} - -.label-hint-text { - font-weight: normal; - color: @grey; -} -.label-hint-text:before { - /* for a line break before hintText */ - content: '\A'; - white-space: pre; -} - -#group_form #group_tabs { - margin-top: 25px; -} - -/* Outline required fields in Red when there is an error */ - .form-control.ng-dirty.ng-invalid, .form-control.ng-dirty.ng-invalid:focus { - border-color: @default-err; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 5px rgba(255, 88, 80, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 5px rgba(255, 88, 80, 0.6); - } - - .form-control.ng-dirty.ng-invalid + .select2 .select2-selection, - .form-control.ng-dirty.ng-invalid + .select2 .select2-selection:focus { - border-color: @default-err !important; - outline: 0 !important; - box-shadow: none !important; - } - - .form-control.ng-dirty.ng-pristine { - border-color: @b7grey; - box-shadow: none; - } - - .form-control.ng-dirty.ng-pristine:focus { - border-color: @default-link; - } -/* For some reason TB 3 RC1 does not provide an input-mini */ - -.input-mini { - height: 26px; - padding: 3px 8px; - font-size: 12px; - border-radius: 3px; -} - -.error { - font-size: 12px; - line-height: normal; - color: @red; -} - -.xsmall { - font-size: 12px; -} - -.note { - padding-top: 15px; - font-size: 12px; -} - -legend { - font-size: medium; - font-weight: bold; -} - -.navigation { - margin: 15px 0 15px 0; -} - -.footer-navigation { - margin: 10px 0 10px 0; -} - -.lookup-navigation { - margin: 15px 0 0 0; - /*padding-top: 20px;*/ - -} - -#lookup-modal-dialog { - overflow-x: hidden; - .instructions { - margin-top: 0; - margin-bottom: 20px; - } -} - -.related-footer { - margin: 10px 0 0 0; -} - -select.page-size { - width: 65px; - height: 24px; - font-size: 10px; -} - -.page-size-label { - margin-left: 15px; - font-size: 10.5px; - font-weight: normal; -} - -.accordion-heading { - font-weight: bold; - color: @blue-link; -} - -.accordion-heading i { - margin-right: 5px; -} - -.status-actions { - display: inline-block; - height: 25px; -} - -.status-spin { - display: inline-block; - margin-left: 15px; - font-size: 22px; - vertical-align: middle; -} - -/* Search Widget */ - - .search-widget label { - display: inline-block; - padding-right: 15px; - vertical-align: middle; - } - - #search-widget-spacer { - height: 20px; - } - -/* breadcrumbs */ -.nav-path { - padding: 5px 0 10px 0; - margin-right: 2px; - margin-bottom: 15px; - font-size: 14px; - font-weight: bold; - background-color: @default-no-items-bord; - border: 1px solid @d7grey; - border-radius: 6px; - box-shadow: 3px 3px 4px 0 @default-icon; - - .breadcrumb { - display: inline-block; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - margin-bottom: 0; - margin-left: 10px; - } - - .dropdown { - display: inline-block; - margin-right: 0; - paddding-right: 0; - - .toggle, .toggle:visited, .toggle:hover, .toggle:active { - color: @black; - } - - li a.active { - color: @grey; - } - - .crumb-icon { - font-size: 12px; - } - } -} - -.actions .dropdown { - display: inline-block; -} - -.greeting { - padding-right: 22px; -} - -.breadcrumb .active { - color: @black; -} - -.nav-tabs > li > a { - font-weight: bold; -} - -input[type="text"].field-mini-height { - height: 12px; - font-size: 10.5px; -} - -select.field-mini-height { - height: 22px; - font-size: 10.5px; -} - -.no-padding { - padding: 0; - margin: 0; -} - -input[type="checkbox"].checkbox-no-label { - margin-top: 10px; -} - -.checkbox-options { - font-weight: normal; -} - -/* Display list actions next to search widget */ -.list-actions { - display: flex; - height: 34px; - justify-content: flex-end; - margin-bottom: -34px; - text-align: right; - - .fa-lg { - vertical-align: -8%; - } -} - -.jqui-accordion { - .list-actions { - margin: 0; - } - /*.list-wrapper { - background-color: @well; - padding: 10px; - border-radius: 4px; - border: 1px solid @well-border; - }*/ - .ui-accordion-content { - padding-left: 15px; - padding-right: 15px; - } - .page-label { - margin-top: 5px; - } -} - -#home-list-actions { - margin-bottom: 15px; -} - -/* End Display list actions */ - - -/* Enable table-hover to work when table is in a well */ - -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: @default-bg; -} - -.table-hover-inverse tbody tr:hover > td, -.table-hover-inverse tbody tr:hover > th { - background-color: @active-color; -} - -.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: @active-color; -} -.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.success:hover > th { - background-color: @active-color; -} - -.table-summary thead > tr > th, -.table-summary tbody > tr > th, -.table-summary tfoot > tr > th, -.table-summary thead > tr > td, -.table-summary tbody > tr > td, -.table-summary tfoot > tr > td { - border-top: 1px solid @d7grey; -} - -.table-summary thead > tr > th { - border-bottom: 1px solid @d7grey; -} - -/* Table without row borders */ - -.table-no-border thead > tr > th, -.table-no-border tbody > tr > th, -.table-no-border tfoot > tr > th, -.table-no-border thead > tr > td, -.table-no-border tbody > tr > td, -.table-no-border tfoot > tr > td { - border-top: none; -} - -.table > tbody > tr > td{ - padding: 0.5em 0.6em; - &.actions{ - padding: 0px; - > a { - padding: 0.5em 0.6em; - display: inline-block; - } - } -} - -/* Less padding on .table-condensed */ -.table-condensed>tbody>tr>td:not(:last-child), -.table-condensed>thead>tr>th:not(:last-child) { - padding: 0.5em 20px 0.5em 0px; -} - -.table-condensed>tbody>tr>td:last-child, -.table-condensed>thead>tr>th:last-child { - padding: 0.5em 0px; -} - -.table.table-condensed.flyout { - thead>tr>th { - padding-left: 0; - border: none; - } -} - -/* Table info rows */ - -.loading-info { - color: @grey-txt; - font-weight: normal; - padding: 15px 0; -} - -/* Status Icons */ - - .license-expired, - .license-invalid, - .icon-failures-true, - .active-failures-true a, - .active-failures-true a:active, - .job-failed, - .job-error { - color: @default-err; - } - - .icon-failures-true a:hover { - color: @red; - } - - .job-failures-true { - padding-top: 5px; - color: @default-err; - } - - .job-event-status, - .license-status { - padding-top: 5px; - } - - - .job-new, - .license-valid, - .job-success, - .job-successful { - color: @green; - } - - .icon-host-all:before, - .icon-host-failed:before, - .icon-job-active:before, - .icon-job-running:before, - .icon-job-success:before, - .icon-job-successful:before, - .icon-job-changed:before, - .icon-job-ok:before, - .icon-job-OK:before, - .icon-job-failed:before, - .icon-job-skipped:before { - content: "\f111"; - } - - .icon-job-stopped:before, - .icon-job-error:before, - .icon-job-canceled:before, - .icon-job-stdout-download-tooltip:before, - .icon-job-unreachable:before, - .icon-job-failed:before { - content: "\f06a"; - } - - .icon-job-pending:before, - .icon-job-waiting:before, - .icon-job-new:before, - .icon-job-none:before, - .icon-job-no-matching-hosts:before { - content: "\f10c"; - } - - .icon-job-active, - .icon-job-running, - .icon-job-success, - .icon-job-successful, - .icon-job-ok, - .icon-job-OK { - color: @green; - } - - .icon-job-skipped { - color: @skipped; - } - - .icon-job-running { - .pulsate(); - } - - .icon-job-changed, - .job-changed { - color: @changed; - } - - .icon-host-failed, - .icon-job-stopped, - .icon-job-error, - .icon-job-failed, - .icon-job-stdout-download-tooltip, - .icon-job-canceled { - color: @red; - } - - .icon-host-all { - color: @at-blue; - } - - .icon-job-unreachable { - color: @unreachable; - } - - .icon-job-none, - .icon-job-pending, - .icon-job-waiting, - .icon-job-new, - .icon-job-no-matching-hosts { - color: @grey; - opacity: 0.45; - } - - .icon-schedule-enabled-true:before { - content: "\f04d"; - } - - .icon-schedule-enabled-false:before { - content: "\f04b"; - } - - .icon-socket-ok:before { - content: "\f111"; - color: @green; - } - .icon-socket-error:before { - content: "\f111"; - color: @red; - } - .icon-socket-connecting:before { - content: "\f042"; - color: @warning; - } - -/* job_events page */ - - #jobevents_table { - div.return-code { - display: inline-block; - margin-left: 10px; - } - textarea { - white-space: pre-wrap; - resize: vertical; - } - } - - #password-modal .alert-info { - margin-top: 0; - margin-bottom: 25px; - } - -/* Inventory job status badge */ - .failures-true { - background-color: @red; - color: @default-bg; - } - - .failures-false { - background-color: @green; - color: @default-bg; - } - -/* Cloud inventory status. i.e. inventory_source.status values */ - - .icon-cloud-na:before, - .icon-cloud-never:before, - .icon-cloud-updating:before, - .icon-cloud-running:before, - .icon-cloud-successful:before, - .icon-cloud-pending:before, - .icon-cloud-failed:before, - .icon-cloud-canceled:before, - .icon-cloud-error:before { - content: "\f0c2"; - } - - /*.icon-cloud-failed:before, - .icon-cloud-error:before { - content: "\f06a"; - }*/ - - .icon-cloud-na, - .icon-cloud-never, - a.icon-cloud-na:hover, - a.icon-cloud-never:hover { - color: @grey; - } - - .icon-cloud-updating, - .icon-cloud-running, - .icon-cloud-successful, - .icon-cloud-pending, - a.icon-cloud-updating:hover, - a.icon-cloud-successful:hover { - color: @green; - } - - .icon-cloud-failed, - .icon-cloud-error, - .icon-cloud-canceled, - a.icon-cloud-failed:hover { - color: @red; - } - - .icon-cloud-updating, - .icon-cloud-running, - .icon-cloud-pending { - .pulsate(); - } - - .icon-enabled-true:before { - content: "\f046"; - } - - .icon-enabled-true { - color: @green; - width: 14px; - - } - .icon-enabled-false:before { - content: "\f096"; - } - - .icon-enabled-false{ - color: @red; - width: 14px; - } - -/* Inventory cloud sourced? indicator */ - .icon-cloud-true:before { - content: "\f111"; - } - - .icon-cloud-false:before { - content: "\f111"; - } - - .error-color { - color:@red; - } - - .error-border { - border-color:@red; - } - - .connecting-color { - color: @warning; - } - - .ok-color, - .icon-cloud-true { - color: @green; - } - - .icon-cloud-false { - color: @grey; - } -/* end */ - - .field-success { - color: @default-succ; - } - - .field-success input { - border-color: @default-succ; - } - - .field-failure { - color: @red; - } - - .field-failure input { - border-color: @red; - } - - .field-badge { - font-size: 12px; - margin-right: 3px; - } - - .license-warning, - .license-demo { - color: @warning; - } - - .job-detail-status { - display: inline-block; - margin-top: 5px; - font-size: 15px; - } - - /*.form-items .search-widget { - margin-top: 15px; - }*/ - - .form-items .item-count { - display: inline-block; - margin-top: 25px; - font-size: small; - } - - .child-event a { - color: @black; - cursor: default; - } - /* Padding levels used on job events and inventory groups */ - .level { display: inline-block; } - .level-1 { padding-left: 15px; } - .level-2 { padding-left: 30px; } - .level-3 { padding-left: 45px; } - .level-4 { padding-left: 60px; } - .level-5 { padding-left: 75px; } - .level-6 { padding-left: 90px; } - .level-7 { padding-left: 105px; } - .level-8 { padding-left: 120px; } - .level-9 { padding-left: 135px; } - .level-10 { padding-left: 150px; } - - .level-3-detail { - padding-left: 80px; - } - - #job_events .control-group { - margin-top: 0; - margin-bottom: 10px; - } - -/* End Jobs Page */ - - -/* license modal */ - #license-modal-dialog { - overflow-x: hidden; - - input[readonly], - textarea[readonly] { - background-color: @default-border; - border: 1px solid @default-icon; - } - - .fa-external-link { - color: @grey; - font-size: 10px; - } - - .free-button { - background-color: @default-err; - border: 1px solid @default-err; - color: @white; - } - .free-button:hover { - background-color: @default-err-hov; - border: 1px solid @default-err-hov; - color: @white; - } - } - -/* Inventory nav links */ - .navigation-links { - - padding: 0; - margin-top: -10px; - - a { - margin-right: 15px; - } - - a:last-child { - margin-right: 20px; - } - } - -/* Dashboard */ - #home #container1.col-lg-6, - #home #container3.col-lg-6 { - padding-right: 7px; - } - - #home #container2.col-lg-6, - #home #container4.col-lg-6 { - padding-left: 7px; - } - - -/* Inventory Edit */ - - #hosts-container.col-lg-6 { - padding-left: 7px; - padding-right: 17px; - } - - #groups-container .well, - #hosts-container .well { - padding: 8px; - margin-bottom: 0; - } - - #home_groups_table i[class*="icon-job-"] { - margin-left: 5px; - } - - .selected { - font-weight: bold; - color: @blue-dark; - } - - .inventory-title { - font-size: 16px; - font-weight: bold; - } - - .active-row { - background-color: @white; - border-bottom: 1px solid @default-tertiary-bg; - border-right: 1px solid @default-tertiary-bg; - } - - .node-toggle, .node-no-toggle { - /* also used on job evetns */ - float: none; - padding-top: 3px; - padding-left: 0; - margin-right: 5px; - margin-left: 0; - } - - .node-no-toggle { - opacity: .30; - } - - .draggable-clone { - opacity: .60; - font-weight: bold; - /*z-index: 2000; - overflow: visible; - whitespace: wrap; - text-overflow: clip;*/ - } - - .droppable-hover { - background-color: @info; - color: @info-color; - padding: 6px; - border: 1px solid @info-border; - border-radius: 4px; - /*overflow: visible; - whitespace: wrap; - text-overflow: clip;*/ - } - - #group-delete-dialog .help-container, - #password-modal .help-container { - .help-link, - .help-link:active, - .help-link:visited { - color: @blue-link; - } - - .help-link:hover { - color: @blue-dark; - } - } - - - .btn-danger { - background-color: @red; - border-color: @red-focus; - } - - .btn-danger:hover, - .btn-danger:focus, - .btn-danger:active { - border-color: @red-focus; - background-color: @red-focus; - } - -// ad hoc permission checkbox -.squeeze.form-group { - margin-bottom: 10px; -} - -.disabled { - color: @grey; -} - -a.disabled:hover { - color: @grey; - cursor: not-allowed; -} -a.btn-disabled:hover { - cursor: not-allowed; -} - -/* Variable Editing */ - .parse-selection { - display: inline-block; - margin: 5px 0 8px 0; - font-size: 12px; - line-height: normal; - } - - .parse-selection input { - margin-left: 5px; - } - - .parse-select .parse-label { - margin-left: 3px; - color: @field-input-text; - } - - .parse-label { - color: @field-input-text; - font-weight: normal; - } - - .external-editor-link { - display: inline-block; - margin-left: 20px; - } - -.slider { - display: inline-block; - width: 100px; - margin: 0 10px; - vertical-align: middle; -} - -/* Sort link styles */ - -.list-header-noSort:hover.list-header:hover{ - cursor: default; -} - -.list-header:hover { - cursor: pointer; -} - -.list-header i { - margin-left: 10px; -} - -.list-header .icon-sort { - color: @default-icon; -} - -.list-header .icon-sort-down, -.list-header .icon-sort-up { - color: @black; -} - -/* job_events syles */ - -#jobevents_table .actions i { - padding-top: 0; - margin-right: 0; -} - -tr td button i { - padding-top: 0; - margin-right: 0; -} - -.event-form { - margin-top: 10px; - margin-bottom: 5px; - - label { - font-weight: normal; - } -} - -.event-detail-host { - padding-top: 10px; - padding-bottom: 5px; -} - -.form-section-title { - width: 100%; - margin-top: 0; - margin-bottom: 10px; - font-weight: bold; - border-bottom: 1px solid @default-border; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.6; - filter: alpha(opacity=60); -} - -.modal-body .ui-accordion .ui-accordion-content { - padding: 10px; -} - -/* overrides to TB modal */ -.modal-content { - padding: 20px; - box-shadow: 0 5px 15px rgba(0,0,0,.5); -} - -.modal-header { - color: @default-interface-txt; - white-space: nowrap; - width: 90%; - overflow: hidden; - text-overflow: ellipsis; - width: 100%; - border: none; - padding: 0; -} - -.modal { - border: 1px solid @black; - overflow-y: auto; -} - -.modal .SmartSearch-bar { - width: 100%; -} - -#alert-modal, #alert-modal2 { - z-index: 2100; -} - -.close { - color: @grey; - opacity: .7; - filter: alpha(opacity=70); -} - -.modal-header h3 { - margin: 0; - text-rendering: optimizeLegibility; - font-size: 15px; - color: @default-interface-txt; - font-weight: bold; - line-height: normal; - font-family: 'Open Sans', helvetica; - text-transform: uppercase; -} - -.modal-body { - min-height: 120px; - padding: 20px 0; - - .alert { - padding: 0px; - margin: 0; - word-wrap: break-word; - } - .alert-danger { - background-color: @default-bg; - border: none; - color: @default-interface-txt; - } -} - -#prompt-modal .modal-body { - padding-bottom: 30px; -} - -.skinny-modal .modal-body { - padding: 5px 10px 0 10px; -} - -.modal-footer { - padding: 0; - border: none; - margin-top: 0; - display: flex; - justify-content: flex-end; - - .btn.btn-primary { - text-transform: uppercase; - background-color: @default-succ; - border-color: @default-succ; - padding: 5px 15px; - cursor: pointer; - - &:hover { - background-color: @default-succ-hov; - border-color: @default-succ-hov; - } - - &:disabled { - background-color: @default-succ-disabled; - border-color: @default-succ-disabled; - } - } - - .btn + .btn { - margin: 0; - } -} - -/* form navigation */ -.navigation-buttons { - height: 40px; -} - - -/* PW progress bar */ -.pw-progress { margin-top: 10px; - - li { - line-height: normal; - margin-bottom: 10px; - } - ul:last-child { - margin-top: 10px; - } - -} - -/* Home page */ - -.failed-column { - a:link, a:visited { - color: @red; - } - a:hover { - color: @red-hover; - } -} - -/* Help modal dialog */ - -#help-modal-dialog { - overflow: hidden; - padding: 10px; - - img { - margin-top: 15px; - margin-bottom: 15px; - border: 1px solid @grey; - box-shadow: 3px 3px 5px 0 @grey; - } - - .img-container, - .icon-container { - width: 100%; - text-align: center; - } - - .icon-container { - margin-top: 15px; - margin-bottom: 15px; - } - - .help-box { - width: 100%; - margin-top: 15px; - border-radius: 6px; - color: @grey-txt; - font-size: 14px; - } - - .fa-rss { - transform:rotate(-45deg); - } -} - -/* job stdout */ - - #pre-container { - overflow: auto; - width: 100%; - border-radius: 4px; - margin: 0; - } - - -/* ng-cloak directive */ - -[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { - display: none !important; -} - - -/* Socket testing page */ -#sockets { - .section-title { - font-weight: bold; - color: @blue-link; - margin-top: 30px; - } - #test-container .section-title { - margin-top: 20px; - } - .well { - padding: 9px; - } - .message-section { - height: 150px; - overflow: auto; - } - .events-section { - margin-top: 40px; - .section-title { - margin-top: 0; - } - } - #event-message-container { - height: 200px; - } -} - -/* Large desktop */ - -@media (min-width: 1200px) { - - .delete-btn { - /* Used on job and project page to make cancel and delete buttons have an equal width */ - width: 60px; - } - - .label-text { - text-align: right; - } - -} - -@media (min-width: 768px) and (max-width: 1199px) { - - .level-1, - .level-2, - .level-3, - .level-4, - .level-5, - .level-6, - .level-7, - .level-8, - .level-9, - .level-10, - .level-3-detail { - padding-left: 0; - } - - .label-text { - text-align: left; - } - - .group-name { - width: 80%; - } - - #groups-container.col-lg-6 { - padding-right: 15px; - } - - #hosts-container.col-lg-6 { - margin-top: 15px; - padding-left: 15px; - padding-right: 15px; - .well { - margin-bottom: 0; - } - } - -} - -/* Landscape phone to portrait tablet */ - -@media (max-width: 767px) { - - /* Job events */ - - .level-1, - .level-2, - .level-3, - .level-4, - .level-5, - .level-6, - .level-7, - .level-8, - .level-9, - .level-10, - .level-3-detail { - padding-left: 0; - } - - table { - word-wrap: break-word; - table-layout: fixed; - } - - th.actions-column, - td.actions { - white-space: normal; - } - - td.actions .btn { - width: 75px; - margin-bottom: 5px; - } - - .group-name { - width: 80%; - } - - .label-text { - text-align: left; - } - - .list-action-label { - display: none; - } - - #groups-container.col-lg-6 { - padding-right: 15px; - } - - #hosts-container.col-lg-6 { - margin-top: 15px; - padding-left: 15px; - padding-right: 15px; - } -} - -// lists.less uses 600px as the breakpoint, doing same for consistency -@media (max-width: 600px) { - .list-actions { - text-align: left; - margin-bottom: 20px; - } -} - -.nvtooltip { - border-radius: 4px; - - td.value { - padding-right: 0px; - } - - p { - padding: 3px 0px; - } - - & > table > thead > tr > td { - font-weight: 700; - - &:first-child { - padding-top: 0; - } - } - - & > table > tbody > tr:last-child > td { - padding-bottom: 0; - } -} - -.nvd3 g.nv-groups path.nv-line { - stroke-width: 3px; -} - -.stdout-panel-body { - background-color: @default-list-header-bg; -} - -.job-stdout-panel { - margin: 0 15px; -} - -.show_input_button { - width: 73px; -} - -.red-text { - color: @red; -} - -.factDetailsNote { - margin-bottom: 10px; -} - -.inputSpacer { - margin-bottom: 25px; -} - -.cleanupStretcher { - margin: 0 -15px; -} - -.factDaysToKeepCompacter { - margin-bottom: 15px; -} - -.factDetailsHeader { - font-weight: bold; -} - -@media (max-width: 991px) { - .inputCompactMobile { - margin-bottom: 15px; - } -} - -#login-modal-body { - padding-bottom: 5px; -} - -.modal { - transition: all 0.3s ease-out !important; -} - -.modal.fade .modal-dialog { - transform: translate(0, 0); - margin: 100px auto; -} - -.modal-backdrop, .modal-backdrop.fade.show { - opacity: .25; -} - -.form-control { - border-color: @b7grey; - background-color: @fcgrey; - color: @default-data-txt; - transition: border-color 0.3s; - box-shadow: none; - font-size: 14px; - font-family: 'Open Sans', sans-serif; -} - -.form-control + .select2 .select2-selection { - border-color: @b7grey !important; - background-color: @fcgrey !important; - color: @default-data-txt !important; - transition: border-color 0.3s !important; - box-shadow: none !important; -} - -.form-control + .select2-container--disabled .select2-selection { - background-color: @ebgrey !important; -} - -.form-control:active, .form-control:focus { - box-shadow: none; - border-color: @default-link; -} - -.form-control:active + .select2 .select2-selection, .form-control:focus + .select2 .select2-selection { - box-shadow: none !important; - border-color: @default-link !important; -} - -.form-control.ng-dirty.ng-invalid, .form-control.ng-dirty.ng-invalid:focus { - box-shadow: none; -} - -.form-control.ng-dirty.ng-invalid + .select2 .select2-selection, .form-control.ng-dirty.ng-invalid:focus + .select2 .select2-selection { - box-shadow: none !important; -} - -.error { - opacity: 1; - transition: opacity 0.2s; -} - -.error.ng-hide-add { - display: none; -} - -.error.ng-hide { - opacity: 0; -} - -/* Overwrite select2 base styles for single/multiple selects so that match up with other form elements. Also overwrite disabled styles. */ -.select2-container--disabled,.select2-container--disabled .select2-selection--single,.select2-container--disabled .select2-selection--multiple { - cursor: not-allowed; - opacity: 100; - background-color: @ebgrey; - border-radius: 5px; -} - -.select2-container--default .select2-selection--single { - background-color: @fcgrey; - border: 1px solid @d7grey; - border-radius: 4px; -} - -.select2-container--default .select2-selection--multiple { - background-color: @field-secondary-bg; - border-radius: 4px; - border: 1px solid @d7grey; - cursor: text; - max-height: 135px; - overflow-y: auto; -} - -body.is-modalOpen { - overflow: hidden; -} - -input[type=file]:focus, input[type=radio]:focus, input[type=checkbox]:focus { - outline: 0 !important; -} - -.btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .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:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { - background-color: @d7grey; - color: @default-bg; - border: 0; -} - -.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { - border-color: @default-succ; -} - -a { - color: @default-link; -} - -a:hover { - color: @default-link-hov; -} - -.form-control:active, .form-control:focus { - border-color: @default-link; -} - -.nv-axislabel { - font-weight: bold !important; - fill: @db-graph-axis-label !important; - font-family: 'Open Sans' !important; -} - -.nv-axis text { - fill: @db-graph-axis-label !important; - font-family: 'Open Sans' !important; -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice { - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding-left: 0px; - border-left-width: 0px; - border-bottom-width: 0px; - border-top-width: 0px; - padding-right: 10px; - border-right-width: 0px; - background-color: @default-link; - color: @default-bg; - border-radius: 5px; - line-height: 21px; - font-size: 13px; - white-space: pre-wrap; - word-wrap: break-word; - word-break: break-all; - white-space: normal; -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 8px !important; - padding: 0 6px; - color: @default-bg !important; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - background-color: @default-link; -} - -.select2-selection { - & > .select2-selection__arrow { - border-left: none; - } -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - background-color: @default-err; -} - -#scheduled-jobs-tab .List-header { - display: none; -} - -.ui-widget { - font-family: 'Open Sans'; -} - -.WorkflowBadge{ - background-color: @b7grey; - border-radius: 10px; - color: @default-bg; - display: inline-block; - font-family: 'Open Sans'; - font-weight: bold; - font-style: normal; - font-size: x-small; - height: 14px; - margin-left: 5px; - padding-left: 2px; - width: 14px; -} - -button[disabled], -html input[disabled] { - cursor: not-allowed; -} - -.CodeMirror { - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; -} - -.CodeMirror--disabled .CodeMirror.cm-s-default, -.CodeMirror--disabled .CodeMirror-line { - background-color: @default-no-items-bord; -} - -.CodeMirror--disabled .CodeMirror-gutter.CodeMirror-lint-markers, -.CodeMirror--disabled .CodeMirror-gutter.CodeMirror-linenumbers { - background-color: @default-list-header-bg; - color: @b7grey; -} - -.CodeMirror--disabled .CodeMirror-lines { - cursor: default; -} - -.CodeMirror--disabled .CodeMirror-cursors { - display: none; -} - -.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.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:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active { - border-color: @field-border; -} - -.btn-default { - background: @default-bg; - border-color: @b7grey; - color: @default-interface-txt; -} - -.select2-container--disabled .select2-selection, -.select2-container--disabled .select2-arrow { - background-color: @ebgrey; -} - -.btn.disabled,.btn[disabled],fieldset[disabled] .bt { - opacity: 0.65; -} - -.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled { - opacity: 1; - background-color: @ebgrey; -} - -input[disabled].ui-spinner-input { - background-color: @ebgrey; -} - -.CodeMirror-scroll { - margin-bottom: 0; - padding-bottom: 0; - margin-right: 0; - overflow: auto !important; - overflow-y: auto !important; - border-radius: 5px; -} - -.CodeMirror-lines { - margin-bottom: 20px; -} - -.btn-default { - border-color: @b7grey; -} - -.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { - background-color: @f2grey; - border-color: @b7grey; - color: @default-interface-txt; -} - -.ui-dialog .ui-dialog-content { - background: @default-bg; -} - -.ui-dialog.no-close button.close { - display: none; -} - -html { height: 100%; } - -body { - font-family: 'Open Sans', sans-serif; - font-weight: 400; - color: @default-data-txt; - background-color: @default-secondary-bg; -} - -.container-fluid { - padding-left: 20px; - padding-right: 20px; -} - -#content-container { - padding-bottom: 0px; -} - -.btn { - text-transform: uppercase; -} - -.ui-spinner-input { - margin-top: .3em; - margin-bottom: .3em; -} - -.Toast-wrapper { - display: flex; - max-width: 250px; - word-break: break-word; -} - -.Toast-icon { - display: flex; - align-items: center; - justify-content: center; -} diff --git a/awx/ui/client/legacy/styles/bootstrap-custom-overrides.less b/awx/ui/client/legacy/styles/bootstrap-custom-overrides.less deleted file mode 100644 index ab6020ce86..0000000000 --- a/awx/ui/client/legacy/styles/bootstrap-custom-overrides.less +++ /dev/null @@ -1,191 +0,0 @@ -body { - font-family: 'Open Sans', sans-serif; - font-weight: 400; - color: @default-data-txt; - background-color: @default-secondary-bg; - font-size: 0.88rem; - /* - * Bootstrap fix that's causing a right margin and padding - * to appear whenever a modal is opened - * https://github.com/twbs/bootstrap/issues/27071 - */ - margin-right: 0px !important; - padding-right: 0px !important; -} - -.dropdown-toggle::after { - display:none; -} - -.tooltip.show { - opacity: 1; -} - -.tooltip { - font-family: 'Open Sans', sans-serif; - font-size: 0.75rem; - line-height: 1.4; -} - -.bs-tooltip-top .arrow::before, -.bs-tooltip-auto[x-placement^="top"] .arrow::before { - border-top-color: @default-stdout-txt; -} - -.bs-tooltip-bottom .arrow::before, -.bs-tooltip-auto[x-placement^="bottom"] .arrow::before { - border-bottom-color: @default-stdout-txt; -} - -.bs-tooltip-left .arrow::before, -.bs-tooltip-auto[x-placement^="left"] .arrow::before { - border-left-color: @default-stdout-txt; -} - -.bs-tooltip-right .arrow::before, -.bs-tooltip-auto[x-placement^="right"] .arrow::before { - border-right-color: @default-stdout-txt; -} - -/* this used to exist but was removed */ -.form-horizontal .form-group { - margin-left: -15px; - margin-right: -15px; -} - -label { - margin-bottom: 0.3125rem; -} - -.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { - line-height: 1.1; -} - -p { - margin-bottom: 0.625rem; -} - -.dropdown-menu, .btn { - font-size: 0.88rem; -} - -.btn-xs, .btn-group-xs>.btn { - padding: 1px 5px; - font-size: 0.75rem; - line-height: 1.5; - border-radius: 3px; -} - -.btn-sm, .btn-group-sm>.btn { - padding: 5px 10px; - font-size: 0.75rem; - line-height: 1.5; - border-radius: 3px; -} - -button, html input[type=button], input[type=reset], input[type=submit] { - cursor: pointer; -} - -.dropdown-menu { - padding: .2rem 0; -} - -.dropdown-item { - padding: 0.19rem 0.625rem; -} - -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - } -} - -.modal-dialog { - max-width: none; -} - -.modal-footer>:not(:last-child) { - margin-right: 1.25rem; -} - -.btn-group-vertical>.btn, .btn-group>.btn { - -ms-flex: 1 1 auto; - flex: 1 1 auto; -} - -.bs-popover-auto[x-placement^=right] .arrow::after, .bs-popover-right .arrow::after { - border-right-color: @default-stdout-txt; -} - -.bs-popover-auto[x-placement^=left] .arrow::after, .bs-popover-left .arrow::after { - border-left-color: @default-stdout-txt; -} - -.bs-popover-auto[x-placement^=top] .arrow::after, .bs-popover-top .arrow::after { - border-top-color: @default-stdout-txt; -} - -.bs-popover-auto[x-placement^=bottom] .arrow::after, .bs-popover-bottom .arrow::after { - border-bottom-color: @default-stdout-txt; -} - -a:not([href]):not([tabindex]) { - color: @default-link; -} - -a:not([href]):not([tabindex]):hover { - color: @default-link-hov; -} - -.dropdown-menu>li>a { - padding: 3px 10px; - display: block; - clear: both; - font-weight: 400; - line-height: 1.42857143; - white-space: nowrap; -} - -.dropdown-item.active, -.dropdown-item:active, -.dropdown-menu>li>a:hover, -.dropdown-menu>li>a:focus { - text-decoration: none; - color: @default-data-txt; - background-color: @f6grey; -} - -.radio-inline+.radio-inline, .checkbox-inline+.checkbox-inline { - margin-left: 10px; -} - -label { - font-weight: 700; -} - -.radio-inline, .checkbox-inline { - font-weight: 400; -} - -.btn-success{ - background: @default-succ; - border-color: transparent; - :hover{ - background: @default-succ-hov; - } - :disabled{ - background: @default-succ-disabled; - } -} -.btn-default{ - background: @btn-bg; - border-color: @btn-bord; - color: @btn-txt; - :hover{ - background: @btn-bg-hov; - } - :focus{ - background: @btn-bg-sel; - } -} diff --git a/awx/ui/client/legacy/styles/bootstrap-datepicker.less b/awx/ui/client/legacy/styles/bootstrap-datepicker.less deleted file mode 100644 index dd5f9490dc..0000000000 --- a/awx/ui/client/legacy/styles/bootstrap-datepicker.less +++ /dev/null @@ -1,750 +0,0 @@ -/*! - * Datepicker for Bootstrap v1.4.0 (https://github.com/eternicode/bootstrap-datepicker) - * - * Copyright 2012 Stefan Petre - * Improvements by Andrew Rowls - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - */ -.datepicker { - padding: 4px; - border-radius: 4px; - direction: ltr; -} -.datepicker-inline { - width: 220px; -} -.datepicker.datepicker-rtl { - direction: rtl; -} -.datepicker.datepicker-rtl table tr td span { - float: right; -} -.datepicker-dropdown { - top: 0; - left: 0; -} -.datepicker-dropdown:before { - content: ''; - display: none; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-top: 0; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; -} -.datepicker-dropdown:after { - content: ''; - display: none; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-top: 0; - position: absolute; -} -.datepicker-dropdown.datepicker-orient-left:before { - left: 6px; -} -.datepicker-dropdown.datepicker-orient-left:after { - left: 7px; -} -.datepicker-dropdown.datepicker-orient-right:before { - right: 6px; -} -.datepicker-dropdown.datepicker-orient-right:after { - right: 7px; -} -.datepicker-dropdown.datepicker-orient-top:before { - top: -7px; -} -.datepicker-dropdown.datepicker-orient-top:after { - top: -6px; -} -.datepicker-dropdown.datepicker-orient-bottom:before { - bottom: -7px; - border-bottom: 0; - border-top: 7px solid #999; -} -.datepicker-dropdown.datepicker-orient-bottom:after { - bottom: -6px; - border-bottom: 0; - border-top: 6px solid #fff; -} -.datepicker.days .datepicker-days, -.datepicker.months .datepicker-months, -.datepicker.years .datepicker-years { - display: block; -} -.datepicker table { - margin: 0; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.datepicker .datepicker-days .table-condensed tr td, -.datepicker .datepicker-days .table-condensed tr th { - text-align: center; - width: 30px; - height: 30px; - border-radius: 4px; - border: none; - padding: 0.5em 0.7em; -} -.table-striped .datepicker table tr td, -.table-striped .datepicker table tr th { - background-color: transparent; -} -.datepicker table tr td.day:hover, -.datepicker table tr td.day.focused { - background: #eeeeee; - cursor: pointer; -} -.datepicker table tr td.old, -.datepicker table tr td.new { - color: #999999; -} -.datepicker table tr td.disabled, -.datepicker table tr td.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td.today, -.datepicker table tr td.today:hover, -.datepicker table tr td.today.disabled, -.datepicker table tr td.today.disabled:hover { - color: #000000; - background-color: #ffdb99; - border-color: #ffb733; -} -.datepicker table tr td.today:hover, -.datepicker table tr td.today:hover:hover, -.datepicker table tr td.today.disabled:hover, -.datepicker table tr td.today.disabled:hover:hover, -.datepicker table tr td.today:focus, -.datepicker table tr td.today:hover:focus, -.datepicker table tr td.today.disabled:focus, -.datepicker table tr td.today.disabled:hover:focus, -.datepicker table tr td.today:active, -.datepicker table tr td.today:hover:active, -.datepicker table tr td.today.disabled:active, -.datepicker table tr td.today.disabled:hover:active, -.datepicker table tr td.today.active, -.datepicker table tr td.today:hover.active, -.datepicker table tr td.today.disabled.active, -.datepicker table tr td.today.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.today, -.open .dropdown-toggle.datepicker table tr td.today:hover, -.open .dropdown-toggle.datepicker table tr td.today.disabled, -.open .dropdown-toggle.datepicker table tr td.today.disabled:hover { - color: #000000; - background-color: #ffcd70; - border-color: #f59e00; -} -.datepicker table tr td.today:active, -.datepicker table tr td.today:hover:active, -.datepicker table tr td.today.disabled:active, -.datepicker table tr td.today.disabled:hover:active, -.datepicker table tr td.today.active, -.datepicker table tr td.today:hover.active, -.datepicker table tr td.today.disabled.active, -.datepicker table tr td.today.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.today, -.open .dropdown-toggle.datepicker table tr td.today:hover, -.open .dropdown-toggle.datepicker table tr td.today.disabled, -.open .dropdown-toggle.datepicker table tr td.today.disabled:hover { - background-image: none; -} -.datepicker table tr td.today.disabled, -.datepicker table tr td.today:hover.disabled, -.datepicker table tr td.today.disabled.disabled, -.datepicker table tr td.today.disabled:hover.disabled, -.datepicker table tr td.today[disabled], -.datepicker table tr td.today:hover[disabled], -.datepicker table tr td.today.disabled[disabled], -.datepicker table tr td.today.disabled:hover[disabled], -fieldset[disabled] .datepicker table tr td.today, -fieldset[disabled] .datepicker table tr td.today:hover, -fieldset[disabled] .datepicker table tr td.today.disabled, -fieldset[disabled] .datepicker table tr td.today.disabled:hover, -.datepicker table tr td.today.disabled:hover, -.datepicker table tr td.today:hover.disabled:hover, -.datepicker table tr td.today.disabled.disabled:hover, -.datepicker table tr td.today.disabled:hover.disabled:hover, -.datepicker table tr td.today[disabled]:hover, -.datepicker table tr td.today:hover[disabled]:hover, -.datepicker table tr td.today.disabled[disabled]:hover, -.datepicker table tr td.today.disabled:hover[disabled]:hover, -fieldset[disabled] .datepicker table tr td.today:hover, -fieldset[disabled] .datepicker table tr td.today:hover:hover, -fieldset[disabled] .datepicker table tr td.today.disabled:hover, -fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover, -.datepicker table tr td.today.disabled:focus, -.datepicker table tr td.today:hover.disabled:focus, -.datepicker table tr td.today.disabled.disabled:focus, -.datepicker table tr td.today.disabled:hover.disabled:focus, -.datepicker table tr td.today[disabled]:focus, -.datepicker table tr td.today:hover[disabled]:focus, -.datepicker table tr td.today.disabled[disabled]:focus, -.datepicker table tr td.today.disabled:hover[disabled]:focus, -fieldset[disabled] .datepicker table tr td.today:focus, -fieldset[disabled] .datepicker table tr td.today:hover:focus, -fieldset[disabled] .datepicker table tr td.today.disabled:focus, -fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus, -.datepicker table tr td.today.disabled:active, -.datepicker table tr td.today:hover.disabled:active, -.datepicker table tr td.today.disabled.disabled:active, -.datepicker table tr td.today.disabled:hover.disabled:active, -.datepicker table tr td.today[disabled]:active, -.datepicker table tr td.today:hover[disabled]:active, -.datepicker table tr td.today.disabled[disabled]:active, -.datepicker table tr td.today.disabled:hover[disabled]:active, -fieldset[disabled] .datepicker table tr td.today:active, -fieldset[disabled] .datepicker table tr td.today:hover:active, -fieldset[disabled] .datepicker table tr td.today.disabled:active, -fieldset[disabled] .datepicker table tr td.today.disabled:hover:active, -.datepicker table tr td.today.disabled.active, -.datepicker table tr td.today:hover.disabled.active, -.datepicker table tr td.today.disabled.disabled.active, -.datepicker table tr td.today.disabled:hover.disabled.active, -.datepicker table tr td.today[disabled].active, -.datepicker table tr td.today:hover[disabled].active, -.datepicker table tr td.today.disabled[disabled].active, -.datepicker table tr td.today.disabled:hover[disabled].active, -fieldset[disabled] .datepicker table tr td.today.active, -fieldset[disabled] .datepicker table tr td.today:hover.active, -fieldset[disabled] .datepicker table tr td.today.disabled.active, -fieldset[disabled] .datepicker table tr td.today.disabled:hover.active { - background-color: #ffdb99; - border-color: #ffb733; -} -.datepicker table tr td.today:hover:hover { - color: #000; -} -.datepicker table tr td.today.active:hover { - color: #fff; -} -.datepicker table tr td.range, -.datepicker table tr td.range:hover, -.datepicker table tr td.range.disabled, -.datepicker table tr td.range.disabled:hover { - background: #eeeeee; - border-radius: 0; -} -.datepicker table tr td.range.today, -.datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today.disabled, -.datepicker table tr td.range.today.disabled:hover { - color: #000000; - background-color: #f7ca77; - border-color: #f1a417; - border-radius: 0; -} -.datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today:hover:hover, -.datepicker table tr td.range.today.disabled:hover, -.datepicker table tr td.range.today.disabled:hover:hover, -.datepicker table tr td.range.today:focus, -.datepicker table tr td.range.today:hover:focus, -.datepicker table tr td.range.today.disabled:focus, -.datepicker table tr td.range.today.disabled:hover:focus, -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today:hover:active, -.datepicker table tr td.range.today.disabled:active, -.datepicker table tr td.range.today.disabled:hover:active, -.datepicker table tr td.range.today.active, -.datepicker table tr td.range.today:hover.active, -.datepicker table tr td.range.today.disabled.active, -.datepicker table tr td.range.today.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.range.today, -.open .dropdown-toggle.datepicker table tr td.range.today:hover, -.open .dropdown-toggle.datepicker table tr td.range.today.disabled, -.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { - color: #000000; - background-color: #f4bb51; - border-color: #bf800c; -} -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today:hover:active, -.datepicker table tr td.range.today.disabled:active, -.datepicker table tr td.range.today.disabled:hover:active, -.datepicker table tr td.range.today.active, -.datepicker table tr td.range.today:hover.active, -.datepicker table tr td.range.today.disabled.active, -.datepicker table tr td.range.today.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.range.today, -.open .dropdown-toggle.datepicker table tr td.range.today:hover, -.open .dropdown-toggle.datepicker table tr td.range.today.disabled, -.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { - background-image: none; -} -.datepicker table tr td.range.today.disabled, -.datepicker table tr td.range.today:hover.disabled, -.datepicker table tr td.range.today.disabled.disabled, -.datepicker table tr td.range.today.disabled:hover.disabled, -.datepicker table tr td.range.today[disabled], -.datepicker table tr td.range.today:hover[disabled], -.datepicker table tr td.range.today.disabled[disabled], -.datepicker table tr td.range.today.disabled:hover[disabled], -fieldset[disabled] .datepicker table tr td.range.today, -fieldset[disabled] .datepicker table tr td.range.today:hover, -fieldset[disabled] .datepicker table tr td.range.today.disabled, -fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, -.datepicker table tr td.range.today.disabled:hover, -.datepicker table tr td.range.today:hover.disabled:hover, -.datepicker table tr td.range.today.disabled.disabled:hover, -.datepicker table tr td.range.today.disabled:hover.disabled:hover, -.datepicker table tr td.range.today[disabled]:hover, -.datepicker table tr td.range.today:hover[disabled]:hover, -.datepicker table tr td.range.today.disabled[disabled]:hover, -.datepicker table tr td.range.today.disabled:hover[disabled]:hover, -fieldset[disabled] .datepicker table tr td.range.today:hover, -fieldset[disabled] .datepicker table tr td.range.today:hover:hover, -fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, -fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover, -.datepicker table tr td.range.today.disabled:focus, -.datepicker table tr td.range.today:hover.disabled:focus, -.datepicker table tr td.range.today.disabled.disabled:focus, -.datepicker table tr td.range.today.disabled:hover.disabled:focus, -.datepicker table tr td.range.today[disabled]:focus, -.datepicker table tr td.range.today:hover[disabled]:focus, -.datepicker table tr td.range.today.disabled[disabled]:focus, -.datepicker table tr td.range.today.disabled:hover[disabled]:focus, -fieldset[disabled] .datepicker table tr td.range.today:focus, -fieldset[disabled] .datepicker table tr td.range.today:hover:focus, -fieldset[disabled] .datepicker table tr td.range.today.disabled:focus, -fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus, -.datepicker table tr td.range.today.disabled:active, -.datepicker table tr td.range.today:hover.disabled:active, -.datepicker table tr td.range.today.disabled.disabled:active, -.datepicker table tr td.range.today.disabled:hover.disabled:active, -.datepicker table tr td.range.today[disabled]:active, -.datepicker table tr td.range.today:hover[disabled]:active, -.datepicker table tr td.range.today.disabled[disabled]:active, -.datepicker table tr td.range.today.disabled:hover[disabled]:active, -fieldset[disabled] .datepicker table tr td.range.today:active, -fieldset[disabled] .datepicker table tr td.range.today:hover:active, -fieldset[disabled] .datepicker table tr td.range.today.disabled:active, -fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active, -.datepicker table tr td.range.today.disabled.active, -.datepicker table tr td.range.today:hover.disabled.active, -.datepicker table tr td.range.today.disabled.disabled.active, -.datepicker table tr td.range.today.disabled:hover.disabled.active, -.datepicker table tr td.range.today[disabled].active, -.datepicker table tr td.range.today:hover[disabled].active, -.datepicker table tr td.range.today.disabled[disabled].active, -.datepicker table tr td.range.today.disabled:hover[disabled].active, -fieldset[disabled] .datepicker table tr td.range.today.active, -fieldset[disabled] .datepicker table tr td.range.today:hover.active, -fieldset[disabled] .datepicker table tr td.range.today.disabled.active, -fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active { - background-color: #f7ca77; - border-color: #f1a417; -} -.datepicker table tr td.selected, -.datepicker table tr td.selected:hover, -.datepicker table tr td.selected.disabled, -.datepicker table tr td.selected.disabled:hover { - color: #ffffff; - background-color: #999999; - border-color: #555555; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.selected:hover, -.datepicker table tr td.selected:hover:hover, -.datepicker table tr td.selected.disabled:hover, -.datepicker table tr td.selected.disabled:hover:hover, -.datepicker table tr td.selected:focus, -.datepicker table tr td.selected:hover:focus, -.datepicker table tr td.selected.disabled:focus, -.datepicker table tr td.selected.disabled:hover:focus, -.datepicker table tr td.selected:active, -.datepicker table tr td.selected:hover:active, -.datepicker table tr td.selected.disabled:active, -.datepicker table tr td.selected.disabled:hover:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected:hover.active, -.datepicker table tr td.selected.disabled.active, -.datepicker table tr td.selected.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.selected, -.open .dropdown-toggle.datepicker table tr td.selected:hover, -.open .dropdown-toggle.datepicker table tr td.selected.disabled, -.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { - color: #ffffff; - background-color: #858585; - border-color: #373737; -} -.datepicker table tr td.selected:active, -.datepicker table tr td.selected:hover:active, -.datepicker table tr td.selected.disabled:active, -.datepicker table tr td.selected.disabled:hover:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected:hover.active, -.datepicker table tr td.selected.disabled.active, -.datepicker table tr td.selected.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.selected, -.open .dropdown-toggle.datepicker table tr td.selected:hover, -.open .dropdown-toggle.datepicker table tr td.selected.disabled, -.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { - background-image: none; -} -.datepicker table tr td.selected.disabled, -.datepicker table tr td.selected:hover.disabled, -.datepicker table tr td.selected.disabled.disabled, -.datepicker table tr td.selected.disabled:hover.disabled, -.datepicker table tr td.selected[disabled], -.datepicker table tr td.selected:hover[disabled], -.datepicker table tr td.selected.disabled[disabled], -.datepicker table tr td.selected.disabled:hover[disabled], -fieldset[disabled] .datepicker table tr td.selected, -fieldset[disabled] .datepicker table tr td.selected:hover, -fieldset[disabled] .datepicker table tr td.selected.disabled, -fieldset[disabled] .datepicker table tr td.selected.disabled:hover, -.datepicker table tr td.selected.disabled:hover, -.datepicker table tr td.selected:hover.disabled:hover, -.datepicker table tr td.selected.disabled.disabled:hover, -.datepicker table tr td.selected.disabled:hover.disabled:hover, -.datepicker table tr td.selected[disabled]:hover, -.datepicker table tr td.selected:hover[disabled]:hover, -.datepicker table tr td.selected.disabled[disabled]:hover, -.datepicker table tr td.selected.disabled:hover[disabled]:hover, -fieldset[disabled] .datepicker table tr td.selected:hover, -fieldset[disabled] .datepicker table tr td.selected:hover:hover, -fieldset[disabled] .datepicker table tr td.selected.disabled:hover, -fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover, -.datepicker table tr td.selected.disabled:focus, -.datepicker table tr td.selected:hover.disabled:focus, -.datepicker table tr td.selected.disabled.disabled:focus, -.datepicker table tr td.selected.disabled:hover.disabled:focus, -.datepicker table tr td.selected[disabled]:focus, -.datepicker table tr td.selected:hover[disabled]:focus, -.datepicker table tr td.selected.disabled[disabled]:focus, -.datepicker table tr td.selected.disabled:hover[disabled]:focus, -fieldset[disabled] .datepicker table tr td.selected:focus, -fieldset[disabled] .datepicker table tr td.selected:hover:focus, -fieldset[disabled] .datepicker table tr td.selected.disabled:focus, -fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus, -.datepicker table tr td.selected.disabled:active, -.datepicker table tr td.selected:hover.disabled:active, -.datepicker table tr td.selected.disabled.disabled:active, -.datepicker table tr td.selected.disabled:hover.disabled:active, -.datepicker table tr td.selected[disabled]:active, -.datepicker table tr td.selected:hover[disabled]:active, -.datepicker table tr td.selected.disabled[disabled]:active, -.datepicker table tr td.selected.disabled:hover[disabled]:active, -fieldset[disabled] .datepicker table tr td.selected:active, -fieldset[disabled] .datepicker table tr td.selected:hover:active, -fieldset[disabled] .datepicker table tr td.selected.disabled:active, -fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active, -.datepicker table tr td.selected.disabled.active, -.datepicker table tr td.selected:hover.disabled.active, -.datepicker table tr td.selected.disabled.disabled.active, -.datepicker table tr td.selected.disabled:hover.disabled.active, -.datepicker table tr td.selected[disabled].active, -.datepicker table tr td.selected:hover[disabled].active, -.datepicker table tr td.selected.disabled[disabled].active, -.datepicker table tr td.selected.disabled:hover[disabled].active, -fieldset[disabled] .datepicker table tr td.selected.active, -fieldset[disabled] .datepicker table tr td.selected:hover.active, -fieldset[disabled] .datepicker table tr td.selected.disabled.active, -fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active { - background-color: #999999; - border-color: #555555; -} -.datepicker table tr td.active, -.datepicker table tr td.active:hover, -.datepicker table tr td.active.disabled, -.datepicker table tr td.active.disabled:hover { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.active:hover, -.datepicker table tr td.active:hover:hover, -.datepicker table tr td.active.disabled:hover, -.datepicker table tr td.active.disabled:hover:hover, -.datepicker table tr td.active:focus, -.datepicker table tr td.active:hover:focus, -.datepicker table tr td.active.disabled:focus, -.datepicker table tr td.active.disabled:hover:focus, -.datepicker table tr td.active:active, -.datepicker table tr td.active:hover:active, -.datepicker table tr td.active.disabled:active, -.datepicker table tr td.active.disabled:hover:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active:hover.active, -.datepicker table tr td.active.disabled.active, -.datepicker table tr td.active.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.active, -.open .dropdown-toggle.datepicker table tr td.active:hover, -.open .dropdown-toggle.datepicker table tr td.active.disabled, -.open .dropdown-toggle.datepicker table tr td.active.disabled:hover { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; -} -.datepicker table tr td.active:active, -.datepicker table tr td.active:hover:active, -.datepicker table tr td.active.disabled:active, -.datepicker table tr td.active.disabled:hover:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active:hover.active, -.datepicker table tr td.active.disabled.active, -.datepicker table tr td.active.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td.active, -.open .dropdown-toggle.datepicker table tr td.active:hover, -.open .dropdown-toggle.datepicker table tr td.active.disabled, -.open .dropdown-toggle.datepicker table tr td.active.disabled:hover { - background-image: none; -} -.datepicker table tr td.active.disabled, -.datepicker table tr td.active:hover.disabled, -.datepicker table tr td.active.disabled.disabled, -.datepicker table tr td.active.disabled:hover.disabled, -.datepicker table tr td.active[disabled], -.datepicker table tr td.active:hover[disabled], -.datepicker table tr td.active.disabled[disabled], -.datepicker table tr td.active.disabled:hover[disabled], -fieldset[disabled] .datepicker table tr td.active, -fieldset[disabled] .datepicker table tr td.active:hover, -fieldset[disabled] .datepicker table tr td.active.disabled, -fieldset[disabled] .datepicker table tr td.active.disabled:hover, -.datepicker table tr td.active.disabled:hover, -.datepicker table tr td.active:hover.disabled:hover, -.datepicker table tr td.active.disabled.disabled:hover, -.datepicker table tr td.active.disabled:hover.disabled:hover, -.datepicker table tr td.active[disabled]:hover, -.datepicker table tr td.active:hover[disabled]:hover, -.datepicker table tr td.active.disabled[disabled]:hover, -.datepicker table tr td.active.disabled:hover[disabled]:hover, -fieldset[disabled] .datepicker table tr td.active:hover, -fieldset[disabled] .datepicker table tr td.active:hover:hover, -fieldset[disabled] .datepicker table tr td.active.disabled:hover, -fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover, -.datepicker table tr td.active.disabled:focus, -.datepicker table tr td.active:hover.disabled:focus, -.datepicker table tr td.active.disabled.disabled:focus, -.datepicker table tr td.active.disabled:hover.disabled:focus, -.datepicker table tr td.active[disabled]:focus, -.datepicker table tr td.active:hover[disabled]:focus, -.datepicker table tr td.active.disabled[disabled]:focus, -.datepicker table tr td.active.disabled:hover[disabled]:focus, -fieldset[disabled] .datepicker table tr td.active:focus, -fieldset[disabled] .datepicker table tr td.active:hover:focus, -fieldset[disabled] .datepicker table tr td.active.disabled:focus, -fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus, -.datepicker table tr td.active.disabled:active, -.datepicker table tr td.active:hover.disabled:active, -.datepicker table tr td.active.disabled.disabled:active, -.datepicker table tr td.active.disabled:hover.disabled:active, -.datepicker table tr td.active[disabled]:active, -.datepicker table tr td.active:hover[disabled]:active, -.datepicker table tr td.active.disabled[disabled]:active, -.datepicker table tr td.active.disabled:hover[disabled]:active, -fieldset[disabled] .datepicker table tr td.active:active, -fieldset[disabled] .datepicker table tr td.active:hover:active, -fieldset[disabled] .datepicker table tr td.active.disabled:active, -fieldset[disabled] .datepicker table tr td.active.disabled:hover:active, -.datepicker table tr td.active.disabled.active, -.datepicker table tr td.active:hover.disabled.active, -.datepicker table tr td.active.disabled.disabled.active, -.datepicker table tr td.active.disabled:hover.disabled.active, -.datepicker table tr td.active[disabled].active, -.datepicker table tr td.active:hover[disabled].active, -.datepicker table tr td.active.disabled[disabled].active, -.datepicker table tr td.active.disabled:hover[disabled].active, -fieldset[disabled] .datepicker table tr td.active.active, -fieldset[disabled] .datepicker table tr td.active:hover.active, -fieldset[disabled] .datepicker table tr td.active.disabled.active, -fieldset[disabled] .datepicker table tr td.active.disabled:hover.active { - background-color: #428bca; - border-color: #357ebd; -} -.datepicker table tr td span { - display: block; - width: 23%; - height: 54px; - line-height: 54px; - float: left; - margin: 1%; - cursor: pointer; - border-radius: 4px; -} -.datepicker table tr td span:hover { - background: #eeeeee; -} -.datepicker table tr td span.disabled, -.datepicker table tr td span.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td span.active, -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active.disabled, -.datepicker table tr td span.active.disabled:hover { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active:hover:hover, -.datepicker table tr td span.active.disabled:hover, -.datepicker table tr td span.active.disabled:hover:hover, -.datepicker table tr td span.active:focus, -.datepicker table tr td span.active:hover:focus, -.datepicker table tr td span.active.disabled:focus, -.datepicker table tr td span.active.disabled:hover:focus, -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td span.active, -.open .dropdown-toggle.datepicker table tr td span.active:hover, -.open .dropdown-toggle.datepicker table tr td span.active.disabled, -.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; -} -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active, -.open .dropdown-toggle.datepicker table tr td span.active, -.open .dropdown-toggle.datepicker table tr td span.active:hover, -.open .dropdown-toggle.datepicker table tr td span.active.disabled, -.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { - background-image: none; -} -.datepicker table tr td span.active.disabled, -.datepicker table tr td span.active:hover.disabled, -.datepicker table tr td span.active.disabled.disabled, -.datepicker table tr td span.active.disabled:hover.disabled, -.datepicker table tr td span.active[disabled], -.datepicker table tr td span.active:hover[disabled], -.datepicker table tr td span.active.disabled[disabled], -.datepicker table tr td span.active.disabled:hover[disabled], -fieldset[disabled] .datepicker table tr td span.active, -fieldset[disabled] .datepicker table tr td span.active:hover, -fieldset[disabled] .datepicker table tr td span.active.disabled, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover, -.datepicker table tr td span.active.disabled:hover, -.datepicker table tr td span.active:hover.disabled:hover, -.datepicker table tr td span.active.disabled.disabled:hover, -.datepicker table tr td span.active.disabled:hover.disabled:hover, -.datepicker table tr td span.active[disabled]:hover, -.datepicker table tr td span.active:hover[disabled]:hover, -.datepicker table tr td span.active.disabled[disabled]:hover, -.datepicker table tr td span.active.disabled:hover[disabled]:hover, -fieldset[disabled] .datepicker table tr td span.active:hover, -fieldset[disabled] .datepicker table tr td span.active:hover:hover, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover, -.datepicker table tr td span.active.disabled:focus, -.datepicker table tr td span.active:hover.disabled:focus, -.datepicker table tr td span.active.disabled.disabled:focus, -.datepicker table tr td span.active.disabled:hover.disabled:focus, -.datepicker table tr td span.active[disabled]:focus, -.datepicker table tr td span.active:hover[disabled]:focus, -.datepicker table tr td span.active.disabled[disabled]:focus, -.datepicker table tr td span.active.disabled:hover[disabled]:focus, -fieldset[disabled] .datepicker table tr td span.active:focus, -fieldset[disabled] .datepicker table tr td span.active:hover:focus, -fieldset[disabled] .datepicker table tr td span.active.disabled:focus, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active:hover.disabled:active, -.datepicker table tr td span.active.disabled.disabled:active, -.datepicker table tr td span.active.disabled:hover.disabled:active, -.datepicker table tr td span.active[disabled]:active, -.datepicker table tr td span.active:hover[disabled]:active, -.datepicker table tr td span.active.disabled[disabled]:active, -.datepicker table tr td span.active.disabled:hover[disabled]:active, -fieldset[disabled] .datepicker table tr td span.active:active, -fieldset[disabled] .datepicker table tr td span.active:hover:active, -fieldset[disabled] .datepicker table tr td span.active.disabled:active, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active:hover.disabled.active, -.datepicker table tr td span.active.disabled.disabled.active, -.datepicker table tr td span.active.disabled:hover.disabled.active, -.datepicker table tr td span.active[disabled].active, -.datepicker table tr td span.active:hover[disabled].active, -.datepicker table tr td span.active.disabled[disabled].active, -.datepicker table tr td span.active.disabled:hover[disabled].active, -fieldset[disabled] .datepicker table tr td span.active.active, -fieldset[disabled] .datepicker table tr td span.active:hover.active, -fieldset[disabled] .datepicker table tr td span.active.disabled.active, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active { - background-color: #428bca; - border-color: #357ebd; -} -.datepicker table tr td span.old, -.datepicker table tr td span.new { - color: #999999; -} -.datepicker .datepicker-switch { - width: 145px; -} -.datepicker thead tr:first-child th, -.datepicker tfoot tr th { - cursor: pointer; -} -.datepicker thead tr:first-child th:hover, -.datepicker tfoot tr th:hover { - background: #eeeeee; -} -.datepicker .cw { - font-size: 10px; - width: 12px; - padding: 0 2px 0 5px; - vertical-align: middle; -} -.datepicker thead tr:first-child .cw { - cursor: default; - background-color: transparent; -} -.input-group.date .input-group-addon { - cursor: pointer; -} -.input-daterange { - width: 100%; -} -.input-daterange input { - text-align: center; -} -.input-daterange input:first-child { - border-radius: 3px 0 0 3px; -} -.input-daterange input:last-child { - border-radius: 0 3px 3px 0; -} -.input-daterange .input-group-addon { - width: auto; - min-width: 16px; - padding: 4px 5px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - text-shadow: 0 1px 0 #fff; - vertical-align: middle; - background-color: #eeeeee; - border: solid #cccccc; - border-width: 1px 0; - margin-left: -5px; - margin-right: -5px; -} diff --git a/awx/ui/client/legacy/styles/codemirror.less b/awx/ui/client/legacy/styles/codemirror.less deleted file mode 100644 index 0a0a1ac47a..0000000000 --- a/awx/ui/client/legacy/styles/codemirror.less +++ /dev/null @@ -1,49 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * Overrides to angular-codemirror - * - * - */ - -.CodeMirror { - height: auto; - overflow-x: auto; - overflow-y: hidden; - border: 1px solid @b7grey; -} - -.CodeMirror, -.CodeMirror-activeline-background { - background-color: @default-secondary-bg; -} - -/* Make sure code editor dialog is always at top of stack */ -[aria-describedby=af-code-editor-modal].ui-front { - z-index: 2050; -} - -.CodeMirror-lint-tooltip { - z-index: 2060; -} - -.CodeMirror-gutters { - border-color: @d7grey; - background-color: @default-no-items-bord; -} - -.CodeMirror-linenumber { - color: @at-gray-70; -} - -// Disabled -textarea[disabled="disabled"] + div[id*="-container"]{ - .CodeMirror-gutters { - border-color: @b7grey; - } - - .CodeMirror-gutter.CodeMirror-lint-markers, - .CodeMirror-gutter.CodeMirror-linenumbers { - background-color: @default-bg; - color: @default-interface-txt; - } -} diff --git a/awx/ui/client/legacy/styles/dashboard.less b/awx/ui/client/legacy/styles/dashboard.less deleted file mode 100644 index 2b1ee7c00e..0000000000 --- a/awx/ui/client/legacy/styles/dashboard.less +++ /dev/null @@ -1,114 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * dashboard.css - * - * custom styles for the new dashboard - * - */ - -.graph-wrapper { - width: 100%; -} - -.graph { - background-color: white; - // @include transition(width 2s ease-in-out, height 2s ease-in-out); - position: relative; - text-align: center; - width: 100%; - height: 100%; - margin: 0 auto; -} - -.job-status-graph, .host-count-graph{ - font: 10px sans-serif; -} - -.axis path, -.axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; -} - -.line { - fill: none; - stroke: steelblue; - stroke-width: 1.5px; -} - - -.dashboard-jobs-list-container { - border: 1px solid @grey; - border-radius: 4px; - padding: 5px; -} - -/* -.graph-container{ - border: 1px solid @grey; - border-radius: 4px; - padding: 5px; - margin-bottom: 15px; -} -due to the login screen showing on top of the dashboard, we're hiding the borders until after the user logs in*/ - -.count-container{ - border: 1px solid @grey; - border-radius: 4px; - margin-left: 0px; - margin-right: 0px; - margin-bottom: 15px; -} - -#replacementImg{ - align:center; - width: 100px; - height: 100px; - -} - -#dashboard-tab-content{ - padding-top: 5px; -} - -#dashboard-tab-content .search-row #active-jobs-search-container{ - height: 35px; -} - - -#dashboard-tab-content table{ - margin-bottom: 10px; -} - -.dashboard-jobs-list-container { - #jobs_table, - #schedules_table { - table-layout:fixed; - } - #jobs_table .name-column, - #schedules_table .name-column { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } -} - -#dash-jobs-list{ - padding-bottom: 15px; -} - - @media (min-width: 769px) { - .left-side { - padding-right: 7px; - } - - .right-side { - padding-left: 7px; - } -} - -.m, .n{ - cursor:pointer; -} diff --git a/awx/ui/client/legacy/styles/event-viewer.less b/awx/ui/client/legacy/styles/event-viewer.less deleted file mode 100644 index ac575b4c03..0000000000 --- a/awx/ui/client/legacy/styles/event-viewer.less +++ /dev/null @@ -1,60 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * event-viewer.less - * - * custom styles for EventViewer.js helper - * - */ - -#eventviewer-modal-dialog { - - textarea { - overflow: scroll; - } - pre { - overflow: scroll; - word-wrap: normal; - word-break: normal; - white-space: pre-wrap; - } -} - -table.eventviewer-status { - margin-top: 20px; - - .key { - width: 20%; - font-weight: bold; - } - .value i { - font-size: 12px; - } -} - -.nested-table { - border: none; - padding: 0; - table { - border-top: none; - border-bottom: none; - width: auto; - td { - vertical-align: top; - padding: 0 3px 3px 3px; - } - tr { - border-top: none; - border-bottom: 1px solid #ddd; - } - /*tr td:first-of-type { - width: auto; - }*/ - tr:last-of-type { - border-bottom: none; - } - .key { - font-weight: 400; - } - } -} \ No newline at end of file diff --git a/awx/ui/client/legacy/styles/fonts.less b/awx/ui/client/legacy/styles/fonts.less deleted file mode 100644 index e75c35f699..0000000000 --- a/awx/ui/client/legacy/styles/fonts.less +++ /dev/null @@ -1,19 +0,0 @@ -.include-font(@family-name; @filename; @weight: normal; @style: normal) { - @font-face { - font-family: @family-name; - src: url("/static/assets/@{filename}.woff2") format('woff2'), - url("/static/assets/@{filename}.woff") format('woff'); - font-weight: @weight; - font-style: @style; - } -} - -.include-font('merriweather'; 'merriweather_light-webfont'; 200); -.include-font('merriweather'; 'merriweather-regular-webfont'); -.include-font('merriweather'; 'merriweather-bold-webfont'; bold); -.include-font('merriweather'; 'merriweather_ultrabold-webfont'; 800); -.include-font('merriweather'; 'merriweather-lightitalic-webfont'; 200; italic); -.include-font('merriweather'; 'merriweather-bolditalic-webfont'; bold; italic); -.include-font('merriweather'; 'merriweather-heavyitalic-webfont'; 800; italic); -.include-font('merriweather'; 'merriweather-italic-webfont'; normal; italic); - diff --git a/awx/ui/client/legacy/styles/forms.less b/awx/ui/client/legacy/styles/forms.less deleted file mode 100644 index ccfc95f412..0000000000 --- a/awx/ui/client/legacy/styles/forms.less +++ /dev/null @@ -1,815 +0,0 @@ -/********************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * Forms.less - * - * custom styles for generated forms - * - */ - -.noselect { - -webkit-touch-callout: none; /* iOS Safari */ - -webkit-user-select: none; /* Chrome/Safari/Opera */ - -khtml-user-select: none; /* Konqueror */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* Internet Explorer/Edge */ - user-select: none; /* Non-prefixed version, currently - not supported by any browser */ -} - -.Form { - display:flex; - flex-wrap:wrap; - flex-direction: row; -} - -.Form-header--fields { - flex: 1 1 auto; -} - -.Form-header-field { - margin-left: 10px; - flex: 1 1 auto; -} - -.Form-header { - display: flex; -} - -.Form-title { - flex: 0 1 auto; - color: @list-header-txt; - font-size: 14px; - font-weight: bold; - word-break: break-all; - max-width: 90%; - word-wrap: break-word; - margin-bottom: 20px; -} - -.Form-title--uppercase { - text-transform: uppercase; -} - -.Form-secondaryTitle { - color: @default-icon; - padding-bottom: 20px; - min-height: 40px; -} - -.Form-title--is_smartinventory, -.Form-title--is_superuser, -.Form-title--is_system_auditor, -.Form-title--is_ldap_user, -.Form-title--is_external_account, -.Form-title--roleType { - background-color: @default-list-header-bg; - border-radius: 5px; - color: @default-interface-txt; - font-size: 10px; - font-weight: 100; - height:15px; - margin-left: 10px; - margin-top: 2.25px; - padding: 0 10px; - text-transform: uppercase; -} - -.Form-title--last_login { - border-radius: 5px; - color: @default-interface-txt; - font-size: 10px; - font-weight: 100; - height:15px; - margin-left: 10px; - margin-top: 2.25px; - padding: 0 10px; - text-transform: uppercase; -} - -.Form-exitHolder { - justify-content: flex-end; - display:flex; -} - -.Form-exit { - cursor:pointer; - padding:0px; - border: none; - height:20px; - font-size: 20px; - background-color:@default-bg; - color:@d7grey; - transition: color 0.2s; - line-height:1; -} - -.Form-exit:hover { - color:@default-icon; -} - -.Form-tabHolder { - display: flex; - min-height: 30px; - flex-wrap:wrap; -} - -.Form-tabHolder--licenseSelected { - margin-bottom: -20px; -} - -.Form-tabs { - flex: 1 0 auto; - display: flex; -} - -.Form-tab { - color: @btn-txt; - background-color: @btn-bg; - font-size: 12px; - border: 1px solid @b7grey; - height: 30px; - border-radius: 5px; - margin-right: 20px; - margin-bottom: 20px; - padding-left: 10px; - padding-right: 10px; - padding-bottom: 5px; - padding-top: 5px; - transition: background-color 0.2s; - text-transform: uppercase; - text-align: center; - white-space: nowrap; - .noselect; -} - -.Form-tab--notitle { - margin-bottom: 0px; -} - -.Form-tab:hover { - color: @btn-txt; - background-color: @btn-bg-hov; - cursor: pointer; -} - -.Form-tab:active { - color: @btn-txt-sel; - background-color: @btn-bg-sel; - cursor: pointer; -} - -.Form-tab:focus { - color: @btn-txt-sel; -} - -.Form-tab.is-selected { - color: @btn-txt-sel; - background-color: @default-icon; - border-color: @default-icon; -} - -.Form-tab--disabled, -.Form-button--disabled { - opacity: 0.65; - color: @btn-txt; -} - -.Form-tab--disabled:hover, -.Form-button--disabled:hover { - color: @btn-txt; - background-color: @btn-bg; - cursor:not-allowed!important; -} - -.Form-tabSection { - display: none; - width: 0%; -} - -.Form-tabSection.is-selected { - width: 100%; - display: block; -} - -.Form-tabActions { - display: flex; -} - -.Form-formGroup { - flex: 1 0 auto; - margin-bottom: 20px; - width: 33%; - max-width: 33%; - padding-right: 30px; -} - -.Form-formGroup--fullWidth { - max-width: none !important; - width: 100% !important; - padding-right: 0px !important; - margin-top: 10px; -} - -.Form-formGroup--checkbox{ - display: flex; - margin-top: 10px; -} - -.Form-formGroup { - input.form-control { - background-color: @fcgrey; - border-color: @b7grey; - border-radius: 5px; - height: auto; - min-height: 30px; - padding: 0 10px; - } - - input.form-control[disabled], input.form-control[readonly], fieldset[disabled] input.form-control { - border-color: @b7grey; - background-color: @ebgrey; - } -} - -.Form-checkbox--subCheckbox { - font-size: 10px; - color: @default-stdout-txt; - text-transform: uppercase; - margin-top: 2px; - - input { - margin-top: 2px; - } -} - -.Form-textUneditable { - .Form-textInput { - border: none; - padding: 0; - } -} - -.Form-subForm { - width: 100%; - margin-bottom: 15px; - display: flex; - flex-wrap: wrap; - flex-direction: row; - justify-content: flex-start; - position: relative; -} - -.Form-subForm:before { - content: ''; - left: -20px; - position: absolute; - width: 5px; - background-color: @b7grey; - height: 100%; -} - -.Form-subForm--title { - font-weight: bold; - text-transform: uppercase; - color: @default-interface-txt; - font-size: small; - width: 100%; - float: left; - margin-bottom: 10px; -} - -.Form-textAreaLabel { - width:100%; - order: 1; -} - -.Form-formGroup.Form-textAreaLabel { - max-width: 100%; -} - -.Form-textArea { - border-radius: 5px; - color: @field-input-text; - background-color: @field-secondary-bg; - width:100%!important; -} - -.Form-textInput { - height: 30px; - background-color: @field-secondary-bg; - border-radius: 5px; - border:1px solid @field-border; - color: @field-input-text; -} - -.Form-textInput:active { - border:1px solid @field-border-sel; -} - -.Form-monospace { - font-family: Menlo,Monaco,Consolas,"Courier New",monospace!important; -} - -.Form-alertblock { - margin: 0; - font-size: 12px; - width: 100%; - padding: 20px; - margin-bottom: 15px; - border-radius: 4px; - border: 1px solid @login-notice-border; - background-color: @login-notice-bg; - color: @login-notice-text; -} - -.Button-primary--hollow { - border: 1px solid @default-link; - color: @default-link; - background: @default-bg; -} -.Button-primary--hollow:hover { - color: @default-link-hov; - border: 1px solid @default-link-hov; -} - -.ui-spinner { - height: 30px; - background-color: @fcgrey !important; - border-radius: 5px; - border:1px solid @field-border !important; - color: @field-input-text; - width:100% -} - -.ui-spinner-input { - color: @field-input-text; - background-color: @fcgrey; -} - -.ui-spinner-input:focus { - outline: none; -} - -.ui-spinner-button { - border-left:1px solid @field-border!important; - background-color: @field-button-bg !important; -} - -.ui-spinner-button:hover { - background-color:@field-button-hov !important; - cursor: pointer!important; -} - -.Form-inputButton { - border-color: @d7grey; - color: @default-data-txt; -} - -.Form-numberInputButton { - color: @default-icon!important; - font-size: 14px; - display: block; -} - -.Form-dropDown { - min-height: 30px !important; - border-radius: 5px !important; - border:1px solid @field-border!important; - color: @field-input-text!important; -} - -.select2-selection__arrow { - border-left:1px solid @field-border; - border-bottom-right-radius: 5px; - border-top-right-radius: 5px; - width: 30px!important; - height: 28px!important; -} - -.select2-container--disabled .select2-selection__arrow { - background-color: @ebgrey !important; -} - -.select2-results__option { - color: @field-label !important; - min-height: 33px; -} - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: @field-button-hov !important; -} - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: @default-white-button-bord !important; -} - -.select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: @field-dropdown-icon transparent transparent transparent !important; -} - -.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent @field-dropdown-icon transparent!important; -} - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--single { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -.select2-dropdown { - border:1px solid @field-border; - z-index: 1030; -} - -.select2-container--open .select2-dropdown--below { - margin-top: -1px; - border-top: 1px solid @field-border; -} - -.Form-dropDown:focus { - outline: none!important; -} - -.Form-dropDown--scmType { - width: 100%; -} - -.Form-browseButton, .Form-passwordButton { - height: 30px; - color: @default-interface-txt; - text-transform: uppercase; - line-height: 1.2; - padding: 6px 12px; - background-color: @default-bg; - border:1px solid @b7grey; -} - -.Form-passwordButton:hover { - cursor: pointer; - background-color: @f2grey; - border: 1px solid @b7grey; - color: @field-lookup-btn-icon; -} - -.Form-passwordButton:focus { - border: 1px solid @field-border; - background-color: @field-lookup-btn-hov-bg; -} - -.Form-passwordButton:active { - border: 1px solid @field-border; - background-color: @field-lookup-btn-hov-bg; -} - -.Form-lookupButton { - height: auto; - width: 30px; - color: @field-lookup-btn-icon!important; - font-size: 16px; - background-color: @field-lookup-btn-bg; - display: flex; - align-items: center; - justify-content: center; - border:1px solid @field-border; -} - -.Form-lookupButton:hover { - cursor: pointer; - background-color: @field-lookup-btn-hov-bg; - color: @default-interface-txt; -} - -.Form-lookupButton:active, -.Form-lookupButton:focus { - border: 1px solid @field-border; -} - -.CodeMirror { - min-height: initial !important; - max-height: initial !important; - border-radius: 5px; - font-style: normal; - color: @field-input-text; -} - -.CodeMirror-gutters { - background-color:@code-mirror-gutter !important; -} - -input[type='radio'] { - -webkit-appearance:none; - width:14px; - height:14px; - border:1px solid @radio-bg; - border-radius:50%; - outline:none; - vertical-align: sub; -} - -input[type='radio']:focus { - outline:none; -} - -input[type='radio']:hover { - box-shadow:0 0 5px 0px @btn-bg-hov inset; -} - -input[type='radio']:before { - content:''; - display:block; - width:65%; - height:60%; - margin: 20% auto; - border-radius:50%; -} - -input[type='radio']:checked:before { - background:@radio-bg; - outline:none; -} - -.Form-inputLabelContainer { - width: 100%; - display: block !important; -} - -.Form-inputLabelContainer[for=variables], -.Form-inputLabelContainer--codeMirror { - width: auto; - display: inline-block !important; -} - -.Form-mixedInputGroup { - display: flex; - width: 100%; - - .form-control { - flex-flow: row wrap; - padding: 0 12px !important; - } - - .input-group-btn { - display: flex; - width: auto; - } -} - -.FormToggle-container { - margin: 0 0 0 10px; - display: initial; - padding-bottom: 5px; - - label { - &:first-child { - border-right: none; - } - &:last-child { - border-left: none; - } - } - - input { - visibility: hidden; - position: absolute; - } - - .btn.btn-xs { - padding: 0px 10px; - } -} - -.Form-inputLabelContainer { - width: 100%; - display: block !important; -} - -.Form-inputLabelContainer[for=variables] { - width: 100%; - display: inline-block !important; -} - -.Form-inputLabel { - text-transform: uppercase; - color: @default-interface-txt; - font-weight: normal; - font-size: small; - width: 100%; - .noselect; -} - -.Form-labelAction { - text-transform: uppercase; - font-weight: normal; - font-size: 0.8em; - padding-left:5px; - float: right; - margin-top: 3px; - .noselect; -} - -.Form-buttons { - height: 30px; - display: flex; - justify-content: flex-end; - - button { - margin-left: 20px; - } - - .at-Tab { - margin-left: 0px; - } -} - -.Form-button { - margin-left: 4px; -} - -.Form-buttonDefault { - background-color: @default-bg; - color: @default-interface-txt; - border-color: @default-border; -} - -.Form-saveButton, .Form-launchButton { - background-color: @submit-button-bg; - color: @submit-button-text; - text-transform: uppercase; - transition: background-color 0.2s; - padding-left:15px; - padding-right: 15px; -} - -.Form-saveButton:disabled, .Form-launchButton:disabled { - background-color: @submit-button-bg-dis; -} - -.Form-saveButton--disabled { - background-color: @submit-button-bg-dis; - cursor: not-allowed; -} - -.Form-saveButton:hover, .Form-launchButton:hover { - background-color: @submit-button-bg-hov; - color: @submit-button-text; -} - -.Form-saveButton--disabled:hover { - background-color: @submit-button-bg-dis; -} - -.Form-cancelButton { - background-color: @default-bg; - color: @btn-txt; - text-transform: uppercase; - border-radius: 5px; - border: 1px solid @field-border; - transition: background-color 0.2s; - padding-left:15px; - padding-right: 15px; -} - -.Form-cancelButton:hover { - background-color: @btn-bg-hov; - color: @btn-txt; -} - -.Form-primaryButton { - background-color: @default-link; - color: @default-bg; - text-transform: uppercase; - padding-left:15px; - padding-right: 15px; - margin-right: 20px; - min-height: 30px; - margin-bottom: 20px; -} - -.Form-buttons .Form-primaryButton { - margin-right: 0; -} - -.Form-primaryButton:hover { - background-color: @default-link-hov; - color: @default-bg; -} - -.Form-primaryButton.Form-tab--disabled:hover, -.Form-primaryButton.Form-button--disabled:hover { - background-color: @default-link; -} - -.Form-primaryButton--noMargin { - margin-right: 0px; -} - -.Form-formGroup--singleColumn { - width: 100% !important; - padding-right: 0px; - max-width: 100% !important; -} - -.Form-checkbox { - float: right; -} - -.Form-subCheckbox { - margin-top: 5px; - font-size: small; - color: @default-interface-txt; - .noselect; -} - -.Form-textInput--variableHeight { - height: inherit; - min-height: 30px; - max-height: 120px; - overflow-y: auto; -} - -.Form-variableHeightButtonGroup { - display: flex; - height: auto; - width: 30px; -} - -.Form-requiredAsterisk { - color: @red; -} - -@media only screen and (max-width: 650px) { - .Form-formGroup { - flex: 1 0 auto; - margin-bottom: 25px; - max-width: 100%; - width: 100%; - padding-right: 50px; - } -} - -@media (min-width: 651px) and (max-width: 900px) { - .Form-formGroup { - flex: 1 0 auto; - margin-bottom: 25px; - max-width: 50%; - width: 50%; - padding-right: 50px; - } -} - -.action_column { - float: right; -} - -.alert-info { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100px; - border-radius: 5px; - border: 1px solid @default-no-items-bord; - background-color: @default-no-items-bord; - color: @default-icon; - text-transform: uppercase; -} - -.alert-info--noTextTransform { - text-transform: none; -} - -.select2-results__option { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.select2-results__option:hover { - overflow-wrap: break-word; - white-space: normal; -} - -::-webkit-input-placeholder { /* Chrome/Opera/Safari */ - color: @b7grey; -} -::-moz-placeholder { /* Firefox 19+ */ - color: @b7grey; -} -:-ms-input-placeholder { /* IE 10+ */ - color: @b7grey; -} -:-moz-placeholder { /* Firefox 18- */ - color: @b7grey; -} - -.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { - border-color: @b7grey; - background-color: @ebgrey; -} - -.Form-checkbox { - label { - font-weight: 400; - } -} diff --git a/awx/ui/client/legacy/styles/inventory-edit.less b/awx/ui/client/legacy/styles/inventory-edit.less deleted file mode 100644 index b608f854c3..0000000000 --- a/awx/ui/client/legacy/styles/inventory-edit.less +++ /dev/null @@ -1,66 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * inventory-edit.less - * - * custom animation mixins for ansible-ui - * - */ -#inventory_edit { - #breadcrumbs .nav-path { - margin-bottom: 8px; - } - #hosts_table .actions{ - float: right; - } - #groups_table .actions{ - float:right; - } -} - -#group-copy-dialog, -#host-copy-dialog { - .highlight { - font-size: 16px; - font-weight: bold; - color: red; - padding-right: 5px; - } - .title { - font-weight: bold; - margin-bottom: 15px; - } - .well { - padding-left: 8px; - padding-right: 8px; - padding-top: 8px; - padding-bottom: 8px; - } - .page-row ul li a { - font-size: 12px; - } - .page-row .col-lg-8 { - width: 100%; - } - .page-row .col-md-8 { - width: 100%; - } -} - -#copy-group-radio-container .form-group { - margin-left: 20px; - margin-bottom: 10px; -} - -#copy-group-target-container .form-group { - margin-top: 10px; - margin-left: 20px; - margin-bottom: 15px; -} - -#group-list-container, -#hosts-container { - .page-row { - margin-top: 5px; - } -} diff --git a/awx/ui/client/legacy/styles/job-details.less b/awx/ui/client/legacy/styles/job-details.less deleted file mode 100644 index 5d79971bfc..0000000000 --- a/awx/ui/client/legacy/styles/job-details.less +++ /dev/null @@ -1,567 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * job-details.less - * - * Styles for job details page - * - */ - - -@failed-hosts-color: @red; -@successful-hosts-color: @green; -@changed-hosts-color: @changed; -@skipped-hosts-color: @skipped; -@unreachable-hosts-color: @unreachable; - - -#host-events-modal-dialog { - overflow: hidden; - i[class*='icon-job'] { - font-size: 12px; - vertical-align: middle; - } - #search-form { - margin-left: 7px; - } - #host-events-search-name { - width: 200px; - padding-right: 15px; - } - #search-all-input-icons { - position: absolute; - right: 3px; - top: 3px; - a { - color: #a9a9a9; - } - a:hover { - color: @black; - } - } - #status-field { - margin-left: 15px; - } - #host-events-table { - margin-top: 15px; - } - #host-events { - height: 200px; - overflow: scroll; - tr:first-of-type { - border-top-color: @white; - td { - border-top-color: @white; - } - } - } - #fixed-table-header { - margin-bottom: 0; - } - #search-indicator { - margin-left: 15px; - } -} - -@media (max-width: 768px) { - #host-events-modal-dialog { - #search-form-input-icons { - position: absolute; - top: 30px; - left: 185px; - } - #status-field { - margin-left: 0; - } - .form-group { - margin-bottom: 15px; - } - } -} - -#jobs-detail { - - #play-help { - width: 1px; - height: 1px; - color: #fff; - } - - .job_summary { - .table { - margin-bottom: 0; - border: 1px solid @grey; - background-color: @white; - } - .table>tbody>tr>td { - border-top-color: @grey; - padding-bottom: 0; - } - .table>thead>tr>th { - border-bottom-color: @grey; - padding-bottom: 0; - height: 22px; - } - } - - .status-bar { - height: 16px; - overflow: hidden; - border-radius: 4px; - border: 1px solid @grey; - margin-top: 2px; - } - - .inner-bar { - display: inline-block; - overflow: hidden; - height: 16px; - text-align: center; - font-size: 12px; - font-weight: bold; - line-height: normal; - } - - .scroll-spinner { - display: none; - background-color: transparent; - color:#000; - float:right; - margin-right: 5px; - } - - #hostResultsMoreRows.scroll-spinner { - padding-top: 0; - position: relative; - top: 12px; - } - - #hostSummariesMoreRows.scroll-spinner { - margin-right: 0; - } - - .failed-hosts { - background-color: @failed-hosts-color; - } - .failed-hosts-color { - color: @failed-hosts-color; - } - .successful-hosts { - background-color: @successful-hosts-color; - } - .successful-hosts-color { - color: @successful-hosts-color; - } - .changed-hosts { - background-color: @changed-hosts-color; - } - .changed-hosts-color { - color: @changed-hosts-color; - } - .skipped-hosts, .no-matching-hosts { - background-color: @skipped-hosts-color; - } - .unreachable-hosts { - background-color: @unreachable-hosts-color; - } - .unreachable-hosts-color { - color: @unreachable-hosts-color; - } - - .job_well { - padding: 8px; - background-color: @white; - border: 1px solid @grey; - border-radius: 4px; - /*-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);*/ - } - - #hide-summary-button { - text-align: right; - margin-bottom: 15px; - } - - .section { - margin-bottom: 20px; - h5 { - margin-top: 0; - margin-bottom: 12px; - font-weight: bold; - } - } - - .section:last-child { - margin-bottom: 0; - } - - - #job_options { - height: 100px; - overflow-y: auto; - overflow-x: none; - } - - #job_plays, #job_tasks { - overflow-y: auto; - overflow-x: none; - } - - #breadcrumb-container { - padding-right: 15px; - .nav-path { - margin-bottom: 15px; - } - } - - #job-detail-container { - - .well { - overflow: hidden; - } - - #job-status-form { - label { - font-weight: bold; - } - .control-label { - padding-top: 0; - padding-right: 0; - text-align: left; - } - .form-group { - margin-bottom: 15px; - } - hr { - margin-top: 0; - } - .more-or-less { - font-size: 12px; - text-align: left; - margin-bottom: 15px; - } - #started-time, - #finished-time, - #elapsed-time { - display: inline-block; - } - #finished-time, - #elapsed-time { - padding-left: 15px; - } - } - - } - - #job-summary-container { - position: absolute; - top: 0; - right: 0; - padding-right: 15px; - padding-left: 7px; - width: 41.66666667%; - } - - .table-header { - font-weight: bold; - font-size: 12px; - .table>thead>tr>th { - border-bottom-color: @white; - } - .table { - margin-bottom: 0; - } - } - - .table-detail { - overflow-x: hidden; - overflow-y: auto; - background-color: @white; - min-height: 40px; - - .row { - border-top: 1px solid @grey; - } - .row:first-child { - border: none; - } - .loading-info { - padding-top: 5px; - padding-left: 3px; - } - .table { - margin-bottom: 0; - } - .table-condensed > tbody > tr > td { - padding-top: 0; - padding-bottom: 0; - } - } - - .status-column i { - font-size: 12px; - } - - #plays-table-header table, - #plays-table-detail table, - #tasks-table-detail table, - #tasks-table-header table, - #tasks-table-detail table { - table-layout:fixed; - } - - #plays-table-detail td, - #plays-table-header td, - #tasks-table-detail td, - #tasks-table-header td { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - #play-section { - .table-detail { - min-height: 40px; - } - } - - .title { - font-size: 14px; - font-weight: 600; - } - - .header { - width: 100%; - height: 28px; - padding-bottom: 5px; - - - .search-field { - display: inline-block; - position: relative; - float: right; - input { - width: 250px; - padding-right: 20px; - } - a { - position: absolute; - right: 3px; - top: 3px; - color: #a9a9a9; - } - a:hover { - color: @black; - } - } - } - - #summary-search-section { - .remove-left-padding { - padding-left: 0; - } - label { - text-align: left; - font-weight: normal; - padding-left: 0; - padding-right: 0; - padding-top: 6px; - } - #search_all_hosts_name { - width: 100%; - padding-left: 3px; - padding-right: 20px; - } - } - - #event-help-link { - margin-left: 3px; - font-size: 14px; - } - - .title-row { - margin-bottom: 15px; - margin-top: 20px; - } - - .search-form { - font-size: 12px; - .form-control { - font-size: 12px; - } - .form-group:nth-of-type(2) { - margin-left: 10px; - } - } - - .search-name { - .input-xs { - height: 25px; - } - } - - #search-all-input-icons { - position: absolute; - right: 3px; - top: 3px; - a { - color: #a9a9a9; - } - a:hover { - color: @black; - } - } - - label.small-label { - font-size: 12px; - } - - #task-hosts-section { - position: relative; - top: 0; - left: 0; - #hosts-table-header table { - table-layout: fixed; - } - #hosts-table-detail { - background-color: @white; - } - #hosts-table-detail table { - table-layout: fixed; - } - #hosts-table-detail td { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } - - #hosts-summary-section { - .col-lg-4, .col-md-4, .col-sm-4, .col-xs-4 { - width: 33%; - } - .col-lg-2, .col-md-2, .col-sm-2, .col-xs-2 { - width: 16.5%; - } - .table-header { - font-size: 12px; - } - .table-detail { - height: 200px; - } - .name { - word-break: break-all; - } - .badge { - font-size: 12px; - } - .badge-column a { - width: 20%; - } - } - - // .legend-row { - // margin-bottom: 15px; - // } - - // .legend { - // display: inline-block; - // font-size: 12px; - // text-align: center; - // i { - // font-size: 10px; - // margin-left: 5px; - // } - // i:first-child { - // margin-left: 0; - // } - // } - - #graph-section { - position: relative; - .legend { - font-size: 12px; - font-family: 'Open Sans'; - } - rect { - stroke-width: 2; - } - .donut-tooltip { - display: none; - font-size: 12px; - font-family: 'Open Sans'; - left: 280px; - padding: 10px; - position: absolute; - text-align: center; - top: 85px; - width: 100px; - z-index: 10; - color: white; - background-color: black !important; - border-radius:4px; - border: 1px solid black; - } - } - - #graph-section svg{ - margin: 0 auto; - } - - path.slice{ - stroke-width:2px; - } - - polyline{ - opacity: .3; - stroke: black; - stroke-width: 2px; - fill: none; - } - - svg text.percent{ - fill:@black; - text-anchor:middle; - font-size:12px; - font-weight: bold; - } - - #pre-formatted-variables { - border-radius: 4px; - border: 1px solid @grey; - overflow: auto; - white-space: pre; - word-break: break-all; - word-wrap: break-word; - padding: 9.5px; - font-family: Fixed, monospace; - max-height: 200px; - } - - .footer-row { - height: 20px; - } - - .host_summary_row { - margin-top: 15px; - margin-bottom: -15px; - margin-left: 0; - } - - @media (max-width: 767px) { - #job-detail-container { - #job-status-form { - #finished-time, - #elapsed-time { - display: block; - } - #finished-time, - #elapsed-time { - padding-left: 0; - margin-left: 0; - padding-top: 15px; - } - } - } - } -} diff --git a/awx/ui/client/legacy/styles/jobs.less b/awx/ui/client/legacy/styles/jobs.less deleted file mode 100644 index 887a979d5a..0000000000 --- a/awx/ui/client/legacy/styles/jobs.less +++ /dev/null @@ -1,99 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * jobs.less - * - * custom styles for the jobs pages - * - */ - -#jobs-page { - - .jobs-list-container { - border: 1px solid @grey; - border-radius: 4px; - padding: 5px; - } - - .job-list { - - i[class*="icon-job-"] { - font-size: 13px; - } - } - - #completed_jobs_table i[class*="icon-job-"] { - font-size: 13px; - } - - #completed_jobs_table, - #schedules_table, - #running_jobs_table, - #queued_jobs_table { - table-layout:fixed; - } - #completed_jobs_table .name-column, - #schedules_table .name-column, - #running_jobs_table .name-column, - #queued_jobs_table .name-column, - { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - .title { - font-weight: bold; - margin-top: 5px; - margin-left: 3px; - } - - #breadcrumbs .nav-path { - background-color: @white; - } - - #breadcrumb-list.breadcrumb { - background-color: @white; - } - - .List-noItems { - margin-top: 0; - } - -} - -@media (min-width: 1201px) { - #jobs-page { - .left-side { - padding-right: 7px; - } - - .right-side { - padding-left: 7px; - } - - .bottom-row { - margin-top: 15px; - } - } -} - -@media (max-width: 1200px) { - #jobs-page .jobs-list-container { - margin-top: 15px; - } - #jobs .jobs-list-container.completed { - margin-top: 0; - } - .title{ - margin-bottom: 8px; - } - #jobs-page { - .left-side { - padding-right: 15px; - } - .right-side { - padding-left: 15px; - } - } -} diff --git a/awx/ui/client/legacy/styles/jquery-ui-overrides.less b/awx/ui/client/legacy/styles/jquery-ui-overrides.less deleted file mode 100644 index 8656b3693f..0000000000 --- a/awx/ui/client/legacy/styles/jquery-ui-overrides.less +++ /dev/null @@ -1,227 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * jquery-ui-overrides.less - * - * Additions to the custom-theme to make things - * look closer to Twitter Bootstrap - * - */ -table.ui-datepicker-calendar { - background-color: @well; -} - -/* Modal dialog */ -.ui-dialog-title { - font-size: 15px; - color: @default-interface-txt; - font-weight: bold; - line-height: normal; - font-family: 'Open Sans', helvetica; - text-transform: uppercase; -} -.ui-dialog { - .close { - font-size: 18px; - font-weight: bold; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - line-height: 1; - opacity: 1; - text-shadow: 0 1px 0 @white; - color:@d7grey; - } - .close:hover{ - color:@default-icon; - } - .ui-widget { - font-family: 'Open Sans', sans-serif; - } - .ui-widget-header { - border-radius: 0; - border: none; - } - .ui-dialog-titlebar { - padding-bottom: 0; - padding-top: 12px; - - button.close i { - font-size: 24px; - } - } - .ui-dialog-titlebar .ui-state-default { - background-image: none; - background-color: @white; - border-color: @white; - color: #A9A9A9; - } - .mono-space { - font-family: Fixed, monospace; - } - textarea.resizable { - resize: vertical; - } - .ui-resizable-se { - right: 5px; - bottom: 5px; - background-position: -80px -224px; - color: @black; - } - - button.btn.btn-primary, - button.btn.btn-default { - padding: 5px 15px; - font-size: 12px; - line-height: 1.5; - transition: background-color 0.2s; - font-size: 12px; - } - - button.btn.btn-primary { - text-transform: uppercase; - background-color: @default-succ; - border-color: @default-succ; - - &:hover { - background-color: @default-succ-hov; - border-color: @default-succ-hov; - } - - &:disabled { - background-color: @default-succ-disabled; - border-color: @default-succ-disabled; - } - } - - button.btn.btn-default { - text-transform: uppercase; - border-color: @b7grey; - color: @default-interface-txt; - } - - .ui-dialog-buttonpane.ui-widget-content { - border: none; - margin: 0; - padding-top: 0; - padding-right: 8px; - } - - .input-group-btn.dropdown, .List-pagination, .List-tableHeader { - font-family: 'Open Sans', sans-serif; - } - -} -.ui-dialog-buttonpane > .ui-dialog-buttonset { - button { - margin-left: 20px; - } -} - -.ui-dialog-buttonset { - text-transform: uppercase; - - button.btn.btn-default.ui-state-hover, - button.btn.btn-default.ui-state-active, - button.btn.btn-default.ui-state-focus { - font-weight: normal; - } - button.btn.btn-primary.ui-state-hover, - button.btn.btn-primary.ui-state-active, - button.btn.btn-primary.ui-state-focus { - background-image: none; - color: @white; - background-color: @blue-dark; - border-color: #285e8e; - text-decoration: none; - font-weight: normal; - } - max-height: 48px; -} - -.ui-widget-overlay.ui-front { - background-image: none; - background-color: #000; - opacity: .6; -} - -.ui-dialog-content.ui-widget-content { - padding-top: 20px; -} - -.ui-widget-content { - background-image: none; - background-color: @default-bg; - - a, - a:visited, - a:active { - color: @blue-link; - text-decoration: none; - } - - a:hover, - a:focus { - color: @blue-dark; - text-decoration: none; - } - - .red-txt, - a.red-txt:visited, - a.red-txt:hover, - a.red-txt:active { - color: @red; - } - - .dropdown-menu>li>a { - color: @default-interface-txt; - } - - .pagination .active { - a, a:visited, a:active { - color: @white; - } - } -} - -.ui-state-default { - background-image: none; - background-color: @white; - border: 1px solid @grey; -} - -.ui-accordion-header-active { - background-color: #E8E8E8; -} - -/*.ui-state-active { - background-image: none; - background-color: #f5f5f5; -}*/ - -.ui-widget-content { - border: 1px solid @grey; -} - -.ui-spinner a.ui-spinner-button { - border-left: 1px solid #A6C9E2; -} - -.ui-front { - z-index: 1100; -} - -.ui-accordion .ui-accordion-header { - margin-top: 1px; -} - -.ui-spinner.ui-state-disabled, -.ui-state-disabled .ui-spinner-button { - cursor: not-allowed !important; -} - -.ui-state-disabled .ui-spinner-button:hover { - background-color: @default-bg !important; -} - -.ui-state-disabled.ui-widget-content { - background-color: @ebgrey !important; -} diff --git a/awx/ui/client/legacy/styles/lists.less b/awx/ui/client/legacy/styles/lists.less deleted file mode 100644 index 6a4922fd2b..0000000000 --- a/awx/ui/client/legacy/styles/lists.less +++ /dev/null @@ -1,644 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * lists.less - * - * custom styles for generated lists - * - */ - -table, tbody { - border-collapse: collapse; -} - -.List-well { - margin-top: 20px; -} - -.List-table{ - width: 100%; - margin-top: 20px; - table-layout: fixed; -} - -.List-tableHeader{ - height: 34px; - font-size: 14px; - font-weight: normal; - text-transform: uppercase; - color: @list-header-txt; - padding-left: 15px; - padding-right: 15px; - border-bottom-width:0px!important; - align-items: center; - display: flex; -} - -.List-tableHeader--info, .List-tableHeader--actions { - justify-content: flex-end; -} - -.List-tableHeader:not([ng-click]) { - cursor: default !important; -} - -.List-tableHeaderSort { - color: @list-header-icon; -} - -.List-tableRow { - min-height: 44px; - font-size: 14px; - color: @list-item; - border-bottom: 1px solid @default-border; -} - -.List-tableRow:last-of-type { - border-bottom: none; -} - -.List-tableRow:hover { - background-color: @f2grey; -} - -.List-tableRow--selected { - background-color: @list-row-select-bord; -} - -.List-tableRow--disabled { - .List-tableCell, .List-tableCell * { - color: @b7grey; - cursor: not-allowed; - } -} - -.List-tableRow--disabled { - .List-actionButton:hover { - color: @list-action-icon; - background-color: @list-actn-bg !important; - } -} - -.List-tableRow--disabled { - .List-actionButtonCell * { - color: @default-err; - font-size: 11px; - text-transform: uppercase; - } -} - -.List-tableRow--invalid { - height: 40px; -} - -.List-tableRow--invalidBar { - align-items: center; - border-left: solid @at-space-2x @at-color-error; - color: @at-white; - display: flex; - height: 100%; - justify-content: center; - position: relative; - - i { - position: absolute; - left: -7px; - } -} - -.List-tableCell { - padding: 7px 15px; - border-top:0px!important; - word-break: break-word; - display: flex; - align-items: center; - height: 100%; -} - -.List-tableCell.description-column { - padding-top: 15px; - padding-bottom: 15px; -} - -.List-actionButtonCell { - padding-top:5px; - padding-right: 0px; - display:flex; - justify-content: flex-end; -} - -.List-actionButton { - font-size: 16px; - height: 30px; - min-width: 30px; - color: @list-action-icon; - background-color: @list-actn-bg; - border: none; - border-radius: 4px; - margin-left: 15px; -} - -.List-actionButton:hover { - background-color: @list-actn-bg-hov !important; - color: @list-actn-icn-hov; -} - -.List-actionButton + .btn-disabled { - &:hover { - color: @default-icon-hov; - background-color: @list-actn-bg !important; - } - color: @default-icon-hov; -} - -.List-actionButton--delete:hover { - background-color: @list-actn-del-bg-hov !important; -} - -.List-header { - display: flex; -} - -.List-title { - align-items: center; - flex: 1 0 auto; - display: flex; -} - -.List-titleBadge { - font-size: 11px; - font-weight: normal; - padding: 2px 10px; - height: 14px; - line-height: 10px; - margin: 0; - background-color: @list-title-badge; - border-radius: 5px; - color: @at-white; -} - -.List-titleBadge--selected { - background-color: @default-link; -} - -.List-titleText { - color: @list-title-txt; - font-size: 14px; - font-weight: bold; - margin-right: 10px; - line-height: 0.8; - text-transform: uppercase; -} - -.List-exitHolder { - justify-content: flex-end; - display:flex; -} - -.List-exit { - cursor:pointer; - padding:0px; - border: none; - height:20px; - font-size: 20px; - background-color:@default-bg; - color:@d7grey; - transition: color 0.2s; - line-height:1; -} - -.List-exit:hover{ - color:@default-icon; -} - -.List-actionHolder { - justify-content: flex-end; - display: flex; - // margin-bottom: 20px; - // float: right; -} - -@media screen and (max-width: 1200px) { - .List-actionHolder--rootGroups { - justify-content: flex-start; - margin-bottom: 55px; - } -} - -.List-actionHolder--leftAlign { - margin-left: 50%; - justify-content: flex-start; - button { - height: 34px; - } -} - -.List-actions { - align-items: center; - display: flex; - margin-bottom: -34px; - - .List-buttonDefault { - margin-left: 20px; - } - - .List-toggleButton { - height: 30px; - line-height: 14px; - } -} - -.List-auxAction { - align-items: center; - display: flex; - order: 1; - margin-left: 20px; -} - -.List-auxActionStream { - width: 200px; -} - -.List-buttonSubmit { - background-color: @submit-button-bg; - color: @submit-button-text; -} - -.List-buttonSubmit:hover, -.List-buttonSubmit:focus { - color: @submit-button-text; - background-color: @submit-button-bg-hov; -} - -.List-buttonDefault { - background-color: @btn-bg; - color: @btn-txt; - border-color: @b7grey; - height: 30px; - line-height: 14px; -} - -.List-buttonDefault:hover, -.List-buttonDefault:focus { - background-color: @btn-bg-hov; - color: @btn-txt; -} - -.List-buttonDefault[disabled] { - opacity: 0.65; -} - -.List-actionButton { - margin-left: 20px; -} - -.List-searchDropdown { - border-top-left-radius: 5px!important; - border-bottom-left-radius: 5px!important; - height: 34px!important; - border-color: @d7grey; - color: @default-icon; - background-color: @default-bg; - border-right: none; -} - -.List-searchDropdown:focus, -.List-searchDropdown:active, -.List-searchDropdown.active -{ - color: @default-icon; - background-color: @default-tertiary-bg; -} - -.List-searchDropdown:hover { - background-color: @default-tertiary-bg; - color: @default-icon; -} - -.List-searchDropdownCarat { - border-top-color: @default-icon!important; -} - -.List-searchInput { - background-color: @list-srch-inpt-bg!important; - font-size: 14px!important; - color: @list-srch-inpt-txt!important; - border-color: @list-srch-inpt-bord!important; - border-radius: 0px 5px 5px 0px!important; - padding-left: 15px!important; - height: 34px!important; - padding-right: 45px!important; - font-family: 'Open Sans', sans-serif; -} - -.List-searchInput:placeholder-shown { - color: @list-srch-inpt-ph-txt!important; - text-transform: uppercase; -} - -.List-searchInput:focus { - border-color: @list-srch-inpt-focus!important; -} - -.List-searchInputIcon { - height: 32px; - width: 32px; - border-left: 1px solid @list-srch-inpt-bord; - color: @list-srch-btn-icon!important; - float: right; - position: relative; - top: -33px; - left: -2px; - z-index: 10; - font-size: 16px; - background-color: @list-srch-btn-bg; - display: flex; - align-items: center; - justify-content: center; - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -.List-searchInputIcon:hover { - cursor: pointer; - background-color: @list-srch-btn-hov-bg; - color: @list-srch-btn-icon; -} - -.List-searchNoResults { - color: @default-interface-txt; - margin-top: 20px; -} - -.List-noItems { - margin-top: 52px; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 200px; - border-radius: 5px; - border: 1px solid @d7grey; - background-color: @default-no-items-bord; - color: @list-no-items-txt; - text-transform: uppercase; - text-align: center; - padding: 10px; -} - -.modal-body > .List-noItems { - margin-top: 0px; -} - -.modal-body > .List-emptyHostFilter { - margin-top: 20px; -} - -.List-actionButton--selected, -.List-editButton--selected { - background-color: @list-actn-bg-hov !important; - color: @list-actn-icn-hov; -} - -.List-searchWidget { - height: 34px; -} - -.List-searchWidget--compact { - max-width: ~"calc(100% - 91px)"; - margin-top: 10px; -} - -.List-searchRow { - margin-bottom: 20px; -} - -.List-staticColumn--smallStatus { - width: 25px; - padding-right: 0px!important; -} - -.List-staticColumn--mediumStatus { - width: 53px; - padding-right: 0px!important; -} - -.List-staticColumn--toggle { - width: 55px; - padding-right: 0px !important; -} - -.List-staticColumn--schedulerTime { - max-width: 164px; -} - -.List-staticColumn--invalidBar { - width: 10px; - padding-right: 0px!important; -} - -.List-staticColumnAdjacent { - padding-left: 10px!important; -} - -.List-staticColumnAdjacent--monospace { - font-family: monospace; -} - -.List-titleLockup { - margin-left: 4px; - margin-right: 6px; - display: inline-block; - margin-top: 0px; - padding-bottom: 2px; - vertical-align: bottom; -} - -.List-titleLockup:before { - content: "\007C"; - color: #d7d7d7; - display: block; - font-size: 13px; -} - -.List-action--showTooltipOnDisabled { - display: inline-block; - cursor: not-allowed; -} - -.List-action--showTooltipOnDisabled .btn[disabled] { - pointer-events: none; -} - -.List-action--showTooltipOnDisabled.disabled { - cursor: not-allowed; -} - -.List-action--notificationAdd { - text-align: right; - font-size: 11px; -} - -.List-dropdownSuccess { - background-color: @submit-button-bg; - color: @submit-button-text; - border-color: @submit-button-bg-hov; -} - -.List-dropdownSuccess:hover, -.List-dropdownSuccess:focus { - color: @submit-button-text; - background-color: @submit-button-bg-hov; -} - -.List-infoCell { - display: flex; - justify-content: flex-end; - font-size: 0.8em; - cursor: pointer; - - .popover-content { - dl { - display: flex; - margin: 0; - } - dt, dd { - flex: 1 1 50%; - font-weight: inherit; - margin: 0; - } - } -} - -.List-actionsInner { - display: flex; -} - -@media (max-width: 991px) { - .List-searchWidget + .List-searchWidget { - margin-top: 20px; - } -} - -@media (max-width: 700px) { - .List-header { - flex-direction: column; - align-items: stretch; - } - .List-actionHolder { - justify-content: flex-start; - align-items: center; - flex: 1 0 auto; - margin-top: 12px; - } - .List-actions { - margin-bottom: 20px; - } - .List-well { - margin-top: 20px; - } - - .List-action { - margin-left: 20px; - } - - .List-actionsInner { - margin-left: -20px; - } -} - -.InventoryManage-container, .modal-body { - .List-header { - flex-direction: column; - align-items: stretch; - } - .List-actionHolder { - justify-content: flex-start; - align-items: center; - flex: 1 0 auto; - margin-top: 12px; - } - .List-actions { - margin-bottom: 20px; - } - .List-well { - margin-top: 20px; - } - .List-action:not(.ng-hide) ~ .List-action:not(.ng-hide) { - margin-left: 0; - } -} - -// Inventory Manage exceptions -.InventoryManage-container { - .List-actionHolder { - justify-content: flex-end; - } - .List-actions { - margin: 0 0 -34px 0; - } - .SmartSearch-searchTermContainer { - width: 100%; - } -} - -.List-defaultLayout { - display: grid; - grid-template-columns: 5px auto; -} - -.List-lookupLayout { - display: grid; - grid-template-columns: 26px auto; -} - -.List-staticColumnLayout--statusOrCheckbox { - display: grid; - grid-template-columns: 5px 25px auto; -} - -.List-staticColumnLayout--groups { - display: grid; - grid-template-columns: @at-space @at-space-5x auto; -} - -.List-staticColumnLayout--hostNestedGroups { - display: grid; - grid-template-columns: @at-space @at-space-5x @at-space-5x auto; -} - -.List-staticColumnLayout--hosts { - display: grid; - grid-template-columns: 5px 55px 25px auto; -} - -.List-staticColumnLayout--hostsWithCheckbox { - display: grid; - grid-template-columns: 5px 25px 55px 25px auto; -} - -.List-staticColumnLayout--schedules { - display: grid; - grid-template-columns: 5px 15px 55px auto; -} - -.List-staticColumnLayout--toggleOnOff { - display: grid; - grid-template-columns: 5px 55px auto; -} - -.List-table { - margin-top: 20px; -} - -.List-tableHeaderRow { - background-color: @list-header-bg; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.List-centerEnd { - display: flex; - align-items: center; - justify-content: flex-end; -} diff --git a/awx/ui/client/legacy/styles/log-viewer.less b/awx/ui/client/legacy/styles/log-viewer.less deleted file mode 100644 index 0690205d9a..0000000000 --- a/awx/ui/client/legacy/styles/log-viewer.less +++ /dev/null @@ -1,29 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * log-viewer.css - * - * custom styles for LogViewer.js helper - * - */ - -#logviewer-modal-dialog { - - textarea { - overflow: scroll; - } - pre { - overflow: scroll; - word-wrap: normal; - word-break: normal; - white-space: pre-wrap; - } -} - -table.logviewer-status { - margin-top: 20px; - - .fld-label { - font-weight: bold; - } -} diff --git a/awx/ui/client/legacy/styles/stdout.less b/awx/ui/client/legacy/styles/stdout.less deleted file mode 100644 index 061e90383a..0000000000 --- a/awx/ui/client/legacy/styles/stdout.less +++ /dev/null @@ -1,70 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2015 Ansible, Inc. - * - * Styles for job stdout - * - */ - - #jobs-stdout { - margin-bottom: 0px; - - #job-status { - label { - margin-right: 15px; - } - margin-bottom: 15px; - } - - .scroll-spinner { - display: none; - background-color: transparent; - color:#000; - } - #stdoutMoreRowsTop { - position: absolute; - top: 10px; - right: 20px; - } - #stdoutMoreRowsBottom { - float: right; - padding-right: 15px; - } - #pre-container { - overflow-x: scroll; - overflow-y: auto; - padding: 10px; - } - - } - -.ansi_fore { color: #AAAAAA; } -.ansi_back { background-color: @black; } -.ansi1 { font-weight: bold; } -.ansi3 { font-weight: italic; } -.ansi4 { text-decoration: underline; } -.ansi9 { text-decoration: line-through; } -.ansi30 { color: @default-data-txt; } -.ansi31 { color: @default-err; } -.ansi1.ansi31 { - color: @default-unreachable; -} -.ansi32 { color: @default-succ; } -.ansi33 { color: @default-warning; } -.ansi34 { color: @default-link; } -.ansi35 { color: @default-magenta; } -.ansi36 { color: @default-cyan; } -.ansi37 { color: @default-bg; } -.ansi40 { background-color: @default-stdout-txt; } -.ansi41 { background-color: @default-err; } -.ansi42 { background-color: @default-succ; } -.ansi43 { background-color: @default-warning; } -.ansi44 { background-color: @default-link; } -.ansi45 { background-color: @default-magenta; } -.ansi46 { background-color: @default-cyan; } -.ansi47 { background-color: @default-bg; } - -#pre-container-content > span { - display: inline-block; - white-space: pre-wrap; - word-wrap: normal; -} diff --git a/awx/ui/client/legacy/styles/survey-maker.less b/awx/ui/client/legacy/styles/survey-maker.less deleted file mode 100644 index 176ee7694f..0000000000 --- a/awx/ui/client/legacy/styles/survey-maker.less +++ /dev/null @@ -1,92 +0,0 @@ -/********************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * survey-maker.css - * - * custom styles for the survey maker - * - */ - - -/** -* #survey_maker_question_area{ -* border: 1px solid; -* border-color: rgb(204,204,204); -* border-radius: 4px; -* padding: 15px; -* } -*/ - -.question_form{ - border: 1px solid; - border-color: rgb(204,204,204); - border-radius: 4px; - padding: 5px; - margin-bottom: 15px; - height: 500px; -} - -.survey_maker_question{ - border: 1px solid; - border-color: rgb(204,204,204); - border-radius: 4px; - margin-bottom: 10px; -} - -.question_final{ - border-top: 1px dashed; - border-color: rgb(204,204,204); - border-radius: 4px; - padding: 5px; - position: relative; - - .survey-maker-password{ - margin-left: 30px; - } - - .final{ - margin-left: 15px; - margin-top: 5px; - } - .question_title{ - opacity: 0.7; - } - .description{ - opacity: 0.7; - margin-left: 15px; - } - .input_area{ - opacity: 0.7; - } - .mc{ - margin-left: 18px; - margin-right: 7px; - } - -} - -.question_actions{ - opacity: 1.0; -} - -#new_question{ - margin-top: 5px; -} - -#add_question_btn{ - margin-top: 15px; - margin-bottom: 15px; -} - - -.survey_taker_input{ - - .mc{ - margin-left: 18px; - margin-right: 7px; - } -} - -.survey_taker_description{ - margin-bottom:10px -} diff --git a/awx/ui/client/legacy/styles/text-label.less b/awx/ui/client/legacy/styles/text-label.less deleted file mode 100644 index eca6e83cf4..0000000000 --- a/awx/ui/client/legacy/styles/text-label.less +++ /dev/null @@ -1,15 +0,0 @@ -.host-disabled-label { - &:after { - display: inline-block; - content: "disabled"; - border-radius: 3px; - color: @default-icon; - text-transform: uppercase; - font-size: .7em; - font-style: normal; - margin-left: 0.5em; - padding: 0.35em; - padding-bottom: 0.2em; - line-height: 1.1; - } -} diff --git a/awx/ui/client/lib/components/_index.less b/awx/ui/client/lib/components/_index.less deleted file mode 100644 index ea4da9a9c9..0000000000 --- a/awx/ui/client/lib/components/_index.less +++ /dev/null @@ -1,19 +0,0 @@ -@import 'action/_index'; -@import 'approvalsDrawer/_index'; -@import 'dialog/_index'; -@import 'input/_index'; -@import 'launchTemplateButton/_index'; -@import 'layout/_index'; -@import 'list/_index'; -@import 'modal/_index'; -@import 'panel/_index'; -@import 'popover/_index'; -@import 'relaunchButton/_index'; -@import 'tabs/_index'; -@import 'tag/_index'; -@import 'toggle-tag/_index'; -@import 'truncate/_index'; -@import 'utility/_index'; -@import 'code-mirror/_index'; -@import 'cards/_index'; -@import 'switch/_index'; diff --git a/awx/ui/client/lib/components/action/_index.less b/awx/ui/client/lib/components/action/_index.less deleted file mode 100644 index c5be9803a3..0000000000 --- a/awx/ui/client/lib/components/action/_index.less +++ /dev/null @@ -1,7 +0,0 @@ -.at-ActionGroup { - margin-top: @at-margin-panel; - - button { - margin-left: 15px; - } -} diff --git a/awx/ui/client/lib/components/action/action-button.directive.js b/awx/ui/client/lib/components/action/action-button.directive.js deleted file mode 100644 index 733faa6f97..0000000000 --- a/awx/ui/client/lib/components/action/action-button.directive.js +++ /dev/null @@ -1,48 +0,0 @@ -const templateUrl = require('~components/action/action-button.partial.html'); - -function link (scope, element, attrs, controllers) { - const [actionButtonController] = controllers; - - actionButtonController.init(scope); -} - -function ActionButtonController () { - const vm = this || {}; - - vm.init = (scope) => { - const { variant } = scope; - - if (variant === 'primary') { - vm.color = 'success'; - vm.fill = ''; - } - - if (variant === 'secondary') { - vm.color = 'info'; - vm.fill = ''; - } - - if (variant === 'tertiary') { - vm.color = 'default'; - vm.fill = 'Hollow'; - } - }; -} - -function atActionButton () { - return { - restrict: 'E', - transclude: true, - replace: true, - templateUrl, - require: ['atActionButton'], - controller: ActionButtonController, - controllerAs: 'vm', - link, - scope: { - variant: '@', - } - }; -} - -export default atActionButton; diff --git a/awx/ui/client/lib/components/action/action-button.partial.html b/awx/ui/client/lib/components/action/action-button.partial.html deleted file mode 100644 index d9f9283351..0000000000 --- a/awx/ui/client/lib/components/action/action-button.partial.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/awx/ui/client/lib/components/action/action-group.directive.js b/awx/ui/client/lib/components/action/action-group.directive.js deleted file mode 100644 index 1974ab1d43..0000000000 --- a/awx/ui/client/lib/components/action/action-group.directive.js +++ /dev/null @@ -1,16 +0,0 @@ -const templateUrl = require('~components/action/action-group.partial.html'); - -function atActionGroup () { - return { - restrict: 'E', - replace: true, - transclude: true, - templateUrl, - scope: { - col: '@', - pos: '@' - } - }; -} - -export default atActionGroup; diff --git a/awx/ui/client/lib/components/action/action-group.partial.html b/awx/ui/client/lib/components/action/action-group.partial.html deleted file mode 100644 index e0df9581ac..0000000000 --- a/awx/ui/client/lib/components/action/action-group.partial.html +++ /dev/null @@ -1,5 +0,0 @@ -
-
- -
-
diff --git a/awx/ui/client/lib/components/approvalsDrawer/_index.less b/awx/ui/client/lib/components/approvalsDrawer/_index.less deleted file mode 100644 index a2c58c854a..0000000000 --- a/awx/ui/client/lib/components/approvalsDrawer/_index.less +++ /dev/null @@ -1,68 +0,0 @@ -.at-ApprovalsDrawer { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - // z-index of the nav header is 1040 - z-index: 1041; - background-color: rgba(0, 0, 0, 0.3); - - &--drawer { - position: absolute; - right: 0; - top: 0; - height: 100%; - width: 540px; - background-color: @default-bg; - padding: 20px; - overflow-y: scroll; - } - - &--header { - display: flex; - width: 100%; - margin-bottom: 20px; - } - - &--title { - flex: 1 0 auto; - color: @default-interface-txt; - font-size: 14px; - font-weight: bold; - } - - &--actionRow { - display: flex; - justify-content: flex-end; - width: 100%; - margin-top: 10px; - line-height: 30px; - - button { - margin-left: 15px; - } - } - - &--exit { - justify-content: flex-end; - display: flex; - - button { - height: 20px; - font-size: 20px; - color: @d7grey; - line-height: 1; - opacity: 1; - } - - button:hover{ - color: @default-icon; - opacity: 1; - } - } - - &--expires { - color: @default-err; - } -} diff --git a/awx/ui/client/lib/components/approvalsDrawer/approvalsDrawer.directive.js b/awx/ui/client/lib/components/approvalsDrawer/approvalsDrawer.directive.js deleted file mode 100644 index 47443c524e..0000000000 --- a/awx/ui/client/lib/components/approvalsDrawer/approvalsDrawer.directive.js +++ /dev/null @@ -1,76 +0,0 @@ -const templateUrl = require('~components/approvalsDrawer/approvalsDrawer.partial.html'); - -function AtApprovalsDrawerController (strings, Rest, GetBasePath, $rootScope) { - const vm = this || {}; - - const toolbarSortDefault = { - label: `${strings.get('sort.CREATED_ASCENDING')}`, - value: 'created' - }; - - vm.strings = strings; - vm.toolbarSortValue = toolbarSortDefault; - vm.queryset = { - page: 1, - page_size: 5, - order_by: 'created', - status: 'pending' - }; - vm.emptyListReason = vm.strings.get('approvals.NONE'); - - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${vm.strings.get('sort.CREATED_DESCENDING')}`, value: '-created' } - ]; - - const loadTheList = () => { - const queryParams = Object.keys(vm.queryset).map(key => `${key}=${vm.queryset[key]}`).join('&'); - Rest.setUrl(`${GetBasePath('workflow_approvals')}?${queryParams}`); - return Rest.get() - .then(({ data }) => { - vm.dataset = data; - vm.approvals = data.results; - vm.count = data.count; - $rootScope.pendingApprovalCount = data.count; - }); - }; - - loadTheList() - .then(() => { vm.listLoaded = true; }); - - vm.approve = (approval) => { - Rest.setUrl(`${GetBasePath('workflow_approvals')}${approval.id}/approve`); - Rest.post() - .then(() => loadTheList()); - }; - - vm.deny = (approval) => { - Rest.setUrl(`${GetBasePath('workflow_approvals')}${approval.id}/deny`); - Rest.post() - .then(() => loadTheList()); - }; - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - vm.queryset.page = 1; - vm.queryset.order_by = sort.value; - loadTheList(); - }; -} - -AtApprovalsDrawerController.$inject = ['ComponentsStrings', 'Rest', 'GetBasePath', '$rootScope']; - -function atApprovalsDrawer () { - return { - restrict: 'E', - transclude: true, - templateUrl, - controller: AtApprovalsDrawerController, - controllerAs: 'vm', - scope: { - closeApprovals: '&' - }, - }; -} - -export default atApprovalsDrawer; diff --git a/awx/ui/client/lib/components/approvalsDrawer/approvalsDrawer.partial.html b/awx/ui/client/lib/components/approvalsDrawer/approvalsDrawer.partial.html deleted file mode 100644 index 5c61d06673..0000000000 --- a/awx/ui/client/lib/components/approvalsDrawer/approvalsDrawer.partial.html +++ /dev/null @@ -1,88 +0,0 @@ -
-
-
-
- - {{:: vm.strings.get('approvals.NOTIFICATIONS') }} - - - {{vm.count}} - -
-
- -
-
- - - - -
-
-
- - -
-
-
- - - - -
-
- - - - - - - -
-
-
-
{{:: vm.strings.get('approvals.CONTINUE') }}
- - -
-
-
-
-
- - -
-
diff --git a/awx/ui/client/lib/components/cards/_index.less b/awx/ui/client/lib/components/cards/_index.less deleted file mode 100644 index b85e7ef50e..0000000000 --- a/awx/ui/client/lib/components/cards/_index.less +++ /dev/null @@ -1,51 +0,0 @@ -/* Cards Group */ -.at-CardContainer { - padding: 20px; -} - -.at-CardGroup { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - grid-gap: 20px; -} - -/* Card */ -.at-Card { - min-height: 103px; - display: flex; - flex-direction: column; - flex: 1; - background-color: @at-white; - text-decoration: none; - text-align: center; - padding: 20px; - border-left: 3px solid @at-white; - border-radius: 2px; - box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); - transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1); - cursor: pointer; -} - -.at-Card:hover { - background-color: @at-color-body-background; - border-left: 3px solid @at-blue; - box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); -} - -.at-Card-title { - font-size: 14px; - color: @at-gray-70; - font-weight: bold; - line-height: 14px; -} - -.at-Card-text { - font-size: 12px; - color: @at-gray-161b1f; -} - -/* Spacers */ - -.at-Card--spacer { - min-height: 15px; -} \ No newline at end of file diff --git a/awx/ui/client/lib/components/cards/card.directive.js b/awx/ui/client/lib/components/cards/card.directive.js deleted file mode 100644 index f81c712f8b..0000000000 --- a/awx/ui/client/lib/components/cards/card.directive.js +++ /dev/null @@ -1,14 +0,0 @@ -const templateUrl = require('~components/cards/card.partial.html'); - -function atCard () { - return { - restrict: 'E', - transclude: true, - templateUrl, - scope: { - title: '@', - }, - }; -} - -export default atCard; diff --git a/awx/ui/client/lib/components/cards/card.partial.html b/awx/ui/client/lib/components/cards/card.partial.html deleted file mode 100644 index fdbe3a1ca1..0000000000 --- a/awx/ui/client/lib/components/cards/card.partial.html +++ /dev/null @@ -1,5 +0,0 @@ -
- {{ title }} - - -
\ No newline at end of file diff --git a/awx/ui/client/lib/components/cards/group.directive.js b/awx/ui/client/lib/components/cards/group.directive.js deleted file mode 100644 index e2f61e4543..0000000000 --- a/awx/ui/client/lib/components/cards/group.directive.js +++ /dev/null @@ -1,11 +0,0 @@ -const templateUrl = require('~components/cards/group.partial.html'); - -function atCardGroup () { - return { - restrict: 'E', - transclude: true, - templateUrl, - }; -} - -export default atCardGroup; diff --git a/awx/ui/client/lib/components/cards/group.partial.html b/awx/ui/client/lib/components/cards/group.partial.html deleted file mode 100644 index aa07696b12..0000000000 --- a/awx/ui/client/lib/components/cards/group.partial.html +++ /dev/null @@ -1,4 +0,0 @@ -
-
-
-
\ No newline at end of file diff --git a/awx/ui/client/lib/components/code-mirror/_index.less b/awx/ui/client/lib/components/code-mirror/_index.less deleted file mode 100644 index 98c258d528..0000000000 --- a/awx/ui/client/lib/components/code-mirror/_index.less +++ /dev/null @@ -1,89 +0,0 @@ -.noselect { - -webkit-touch-callout: none; /* iOS Safari */ - -webkit-user-select: none; /* Chrome/Safari/Opera */ - -khtml-user-select: none; /* Konqueror */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* Internet Explorer/Edge */ - user-select: none; /* Non-prefixed version, currently - not supported by any browser */ -} - -.atCodeMirror-label{ - display: flex; - width: 100%; - margin-bottom: 5px; -} - -.atCodeMirror-labelLeftSide{ - flex: 1 0 auto; -} - -.atCodeMirror-labelRightSide{ - display: flex; - align-items: center; -} - -.atCodeMirror-labelText{ - text-transform: uppercase; - color: #707070; - font-weight: normal; - font-size: small; - padding-right: 5px; - width: 100%; -} - -.atCodeMirror-toggleContainer{ - margin: 0 0 0 10px; - display: initial; - padding-bottom: 5px; -} - -.atCodeMirror-expandTextContainer{ - flex: 1 0 auto; - text-align: right; - font-weight: normal; - color: @default-link; - cursor: pointer; - font-size: 12px; -} - -.CodeMirror-modal .modal-dialog{ - width: calc(~"100% - 200px"); - height: calc(~"100vh - 80px"); -} - -@media screen and (min-width: 768px){ - .NetworkingExtraVars .modal-dialog{ - width: 700px; - } -} - -.CodeMirror-modal .modal-dialog{ - width: calc(~"100% - 200px"); - height: calc(~"100vh - 80px"); -} - -.CodeMirror-modal .modal-content{ - height: 100%; -} - -.CodeMirror-modal .CodeMirror { - max-height: calc(~"100vh - 230px"); -} - -.NetworkingExtraVars .CodeMirror{ - overflow-x: hidden; -} - -.CodeMirror-modalControls{ - float: right; - margin-top: 15px; - button { - margin-left: 10px; - } -} - -.atCodeMirror-badge{ - display: initial; - margin-right: 20px; -} diff --git a/awx/ui/client/lib/components/code-mirror/code-mirror.directive.js b/awx/ui/client/lib/components/code-mirror/code-mirror.directive.js deleted file mode 100644 index 4ca2af09f2..0000000000 --- a/awx/ui/client/lib/components/code-mirror/code-mirror.directive.js +++ /dev/null @@ -1,138 +0,0 @@ -const templateUrl = require('~components/code-mirror/code-mirror.partial.html'); - -const CodeMirrorModalID = '#CodeMirror-modal'; - -function atCodeMirrorController ( - $scope, - strings, - ParseTypeChange -) { - const vm = this; - const variablesName = `${$scope.name}_variables`; - - function init () { - if ($scope.disabled === 'true') { - $scope.disabled = true; - } else if ($scope.disabled === 'false') { - $scope.disabled = false; - } - $scope.variables = sanitizeVars($scope.variables); - $scope.parseType = 'yaml'; - - $scope.variablesName = variablesName; - $scope[variablesName] = $scope.variables; - ParseTypeChange({ - scope: $scope, - variable: variablesName, - parse_variable: 'parseType', - field_id: `${$scope.name}_variables`, - readOnly: $scope.disabled - }); - - $scope.$watch(variablesName, () => { - $scope.variables = $scope[variablesName]; - }); - } - - function expand () { - vm.expanded = true; - } - - function close (varsFromModal, parseTypeFromModal) { - $scope.variables = varsFromModal; - $scope[variablesName] = $scope.variables; - $scope.parseType = parseTypeFromModal; - // New set of variables from the modal, reinit codemirror - ParseTypeChange({ - scope: $scope, - variable: variablesName, - parse_variable: 'parseType', - field_id: `${$scope.name}_variables`, - readOnly: $scope.disabled - }); - $(CodeMirrorModalID).off('hidden.bs.modal'); - $(CodeMirrorModalID).modal('hide'); - $('.popover').popover('hide'); - vm.expanded = false; - } - - // Adding this function b/c sometimes extra vars are returned to the - // UI as yaml (ex: "foo: bar"), and other times as a - // json-object-string (ex: "{"foo": "bar"}"). The latter typically - // occurs when host vars were system generated and not user-input - // (such as adding a cloud host); - function sanitizeVars (str) { - // Quick function to test if the host vars are a json-object-string, - // by testing if they can be converted to a JSON object w/o error. - function IsJsonString (varStr) { - try { - JSON.parse(varStr); - } catch (e) { - return false; - } - return true; - } - - if (typeof str === 'undefined') { - return '---'; - } - if (typeof str !== 'string') { - const yamlStr = jsyaml.safeDump(str); - // jsyaml.safeDump doesn't process an empty object correctly - if (yamlStr === '{}\n') { - return '---'; - } - return yamlStr; - } - if (str === '' || str === '{}') { - return '---'; - } else if (IsJsonString(str)) { - str = JSON.parse(str); - return jsyaml.safeDump(str); - } - return str; - } - - vm.name = $scope.name; - vm.strings = strings; - vm.expanded = false; - vm.close = close; - vm.expand = expand; - vm.variablesName = variablesName; - vm.parseType = $scope.parseType; - if ($scope.init) { - $scope.init = init; - } - angular.element(document).ready(() => { - init(); - }); -} - -atCodeMirrorController.$inject = [ - '$scope', - 'CodeMirrorStrings', - 'ParseTypeChange' -]; - -function atCodeMirrorTextarea () { - return { - restrict: 'E', - replace: true, - transclude: true, - templateUrl, - controller: atCodeMirrorController, - controllerAs: 'vm', - scope: { - disabled: '@', - label: '@', - labelClass: '@', - tooltip: '@', - tooltipPlacement: '@', - variables: '=', - name: '@', - init: '=' - } - }; -} - -export default atCodeMirrorTextarea; diff --git a/awx/ui/client/lib/components/code-mirror/code-mirror.partial.html b/awx/ui/client/lib/components/code-mirror/code-mirror.partial.html deleted file mode 100644 index 736d82a9ec..0000000000 --- a/awx/ui/client/lib/components/code-mirror/code-mirror.partial.html +++ /dev/null @@ -1,66 +0,0 @@ -
-
-
- - {{ label || vm.strings.get('code_mirror.label.VARIABLES') }} - - - - - - -
-
- - -
-
-
-
{{ vm.strings.get('label.EXPAND') }}
-
- - - -
diff --git a/awx/ui/client/lib/components/code-mirror/code-mirror.strings.js b/awx/ui/client/lib/components/code-mirror/code-mirror.strings.js deleted file mode 100644 index a95ded436b..0000000000 --- a/awx/ui/client/lib/components/code-mirror/code-mirror.strings.js +++ /dev/null @@ -1,57 +0,0 @@ -function CodeMirrorStrings (BaseString) { - BaseString.call(this, 'code_mirror'); - - const { t } = this; - const ns = this.code_mirror; - - ns.CLOSE_MODAL = t.s('Close variables modal'); - - ns.label = { - EXTRA_VARIABLES: t.s('EXTRA VARIABLES'), - VARIABLES: t.s('VARIABLES'), - EXPAND: t.s('EXPAND'), - YAML: t.s('YAML'), - JSON: t.s('JSON'), - READONLY: t.s('READ ONLY') - }; - - ns.tooltip = { - TOOLTIP: t.s(` -

- Enter inventory variables using either JSON or YAML - syntax. Use the radio button to toggle between the two. -

- JSON: -
-
- { -
"somevar": "somevalue", -
"password": "magic" -
- } -
- YAML: -
-
- --- -
somevar: somevalue -
password: magic -
-
-

- View JSON examples at - www.json.org -

-

- View YAML examples at - - docs.ansible.com -

`), - TOOLTIP_TITLE: t.s('EXTRA VARIABLES'), - JOB_RESULTS: t.s('Read-only view of extra variables added to the job template.') - }; -} - -CodeMirrorStrings.$inject = ['BaseStringService']; - -export default CodeMirrorStrings; diff --git a/awx/ui/client/lib/components/code-mirror/index.js b/awx/ui/client/lib/components/code-mirror/index.js deleted file mode 100644 index 21d4aedc09..0000000000 --- a/awx/ui/client/lib/components/code-mirror/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import codemirror from './code-mirror.directive'; -import modal from './modal/code-mirror-modal.directive'; -import strings from './code-mirror.strings'; - -const MODULE_NAME = 'at.code.mirror'; - -angular.module(MODULE_NAME, []) - .directive('atCodeMirror', codemirror) - .directive('atCodeMirrorModal', modal) - .service('CodeMirrorStrings', strings); - -export default MODULE_NAME; diff --git a/awx/ui/client/lib/components/code-mirror/modal/code-mirror-modal.directive.js b/awx/ui/client/lib/components/code-mirror/modal/code-mirror-modal.directive.js deleted file mode 100644 index 3c0ad60a07..0000000000 --- a/awx/ui/client/lib/components/code-mirror/modal/code-mirror-modal.directive.js +++ /dev/null @@ -1,100 +0,0 @@ -const templateUrl = require('~components/code-mirror/modal/code-mirror-modal.partial.html'); - -const CodeMirrorModalID = '#CodeMirror-modal'; -const ModalHeight = '#CodeMirror-modal .modal-dialog'; -const ModalHeader = '.atCodeMirror-label'; -const ModalFooter = '.CodeMirror-modalControls'; - -function atCodeMirrorModalController ( - $scope, - strings, - ParseTypeChange -) { - const vm = this; - function resize () { - if ($scope.disabled === 'true') { - $scope.disabled = true; - } else if ($scope.disabled === 'false') { - $scope.disabled = false; - } - const editor = $(`${CodeMirrorModalID} .CodeMirror`)[0]; - if (editor) { - const height = $(ModalHeight).height() - $(ModalHeader).height() - - $(ModalFooter).height() - 100; - editor.CodeMirror.setSize('100%', height); - } - } - - function toggle () { - $scope.parseTypeChange('modalParseType', 'modalVars'); - setTimeout(resize, 0); - } - - $scope.close = () => { - $scope.closeFn({ - values: $scope.modalVars, - parseType: $scope.modalParseType, - }); - }; - - function init () { - if ($scope.disabled === 'true') { - $scope.disabled = true; - } else if ($scope.disabled === 'false') { - $scope.disabled = false; - } - $(CodeMirrorModalID).modal('show'); - ParseTypeChange({ - scope: $scope, - variable: 'modalVars', - parse_variable: 'modalParseType', - field_id: 'variables_modal', - readOnly: $scope.disabled - }); - resize(); - $(CodeMirrorModalID).on('hidden.bs.modal', $scope.close); - $(`${CodeMirrorModalID} .modal-dialog`).resizable({ - minHeight: 523, - minWidth: 600 - }); - $(`${CodeMirrorModalID} .modal-dialog`).on('resize', resize); - } - - vm.strings = strings; - vm.toggle = toggle; - if ($scope.init) { - $scope.init = init; - } - angular.element(document).ready(() => { - init($scope.variablesName, $scope.name); - }); -} - -atCodeMirrorModalController.$inject = [ - '$scope', - 'CodeMirrorStrings', - 'ParseTypeChange', -]; - -function atCodeMirrorModal () { - return { - restrict: 'E', - replace: true, - transclude: true, - templateUrl, - controller: atCodeMirrorModalController, - controllerAs: 'vm', - scope: { - disabled: '@', - label: '@', - labelClass: '@', - tooltip: '@', - modalVars: '=', - modalParseType: '=', - name: '@', - closeFn: '&' - } - }; -} - -export default atCodeMirrorModal; diff --git a/awx/ui/client/lib/components/code-mirror/modal/code-mirror-modal.partial.html b/awx/ui/client/lib/components/code-mirror/modal/code-mirror-modal.partial.html deleted file mode 100644 index 97786fc3c4..0000000000 --- a/awx/ui/client/lib/components/code-mirror/modal/code-mirror-modal.partial.html +++ /dev/null @@ -1,72 +0,0 @@ - diff --git a/awx/ui/client/lib/components/components.strings.js b/awx/ui/client/lib/components/components.strings.js deleted file mode 100644 index 38e26ad818..0000000000 --- a/awx/ui/client/lib/components/components.strings.js +++ /dev/null @@ -1,145 +0,0 @@ -function ComponentsStrings (BaseString) { - BaseString.call(this, 'components'); - - const { t } = this; - const ns = this.components; - - ns.REPLACE = t.s('Replace'); - ns.REVERT = t.s('Revert'); - ns.ENCRYPTED = t.s('ENCRYPTED'); - ns.OPTIONS = t.s('OPTIONS'); - ns.SHOW = t.s('Show'); - ns.HIDE = t.s('Hide'); - - ns.message = { - REQUIRED_INPUT_MISSING: t.s('Please enter a value.'), - INVALID_INPUT: t.s('Invalid input for this type.') - }; - - ns.file = { - PLACEHOLDER: t.s('CHOOSE A FILE'), - SELECT_FILE: t.s('Select file') - }; - - ns.form = { - SUBMISSION_ERROR_TITLE: t.s('Unable to Submit'), - SUBMISSION_ERROR_MESSAGE: t.s('Unexpected server error. View the console for more information'), - SUBMISSION_ERROR_PREFACE: t.s('Unexpected Error') - }; - - ns.group = { - UNSUPPORTED_ERROR_PREFACE: t.s('Unsupported input type') - }; - - ns.label = { - PROMPT_ON_LAUNCH: t.s('Prompt on launch') - }; - - ns.select = { - UNSUPPORTED_TYPE_ERROR: t.s('Unsupported display model type'), - EMPTY_PLACEHOLDER: t.s('NO OPTIONS AVAILABLE') - }; - - ns.textarea = { - SSH_KEY_HINT: t.s('HINT: Drag and drop private file on the field below.') - }; - - ns.lookup = { - NOT_FOUND: t.s('That value was not found. Please enter or select a valid value.'), - PERFORM_LOOKUP: t.s('Perform lookup') - }; - - ns.truncate = { - DEFAULT: t.s('Copy full revision to clipboard.'), - COPIED: t.s('Copied to clipboard.') - }; - - ns.toggle = { - VIEW_MORE: t.s('VIEW MORE'), - VIEW_LESS: t.s('VIEW LESS') - }; - - ns.tooltips = { - VIEW_THE_CREDENTIAL: t.s('View the Credential'), - }; - - ns.layout = { - CURRENT_USER_LABEL: t.s('Logged in as'), - VIEW_DOCS: t.s('View Documentation'), - LOGOUT: t.s('Logout'), - DASHBOARD: t.s('Dashboard'), - JOBS: t.s('Jobs'), - SCHEDULES: t.s('Schedules'), - MY_VIEW: t.s('My View'), - PROJECTS: t.s('Projects'), - CREDENTIALS: t.s('Credentials'), - CREDENTIAL_TYPES: t.s('Credential Types'), - INVENTORIES: t.s('Inventories'), - TEMPLATES: t.s('Templates'), - ORGANIZATIONS: t.s('Organizations'), - USERS: t.s('Users'), - TEAMS: t.s('Teams'), - INVENTORY_SCRIPTS: t.s('Inventory Scripts'), - NOTIFICATIONS: t.s('Notifications'), - MANAGEMENT_JOBS: t.s('Management Jobs'), - INSTANCES: t.s('Instances'), - INSTANCE_GROUPS: t.s('Instance Groups'), - APPLICATIONS: t.s('Applications'), - SETTINGS: t.s('Settings'), - ABOUT: t.s('About'), - COPYRIGHT: t.s('Copyright © 2019 Red Hat, Inc.'), - VIEWS_HEADER: t.s('Views'), - RESOURCES_HEADER: t.s('Resources'), - ACCESS_HEADER: t.s('Access'), - ADMINISTRATION_HEADER: t.s('Administration'), - AUTHENTICATION: t.s('Authentication'), - SYSTEM: t.s('System'), - USER_INTERFACE: t.s('User Interface'), - LICENSE: t.s('License') - }; - - ns.relaunch = { - DEFAULT: t.s('Relaunch using the same parameters'), - HOSTS: t.s('Relaunch using host parameters'), - DROPDOWN_TITLE: t.s('Relaunch On'), - ALL: t.s('All'), - FAILED: t.s('Failed') - }; - - ns.launchTemplate = { - DEFAULT: t.s('Start a job using this template'), - DISABLED: t.s('Please save before launching this template.'), - BUTTON_LABEL: t.s('LAUNCH') - }; - - ns.list = { - DEFAULT_EMPTY_LIST: t.s('Please add items to this list.') - }; - - ns.toolbar = { - COMPACT: t.s('Compact'), - EXPANDED: t.s('Expanded'), - SORT_BY: t.s('SORT BY') - }; - - ns.approvals = { - APPROVAL: t.s('APPROVAL'), - NONE: t.s('There are no jobs awaiting approval'), - APPROVE: t.s('APPROVE'), - DENY: t.s('DENY'), - CONTINUE: t.s('Continue workflow job?'), - NOTIFICATIONS: t.s('NOTIFICATIONS'), - WORKFLOW_TEMPLATE: t.s('Workflow Template'), - EXPIRES: t.s('Expires:'), - EXPIRES_NEVER: t.s('Expires: Never'), - CLOSE_APPROVALS: t.s('Close Approvals') - }; - - ns.secret = { - REPLACE: t.s('Replace secret') - }; -} - -ComponentsStrings.$inject = ['BaseStringService']; - -export default ComponentsStrings; diff --git a/awx/ui/client/lib/components/dialog/_index.less b/awx/ui/client/lib/components/dialog/_index.less deleted file mode 100644 index 60ff25c935..0000000000 --- a/awx/ui/client/lib/components/dialog/_index.less +++ /dev/null @@ -1,43 +0,0 @@ -.at-Dialog { - display: block; - border: none; - opacity: 1; - background: rgba(0, 0, 0, 0.3); - animation-name: at-DialogFadeIn; - animation-iteration-count: 1; - animation-timing-function: ease-in; - animation-duration: 0.3s; -} - -@keyframes at-DialogFadeIn { - 0% { opacity: 0; background: rgba(0, 0, 0, 0); } - 100% { opacity: 1; background: rgba(0, 0, 0, 0.3); } -} - -.at-Dialog-body { - font-size: @at-font-size; - padding: @at-padding-panel 0; -} - -.at-Dialog-dismiss { - .at-mixin-ButtonIcon(); - font-size: @at-font-size-modal-dismiss; - color: @at-color-icon-dismiss; - text-align: right; -} - -.at-Dialog-heading { - margin: 0; - overflow: visible; - - & > .at-Dialog-dismiss { - margin: 0; - } -} - -.at-Dialog-title { - margin: 0; - padding: 0; - - .at-mixin-Heading(@at-font-size-modal-heading); -} diff --git a/awx/ui/client/lib/components/dialog/dialog.component.js b/awx/ui/client/lib/components/dialog/dialog.component.js deleted file mode 100644 index 888c47033c..0000000000 --- a/awx/ui/client/lib/components/dialog/dialog.component.js +++ /dev/null @@ -1,11 +0,0 @@ -const templateUrl = require('~components/dialog/dialog.partial.html'); - -export default { - templateUrl, - controllerAs: 'vm', - transclude: true, - bindings: { - title: '=', - onClose: '=', - }, -}; diff --git a/awx/ui/client/lib/components/dialog/dialog.partial.html b/awx/ui/client/lib/components/dialog/dialog.partial.html deleted file mode 100644 index 639a2fed97..0000000000 --- a/awx/ui/client/lib/components/dialog/dialog.partial.html +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/awx/ui/client/lib/components/form/action.directive.js b/awx/ui/client/lib/components/form/action.directive.js deleted file mode 100644 index ab8d6e72a3..0000000000 --- a/awx/ui/client/lib/components/form/action.directive.js +++ /dev/null @@ -1,78 +0,0 @@ -const templateUrl = require('~components/form/action.partial.html'); - -function link (scope, element, attrs, controllers) { - const [formController, actionController] = controllers; - - actionController.init(formController, scope); -} - -function atFormActionController ($state, strings) { - const vm = this || {}; - - let form; - let scope; - - vm.init = (_form_, _scope_) => { - form = _form_; - scope = _scope_; - - switch (scope.type) { - case 'cancel': - vm.setCancelDefaults(); - break; - case 'save': - vm.setSaveDefaults(); - break; - case 'secondary': - vm.setSecondaryDefaults(); - break; - default: - vm.setCustomDefaults(); - } - - form.register('action', scope); - }; - - vm.setCancelDefaults = () => { - scope.text = strings.get('CANCEL'); - scope.fill = 'Hollow'; - scope.color = 'default'; - scope.action = () => { $state.go(scope.to || '^'); }; - }; - - vm.setSaveDefaults = () => { - scope.text = strings.get('SAVE'); - scope.fill = ''; - scope.color = 'success'; - scope.action = () => { form.submit(); }; - }; - - vm.setSecondaryDefaults = () => { - scope.text = strings.get('TEST'); - scope.fill = ''; - scope.color = 'info'; - scope.action = () => { form.submitSecondary(); }; - }; -} - -atFormActionController.$inject = ['$state', 'ComponentsStrings']; - -function atFormAction () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atFormAction'], - templateUrl, - controller: atFormActionController, - controllerAs: 'vm', - link, - scope: { - state: '=', - type: '@', - to: '@' - } - }; -} - -export default atFormAction; diff --git a/awx/ui/client/lib/components/form/action.partial.html b/awx/ui/client/lib/components/form/action.partial.html deleted file mode 100644 index 78c89d0f91..0000000000 --- a/awx/ui/client/lib/components/form/action.partial.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/awx/ui/client/lib/components/form/form.directive.js b/awx/ui/client/lib/components/form/form.directive.js deleted file mode 100644 index 7a4d7154d8..0000000000 --- a/awx/ui/client/lib/components/form/form.directive.js +++ /dev/null @@ -1,248 +0,0 @@ -const templateUrl = require('~components/form/form.partial.html'); - -function atFormLink (scope, el, attrs, controllers) { - const formController = controllers[0]; - const form = el[0]; - - scope.ns = 'form'; - scope[scope.ns] = { modal: {} }; - - formController.init(scope, form); -} - -function AtFormController (eventService, strings) { - const vm = this || {}; - - let scope; - let modal; - let form; - - vm.components = []; - vm.state = { - isValid: false, - disabled: false, - value: {}, - }; - - vm.init = (_scope_, _form_) => { - scope = _scope_; - form = _form_; - ({ modal } = scope[scope.ns]); - - vm.state.disabled = scope.state.disabled; - vm.setListeners(); - }; - - vm.register = (category, component) => { - component.category = category; - component.form = vm.state; - - if (category === 'input') { - scope.state[component.state.id] = component.state; - } - - vm.components.push(component); - }; - - vm.setListeners = () => { - const listeners = eventService.addListeners([ - [form, 'keypress', vm.submitOnEnter] - ]); - - scope.$on('$destroy', () => eventService.remove(listeners)); - }; - - vm.submitOnEnter = event => { - if (event.key !== 'Enter' || event.srcElement.type === 'textarea') { - return; - } - - event.preventDefault(); - scope.$apply(vm.submit); - }; - - vm.getSubmitData = () => vm.components - .filter(component => component.category === 'input') - .reduce((values, component) => { - if (component.state._value === undefined) { - return values; - } - - if (component.state._format === 'selectFromOptions') { - values[component.state.id] = component.state._value[0]; - } else if (component.state._key && typeof component.state._value === 'object') { - values[component.state.id] = component.state._value[component.state._key]; - } else if (component.state._group) { - values[component.state._key] = values[component.state._key] || {}; - values[component.state._key][component.state.id] = component.state._value; - } else { - values[component.state.id] = component.state._value; - } - - return values; - }, {}); - - vm.submitSecondary = () => { - if (!vm.state.isValid) { - return; - } - const data = vm.getSubmitData(); - scope.state.secondary(data); - }; - - vm.submit = () => { - if (!vm.state.isValid) { - return; - } - - vm.state.disabled = true; - - const data = vm.getSubmitData(); - - scope.state.save(data) - .then(scope.state.onSaveSuccess) - .catch(err => vm.onSaveError(err)) - .finally(() => { vm.state.disabled = false; }); - }; - - vm.onSaveError = err => { - let handled; - - if (err.status === 400) { - handled = vm.handleValidationError(err.data); - } - - if (err.status === 500) { - handled = vm.handleUnexpectedError(err); - } - - if (!handled) { - let message; - const title = strings.get('form.SUBMISSION_ERROR_TITLE'); - const preface = strings.get('form.SUBMISSION_ERROR_PREFACE'); - - if (typeof err.data === 'object') { - message = JSON.stringify(err.data); - } if (_.has(err, 'data.__all__')) { - if (typeof err.data.__all__ === 'object' && Array.isArray(err.data.__all__)) { - message = JSON.stringify(err.data.__all__[0]); - } else { - message = JSON.stringify(err.data.__all__); - } - } else { - message = err.data; - } - - modal.show(title, `${preface}: ${message}`); - } - }; - - vm.handleUnexpectedError = () => { - const title = strings.get('form.SUBMISSION_ERROR_TITLE'); - const message = strings.get('form.SUBMISSION_ERROR_MESSAGE'); - - modal.show(title, message); - - return true; - }; - - vm.handleValidationError = errors => { - const errorMessageSet = vm.setValidationMessages(errors); - - if (errorMessageSet) { - vm.check(); - } - - return errorMessageSet; - }; - - vm.setValidationMessages = (errors, errorSet) => { - let errorMessageSet = errorSet || false; - - Object.keys(errors).forEach(id => { - if (!Array.isArray(errors[id]) && typeof errors[id] === 'object') { - errorMessageSet = vm.setValidationMessages(errors[id], errorMessageSet); - - return; - } - - vm.components - .filter(component => component.category === 'input') - .filter(component => errors[component.state.id]) - .forEach(component => { - errorMessageSet = true; - - component.state._rejected = true; - component.state._message = errors[component.state.id].join(' '); - }); - }); - - return errorMessageSet; - }; - - vm.validate = () => { - let isValid = true; - - for (let i = 0; i < vm.components.length; i++) { - if (vm.components[i].category !== 'input') { - continue; - } - - if (vm.components[i].state.asTag) { - continue; - } - - if (!vm.components[i].state._isValid) { - isValid = false; - break; - } - } - - return isValid; - }; - - vm.check = () => { - const isValid = vm.validate(); - - if (isValid !== vm.state.isValid) { - vm.state.isValid = isValid; - } - - if (isValid !== scope.state.isValid) { - scope.state.isValid = isValid; - } - }; - - vm.deregisterInputGroup = components => { - for (let i = 0; i < components.length; i++) { - for (let j = 0; j < vm.components.length; j++) { - if (components[i] === vm.components[j].state) { - vm.components.splice(j, 1); - delete scope.state[components[i].id]; - break; - } - } - } - }; -} - -AtFormController.$inject = ['EventService', 'ComponentsStrings']; - -function atForm () { - return { - restrict: 'E', - replace: true, - transclude: true, - require: ['atForm'], - templateUrl, - controller: AtFormController, - controllerAs: 'vm', - link: atFormLink, - scope: { - state: '=', - autocomplete: '@' - } - }; -} - -export default atForm; diff --git a/awx/ui/client/lib/components/form/form.partial.html b/awx/ui/client/lib/components/form/form.partial.html deleted file mode 100644 index 3d45276cd6..0000000000 --- a/awx/ui/client/lib/components/form/form.partial.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
- -
- - -
diff --git a/awx/ui/client/lib/components/index.js b/awx/ui/client/lib/components/index.js deleted file mode 100644 index cc3cd55bb0..0000000000 --- a/awx/ui/client/lib/components/index.js +++ /dev/null @@ -1,110 +0,0 @@ -import atLibServices from '~services'; - -import actionGroup from '~components/action/action-group.directive'; -import actionButton from '~components/action/action-button.directive'; -import approvalsDrawer from '~components/approvalsDrawer/approvalsDrawer.directive'; -import dialog from '~components/dialog/dialog.component'; -import divider from '~components/utility/divider.directive'; -import dynamicSelect from '~components/input/dynamic-select.directive'; -import form from '~components/form/form.directive'; -import formAction from '~components/form/action.directive'; -import inputCheckbox from '~components/input/checkbox.directive'; -import inputFile from '~components/input/file.directive'; -import inputGroup from '~components/input/group.directive'; -import inputLabel from '~components/input/label.directive'; -import inputLookup from '~components/input/lookup.directive'; -import inputMessage from '~components/input/message.directive'; -import inputSecret from '~components/input/secret.directive'; -import inputSelect from '~components/input/select.directive'; -import inputSlider from '~components/input/slider.directive'; -import inputText from '~components/input/text.directive'; -import inputTextarea from '~components/input/textarea.directive'; -import inputTextareaSecret from '~components/input/textarea-secret.directive'; -import launchTemplate from '~components/launchTemplateButton/launchTemplateButton.component'; -import layout from '~components/layout/layout.directive'; -import list from '~components/list/list.directive'; -import lookupList from '~components/lookup-list/lookup-list.component'; -import modal from '~components/modal/modal.directive'; -import panel from '~components/panel/panel.directive'; -import panelBody from '~components/panel/body.directive'; -import panelHeading from '~components/panel/heading.directive'; -import popover from '~components/popover/popover.directive'; -import relaunch from '~components/relaunchButton/relaunchButton.component'; -import row from '~components/list/row.directive'; -import rowItem from '~components/list/row-item.directive'; -import rowAction from '~components/list/row-action.directive'; -import sideNav from '~components/layout/side-nav.directive'; -import sideNavItem from '~components/layout/side-nav-item.directive'; -import tab from '~components/tabs/tab.directive'; -import tabGroup from '~components/tabs/group.directive'; -import tag from '~components/tag/tag.directive'; -import toggleTag from '~components/toggle-tag/toggle-tag.directive'; -import toolbar from '~components/list/list-toolbar.directive'; -import topNavItem from '~components/layout/top-nav-item.directive'; -import truncate from '~components/truncate/truncate.directive'; -import atCodeMirror from '~components/code-mirror'; -import atSyntaxHighlight from '~components/syntax-highlight'; -import card from '~components/cards/card.directive'; -import cardGroup from '~components/cards/group.directive'; -import atSwitch from '~components/switch/switch.directive'; - -import BaseInputController from '~components/input/base.controller'; -import ComponentsStrings from '~components/components.strings'; - -const MODULE_NAME = 'at.lib.components'; - -angular - .module(MODULE_NAME, [ - atLibServices, - atCodeMirror, - atSyntaxHighlight, - ]) - .directive('atActionGroup', actionGroup) - .directive('atActionButton', actionButton) - .directive('atApprovalsDrawer', approvalsDrawer) - .component('atDialog', dialog) - .directive('atDivider', divider) - .directive('atDynamicSelect', dynamicSelect) - .directive('atForm', form) - .directive('atFormAction', formAction) - .directive('atInputCheckbox', inputCheckbox) - .directive('atInputFile', inputFile) - .directive('atInputGroup', inputGroup) - .directive('atInputLabel', inputLabel) - .directive('atInputLookup', inputLookup) - .directive('atInputMessage', inputMessage) - .directive('atInputSecret', inputSecret) - .directive('atInputSelect', inputSelect) - .directive('atInputSlider', inputSlider) - .directive('atInputText', inputText) - .directive('atInputTextarea', inputTextarea) - .directive('atInputTextareaSecret', inputTextareaSecret) - .component('atLaunchTemplate', launchTemplate) - .directive('atLayout', layout) - .directive('atList', list) - .component('atLookupList', lookupList) - .directive('atListToolbar', toolbar) - .component('atRelaunch', relaunch) - .directive('atRow', row) - .directive('atRowItem', rowItem) - .directive('atRowAction', rowAction) - .directive('atModal', modal) - .directive('atPanel', panel) - .directive('atPanelBody', panelBody) - .directive('atPanelHeading', panelHeading) - .directive('atPopover', popover) - .directive('atSideNav', sideNav) - .directive('atSideNavItem', sideNavItem) - .directive('atTab', tab) - .directive('atTabGroup', tabGroup) - .directive('atTag', tag) - .directive('atToggleTag', toggleTag) - .directive('atTopNavItem', topNavItem) - .directive('atTruncate', truncate) - .directive('atCard', card) - .directive('atCardGroup', cardGroup) - .directive('atSwitch', atSwitch) - .service('BaseInputController', BaseInputController) - .service('ComponentsStrings', ComponentsStrings); - -export default MODULE_NAME; diff --git a/awx/ui/client/lib/components/input/_index.less b/awx/ui/client/lib/components/input/_index.less deleted file mode 100644 index 68be7f59d0..0000000000 --- a/awx/ui/client/lib/components/input/_index.less +++ /dev/null @@ -1,359 +0,0 @@ -.at-Input { - .at-mixin-Placeholder(@at-color-input-placeholder); - - height: @at-height-input; - background: @at-color-input-background; - border-radius: @at-border-radius; - color: @at-color-input-text; - padding: 0 @at-padding-input; - - &, &:active { - border-color: @at-color-input-border; - } - - &:focus { - border-color: @at-color-input-focus; - } - - &[readonly] { - background: @at-color-input-readonly; - } - - &[disabled] { - background: @at-color-input-disabled; - } -} - -.at-InputCheckbox { - margin: 0; - padding: 0; - display: block; - min-height: 20px; - - & > label { - font-weight: normal; - - & > input[type=checkbox] { - height: @at-height-input; - margin: 0; - padding: 0; - float: left; - } - - & > p { - margin: 0; - padding: 0 0 0 @at-padding-panel; - line-height: @at-line-height-tall; - } - } -} - -.at-InputContainer { - margin-top: @at-margin-panel; -} - -.at-Input-button { - .at-mixin-InputButton(); -} - -.at-Input-button--fixed-xs { - .at-mixin-InputButton(); - min-width: @at-width-input-button-sm; - height: @at-height-input; -} - -.at-Input-button--fixed-sm { - .at-mixin-InputButton(); - min-width: @at-width-input-button-md; - height: @at-height-input; -} - -.at-Input-button--fixed-md { - .at-mixin-InputButton(); - display: inherit; - min-width: @at-width-input-button-md; - height: @at-height-textarea; -} - -.at-Input-button--long-sm { - .at-mixin-InputButton(); - max-width: @at-width-input-button-md; - min-height: @at-height-textarea; -} - -.at-Input-button--active { - .at-mixin-ButtonColor(at-color-info, at-color-default); -} - -.at-Input--focus { - border-color: @at-color-input-focus; -} - -.at-Input--rejected { - &, &:focus { - border-color: @at-color-input-error; - } -} - -.at-InputFile--hidden { - position: absolute; - height: 100%; - width: 100%; - left: 0; - z-index: -2; - opacity: 0; -} - -.at-InputFile--drag { - z-index: 3; -} - -.at-InputGroup { - padding: 0; - margin: @at-margin-panel 0 0 0; -} - -.at-InputGroup-border { - position: absolute; - width: 5px; - height: 100%; - background: @at-color-panel-border; - left: -5px; -} - -.at-InputGroup-title { - .at-mixin-Heading(@at-font-size-panel-inset-heading); - margin: 0 0 0 @at-margin-panel-inset; -} - -.at-InputGroup-divider { - clear: both; - margin: 0; - padding: 0; - height: @at-height-divider; -} - -.at-InputLabel { - display: inline-block; - width: 100%; -} - -.at-InputLabel-name { - color: @at-color-form-label; - font-size: @at-font-size-form-label; - font-weight: @at-font-weight-body; - text-transform: uppercase; -} - -.at-InputLabel-hint { - margin-left: @at-margin-form-label-hint; - color: @at-color-input-hint; - font-size: @at-font-size-help-text; - font-weight: @at-font-weight-body; - line-height: @at-line-height-short; -} - -.at-InputLabel-checkbox { - margin: 0; - padding: 0; -} - -.at-InputLabel-checkboxLabel { - margin-bottom: 0; - - & > input[type=checkbox] { - margin: 0 3px 0 0; - } - - & > p { - font-size: @at-font-size-help-text; - color: @at-color-form-label; - font-weight: @at-font-weight-body; - display: inline; - margin: 0; - padding: 0; - } -} - -.at-InputMessage--rejected { - font-size: @at-font-size-help-text; - color: @at-color-error; - margin: @at-margin-input-message 0 0 0; - padding: 0; -} - -.at-InputLabel-required { - color: @at-color-error; - font-weight: @at-font-weight-heading; - font-size: @at-font-size-form-label; - margin: 0; -} - -.at-InputSelect { - position: relative; - width: 100%; - - & > i { - font-size: @at-font-size-button; - position: absolute; - z-index: 3; - pointer-events: none; - top: @at-height-input / 3; - right: @at-height-input / 3; - color: @at-color-input-icon; - } -} - -.at-InputSelect-input { - position: relative; - z-index: 2; - pointer-events: none; -} - -.at-InputSelect-select { - height: @at-height-input; - cursor: pointer; - position: absolute; - z-index: 1; - top: 0; - - & > optgroup { - text-transform: uppercase; - - & > option { - text-transform: none; - } - } -} - -.at-InputTextarea { - .at-mixin-FontFixedWidth(); - min-height: @at-height-textarea; - padding: 6px @at-padding-input 0 @at-padding-input; -} - -.at-InputLookup { - display: flex; - - .at-InputLookup-button { - .at-mixin-InputButton(); - border-radius: @at-border-radius 0 0 @at-border-radius; - border-right: none; - flex: 0 0 35px; - height: auto; - min-height: 30px - } - - .at-InputLookup-tagContainer { - .at-mixin-Border; - display: flex; - flex-flow: row wrap; - padding: 0 10px; - width: 100%; - } - - .at-InputLookup-button + .at-Input, - .at-InputLookup-tagContainer { - border-radius: 0 @at-border-radius @at-border-radius 0; - } -} - -.at-InputSlider { - display: flex; - padding: 5px 0; - - p { - color: @at-color-form-label; - font-size: @at-font-size-help-text; - font-weight: @at-font-weight-body; - margin: 0 0 0 10px; - padding: 0; - width: 50px; - } - - input[type=range] { - -webkit-appearance: none; - width: 100%; - background: transparent; - height: 20px; - border-right: 1px solid @at-color-input-slider-track; - border-left: 1px solid @at-color-input-slider-track; - - &:focus { - outline: none; - } - - &::-webkit-slider-runnable-track { - background: @at-color-input-slider-track; - cursor: pointer; - height: 1px; - width: 100%; - } - - &::-webkit-slider-thumb { - -webkit-appearance: none; - background-color: @at-color-input-slider-thumb; - border-radius: 50%; - border: none; - cursor: pointer; - height: 16px; - margin-top: -7px; - width: 16px; - } - - } - - input[type=range]::-moz-range-thumb { - -webkit-appearance: none; - background-color: @at-color-input-slider-thumb; - border-radius: 50%; - border: none; - cursor: pointer; - height: 16px; - width: 16px; - } - - input[type=range]::-moz-range-track { - background: @at-color-input-slider-track; - cursor: pointer; - height: 1px; - width: 100%; - } - - input[type=range][disabled] { - &::-webkit-slider-thumb { - background: @at-color-disabled; - border: solid 1px @at-color-disabled; - cursor: not-allowed; - } - } -} - -.at-InputGroup-container { - .row { - margin: 0; - } -} - -.at-InputTaggedTextarea { - .at-mixin-FontFixedWidth(); - min-height: @at-height-textarea; - padding: 6px @at-padding-input 0 @at-padding-input; - border-radius: @at-border-radius; -} - -.at-InputTagContainer { - display: flex; - width: 100%; - flex-wrap: wrap; - - .TagComponent { - max-height: @at-space-4x; - } - - .TagComponent-name { - align-self: auto; - word-break: break-all; - font-family: 'Open Sans', sans-serif; - } -} diff --git a/awx/ui/client/lib/components/input/base.controller.js b/awx/ui/client/lib/components/input/base.controller.js deleted file mode 100644 index 9a08ed0f2e..0000000000 --- a/awx/ui/client/lib/components/input/base.controller.js +++ /dev/null @@ -1,155 +0,0 @@ -function BaseInputController (strings) { - // Default values are universal. Don't translate. - const PROMPT_ON_LAUNCH_VALUE = 'ASK'; - const ENCRYPTED_VALUE = '$encrypted$'; - - return function extend (type, scope, element, form) { - const vm = this; - - vm.strings = strings; - - scope.state = scope.state || {}; - - scope.state._touched = false; - scope.state._required = scope.state.required || false; - - if (scope.state.type === 'boolean') { - scope.state._isValid = scope.state._isValid || true; - } else { - scope.state._isValid = scope.state._isValid || false; - } - - scope.state._disabled = scope.state._disabled || false; - scope.state._activeModel = scope.state._activeModel || '_value'; - - if (scope.state.ask_at_runtime) { - scope.state._displayPromptOnLaunch = true; - } - - if (typeof scope.state._value !== 'undefined') { - scope.state._edit = true; - scope.state._preEditValue = scope.state._value; - - if (scope.state._value === PROMPT_ON_LAUNCH_VALUE) { - scope.state._promptOnLaunch = true; - scope.state._disabled = true; - scope.state._activeModel = '_displayValue'; - } - - if (scope.state._value === ENCRYPTED_VALUE) { - scope.state._displayRevertReplace = true; - scope.state._enableToggle = true; - scope.state._disabled = true; - scope.state._isBeingReplaced = false; - scope.state._activeModel = '_displayValue'; - } - } else if (typeof scope.state.default !== 'undefined') { - scope.state._value = scope.state.default; - } - - form.register(type, scope); - - if (scope.form && scope.form.disabled) { - scope.state._enableToggle = false; - } - - vm.validate = () => { - let isValid = true; - let message = ''; - - if (scope.state.asTag) { - return (isValid, message); - } - - if (scope.state._value || scope.state._displayValue) { - scope.state._touched = true; - } - - if (scope.state.type === 'boolean') { - return { isValid, message }; - } - - if (scope.state._required && (!scope.state._value || !scope.state._value[0]) && - !scope.state._displayValue) { - isValid = false; - message = vm.strings.get('message.REQUIRED_INPUT_MISSING'); - } else if (scope.state._validate) { - const result = scope.state._validate(scope.state._value); - - if (!result.isValid) { - isValid = false; - message = result.message || vm.strings.get('message.INVALID_INPUT'); - } - } - - return { - isValid, - message - }; - }; - - vm.updateValidationState = result => { - if (!scope.state._touched && scope.state._required) { - return; - } - - scope.state._rejected = !result.isValid; - scope.state._isValid = result.isValid; - scope.state._message = result.message; - - form.check(); - }; - - vm.check = result => { - result = result || vm.validate(); - - vm.updateValidationState(result); - }; - - vm.onRevertReplaceToggle = () => { - if (!scope.state._isBeingReplaced) { - scope.state._buttonText = vm.strings.get('REPLACE'); - scope.state._disabled = true; - scope.state._enableToggle = true; - scope.state._value = scope.state._preEditValue; - scope.state._activeModel = '_displayValue'; - scope.state._placeholder = vm.strings.get('ENCRYPTED'); - vm.check(); - } else { - scope.state._buttonText = vm.strings.get('REVERT'); - scope.state._disabled = false; - scope.state._enableToggle = false; - scope.state._activeModel = '_value'; - scope.state._value = ''; - scope.state._placeholder = ''; - vm.check(); - } - if (scope.form && scope.form.disabled) { - scope.state._enableToggle = false; - } - }; - - vm.togglePromptOnLaunch = () => { - if (scope.state._promptOnLaunch) { - scope.state._value = PROMPT_ON_LAUNCH_VALUE; - scope.state._activeModel = '_displayValue'; - scope.state._disabled = true; - scope.state._enableToggle = false; - } else if (scope.state._isBeingReplaced === false) { - scope.state._disabled = true; - scope.state._enableToggle = true; - scope.state._value = scope.state._preEditValue; - } else { - scope.state._activeModel = '_value'; - scope.state._disabled = false; - scope.state._value = ''; - } - - vm.check(); - }; - }; -} - -BaseInputController.$inject = ['ComponentsStrings']; - -export default BaseInputController; diff --git a/awx/ui/client/lib/components/input/checkbox.directive.js b/awx/ui/client/lib/components/input/checkbox.directive.js deleted file mode 100644 index 00fcdcf05c..0000000000 --- a/awx/ui/client/lib/components/input/checkbox.directive.js +++ /dev/null @@ -1,46 +0,0 @@ -const templateUrl = require('~components/input/checkbox.partial.html'); - -function atInputCheckboxLink (scope, element, attrs, controllers) { - const formController = controllers[0]; - const inputController = controllers[1]; - - if (scope.tab === '1') { - element.find('input')[0].focus(); - } - - inputController.init(scope, element, formController); -} - -function AtInputCheckboxController (baseInputController) { - const vm = this || {}; - - vm.init = (scope, element, form) => { - baseInputController.call(vm, 'input', scope, element, form); - scope.label = scope.state.label; - scope.state.label = vm.strings.get('OPTIONS'); - - vm.check(); - }; -} - -AtInputCheckboxController.$inject = ['BaseInputController']; - -function atInputCheckbox () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atInputCheckbox'], - templateUrl, - controller: AtInputCheckboxController, - controllerAs: 'vm', - link: atInputCheckboxLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputCheckbox; diff --git a/awx/ui/client/lib/components/input/checkbox.partial.html b/awx/ui/client/lib/components/input/checkbox.partial.html deleted file mode 100644 index df171e5cb5..0000000000 --- a/awx/ui/client/lib/components/input/checkbox.partial.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
- -
- -
- -
-
diff --git a/awx/ui/client/lib/components/input/dynamic-select.directive.js b/awx/ui/client/lib/components/input/dynamic-select.directive.js deleted file mode 100644 index ee3bca40ed..0000000000 --- a/awx/ui/client/lib/components/input/dynamic-select.directive.js +++ /dev/null @@ -1,49 +0,0 @@ -const templateUrl = require('~components/input/dynamic-select.partial.html'); - -function atDynamicSelectLink (scope, element, attrs, controllers) { - const [formController, inputController] = controllers; - - inputController.init(scope, element, formController); -} - -function AtDynamicSelectController (baseInputController, CreateSelect2) { - const vm = this || {}; - - let scope; - - vm.init = (_scope_, _element_, form) => { - baseInputController.call(vm, 'input', _scope_, _element_, form); - scope = _scope_; - CreateSelect2({ - element: `#${scope.state._formId}_${scope.state.id}_dynamic_select`, - model: 'state._value', - multiple: false, - addNew: true, - scope, - options: 'state._data' - }); - vm.check(); - }; -} - -AtDynamicSelectController.$inject = ['BaseInputController', 'CreateSelect2']; - -function atDynamicSelect () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^at-form', 'atDynamicSelect'], - templateUrl, - controller: AtDynamicSelectController, - controllerAs: 'vm', - link: atDynamicSelectLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atDynamicSelect; diff --git a/awx/ui/client/lib/components/input/dynamic-select.partial.html b/awx/ui/client/lib/components/input/dynamic-select.partial.html deleted file mode 100644 index b1b5eaf616..0000000000 --- a/awx/ui/client/lib/components/input/dynamic-select.partial.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
- -
- -
- -
-
diff --git a/awx/ui/client/lib/components/input/file.directive.js b/awx/ui/client/lib/components/input/file.directive.js deleted file mode 100644 index 42aa2c4fba..0000000000 --- a/awx/ui/client/lib/components/input/file.directive.js +++ /dev/null @@ -1,94 +0,0 @@ -const templateUrl = require('~components/input/file.partial.html'); - -function atInputFileLink (scope, element, attrs, controllers) { - const formController = controllers[0]; - const inputController = controllers[1]; - - if (scope.tab === '1') { - element.find('input')[0].focus(); - } - - inputController.init(scope, element, formController); -} - -function AtInputFileController (baseInputController, eventService) { - const vm = this || {}; - - let input; - let scope; - - vm.init = (_scope_, element, form) => { - baseInputController.call(vm, 'input', _scope_, element, form); - - scope = _scope_; - input = element.find('input')[0]; // eslint-disable-line prefer-destructuring - - vm.listeners = vm.setFileListeners(input); - - vm.check(); - }; - - vm.onButtonClick = () => { - if (scope.state._value) { - vm.removeFile(); - } else { - input.click(); - } - }; - - vm.setFileListeners = inputEl => eventService.addListeners([ - [inputEl, 'change', event => vm.handleFileChangeEvent(inputEl, event)] - ]); - - vm.handleFileChangeEvent = (element, event) => { - if (element.files.length > 0) { - const reader = new FileReader(); - - reader.onload = () => vm.readFile(reader, event); - reader.readAsText(element.files[0]); - } else { - scope.$apply(vm.removeFile); - } - }; - - vm.readFile = (reader, event) => { - scope.$apply(() => { - scope.state._value = reader.result; - scope.state._displayValue = event.target.files[0].name; - - vm.check(); - }); - }; - - vm.removeFile = () => { - delete scope.state._value; - delete scope.state._displayValue; - - input.value = ''; - }; -} - -AtInputFileController.$inject = [ - 'BaseInputController', - 'EventService' -]; - -function atInputFile () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atInputFile'], - templateUrl, - controller: AtInputFileController, - controllerAs: 'vm', - link: atInputFileLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputFile; diff --git a/awx/ui/client/lib/components/input/file.partial.html b/awx/ui/client/lib/components/input/file.partial.html deleted file mode 100644 index d779bf4c62..0000000000 --- a/awx/ui/client/lib/components/input/file.partial.html +++ /dev/null @@ -1,28 +0,0 @@ -
-
- - -
- - - - -
- -
-
diff --git a/awx/ui/client/lib/components/input/group.directive.js b/awx/ui/client/lib/components/input/group.directive.js deleted file mode 100644 index 5272b6cbe7..0000000000 --- a/awx/ui/client/lib/components/input/group.directive.js +++ /dev/null @@ -1,209 +0,0 @@ -const templateUrl = require('~components/input/group.partial.html'); - -function atInputGroupLink (scope, el, attrs, controllers) { - const groupController = controllers[0]; - const formController = controllers[1]; - const element = el[0].getElementsByClassName('at-InputGroup-container')[0]; - - groupController.init(scope, formController, element); -} - -function AtInputGroupController ($scope, $compile) { - const vm = this || {}; - - let form; - let scope; - let state; - let source; - let element; - let formId; - - vm.init = (_scope_, _form_, _element_) => { - form = _form_; - scope = _scope_; - element = _element_; - state = scope.state || {}; - source = state._source; - ({ formId } = scope); - - $scope.$watch('state._source._value', vm.update); - }; - - vm.isValidSource = () => { - if (!source._value || source._value === state._value) { - return false; - } - - return true; - }; - - vm.update = () => { - if (state._group) { - vm.clear(); - } - - if (!vm.isValidSource()) { - return; - } - - state._value = source._value; - - const inputs = state._get(form); - const group = vm.createComponentConfigs(inputs); - - vm.insert(group); - state._group = group; - }; - - vm.createComponentConfigs = inputs => { - const group = []; - - if (inputs) { - inputs.forEach((input, i) => { - input = Object.assign(input, vm.getComponentType(input)); - - group.push(Object.assign({ - _element: vm.createComponent(input, i), - _key: 'inputs', - _group: true, - _groupIndex: i, - _onInputLookup: state._onInputLookup, - _onRemoveTag: state._onRemoveTag, - }, input)); - }); - } - - return group; - }; - - vm.getComponentType = input => { - const config = { - _formId: formId - }; - - if (input.type === 'string') { - if (input._isDynamic) { - config._component = 'at-dynamic-select'; - config._format = 'array'; - config._data = input._choices; - config._exp = 'choice for (index, choice) in state._data'; - config._isDynamic = true; - } else if (!input.multiline) { - if (input.secret) { - config._component = 'at-input-secret'; - } else { - config._component = 'at-input-text'; - } - } else { - config._expand = true; - - if (input.secret) { - config._component = 'at-input-textarea-secret'; - input.format = 'ssh_private_key'; - } else { - config._component = 'at-input-textarea'; - } - } - - if (input.format === 'ssh_private_key') { - config._format = 'ssh-key'; - } - } else if (input.type === 'number') { - config._component = 'at-input-number'; - } else if (input.type === 'boolean') { - config._component = 'at-input-checkbox'; - } else if (input.type === 'file') { - config._component = 'at-input-file'; - } - - if (input.choices) { - config._component = 'at-input-select'; - config._format = 'array'; - config._data = input.choices; - config._exp = 'choice for (index, choice) in state._data'; - } - - if (!config._component) { - const preface = vm.strings.get('group.UNSUPPORTED_ERROR_PREFACE'); - throw new Error(`${preface}: ${input.type}`); - } - - return config; - }; - - vm.insert = group => { - const container = document.createElement('div'); - container.className = 'row'; - let col = 1; - const colPerRow = 12 / scope.col; - let isDivided = true; - - group.forEach((input, i) => { - if (input._expand && !isDivided) { - container.appendChild(vm.createDivider()[0]); - } - - container.appendChild(input._element[0]); - - if ((input._expand || col % colPerRow === 0) && i !== group.length - 1) { - container.appendChild(vm.createDivider()[0]); - isDivided = true; - col = 0; - } else { - isDivided = false; - } - - col++; - }); - - element.appendChild(container); - }; - - vm.createComponent = (input, index) => { - const tabindex = Number(scope.tab) + index; - const col = input._expand ? 12 : scope.col; - const component = angular.element(`<${input._component} col="${col}" tab="${tabindex}" - state="${state._reference}._group[${index}]" id="${formId}_${input.id}_group"> - `); - - $compile(component)(scope.$parent); - return component; - }; - - vm.createDivider = () => { - const divider = angular.element(''); - $compile(divider[0])(scope.$parent); - - return divider; - }; - - vm.clear = () => { - form.deregisterInputGroup(state._group); - element.innerHTML = ''; - state._group = undefined; - state._value = undefined; - }; -} - -AtInputGroupController.$inject = ['$scope', '$compile']; - -function atInputGroup () { - return { - restrict: 'E', - replace: true, - transclude: true, - require: ['atInputGroup', '^^atForm'], - templateUrl, - controller: AtInputGroupController, - controllerAs: 'vm', - link: atInputGroupLink, - scope: { - state: '=', - col: '@', - tab: '@', - formId: '@' - } - }; -} - -export default atInputGroup; diff --git a/awx/ui/client/lib/components/input/group.partial.html b/awx/ui/client/lib/components/input/group.partial.html deleted file mode 100644 index c32d29bb1e..0000000000 --- a/awx/ui/client/lib/components/input/group.partial.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-
-
-

- -

-
-
-
-
-
diff --git a/awx/ui/client/lib/components/input/label.directive.js b/awx/ui/client/lib/components/input/label.directive.js deleted file mode 100644 index ea1fafd23a..0000000000 --- a/awx/ui/client/lib/components/input/label.directive.js +++ /dev/null @@ -1,11 +0,0 @@ -const templateUrl = require('~components/input/label.partial.html'); - -function atInputLabel () { - return { - restrict: 'E', - replace: true, - templateUrl - }; -} - -export default atInputLabel; diff --git a/awx/ui/client/lib/components/input/label.partial.html b/awx/ui/client/lib/components/input/label.partial.html deleted file mode 100644 index 5f4cab5ee9..0000000000 --- a/awx/ui/client/lib/components/input/label.partial.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/awx/ui/client/lib/components/input/lookup.directive.js b/awx/ui/client/lib/components/input/lookup.directive.js deleted file mode 100644 index 43810d1796..0000000000 --- a/awx/ui/client/lib/components/input/lookup.directive.js +++ /dev/null @@ -1,152 +0,0 @@ -const templateUrl = require('~components/input/lookup.partial.html'); - -const DEFAULT_DEBOUNCE = 250; -const DEFAULT_KEY = 'name'; - -function atInputLookupLink (scope, element, attrs, controllers) { - const formController = controllers[0]; - const inputController = controllers[1]; - - if (scope.tab === '1') { - element.find('input')[0].focus(); - } - - inputController.init(scope, element, formController); -} - -function AtInputLookupController (baseInputController, $q, $state) { - const vm = this || {}; - - let scope; - let model; - let search; - - vm.init = (_scope_, element, form) => { - baseInputController.call(vm, 'input', _scope_, element, form); - - scope = _scope_; - model = scope.state._model; - scope.state._debounce = scope.state._debounce || DEFAULT_DEBOUNCE; - search = scope.state._search || { - key: DEFAULT_KEY, - config: { - unique: true - } - }; - - // This should get triggered when the user selects something in the lookup modal and - // hits save to close the modal. This won't get triggered when the user types in - // a value in the input. - scope.$watch('state._idFromModal', () => { - if (scope.state._idFromModal && - (scope.state._idFromModal !== scope.state._value) - ) { - vm.search({ id: scope.state._idFromModal }); - } - }); - - vm.check(); - }; - - vm.lookup = () => { - const params = {}; - - if (scope.state._value && scope.state._isValid) { - params.selected = scope.state._value; - } - - $state.go(scope.state._route, params); - }; - - vm.reset = () => { - scope.state._idFromModal = undefined; - scope.state._value = undefined; - scope[scope.state._resource] = undefined; - }; - - vm.searchAfterDebounce = () => { - vm.isDebouncing = true; - - vm.debounce = window.setTimeout(() => { - vm.isDebouncing = false; - vm.search(); - }, scope.state._debounce); - }; - - vm.resetDebounce = () => { - clearTimeout(vm.debounce); - vm.searchAfterDebounce(); - }; - - vm.search = (searchParams) => { - scope.state._touched = true; - - if (!scope.state._required && - scope.state._displayValue === '' && - !scope.state._idFromModal - ) { - scope.state._value = null; - return vm.check({ isValid: true }); - } - searchParams = searchParams || { [search.key]: scope.state._displayValue }; - - return model.search(searchParams, search.config) - .then(found => { - if (!found) { - vm.reset(); - return; - } - scope[scope.state._resource] = model.get('id'); - scope.state._value = model.get('id'); - scope.state._displayValue = model.get('name'); - scope.state._idFromModal = undefined; - }) - .catch(() => vm.reset()) - .finally(() => { - const isValid = scope.state._value !== undefined; - const message = isValid ? '' : vm.strings.get('lookup.NOT_FOUND'); - - vm.check({ isValid, message }); - }); - }; - - vm.searchOnInput = () => { - if (vm.isDebouncing) { - vm.resetDebounce(); - - return; - } - - vm.searchAfterDebounce(); - }; - - vm.removeTag = (tagToRemove) => { - _.remove(scope.state._value, (tag) => tag === tagToRemove); - }; -} - -AtInputLookupController.$inject = [ - 'BaseInputController', - '$q', - '$state' -]; - -function atInputLookup () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atInputLookup'], - templateUrl, - controller: AtInputLookupController, - controllerAs: 'vm', - link: atInputLookupLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputLookup; diff --git a/awx/ui/client/lib/components/input/lookup.partial.html b/awx/ui/client/lib/components/input/lookup.partial.html deleted file mode 100644 index 62eb2145da..0000000000 --- a/awx/ui/client/lib/components/input/lookup.partial.html +++ /dev/null @@ -1,36 +0,0 @@ -
-
- - -
- - - - -
- - -
-
-
- - -
-
diff --git a/awx/ui/client/lib/components/input/message.directive.js b/awx/ui/client/lib/components/input/message.directive.js deleted file mode 100644 index 6e4dba6da3..0000000000 --- a/awx/ui/client/lib/components/input/message.directive.js +++ /dev/null @@ -1,11 +0,0 @@ -const templateUrl = require('~components/input/message.partial.html'); - -function atInputMessage () { - return { - restrict: 'E', - replace: true, - templateUrl - }; -} - -export default atInputMessage; diff --git a/awx/ui/client/lib/components/input/message.partial.html b/awx/ui/client/lib/components/input/message.partial.html deleted file mode 100644 index cb73ab9620..0000000000 --- a/awx/ui/client/lib/components/input/message.partial.html +++ /dev/null @@ -1,4 +0,0 @@ -

- {{ state._message }} -

- diff --git a/awx/ui/client/lib/components/input/secret.directive.js b/awx/ui/client/lib/components/input/secret.directive.js deleted file mode 100644 index de16f12269..0000000000 --- a/awx/ui/client/lib/components/input/secret.directive.js +++ /dev/null @@ -1,90 +0,0 @@ -const templateUrl = require('~components/input/secret.partial.html'); - -function atInputSecretLink (scope, element, attrs, controllers) { - const formController = controllers[0]; - const inputController = controllers[1]; - - if (scope.tab === '1') { - element.find('input')[0].focus(); - } - - inputController.init(scope, element, formController); -} - -function AtInputSecretController (baseInputController) { - const vm = this || {}; - - let scope; - - vm.init = (_scope_, element, form) => { - baseInputController.call(vm, 'input', _scope_, element, form); - - scope = _scope_; - scope.type = 'password'; - scope.state._show = false; - scope.state._showHideText = vm.strings.get('SHOW'); - - if (!scope.state._value || scope.state._promptOnLaunch) { - scope.mode = 'input'; - } else { - scope.mode = 'encrypted'; - scope.state._placeholder = vm.strings.get('ENCRYPTED'); - scope.state._buttonText = vm.strings.get('REPLACE'); - } - - vm.check(); - }; - - vm.toggleRevertReplace = () => { - scope.state._isBeingReplaced = !scope.state._isBeingReplaced; - - vm.onRevertReplaceToggle(); - - if (scope.state._isBeingReplaced) { - if (scope.type !== 'password') { - vm.toggleShowHide(); - } - } - }; - - vm.toggleShowHide = () => { - if (scope.type === 'password') { - scope.type = 'text'; - scope.state._show = true; - scope.state._showHideText = vm.strings.get('HIDE'); - } else { - scope.type = 'password'; - scope.state._show = false; - scope.state._showHideText = vm.strings.get('SHOW'); - } - }; - - vm.onLookupClick = () => { - if (scope.state._onInputLookup) { - const { id, label, required, type } = scope.state; - scope.state._onInputLookup({ id, label, required, type }); - } - }; -} - -AtInputSecretController.$inject = ['BaseInputController']; - -function atInputSecret () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atInputSecret'], - templateUrl, - controller: AtInputSecretController, - controllerAs: 'vm', - link: atInputSecretLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputSecret; diff --git a/awx/ui/client/lib/components/input/secret.partial.html b/awx/ui/client/lib/components/input/secret.partial.html deleted file mode 100644 index 9f72965e7c..0000000000 --- a/awx/ui/client/lib/components/input/secret.partial.html +++ /dev/null @@ -1,74 +0,0 @@ -
-
- - -
- - - - -
- - -
-
- - - - - - - -
- - -
-
diff --git a/awx/ui/client/lib/components/input/select.directive.js b/awx/ui/client/lib/components/input/select.directive.js deleted file mode 100644 index ddc0e23766..0000000000 --- a/awx/ui/client/lib/components/input/select.directive.js +++ /dev/null @@ -1,96 +0,0 @@ -const templateUrl = require('~components/input/select.partial.html'); - -function atInputSelectLink (scope, element, attrs, controllers) { - const [formController, inputController] = controllers; - - inputController.init(scope, element, formController); -} - -function AtInputSelectController (baseInputController, eventService) { - const vm = this || {}; - - let scope; - let element; - let input; - let select; - - vm.init = (_scope_, _element_, form) => { - baseInputController.call(vm, 'input', _scope_, _element_, form); - - scope = _scope_; - element = _element_; - [input] = element.find('input'); - [select] = element.find('select'); - - if (scope.tab === '1') { - select.focus(); - } - - if (!scope.state._data || scope.state._data.length === 0) { - scope.state._disabled = true; - scope.state._placeholder = vm.strings.get('select.EMPTY_PLACEHOLDER'); - } - - vm.setListeners(); - vm.check(); - - if (scope.state._value) { - vm.updateDisplayModel(); - } - }; - - vm.setListeners = () => { - const listeners = eventService.addListeners([ - [input, 'focus', () => select.focus], - [select, 'mousedown', () => scope.$apply(() => { scope.open = !scope.open; })], - [select, 'focus', () => input.classList.add('at-Input--focus')], - [select, 'change', () => scope.$apply(() => { - scope.open = false; - vm.updateDisplayModel(); - vm.check(); - })], - [select, 'blur', () => { - input.classList.remove('at-Input--focus'); - scope.open = scope.open && false; - }] - ]); - - scope.$on('$destroy', () => eventService.remove(listeners)); - }; - - vm.updateDisplayModel = () => { - if (scope.state._format === 'selectFromOptions') { - scope.displayModel = scope.state._value[1]; - } else if (scope.state._format === 'array') { - scope.displayModel = scope.state._value; - } else if (scope.state._format === 'objects') { - scope.displayModel = scope.state._value[scope.state._display]; - } else if (scope.state._format === 'grouped-object') { - scope.displayModel = scope.state._value[scope.state._display]; - } else { - throw new Error(vm.strings.get('select.UNSUPPORTED_TYPE_ERROR')); - } - }; -} - -AtInputSelectController.$inject = ['BaseInputController', 'EventService']; - -function atInputSelect () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^at-form', 'atInputSelect'], - templateUrl, - controller: AtInputSelectController, - controllerAs: 'vm', - link: atInputSelectLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputSelect; diff --git a/awx/ui/client/lib/components/input/select.partial.html b/awx/ui/client/lib/components/input/select.partial.html deleted file mode 100644 index f3ba5e845a..0000000000 --- a/awx/ui/client/lib/components/input/select.partial.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
- - -
- - - - - -
- - -
-
diff --git a/awx/ui/client/lib/components/input/slider.directive.js b/awx/ui/client/lib/components/input/slider.directive.js deleted file mode 100644 index a2e1b8c28e..0000000000 --- a/awx/ui/client/lib/components/input/slider.directive.js +++ /dev/null @@ -1,38 +0,0 @@ -const templateUrl = require('~components/input/slider.partial.html'); - -function atInputSliderLink (scope, element, attrs, controllers) { - const [formController, inputController] = controllers; - - inputController.init(scope, element, formController); -} - -function atInputSliderController (baseInputController) { - const vm = this || {}; - - vm.init = (_scope_, _element_, form) => { - baseInputController.call(vm, 'input', _scope_, _element_, form); - - vm.check(); - }; -} - -atInputSliderController.$inject = ['BaseInputController']; - -function atInputSlider () { - return { - restrict: 'E', - require: ['^^atForm', 'atInputSlider'], - replace: true, - templateUrl, - controller: atInputSliderController, - controllerAs: 'vm', - link: atInputSliderLink, - scope: { - state: '=?', - col: '@', - tab: '@' - } - }; -} - -export default atInputSlider; diff --git a/awx/ui/client/lib/components/input/slider.partial.html b/awx/ui/client/lib/components/input/slider.partial.html deleted file mode 100644 index e07abdadfa..0000000000 --- a/awx/ui/client/lib/components/input/slider.partial.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
- -
- -

{{ state._value }}%

-
-
-
diff --git a/awx/ui/client/lib/components/input/text.directive.js b/awx/ui/client/lib/components/input/text.directive.js deleted file mode 100644 index c24c807cd4..0000000000 --- a/awx/ui/client/lib/components/input/text.directive.js +++ /dev/null @@ -1,57 +0,0 @@ -const templateUrl = require('~components/input/text.partial.html'); - -function atInputTextLink (scope, element, attrs, controllers) { - const formController = controllers[0]; - const inputController = controllers[1]; - - if (scope.tab === '1') { - const el = element.find('input')[0]; - if (el) { - el.focus(); - } - } - - inputController.init(scope, element, formController); -} - -function AtInputTextController (baseInputController) { - const vm = this || {}; - - let scope; - - vm.init = (_scope_, element, form) => { - baseInputController.call(vm, 'input', _scope_, element, form); - scope = _scope_; - - scope.$watch('state._value', () => vm.check()); - }; - - vm.onLookupClick = () => { - if (scope.state._onInputLookup) { - const { id, label, required, type } = scope.state; - scope.state._onInputLookup({ id, label, required, type }); - } - }; -} - -AtInputTextController.$inject = ['BaseInputController']; - -function atInputText () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atInputText'], - templateUrl, - controller: AtInputTextController, - controllerAs: 'vm', - link: atInputTextLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputText; diff --git a/awx/ui/client/lib/components/input/text.partial.html b/awx/ui/client/lib/components/input/text.partial.html deleted file mode 100644 index 0d9fb78e17..0000000000 --- a/awx/ui/client/lib/components/input/text.partial.html +++ /dev/null @@ -1,53 +0,0 @@ -
-
- -
- - - - -
- - - -
-
- -
- - -
-
diff --git a/awx/ui/client/lib/components/input/textarea-secret.directive.js b/awx/ui/client/lib/components/input/textarea-secret.directive.js deleted file mode 100644 index fb4b29d870..0000000000 --- a/awx/ui/client/lib/components/input/textarea-secret.directive.js +++ /dev/null @@ -1,129 +0,0 @@ -const templateUrl = require('~components/input/textarea-secret.partial.html'); - -function atInputTextareaSecretLink (scope, element, attrs, controllers) { - const [formController, inputController] = controllers; - - if (scope.tab === '1') { - element.find('textarea')[0].focus(); - } - - inputController.init(scope, element, formController); -} - -function AtInputTextareaSecretController (baseInputController, eventService) { - const vm = this || {}; - - let scope; - let textarea; - let input; - - vm.init = (_scope_, element, form) => { - baseInputController.call(vm, 'input', _scope_, element, form); - - scope = _scope_; - - [textarea] = element.find('textarea'); - - if (scope.state.format === 'ssh_private_key') { - scope.ssh = true; - scope.state._hint = scope.state._hint || vm.strings.get('textarea.SSH_KEY_HINT'); - [input] = element.find('input'); - } - - if (scope.state._value) { - scope.state._buttonText = vm.strings.get('REPLACE'); - scope.state._placeholder = vm.strings.get('ENCRYPTED'); - } else if (scope.state.format === 'ssh_private_key') { - vm.listeners = vm.setFileListeners(textarea, input); - scope.state._displayHint = true; - } - - vm.check(); - - scope.$watch('state[state._activeModel]', () => vm.check()); - scope.$watch('state._isBeingReplaced', () => vm.onIsBeingReplacedChanged()); - }; - - vm.onIsBeingReplacedChanged = () => { - if (!scope.state) return; - if (!scope.state._touched) return; - - vm.onRevertReplaceToggle(); - - if (scope.state._isBeingReplaced) { - scope.state._placeholder = ''; - scope.state._displayHint = true; - vm.listeners = vm.setFileListeners(textarea, input); - } else { - scope.state._displayHint = false; - scope.state._placeholder = vm.strings.get('ENCRYPTED'); - - if (vm.listeners) { - eventService.remove(vm.listeners); - } - } - }; - - vm.setFileListeners = (textareaEl, inputEl) => eventService.addListeners([ - [textareaEl, 'dragenter', event => { - event.stopPropagation(); - event.preventDefault(); - scope.$apply(() => { scope.drag = true; }); - }], - - [inputEl, 'dragleave', event => { - event.stopPropagation(); - event.preventDefault(); - scope.$apply(() => { scope.drag = false; }); - }], - - [inputEl, 'change', event => { - const reader = new FileReader(); - - reader.onload = () => vm.readFile(reader, event); - reader.readAsText(inputEl.files[0]); - }] - ]); - - vm.readFile = (reader) => { - scope.$apply(() => { - scope.state._value = reader.result; - vm.check(); - scope.drag = false; - input.value = ''; - }); - }; - - vm.onLookupClick = () => { - if (scope.state._onInputLookup) { - const { id, label, required, type } = scope.state; - scope.state._onInputLookup({ id, label, required, type }); - } - }; -} - -AtInputTextareaSecretController.$inject = [ - 'BaseInputController', - 'EventService', - 'ComponentsStrings' -]; - -function atInputTextareaSecret () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atInputTextareaSecret'], - templateUrl, - controller: AtInputTextareaSecretController, - controllerAs: 'vm', - link: atInputTextareaSecretLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputTextareaSecret; diff --git a/awx/ui/client/lib/components/input/textarea-secret.partial.html b/awx/ui/client/lib/components/input/textarea-secret.partial.html deleted file mode 100644 index 912dc4160b..0000000000 --- a/awx/ui/client/lib/components/input/textarea-secret.partial.html +++ /dev/null @@ -1,70 +0,0 @@ -
-
- -
-
- -
- -
-
- - -
-
- -
- -
-
- -
-
diff --git a/awx/ui/client/lib/components/input/textarea.directive.js b/awx/ui/client/lib/components/input/textarea.directive.js deleted file mode 100644 index 2456f90252..0000000000 --- a/awx/ui/client/lib/components/input/textarea.directive.js +++ /dev/null @@ -1,53 +0,0 @@ -const templateUrl = require('~components/input/textarea.partial.html'); - -function atInputTextareaLink (scope, element, attrs, controllers) { - const formController = controllers[0]; - const inputController = controllers[1]; - - if (scope.tab === '1') { - element.find('input')[0].focus(); - } - - inputController.init(scope, element, formController); -} - -function AtInputTextareaController (baseInputController) { - const vm = this || {}; - let scope; - - vm.init = (_scope_, element, form) => { - baseInputController.call(vm, 'input', _scope_, element, form); - scope = _scope_; - - vm.check(); - }; - - vm.onLookupClick = () => { - if (scope.state._onInputLookup) { - const { id, label, required, type } = scope.state; - scope.state._onInputLookup({ id, label, required, type }); - } - }; -} - -AtInputTextareaController.$inject = ['BaseInputController']; - -function atInputTextarea () { - return { - restrict: 'E', - transclude: true, - replace: true, - require: ['^^atForm', 'atInputTextarea'], - templateUrl, - controller: AtInputTextareaController, - controllerAs: 'vm', - link: atInputTextareaLink, - scope: { - state: '=', - col: '@', - tab: '@' - } - }; -} - -export default atInputTextarea; diff --git a/awx/ui/client/lib/components/input/textarea.partial.html b/awx/ui/client/lib/components/input/textarea.partial.html deleted file mode 100644 index 044d2c119f..0000000000 --- a/awx/ui/client/lib/components/input/textarea.partial.html +++ /dev/null @@ -1,45 +0,0 @@ -
-
- -
-
- -
-
-
- - -
-
- -
New lines are not supported in this field
-
diff --git a/awx/ui/client/lib/components/tabs/_index.less b/awx/ui/client/lib/components/tabs/_index.less deleted file mode 100644 index 80b9eec5c6..0000000000 --- a/awx/ui/client/lib/components/tabs/_index.less +++ /dev/null @@ -1,28 +0,0 @@ -.at-Tab { - margin: 0 @at-margin-item-column 0 0; - font-size: @at-font-size-body; - line-height: 1; -} - -.at-Tab--active { - &, &:hover, &:active, &:focus { - color: @at-color-tab-text-default-active; - background-color: @at-color-tab-default-active; - border-color: @at-color-tab-border-default-active; - cursor: default; - } -} - -.at-Tab--disabled { - &, &:hover, &:active, &:focus { - background-color: @at-color-tab-default-disabled; - color: @at-color-tab-text-default-disabled; - border-color: @at-color-tab-border-default-disabled; - opacity: 0.65; - cursor: not-allowed; - } -} - -.at-TabGroup--padBelow { - margin-bottom: 20px; -} diff --git a/awx/ui/client/lib/components/tabs/group.directive.js b/awx/ui/client/lib/components/tabs/group.directive.js deleted file mode 100644 index d3c55a295f..0000000000 --- a/awx/ui/client/lib/components/tabs/group.directive.js +++ /dev/null @@ -1,36 +0,0 @@ -const templateUrl = require('~components/tabs/group.partial.html'); - -function AtTabGroupController () { - const vm = this; - - vm.tabs = []; - - vm.register = tab => { - tab.active = true; - - vm.tabs.push(tab); - }; - - vm.clearActive = () => { - vm.tabs.forEach((tab) => { - tab.state._active = false; - }); - }; -} - -function atTabGroup () { - return { - restrict: 'E', - replace: true, - require: 'atTabGroup', - transclude: true, - templateUrl, - controller: AtTabGroupController, - controllerAs: 'vm', - scope: { - state: '=' - } - }; -} - -export default atTabGroup; diff --git a/awx/ui/client/lib/components/tabs/group.partial.html b/awx/ui/client/lib/components/tabs/group.partial.html deleted file mode 100644 index 325fb36cc5..0000000000 --- a/awx/ui/client/lib/components/tabs/group.partial.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/awx/ui/client/lib/components/tabs/tab.directive.js b/awx/ui/client/lib/components/tabs/tab.directive.js deleted file mode 100644 index 85dc5f4d2c..0000000000 --- a/awx/ui/client/lib/components/tabs/tab.directive.js +++ /dev/null @@ -1,57 +0,0 @@ -const templateUrl = require('~components/tabs/tab.partial.html'); - -function atTabLink (scope, el, attrs, controllers) { - const groupController = controllers[0]; - const tabController = controllers[1]; - - tabController.init(scope, groupController); -} - -function AtTabController ($state) { - const vm = this; - - let scope; - let group; - - vm.init = (_scope_, _group_) => { - scope = _scope_; - group = _group_; - - group.register(scope); - }; - - vm.handleClick = () => { - if (scope.state._disabled || scope.state._active) { - return; - } - if (scope.state._go) { - $state.go(scope.state._go, scope.state._params, { reload: true }); - return; - } - group.clearActive(); - scope.state._active = true; - if (scope.state._onClickActivate) { - scope.state._onClickActivate(); - } - }; -} - -AtTabController.$inject = ['$state']; - -function atTab () { - return { - restrict: 'E', - replace: true, - transclude: true, - require: ['^^atTabGroup', 'atTab'], - templateUrl, - controller: AtTabController, - controllerAs: 'vm', - link: atTabLink, - scope: { - state: '=' - } - }; -} - -export default atTab; diff --git a/awx/ui/client/lib/components/tabs/tab.partial.html b/awx/ui/client/lib/components/tabs/tab.partial.html deleted file mode 100644 index 5b77e02841..0000000000 --- a/awx/ui/client/lib/components/tabs/tab.partial.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/awx/ui/client/lib/components/tag/_index.less b/awx/ui/client/lib/components/tag/_index.less deleted file mode 100644 index 486b304337..0000000000 --- a/awx/ui/client/lib/components/tag/_index.less +++ /dev/null @@ -1,85 +0,0 @@ -.TagComponent { - color: @at-white; - cursor: default; - background: @at-blue; - border-radius: @at-space; - font-size: 12px; - display: flex; - flex-direction: row; - align-content: center; - min-height: @at-space-4x; - overflow: hidden; - max-width: 200px; - margin: @at-space 0; - - &:last-of-type { - margin-right: 20px; - } -} - -.TagComponent-name { - color: @at-white; - margin: 2px @at-space-2x; - align-self: center; - /* fallback for FF < 68 which doesn't support `break-word` */ - word-break: break-all; - word-break: break-word; - - &:hover, - &:focus { - color: @at-white; - } -} - -.TagComponent-icon { - .at-mixin-VerticallyCenter(); - line-height: 20px; - margin-left: @at-space-2x; - - &--cloud:before, - &--aws:before, - &--tower:before, - &--azure_rm:before, - { - content: '\f0c2'; - } - - &--insights:before { - content: '\f129'; - } - - &--net:before { - content: '\f0e8'; - } - - &--scm:before { - content: '\f126'; - } - - &--ssh:before { - content: '\f084'; - } - - &--vault:before { - content: '\f187'; - } - - &--external:before { - content: '\f14c' - } - - &--kubernetes:before, &--kubernetes_bearer_token:before { - content: '\f0c2'; - } -} - -.TagComponent-button { - padding: 0 @at-space; - .at-mixin-VerticallyCenter(); -} - -.TagComponent-button:hover { - cursor: pointer; - border-color: @at-color-error; - background-color: @at-color-error; -} diff --git a/awx/ui/client/lib/components/tag/tag.directive.js b/awx/ui/client/lib/components/tag/tag.directive.js deleted file mode 100644 index f18ae9dce9..0000000000 --- a/awx/ui/client/lib/components/tag/tag.directive.js +++ /dev/null @@ -1,18 +0,0 @@ -const templateUrl = require('~components/tag/tag.partial.html'); - -function atTag () { - return { - restrict: 'E', - replace: true, - transclude: true, - templateUrl, - scope: { - tag: '=', - icon: '@?', - link: '@?', - removeTag: '&?', - }, - }; -} - -export default atTag; diff --git a/awx/ui/client/lib/components/tag/tag.partial.html b/awx/ui/client/lib/components/tag/tag.partial.html deleted file mode 100644 index f16da4da42..0000000000 --- a/awx/ui/client/lib/components/tag/tag.partial.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
- {{ tag }} -
{{ tag }}
-
- -
-
\ No newline at end of file diff --git a/awx/ui/client/lib/components/toggle-tag/_index.less b/awx/ui/client/lib/components/toggle-tag/_index.less deleted file mode 100644 index 18639c5648..0000000000 --- a/awx/ui/client/lib/components/toggle-tag/_index.less +++ /dev/null @@ -1,19 +0,0 @@ -.ToggleComponent-wrapper { - line-height: initial; -} - -.ToggleComponent-container { - display: flex; - flex-wrap: wrap; -} - -.ToggleComponent-button { - border: none; - background: transparent; - color: @at-blue; - font-size: @at-font-size; - - &:hover { - color: @at-blue-hover; - } -} \ No newline at end of file diff --git a/awx/ui/client/lib/components/toggle-tag/constants.js b/awx/ui/client/lib/components/toggle-tag/constants.js deleted file mode 100644 index f3a4951c9c..0000000000 --- a/awx/ui/client/lib/components/toggle-tag/constants.js +++ /dev/null @@ -1,2 +0,0 @@ -export const TRUNCATE_LENGTH = 5; -export const IS_TRUNCATED = true; diff --git a/awx/ui/client/lib/components/toggle-tag/toggle-tag.directive.js b/awx/ui/client/lib/components/toggle-tag/toggle-tag.directive.js deleted file mode 100644 index 4fec4cd794..0000000000 --- a/awx/ui/client/lib/components/toggle-tag/toggle-tag.directive.js +++ /dev/null @@ -1,32 +0,0 @@ -import { IS_TRUNCATED, TRUNCATE_LENGTH } from './constants'; - -const templateUrl = require('~components/toggle-tag/toggle-tag.partial.html'); - -function controller (strings) { - const vm = this; - vm.truncatedLength = TRUNCATE_LENGTH; - vm.isTruncated = IS_TRUNCATED; - vm.strings = strings; - - vm.toggle = () => { - vm.isTruncated = !vm.isTruncated; - }; -} - -controller.$inject = ['ComponentsStrings']; - -function atToggleTag () { - return { - restrict: 'E', - replace: true, - transclude: true, - controller, - controllerAs: 'vm', - templateUrl, - scope: { - tags: '=', - }, - }; -} - -export default atToggleTag; diff --git a/awx/ui/client/lib/components/toggle-tag/toggle-tag.partial.html b/awx/ui/client/lib/components/toggle-tag/toggle-tag.partial.html deleted file mode 100644 index fada04154e..0000000000 --- a/awx/ui/client/lib/components/toggle-tag/toggle-tag.partial.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
-
- -
- -
-
-
- -
- -
-
-
-
- -
-
-
diff --git a/awx/ui/client/lib/components/truncate/_index.less b/awx/ui/client/lib/components/truncate/_index.less deleted file mode 100644 index b4e4cb9dd5..0000000000 --- a/awx/ui/client/lib/components/truncate/_index.less +++ /dev/null @@ -1,35 +0,0 @@ -.at-Truncate { - display: inline-block; - - .at-Truncate-text { - font-family: monospace, Courier, "Courier New", "Open Sans", sans-serif; - } - - .at-Truncate-tag { - display: inherit; - } - - .at-Truncate-copy { - color: @at-gray-b7; - cursor: pointer; - margin: 0 20px 0 0; - display: inherit; - - i:hover { - color: @at-blue; - } - } - - .at-Truncate-textarea { - background: transparent; - border: none; - box-shadow: none; - height: 2em; - left: 0px; - outline: none; - padding: 0px; - position: fixed; - top: 0px; - width: 2em; - } -} diff --git a/awx/ui/client/lib/components/truncate/truncate.directive.js b/awx/ui/client/lib/components/truncate/truncate.directive.js deleted file mode 100644 index 8cc3df8bef..0000000000 --- a/awx/ui/client/lib/components/truncate/truncate.directive.js +++ /dev/null @@ -1,66 +0,0 @@ -const templateUrl = require('~components/truncate/truncate.partial.html'); - -function atTruncateLink (scope, el, attr, ctrl) { - const truncateController = ctrl; - const { string } = attr; - const { maxlength } = attr; - - truncateController.init(el, string, maxlength); -} - -function AtTruncateController (strings) { - const vm = this; - let el; - let string; - let maxlength; - vm.strings = strings; - - vm.init = (_el_, _string_, _maxlength_) => { - el = _el_; - string = _string_; - maxlength = _maxlength_; - vm.truncatedString = string.substring(0, maxlength); - }; - - vm.copyToClipboard = () => { - vm.tooltip.popover.text = vm.strings.get('truncate.COPIED'); - - const textarea = el[0].getElementsByClassName('at-Truncate-textarea')[0]; - textarea.value = string; - textarea.select(); - - document.execCommand('copy'); - }; - - vm.tooltip = { - popover: { - text: vm.strings.get('truncate.DEFAULT'), - on: 'mouseover', - position: 'top', - icon: 'fa fa-clone', - resetOnExit: true, - click: vm.copyToClipboard - } - }; -} - -AtTruncateController.$inject = ['ComponentsStrings']; - -function atTruncate () { - return { - restrict: 'E', - replace: true, - transclude: true, - templateUrl, - controller: AtTruncateController, - controllerAs: 'vm', - link: atTruncateLink, - scope: { - state: '=', - maxLength: '@', - string: '@' - } - }; -} - -export default atTruncate; diff --git a/awx/ui/client/lib/components/truncate/truncate.partial.html b/awx/ui/client/lib/components/truncate/truncate.partial.html deleted file mode 100644 index aa329908eb..0000000000 --- a/awx/ui/client/lib/components/truncate/truncate.partial.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
- {{vm.truncatedString}} -
-
- -
- -
diff --git a/awx/ui/client/lib/components/utility/_index.less b/awx/ui/client/lib/components/utility/_index.less deleted file mode 100644 index f9851bef2b..0000000000 --- a/awx/ui/client/lib/components/utility/_index.less +++ /dev/null @@ -1,5 +0,0 @@ -.at-Divider { - clear: both; - margin: 0; - padding: 0; -} diff --git a/awx/ui/client/lib/components/utility/divider.directive.js b/awx/ui/client/lib/components/utility/divider.directive.js deleted file mode 100644 index 8aa71fad50..0000000000 --- a/awx/ui/client/lib/components/utility/divider.directive.js +++ /dev/null @@ -1,12 +0,0 @@ -const templateUrl = require('~components/utility/divider.partial.html'); - -function atPanelBody () { - return { - restrict: 'E', - replace: true, - templateUrl, - scope: false - }; -} - -export default atPanelBody; diff --git a/awx/ui/client/lib/components/utility/divider.partial.html b/awx/ui/client/lib/components/utility/divider.partial.html deleted file mode 100644 index 514695d55c..0000000000 --- a/awx/ui/client/lib/components/utility/divider.partial.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/awx/ui/client/lib/models/AdHocCommand.js b/awx/ui/client/lib/models/AdHocCommand.js deleted file mode 100644 index 9f259a929a..0000000000 --- a/awx/ui/client/lib/models/AdHocCommand.js +++ /dev/null @@ -1,44 +0,0 @@ -let $http; -let BaseModel; - -function getRelaunch (params) { - const req = { - method: 'GET', - url: `${this.path}${params.id}/relaunch/` - }; - - return $http(req); -} - -function postRelaunch (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/relaunch/` - }; - - return $http(req); -} - -function AdHocCommandModel (method, resource, config) { - BaseModel.call(this, 'ad_hoc_commands'); - - this.Constructor = AdHocCommandModel; - this.postRelaunch = postRelaunch.bind(this); - this.getRelaunch = getRelaunch.bind(this); - - return this.create(method, resource, config); -} - -function AdHocCommandModelLoader (_$http_, _BaseModel_) { - $http = _$http_; - BaseModel = _BaseModel_; - - return AdHocCommandModel; -} - -AdHocCommandModelLoader.$inject = [ - '$http', - 'BaseModel', -]; - -export default AdHocCommandModelLoader; diff --git a/awx/ui/client/lib/models/Application.js b/awx/ui/client/lib/models/Application.js deleted file mode 100644 index 2a364eb9e7..0000000000 --- a/awx/ui/client/lib/models/Application.js +++ /dev/null @@ -1,80 +0,0 @@ -let Base; - -function createFormSchema (method, config) { - function mungeSelectFromOptions (configObj, value) { - configObj.choices = [[null, '']].concat(configObj.choices); - configObj._data = configObj.choices; - configObj._exp = 'choice[1] for choice in state._data'; - configObj._format = 'selectFromOptions'; - - configObj._data.forEach((val, i) => { - if (val[0] === value) { - configObj._value = configObj._data[i]; - } - }); - - return configObj; - } - - if (!config) { - config = method; - method = 'GET'; - } - - const schema = Object.assign({}, this.options(`actions.${method.toUpperCase()}`)); - - if (config && config.omit) { - config.omit.forEach(key => delete schema[key]); - } - - Object.keys(schema).forEach(key => { - schema[key].id = key; - - if (this.has(key) && schema[key].type !== 'choice') { - schema[key]._value = this.get(key); - } - - if (schema[key].type === 'choice') { - schema[key] = mungeSelectFromOptions(schema[key], this.get(key)); - } - }); - - // necessary because authorization_grant_type is not changeable on update - if (method === 'put') { - schema.authorization_grant_type = mungeSelectFromOptions(Object.assign({}, this - .options('actions.GET.authorization_grant_type')), this - .get('authorization_grant_type')); - - schema.authorization_grant_type._required = false; - schema.authorization_grant_type._disabled = true; - } - - return schema; -} - -function setDependentResources () { - this.dependentResources = []; -} - -function ApplicationModel (method, resource, config) { - // TODO: change to applications - Base.call(this, 'applications'); - - this.Constructor = ApplicationModel; - this.createFormSchema = createFormSchema.bind(this); - this.setDependentResources = setDependentResources.bind(this); - - return this.create(method, resource, config); -} - -function ApplicationModelLoader (BaseModel) { - Base = BaseModel; - - return ApplicationModel; -} - -ApplicationModelLoader.$inject = [ - 'BaseModel', -]; - -export default ApplicationModelLoader; diff --git a/awx/ui/client/lib/models/Base.js b/awx/ui/client/lib/models/Base.js deleted file mode 100644 index e5425a3335..0000000000 --- a/awx/ui/client/lib/models/Base.js +++ /dev/null @@ -1,738 +0,0 @@ -let $http; -let $q; -let cache; -let strings; - -function request (method, resource, config) { - let req = this.parseRequestConfig(method, resource, config); - - if (Array.isArray(req.method)) { - const promises = req.method.map((_method, i) => { - const _resource = Array.isArray(req.resource) ? req.resource[i] : req.resource; - - req = this.parseRequestConfig(_method, _resource, config); - - if (this.isCacheable(req)) { - return this.requestWithCache(req); - } - - return this.request(req); - }); - - return $q.all(promises); - } - - if (this.isCacheable(req)) { - return this.requestWithCache(req); - } - - return this.http[req.method](req); -} - -function requestWithCache (config) { - const key = cache.createKey(config.method, this.path, config.resource); - - return cache.get(key) - .then(data => { - if (data) { - this.model[config.method.toUpperCase()] = data; - - return data; - } - - return this.http[config.method](config) - .then(res => { - cache.put(key, res.data); - - return res; - }); - }); -} - -/** - * Intended to be useful in searching and filtering results using params - * supported by the API. - * - * @arg {Object} params - An object of keys and values to to format and - * to the URL as a query string. Refer to the API documentation for the - * resource in use for specifics. - * @arg {Object} config - Configuration specific to the UI to accommodate - * common use cases. - * - * @yields {boolean} - Indicating a match has been found. If so, the results - * are set on the model. - */ -function search (params = {}, config = {}, headers = {}) { - const req = { - method: 'GET', - url: this.path, - headers - }; - - if (typeof params === 'string') { - req.url = '?params'; - } else if (Array.isArray(params)) { - req.url += `?${params.join('&')}`; - } else { - req.params = params; - } - - return $http(req) - .then(({ data }) => { - if (!data.count) { - return false; - } - - if (config.unique) { - if (data.count !== 1) { - return false; - } - - [this.model.GET] = data.results; - } else { - this.model.GET = data; - } - - return true; - }); -} - -function httpGet (config = {}) { - const req = { - method: 'GET', - url: this.path - }; - - if (config.params) { - req.params = config.params; - - if (config.params.page_size) { - this.page.size = config.params.page_size; - this.page.current = 1; - - if (config.pageCache) { - this.page.cachedPages = this.page.cachedPages || {}; - this.page.cache = this.page.cache || {}; - this.page.limit = config.pageLimit || false; - - if (!_.has(this.page.cachedPages, 'root')) { - this.page.cachedPages.root = []; - } - - if (!_.has(this.page.cache, 'root')) { - this.page.cache.root = {}; - } - } - } - } - - if (typeof config.resource === 'object') { - this.model.GET = config.resource; - - return $q.resolve(); - } else if (config.resource) { - req.url = `${this.path}${config.resource}/`; - } - - return $http(req) - .then(res => { - this.model.GET = res.data; - - if (config.pageCache) { - this.page.cache.root[this.page.current] = res.data.results; - this.page.cachedPages.root.push(this.page.current); - this.page.count = res.data.count; - this.page.last = Math.ceil(res.data.count / this.page.size); - } - - return res; - }); -} - -function httpPost (config = {}) { - const req = { - method: 'POST', - url: this.path, - data: config.data, - }; - - if (config.url) { - req.url = `${this.path}${config.url}`; - } - - if (!('replace' in config)) { - config.replace = true; - } - - return $http(req) - .then(res => { - if (config.replace) { - this.model.GET = res.data; - } - return res; - }); -} - -function httpPatch (config = {}) { - const req = { - method: 'PUT', - url: `${this.path}${this.get('id')}/`, - data: config.changes - }; - - return $http(req); -} - -function httpPut (config = {}) { - const model = _.merge(this.get(), config.data); - - const req = { - method: 'PUT', - url: `${this.path}${this.get('id')}/`, - data: model - }; - - return $http(req); -} - -function httpOptions (config = {}) { - const req = { - method: 'OPTIONS', - url: this.path - }; - - if (config.resource) { - req.url = `${this.path}${config.resource}/`; - } - - return $http(req) - .then(res => { - this.model.OPTIONS = res.data; - - return res; - }); -} - -function httpDelete (config = {}) { - const req = { - method: 'DELETE', - url: this.path - }; - - if (config.resource) { - req.url = `${this.path}${config.resource}/`; - } - - return $http(req); -} - -function options (keys) { - return this.find('options', keys); -} - -function get (keys) { - return this.find('get', keys); -} - -function unset (method, keys) { - if (!keys) { - keys = method; - method = 'GET'; - } - - method = method.toUpperCase(); - keys = keys.split('.'); - - if (!keys.length) { - delete this.model[method]; - } else if (keys.length === 1) { - delete this.model[method][keys[0]]; - } else { - const property = keys.splice(-1); - keys = keys.join('.'); - - const model = this.find(method, keys); - delete model[property]; - } -} - -function set (method, keys, value) { - if (!value) { - value = keys; - keys = method; - method = 'GET'; - } - - keys = keys.split('.'); - - if (keys.length === 1) { - this.model[keys[0]] = value; - } else { - const property = keys.splice(-1); - keys = keys.join('.'); - - const model = this.find(method, keys); - - model[property] = value; - } -} - -function match (method, key, value) { - if (!value) { - value = key; - key = method; - method = 'GET'; - } - - const model = this.model[method.toUpperCase()]; - - if (!model) { - return null; - } - - if (!model.results) { - if (model[key] === value) { - return model; - } - - return null; - } - - const result = model.results.filter(object => object[key] === value); - - return result.length === 0 ? null : result[0]; -} - -function find (method, keys) { - let value = this.model[method.toUpperCase()]; - - if (!keys) { - return value; - } - - try { - keys = keys.split('.'); - - keys.forEach(key => { - const bracketIndex = key.indexOf('['); - const hasArray = bracketIndex !== -1; - - if (!hasArray) { - value = value[key]; - return; - } - - if (bracketIndex === 0) { - value = value[Number(key.substring(1, key.length - 1))]; - return; - } - - const prop = key.substring(0, bracketIndex); - const index = Number(key.substring(bracketIndex + 1, key.length - 1)); - - value = value[prop][index]; - }); - } catch (err) { - return undefined; - } - - return value; -} - -function has (method, keys) { - if (!keys) { - keys = method; - method = 'GET'; - } - - method = method.toUpperCase(); - - let value; - switch (method) { - case 'OPTIONS': - value = this.options(keys); - break; - default: - value = this.get(keys); - } - - return value !== undefined && value !== null; -} - -function extend (method, related, config = {}) { - const req = this.parseRequestConfig(method.toUpperCase(), config); - - if (_.get(config, 'params.page_size')) { - this.page.size = config.params.page_size; - this.page.current = 1; - - if (config.pageCache) { - this.page.cachedPages = this.page.cachedPages || {}; - this.page.cache = this.page.cache || {}; - this.page.limit = config.pageLimit || false; - - if (!_.has(this.page.cachedPages, `related.${related}`)) { - _.set(this.page.cachedPages, `related.${related}`, []); - } - - if (!_.has(this.page.cache, `related.${related}`)) { - _.set(this.page.cache, `related.${related}`, []); - } - } - } - - if (this.has(req.method, `related.${related}`)) { - req.url = this.get(`related.${related}`); - - Object.assign(req, config); - - return $http(req) - .then(({ data }) => { - this.set(req.method, `related.${related}`, data); - - if (config.pageCache) { - this.page.cache.related[related][this.page.current] = data.results; - this.page.cachedPages.related[related].push(this.page.current); - this.page.count = data.count; - this.page.last = Math.ceil(data.count / this.page.size); - } - - return this; - }); - } - - return Promise.reject(new Error(`No related property, ${related}, exists`)); -} - -function updateCount (count) { - this.page.count = count; - this.page.last = Math.ceil(count / this.page.size); - - return this.page.last; -} - -function goToPage (config) { - const params = config.params || {}; - const { page } = config; - - let url; - let key; - let pageNumber; - let pageCache; - let pagesInCache; - - if (config.related) { - url = `${this.endpoint}${config.related}/`; - key = `related.${config.related}`; - } else { - url = this.endpoint; - key = 'root'; - } - - params.page_size = this.page.size; - - if (page === 'next') { - pageNumber = this.page.current + 1; - } else if (page === 'previous') { - pageNumber = this.page.current - 1; - } else if (page === 'first') { - pageNumber = 1; - } else if (page === 'last') { - pageNumber = this.page.last; - } else { - pageNumber = page; - } - - if (pageNumber < 1 || pageNumber > this.page.last) { - return Promise.resolve(null); - } - - this.page.current = pageNumber; - - if (this.page.cache) { - pageCache = _.get(this.page.cache, key); - pagesInCache = _.get(this.page.cachedPages, key); - - if (_.has(pageCache, pageNumber)) { - return Promise.resolve({ - results: pageCache[pageNumber], - page: pageNumber - }); - } - } - - params.page_size = this.page.size; - params.page = pageNumber; - - const req = { - method: 'GET', - url, - params - }; - - return $http(req) - .then(({ data }) => { - if (pageCache) { - pageCache[pageNumber] = data.results; - pagesInCache.push(pageNumber); - - if (pagesInCache.length > this.page.limit) { - const pageToDelete = pagesInCache.shift(); - - delete pageCache[pageToDelete]; - } - } - - return { - results: data.results, - page: pageNumber - }; - }); -} - -function next (config = {}) { - config.page = 'next'; - - return this.goToPage(config); -} - -function prev (config = {}) { - config.page = 'previous'; - - return this.goToPage(config); -} - -function normalizePath (resource) { - const version = '/api/v2/'; - - return `${version}${resource}/`; -} - -function isEditable () { - let canEdit = this.get('summary_fields.user_capabilities.edit'); - - if (canEdit === undefined) { - canEdit = true; - } - - if (canEdit) { - return true; - } - - if (this.has('options', 'actions.PUT')) { - return true; - } - - return false; -} - -function isCreatable () { - if (this.has('options', 'actions.POST')) { - return true; - } - - return false; -} - -function isCacheable () { - if (this.settings.cache === true) { - return true; - } - - return false; -} - -function graft (id) { - let item = this.get('results').filter(result => result.id === id); - - item = item ? item[0] : undefined; - - if (!item) { - return undefined; - } - - return new this.Constructor('get', item, true); -} - -function getDependentResourceCounts (id) { - this.setDependentResources(id); - - const promises = []; - - this.dependentResources.forEach(resource => { - promises.push(resource.model.request('get', { params: resource.params }) - .then(res => ({ - label: resource.model.label, - count: res.data.count - }))); - }); - - return Promise.all(promises); -} - -function copy () { - if (!this.has('POST', 'related.copy')) { - return Promise.reject(new Error('No related property, copy, exists')); - } - - const date = new Date(); - const name = `${this.get('name')}@${date.toLocaleTimeString()}`; - - const url = `${this.path}${this.get('id')}/copy/`; - - const req = { - url, - method: 'POST', - data: { name } - }; - - return $http(req).then(res => res.data); -} - -/** - * `create` is called on instantiation of every model. Models can be - * instantiated empty or with `GET` and/or `OPTIONS` requests that yield data. - * If model data already exists a new instance can be created (see: `graft`) - * with existing data. - * - * @arg {string=} method - Populate the model with `GET` or `OPTIONS` data. - * @arg {(string|Object)=} resource - An `id` reference to a particular - * resource or an existing model's data. - * @arg {config=} config - Create a new instance from existing model data. - * - * @returns {(Object|Promise)} - Returns a reference to the model instance - * if an empty instance or graft is created. Otherwise, a promise yielding - * a model instance is returned. - */ -function create (method, resource, config) { - const req = this.parseRequestConfig(method, resource, config); - - if (!req || !req.method) { - return this; - } - - if (req.resource) { - this.setEndpoint(req.resource); - } - - this.promise = this.request(req); - - if (req.graft) { - return this; - } - - return this.promise - .then(() => this); -} - -function setEndpoint (resource) { - if (Array.isArray(resource)) { - this.endpoint = `${this.path}${resource[0]}/`; - } else { - this.endpoint = `${this.path}${resource}/`; - } -} - -function parseRequestConfig (method, resource, config) { - if (!method) { - return null; - } - - let req = {}; - - if (Array.isArray(method)) { - if (Array.isArray(resource)) { - req.resource = resource; - } else if (resource === null) { - req.resource = undefined; - } else if (typeof resource === 'object') { - req = resource; - } - - req.method = method; - } else if (typeof method === 'string') { - if (resource === null) { - req.resource = undefined; - } else if (typeof resource === 'object') { - req = resource; - } else { - req.resource = resource; - } - - req.method = method; - } else if (typeof method === 'object') { - req = method; - } else { - req = config; - req.method = method; - req.resource = resource === null ? undefined : resource; - } - - return req; -} - -/** - * Base functionality for API interaction. - * - * @arg {string} resource - The API resource for the model extending BaseModel to - * use. - * @arg {Object=} settings - Configuration applied to all instances of the - * extending model. - * @arg {boolean=} settings.cache - Cache the model data. - * - */ -function BaseModel (resource, settings) { - this.create = create; - this.find = find; - this.get = get; - this.goToPage = goToPage; - this.graft = graft; - this.has = has; - this.isEditable = isEditable; - this.isCacheable = isCacheable; - this.isCreatable = isCreatable; - this.match = match; - this.next = next; - this.normalizePath = normalizePath; - this.options = options; - this.parseRequestConfig = parseRequestConfig; - this.prev = prev; - this.request = request; - this.requestWithCache = requestWithCache; - this.search = search; - this.set = set; - this.setEndpoint = setEndpoint; - this.unset = unset; - this.extend = extend; - this.copy = copy; - this.getDependentResourceCounts = getDependentResourceCounts; - this.updateCount = updateCount; - - this.http = { - get: httpGet.bind(this), - options: httpOptions.bind(this), - patch: httpPatch.bind(this), - post: httpPost.bind(this), - put: httpPut.bind(this), - delete: httpDelete.bind(this) - }; - - this.page = {}; - this.model = {}; - this.path = this.normalizePath(resource); - this.label = strings.get(`${resource}.LABEL`); - this.settings = settings || {}; -} - -function BaseModelLoader (_$http_, _$q_, _cache_, ModelsStrings) { - $http = _$http_; - $q = _$q_; - cache = _cache_; - strings = ModelsStrings; - - return BaseModel; -} - -BaseModelLoader.$inject = ['$http', '$q', 'CacheService', 'ModelsStrings']; - -export default BaseModelLoader; diff --git a/awx/ui/client/lib/models/Config.js b/awx/ui/client/lib/models/Config.js deleted file mode 100644 index 9f2e3ab87a..0000000000 --- a/awx/ui/client/lib/models/Config.js +++ /dev/null @@ -1,39 +0,0 @@ -let $log; -let Base; - -function getTruncatedVersion () { - let version; - - try { - [version] = this.get('version').split('-'); - } catch (err) { - $log.error(err); - } - - return version; -} - -function isOpen () { - return this.get('license_info.license_type') === 'open'; -} - -function ConfigModel (method, resource, config) { - Base.call(this, 'config', { cache: true }); - - this.Constructor = ConfigModel; - this.getTruncatedVersion = getTruncatedVersion; - this.isOpen = isOpen; - - return this.create(method, resource, config); -} - -function ConfigModelLoader (BaseModel, _$log_) { - Base = BaseModel; - $log = _$log_; - - return ConfigModel; -} - -ConfigModelLoader.$inject = ['BaseModel', '$log']; - -export default ConfigModelLoader; diff --git a/awx/ui/client/lib/models/Credential.js b/awx/ui/client/lib/models/Credential.js deleted file mode 100644 index 6fbce5e141..0000000000 --- a/awx/ui/client/lib/models/Credential.js +++ /dev/null @@ -1,174 +0,0 @@ -/* eslint camelcase: 0 */ -const ENCRYPTED_VALUE = '$encrypted$'; - -let Base; -let Project; -let JobTemplate; -let Inventory; -let InventorySource; - -function createFormSchema (method, config) { - if (!config) { - config = method; - method = 'GET'; - } - - const schema = Object.assign({}, this.options(`actions.${method.toUpperCase()}`)); - - if (config && config.omit) { - config.omit.forEach(key => delete schema[key]); - } - - Object.keys(schema).forEach(key => { - schema[key].id = key; - - if (this.has(key)) { - schema[key]._value = this.get(key); - } - }); - - // Custom credentials can have input fields named 'name', 'organization', - // 'description', etc. Underscore these variables to make collisions - // less likely to occur. - schema._name = schema.name; - schema._organization = schema.organization; - schema._description = schema.description; - delete schema.name; - delete schema.organization; - delete schema.description; - - return schema; -} - -function assignInputGroupValues (apiConfig, credentialType, sourceCredentials) { - let inputs = credentialType.get('inputs.fields'); - - if (!inputs) { - return []; - } - - if (this.has('credential_type')) { - if (credentialType.get('id') !== this.get('credential_type')) { - inputs.forEach(field => { - field.tagMode = this.isEditable() && credentialType.get('kind') !== 'external'; - }); - return inputs; - } - } - - inputs = inputs.map(input => { - const value = this.get(`inputs.${input.id}`); - - input._value = value; - input._encrypted = value === ENCRYPTED_VALUE; - - return input; - }); - - if (credentialType.get('namespace') === 'ssh') { - const become = inputs.find((field) => field.id === 'become_method'); - become._isDynamic = true; - become._choices = Array.from(apiConfig.become_methods, method => method[0]); - // Add the value to the choices if it doesn't exist in the preset list - if (become._value && become._value !== '') { - const optionMatches = become._choices - .findIndex((option) => option === become._value); - if (optionMatches === -1) { - become._choices.push(become._value); - } - } - } - - const linkedFieldNames = (this.get('related.input_sources.results') || []) - .map(({ input_field_name }) => input_field_name); - - inputs = inputs.map((field) => { - field.tagMode = this.isEditable() && credentialType.get('kind') !== 'external'; - if (linkedFieldNames.includes(field.id)) { - field.tagMode = true; - field.asTag = true; - const { summary_fields } = this.get('related.input_sources.results') - .find(({ input_field_name }) => input_field_name === field.id); - field._tagValue = summary_fields.source_credential.name; - - const { source_credential: { id } } = summary_fields; - const src = sourceCredentials.data.results.find(obj => obj.id === id); - const canRemove = _.get(src, ['summary_fields', 'user_capabilities', 'delete'], false); - - if (!canRemove) { - field._disabled = true; - } - } - - return field; - }); - - return inputs; -} - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new Project(), - params: { - credential: id - } - }, - { - model: new JobTemplate(), - params: { - credentials__id: id, - ask_credential_on_launch: false - } - }, - { - model: new Inventory(), - params: { - insights_credential: id - } - }, - { - model: new InventorySource(), - params: { - credentials__id: id - } - } - ]; -} - -function CredentialModel (method, resource, config) { - Base.call(this, 'credentials'); - - this.Constructor = CredentialModel; - this.createFormSchema = createFormSchema.bind(this); - this.assignInputGroupValues = assignInputGroupValues.bind(this); - this.setDependentResources = setDependentResources.bind(this); - - return this.create(method, resource, config); -} - -function CredentialModelLoader ( - BaseModel, - ProjectModel, - JobTemplateModel, - InventoryModel, - InventorySourceModel -) { - Base = BaseModel; - Project = ProjectModel; - JobTemplate = JobTemplateModel; - Inventory = InventoryModel; - InventorySource = InventorySourceModel; - - return CredentialModel; -} - -CredentialModelLoader.$inject = [ - 'BaseModel', - 'ProjectModel', - 'JobTemplateModel', - 'InventoryModel', - 'InventorySourceModel' -]; - -export default CredentialModelLoader; diff --git a/awx/ui/client/lib/models/CredentialType.js b/awx/ui/client/lib/models/CredentialType.js deleted file mode 100644 index 38c44cd845..0000000000 --- a/awx/ui/client/lib/models/CredentialType.js +++ /dev/null @@ -1,68 +0,0 @@ -let Base; -let Credential; - -function categorizeByKind () { - const group = {}; - - this.get('results').forEach(result => { - group[result.kind] = group[result.kind] || []; - group[result.kind].push(result); - }); - - return Object.keys(group).map(category => ({ - data: group[category], - category - })); -} - -function mergeInputProperties (key = 'fields') { - if (!this.has(`inputs.${key}`)) { - return undefined; - } - - const required = this.get('inputs.required'); - - return this.get(`inputs.${key}`).forEach((field, i) => { - if (!required || required.indexOf(field.id) === -1) { - this.set(`inputs.${key}[${i}].required`, false); - } else { - this.set(`inputs.${key}[${i}].required`, true); - } - }); -} - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new Credential(), - params: { - credential_type: id - } - } - ]; -} - -function CredentialTypeModel (method, resource, config) { - Base.call(this, 'credential_types'); - - this.Constructor = CredentialTypeModel; - this.categorizeByKind = categorizeByKind.bind(this); - this.mergeInputProperties = mergeInputProperties.bind(this); - this.setDependentResources = setDependentResources.bind(this); - - return this.create(method, resource, config); -} - -function CredentialTypeModelLoader (BaseModel, CredentialModel) { - Base = BaseModel; - Credential = CredentialModel; - - return CredentialTypeModel; -} - -CredentialTypeModelLoader.$inject = [ - 'BaseModel', - 'CredentialModel' -]; - -export default CredentialTypeModelLoader; diff --git a/awx/ui/client/lib/models/Instance.js b/awx/ui/client/lib/models/Instance.js deleted file mode 100644 index 09b7df0547..0000000000 --- a/awx/ui/client/lib/models/Instance.js +++ /dev/null @@ -1,47 +0,0 @@ -let Base; - -function createFormSchema (method, config) { - if (!config) { - config = method; - method = 'GET'; - } - - const schema = Object.assign({}, this.options(`actions.${method.toUpperCase()}`)); - - if (config && config.omit) { - config.omit.forEach(key => delete schema[key]); - } - - Object.keys(schema).forEach(key => { - schema[key].id = key; - - if (this.has(key)) { - schema[key]._value = this.get(key); - } - }); - - return schema; -} - -function InstanceModel (method, resource, config) { - // Base takes two args: resource and settings - // resource is the string endpoint - Base.call(this, 'instances'); - - this.Constructor = InstanceModel; - this.createFormSchema = createFormSchema.bind(this); - - return this.create(method, resource, config); -} - -function InstanceModelLoader (BaseModel) { - Base = BaseModel; - - return InstanceModel; -} - -InstanceModelLoader.$inject = [ - 'BaseModel' -]; - -export default InstanceModelLoader; diff --git a/awx/ui/client/lib/models/InstanceGroup.js b/awx/ui/client/lib/models/InstanceGroup.js deleted file mode 100644 index cc82432c42..0000000000 --- a/awx/ui/client/lib/models/InstanceGroup.js +++ /dev/null @@ -1,47 +0,0 @@ -let Base; - -function createFormSchema (method, config) { - if (!config) { - config = method; - method = 'GET'; - } - - const schema = Object.assign({}, this.options(`actions.${method.toUpperCase()}`)); - - if (config && config.omit) { - config.omit.forEach(key => delete schema[key]); - } - - Object.keys(schema).forEach(key => { - schema[key].id = key; - - if (this.has(key)) { - schema[key]._value = this.get(key); - } - }); - - return schema; -} - -function InstanceGroupModel (method, resource, config) { - // Base takes two args: resource and settings - // resource is the string endpoint - Base.call(this, 'instance_groups'); - - this.Constructor = InstanceGroupModel; - this.createFormSchema = createFormSchema.bind(this); - - return this.create(method, resource, config); -} - -function InstanceGroupModelLoader (BaseModel) { - Base = BaseModel; - - return InstanceGroupModel; -} - -InstanceGroupModelLoader.$inject = [ - 'BaseModel' -]; - -export default InstanceGroupModelLoader; diff --git a/awx/ui/client/lib/models/Inventory.js b/awx/ui/client/lib/models/Inventory.js deleted file mode 100644 index 828dac1055..0000000000 --- a/awx/ui/client/lib/models/Inventory.js +++ /dev/null @@ -1,45 +0,0 @@ -let Base; -let JobTemplate; -let WorkflowJobTemplate; - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new JobTemplate(), - params: { - inventory: id - } - }, - { - model: new WorkflowJobTemplate(), - params: { - inventory: id - } - } - ]; -} - -function InventoryModel (method, resource, config) { - Base.call(this, 'inventories'); - - this.Constructor = InventoryModel; - this.setDependentResources = setDependentResources.bind(this); - - return this.create(method, resource, config); -} - -function InventoryModelLoader (BaseModel, JobTemplateModel, WorkflowJobTemplateModel) { - Base = BaseModel; - JobTemplate = JobTemplateModel; - WorkflowJobTemplate = WorkflowJobTemplateModel; - - return InventoryModel; -} - -InventoryModelLoader.$inject = [ - 'BaseModel', - 'JobTemplateModel', - 'WorkflowJobTemplateModel', -]; - -export default InventoryModelLoader; diff --git a/awx/ui/client/lib/models/InventoryScript.js b/awx/ui/client/lib/models/InventoryScript.js deleted file mode 100644 index 1b759410ab..0000000000 --- a/awx/ui/client/lib/models/InventoryScript.js +++ /dev/null @@ -1,36 +0,0 @@ -let Base; -let InventorySource; - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new InventorySource(), - params: { - source_script: id - } - } - ]; -} - -function InventoryScriptModel (method, resource, config) { - Base.call(this, 'inventory_scripts'); - - this.Constructor = InventoryScriptModel; - this.setDependentResources = setDependentResources.bind(this); - - return this.create(method, resource, config); -} - -function InventoryScriptModelLoader (BaseModel, InventorySourceModel) { - Base = BaseModel; - InventorySource = InventorySourceModel; - - return InventoryScriptModel; -} - -InventoryScriptModelLoader.$inject = [ - 'BaseModel', - 'InventorySourceModel' -]; - -export default InventoryScriptModelLoader; diff --git a/awx/ui/client/lib/models/InventorySource.js b/awx/ui/client/lib/models/InventorySource.js deleted file mode 100644 index 0d68a11780..0000000000 --- a/awx/ui/client/lib/models/InventorySource.js +++ /dev/null @@ -1,63 +0,0 @@ -let Base; -let WorkflowJobTemplateNode; -let $http; - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new WorkflowJobTemplateNode(), - params: { - unified_job_template: id - } - } - ]; -} - -function getUpdate (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/update/` - }; - - return $http(req); -} - -function postUpdate (id) { - const req = { - method: 'POST', - url: `${this.path}${id}/update/` - }; - - return $http(req); -} - -function InventorySourceModel (method, resource, config) { - Base.call(this, 'inventory_sources'); - - this.Constructor = InventorySourceModel; - this.setDependentResources = setDependentResources.bind(this); - this.getUpdate = getUpdate.bind(this); - this.postUpdate = postUpdate.bind(this); - - return this.create(method, resource, config); -} - -function InventorySourceModelLoader ( - BaseModel, - WorkflowJobTemplateNodeModel, - _$http_ -) { - Base = BaseModel; - WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel; - $http = _$http_; - - return InventorySourceModel; -} - -InventorySourceModelLoader.$inject = [ - 'BaseModel', - 'WorkflowJobTemplateNodeModel', - '$http' -]; - -export default InventorySourceModelLoader; diff --git a/awx/ui/client/lib/models/InventoryUpdate.js b/awx/ui/client/lib/models/InventoryUpdate.js deleted file mode 100644 index 37951911d7..0000000000 --- a/awx/ui/client/lib/models/InventoryUpdate.js +++ /dev/null @@ -1,21 +0,0 @@ -let BaseModel; - -function InventoryUpdateModel (method, resource, config) { - BaseModel.call(this, 'inventory_updates'); - - this.Constructor = InventoryUpdateModel; - - return this.create(method, resource, config); -} - -function InventoryUpdateModelLoader (_BaseModel_) { - BaseModel = _BaseModel_; - - return InventoryUpdateModel; -} - -InventoryUpdateModelLoader.$inject = [ - 'BaseModel' -]; - -export default InventoryUpdateModelLoader; diff --git a/awx/ui/client/lib/models/Job.js b/awx/ui/client/lib/models/Job.js deleted file mode 100644 index 7e2f017826..0000000000 --- a/awx/ui/client/lib/models/Job.js +++ /dev/null @@ -1,59 +0,0 @@ -let $http; -let BaseModel; - -function getRelaunch (params) { - const req = { - method: 'GET', - url: `${this.path}${params.id}/relaunch/` - }; - - return $http(req); -} - -function postRelaunch (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/relaunch/` - }; - - if (params.relaunchData) { - req.data = params.relaunchData; - } - - return $http(req); -} - -function getCredentials (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/credentials/` - }; - - return $http(req); -} - -function JobModel (method, resource, config) { - BaseModel.call(this, 'jobs'); - - this.Constructor = JobModel; - - this.postRelaunch = postRelaunch.bind(this); - this.getRelaunch = getRelaunch.bind(this); - this.getCredentials = getCredentials.bind(this); - - return this.create(method, resource, config); -} - -function JobModelLoader (_$http_, _BaseModel_) { - $http = _$http_; - BaseModel = _BaseModel_; - - return JobModel; -} - -JobModelLoader.$inject = [ - '$http', - 'BaseModel', -]; - -export default JobModelLoader; diff --git a/awx/ui/client/lib/models/JobEvent.js b/awx/ui/client/lib/models/JobEvent.js deleted file mode 100644 index 1c71ba9c54..0000000000 --- a/awx/ui/client/lib/models/JobEvent.js +++ /dev/null @@ -1,19 +0,0 @@ -let BaseModel; - -function JobEventModel (method, resource, config) { - BaseModel.call(this, 'job_events'); - - this.Constructor = JobEventModel; - - return this.create(method, resource, config); -} - -function JobEventModelLoader (_BaseModel_) { - BaseModel = _BaseModel_; - - return JobEventModel; -} - -JobEventModel.$inject = ['BaseModel']; - -export default JobEventModelLoader; diff --git a/awx/ui/client/lib/models/JobTemplate.js b/awx/ui/client/lib/models/JobTemplate.js deleted file mode 100644 index b5a0dae16e..0000000000 --- a/awx/ui/client/lib/models/JobTemplate.js +++ /dev/null @@ -1,120 +0,0 @@ -let Base; -let WorkflowJobTemplateNode; -let $http; - -function optionsLaunch (id) { - const req = { - method: 'OPTIONS', - url: `${this.path}${id}/launch/` - }; - - return $http(req); -} - -function getLaunch (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/launch/` - }; - - return $http(req) - .then(res => { - this.model.launch.GET = res.data; - - return res; - }); -} - -function postLaunch (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/launch/` - }; - - if (params.launchData) { - req.data = params.launchData; - } - - return $http(req); -} - -function getSurveyQuestions (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/survey_spec/` - }; - - return $http(req); -} - -function getLaunchConf () { - // this method is just a pass-through to the underlying launch GET data - // we use it to make the access patterns consistent across both types of - // templates - return this.model.launch.GET; -} - -function canLaunchWithoutPrompt () { - const launchData = this.getLaunchConf(); - - return ( - launchData.can_start_without_user_input && - !launchData.ask_inventory_on_launch && - !launchData.ask_credential_on_launch && - !launchData.ask_verbosity_on_launch && - !launchData.ask_job_type_on_launch && - !launchData.ask_limit_on_launch && - !launchData.ask_tags_on_launch && - !launchData.ask_skip_tags_on_launch && - !launchData.ask_variables_on_launch && - !launchData.ask_diff_mode_on_launch && - !launchData.ask_scm_branch_on_launch && - !launchData.survey_enabled && - launchData.variables_needed_to_start.length === 0 - ); -} - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new WorkflowJobTemplateNode(), - params: { - unified_job_template: id - } - } - ]; -} - -function JobTemplateModel (method, resource, config) { - Base.call(this, 'job_templates'); - - this.Constructor = JobTemplateModel; - this.setDependentResources = setDependentResources.bind(this); - this.optionsLaunch = optionsLaunch.bind(this); - this.getLaunch = getLaunch.bind(this); - this.postLaunch = postLaunch.bind(this); - this.getSurveyQuestions = getSurveyQuestions.bind(this); - this.getLaunchConf = getLaunchConf.bind(this); - this.canLaunchWithoutPrompt = canLaunchWithoutPrompt.bind(this); - - this.model.launch = {}; - - return this.create(method, resource, config); -} - -function JobTemplateModelLoader (BaseModel, WorkflowJobTemplateNodeModel, _$http_) { - Base = BaseModel; - WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel; - $http = _$http_; - - return JobTemplateModel; -} - -JobTemplateModelLoader.$inject = [ - 'BaseModel', - 'WorkflowJobTemplateNodeModel', - '$http', - '$state' -]; - -export default JobTemplateModelLoader; diff --git a/awx/ui/client/lib/models/Me.js b/awx/ui/client/lib/models/Me.js deleted file mode 100644 index 221a29da34..0000000000 --- a/awx/ui/client/lib/models/Me.js +++ /dev/null @@ -1,27 +0,0 @@ -let Base; - -function MeModel (method, resource, config) { - Base.call(this, 'me'); - - this.Constructor = MeModel; - - return this.create(method, resource, config) - .then(() => { - if (this.has('results')) { - _.merge(this.model.GET, this.get('results[0]')); - this.unset('results'); - } - - return this; - }); -} - -function MeModelLoader (BaseModel) { - Base = BaseModel; - - return MeModel; -} - -MeModelLoader.$inject = ['BaseModel']; - -export default MeModelLoader; diff --git a/awx/ui/client/lib/models/NotificationTemplate.js b/awx/ui/client/lib/models/NotificationTemplate.js deleted file mode 100644 index 6418a7184d..0000000000 --- a/awx/ui/client/lib/models/NotificationTemplate.js +++ /dev/null @@ -1,21 +0,0 @@ -let Base; - -function NotificationTemplateModel (method, resource, config) { - Base.call(this, 'notification_templates'); - - this.Constructor = NotificationTemplateModel; - - return this.create(method, resource, config); -} - -function NotificationTemplateModelLoader (BaseModel) { - Base = BaseModel; - - return NotificationTemplateModel; -} - -NotificationTemplateModelLoader.$inject = [ - 'BaseModel' -]; - -export default NotificationTemplateModelLoader; diff --git a/awx/ui/client/lib/models/Organization.js b/awx/ui/client/lib/models/Organization.js deleted file mode 100644 index 6209889fba..0000000000 --- a/awx/ui/client/lib/models/Organization.js +++ /dev/null @@ -1,36 +0,0 @@ -let Base; -let Credential; - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new Credential(), - params: { - organization: id - } - } - ]; -} - -function OrganizationModel (method, resource, config) { - Base.call(this, 'organizations'); - - this.Constructor = OrganizationModel; - this.setDependentResources = setDependentResources.bind(this); - - return this.create(method, resource, config); -} - -function OrganizationModelLoader (BaseModel, CredentialModel) { - Base = BaseModel; - Credential = CredentialModel; - - return OrganizationModel; -} - -OrganizationModelLoader.$inject = [ - 'BaseModel', - 'CredentialModel' -]; - -export default OrganizationModelLoader; diff --git a/awx/ui/client/lib/models/Project.js b/awx/ui/client/lib/models/Project.js deleted file mode 100644 index 02606c3dcd..0000000000 --- a/awx/ui/client/lib/models/Project.js +++ /dev/null @@ -1,83 +0,0 @@ -let Base; -let JobTemplate; -let WorkflowJobTemplateNode; -let InventorySource; -let $http; - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new JobTemplate(), - params: { - project: id - } - }, - { - model: new WorkflowJobTemplateNode(), - params: { - unified_job_template: id - } - }, - { - model: new InventorySource(), - params: { - source_project: id - } - } - ]; -} - -function getUpdate (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/update/` - }; - - return $http(req); -} - -function postUpdate (id) { - const req = { - method: 'POST', - url: `${this.path}${id}/update/` - }; - - return $http(req); -} - -function ProjectModel (method, resource, config) { - Base.call(this, 'projects'); - - this.Constructor = ProjectModel; - this.setDependentResources = setDependentResources.bind(this); - this.getUpdate = getUpdate.bind(this); - this.postUpdate = postUpdate.bind(this); - - return this.create(method, resource, config); -} - -function ProjectModelLoader ( - BaseModel, - JobTemplateModel, - WorkflowJobTemplateNodeModel, - InventorySourceModel, - _$http_ -) { - Base = BaseModel; - JobTemplate = JobTemplateModel; - WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel; - InventorySource = InventorySourceModel; - $http = _$http_; - - return ProjectModel; -} - -ProjectModelLoader.$inject = [ - 'BaseModel', - 'JobTemplateModel', - 'WorkflowJobTemplateNodeModel', - 'InventorySourceModel', - '$http' -]; - -export default ProjectModelLoader; diff --git a/awx/ui/client/lib/models/ProjectUpdate.js b/awx/ui/client/lib/models/ProjectUpdate.js deleted file mode 100644 index a8b1ae1fe9..0000000000 --- a/awx/ui/client/lib/models/ProjectUpdate.js +++ /dev/null @@ -1,21 +0,0 @@ -let BaseModel; - -function ProjectUpdateModel (method, resource, config) { - BaseModel.call(this, 'project_updates'); - - this.Constructor = ProjectUpdateModel; - - return this.create(method, resource, config); -} - -function ProjectUpdateModelLoader (_BaseModel_) { - BaseModel = _BaseModel_; - - return ProjectUpdateModel; -} - -ProjectUpdateModelLoader.$inject = [ - 'BaseModel' -]; - -export default ProjectUpdateModelLoader; diff --git a/awx/ui/client/lib/models/Schedule.js b/awx/ui/client/lib/models/Schedule.js deleted file mode 100644 index b6bd3cf60f..0000000000 --- a/awx/ui/client/lib/models/Schedule.js +++ /dev/null @@ -1,38 +0,0 @@ -let Base; -let $http; - -function postCredential (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/credentials/` - }; - - if (params.data) { - req.data = params.data; - } - - return $http(req); -} - -function ScheduleModel (method, resource, config) { - Base.call(this, 'schedules'); - - this.Constructor = ScheduleModel; - this.postCredential = postCredential.bind(this); - - return this.create(method, resource, config); -} - -function ScheduleModelLoader (BaseModel, _$http_) { - Base = BaseModel; - $http = _$http_; - - return ScheduleModel; -} - -ScheduleModelLoader.$inject = [ - 'BaseModel', - '$http' -]; - -export default ScheduleModelLoader; diff --git a/awx/ui/client/lib/models/SystemJob.js b/awx/ui/client/lib/models/SystemJob.js deleted file mode 100644 index cc092ff8f4..0000000000 --- a/awx/ui/client/lib/models/SystemJob.js +++ /dev/null @@ -1,19 +0,0 @@ -let BaseModel; - -function SystemJobModel (method, resource, config) { - BaseModel.call(this, 'system_jobs'); - - this.Constructor = SystemJobModel; - - return this.create(method, resource, config); -} - -function SystemJobModelLoader (_BaseModel_) { - BaseModel = _BaseModel_; - - return SystemJobModel; -} - -SystemJobModelLoader.$inject = ['BaseModel']; - -export default SystemJobModelLoader; diff --git a/awx/ui/client/lib/models/Token.js b/awx/ui/client/lib/models/Token.js deleted file mode 100644 index c4dfaf1937..0000000000 --- a/awx/ui/client/lib/models/Token.js +++ /dev/null @@ -1,26 +0,0 @@ -let Base; - -function setDependentResources () { - this.dependentResources = []; -} - -function TokenModel (method, resource, config) { - Base.call(this, 'tokens'); - - this.Constructor = TokenModel; - this.setDependentResources = setDependentResources.bind(this); - - return this.create(method, resource, config); -} - -function TokenModelLoader (BaseModel) { - Base = BaseModel; - - return TokenModel; -} - -TokenModelLoader.$inject = [ - 'BaseModel', -]; - -export default TokenModelLoader; diff --git a/awx/ui/client/lib/models/UnifiedJob.js b/awx/ui/client/lib/models/UnifiedJob.js deleted file mode 100644 index 13078f8fa2..0000000000 --- a/awx/ui/client/lib/models/UnifiedJob.js +++ /dev/null @@ -1,21 +0,0 @@ -let Base; - -function UnifiedJobModel (method, resource, config) { - Base.call(this, 'unified_jobs'); - - this.Constructor = UnifiedJobModel; - - return this.create(method, resource, config); -} - -function UnifiedJobModelLoader (BaseModel) { - Base = BaseModel; - - return UnifiedJobModel; -} - -UnifiedJobModelLoader.$inject = [ - 'BaseModel' -]; - -export default UnifiedJobModelLoader; diff --git a/awx/ui/client/lib/models/UnifiedJobTemplate.js b/awx/ui/client/lib/models/UnifiedJobTemplate.js deleted file mode 100644 index fb1e241fd3..0000000000 --- a/awx/ui/client/lib/models/UnifiedJobTemplate.js +++ /dev/null @@ -1,111 +0,0 @@ -let BaseModel; -let WorkflowJobTemplateNode; -let $http; - -function optionsLaunch (id) { - const req = { - method: 'OPTIONS', - url: `${this.path}${id}/launch/` - }; - - return $http(req); -} - -function getLaunch (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/launch/` - }; - - return $http(req) - .then(res => { - this.model.launch.GET = res.data; - - return res; - }); -} - -function postLaunch (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/launch/` - }; - - if (params.launchData) { - req.data = params.launchData; - } - - return $http(req); -} - -function getSurveyQuestions (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/survey_spec/` - }; - - return $http(req); -} - -function canLaunchWithoutPrompt () { - const launchData = this.model.launch.GET; - - return ( - launchData.can_start_without_user_input && - !launchData.ask_inventory_on_launch && - !launchData.ask_credential_on_launch && - !launchData.ask_verbosity_on_launch && - !launchData.ask_job_type_on_launch && - !launchData.ask_limit_on_launch && - !launchData.ask_tags_on_launch && - !launchData.ask_skip_tags_on_launch && - !launchData.ask_variables_on_launch && - !launchData.ask_diff_mode_on_launch && - !launchData.ask_scm_branch_on_launch && - !launchData.survey_enabled - ); -} - -function setDependentResources (id) { - this.dependentResources = [ - { - model: new WorkflowJobTemplateNode(), - params: { - unified_job_template: id - } - } - ]; -} - -function UnifiedJobTemplateModel (method, resource, graft) { - BaseModel.call(this, 'unified_job_templates'); - - this.Constructor = UnifiedJobTemplateModel; - this.setDependentResources = setDependentResources.bind(this); - this.optionsLaunch = optionsLaunch.bind(this); - this.getLaunch = getLaunch.bind(this); - this.postLaunch = postLaunch.bind(this); - this.getSurveyQuestions = getSurveyQuestions.bind(this); - this.canLaunchWithoutPrompt = canLaunchWithoutPrompt.bind(this); - - this.model.launch = {}; - - return this.create(method, resource, graft); -} - -function UnifiedJobTemplateModelLoader (_BaseModel_, WorkflowJobTemplateNodeModel, _$http_) { - BaseModel = _BaseModel_; - WorkflowJobTemplateNode = WorkflowJobTemplateNodeModel; - $http = _$http_; - - return UnifiedJobTemplateModel; -} - -UnifiedJobTemplateModelLoader.$inject = [ - 'BaseModel', - 'WorkflowJobTemplateNodeModel', - '$http', - '$state' -]; - -export default UnifiedJobTemplateModelLoader; diff --git a/awx/ui/client/lib/models/User.js b/awx/ui/client/lib/models/User.js deleted file mode 100644 index da521255cb..0000000000 --- a/awx/ui/client/lib/models/User.js +++ /dev/null @@ -1,40 +0,0 @@ -let Base; -let $http; - -function postAuthorizedTokens (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/authorized_tokens/` - }; - - if (params.payload) { - req.data = params.payload; - } - - return $http(req); -} - -function UserModel (method, resource, config) { - Base.call(this, 'users'); - - this.Constructor = UserModel; - this.postAuthorizedTokens = postAuthorizedTokens.bind(this); - - this.model.launch = {}; - - return this.create(method, resource, config); -} - -function UserModelLoader (BaseModel, _$http_) { - Base = BaseModel; - $http = _$http_; - - return UserModel; -} - -UserModelLoader.$inject = [ - 'BaseModel', - '$http' -]; - -export default UserModelLoader; diff --git a/awx/ui/client/lib/models/WorkflowJob.js b/awx/ui/client/lib/models/WorkflowJob.js deleted file mode 100644 index 02ea3582cc..0000000000 --- a/awx/ui/client/lib/models/WorkflowJob.js +++ /dev/null @@ -1,34 +0,0 @@ -let Base; -let $http; - -function postRelaunch (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/relaunch/` - }; - - return $http(req); -} - -function WorkflowJobModel (method, resource, config) { - Base.call(this, 'workflow_jobs'); - - this.Constructor = WorkflowJobModel; - this.postRelaunch = postRelaunch.bind(this); - - return this.create(method, resource, config); -} - -function WorkflowJobModelLoader (BaseModel, _$http_) { - Base = BaseModel; - $http = _$http_; - - return WorkflowJobModel; -} - -WorkflowJobModelLoader.$inject = [ - 'BaseModel', - '$http' -]; - -export default WorkflowJobModelLoader; diff --git a/awx/ui/client/lib/models/WorkflowJobTemplate.js b/awx/ui/client/lib/models/WorkflowJobTemplate.js deleted file mode 100644 index 06d9e9decc..0000000000 --- a/awx/ui/client/lib/models/WorkflowJobTemplate.js +++ /dev/null @@ -1,96 +0,0 @@ -/* eslint camelcase: 0 */ -let Base; -let $http; - -function optionsLaunch (id) { - const req = { - method: 'OPTIONS', - url: `${this.path}${id}/launch/` - }; - - return $http(req); -} - -function getLaunch (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/launch/` - }; - - return $http(req) - .then(res => { - this.model.launch.GET = res.data; - - return res; - }); -} - -function postLaunch (params) { - const req = { - method: 'POST', - url: `${this.path}${params.id}/launch/` - }; - - if (params.launchData) { - req.data = params.launchData; - } - - return $http(req); -} - -function getSurveyQuestions (id) { - const req = { - method: 'GET', - url: `${this.path}${id}/survey_spec/` - }; - - return $http(req); -} - -function getLaunchConf () { - return this.model.launch.GET; -} - -function canLaunchWithoutPrompt () { - const launchData = this.getLaunchConf(); - - return ( - launchData.can_start_without_user_input && - !launchData.ask_inventory_on_launch && - !launchData.ask_variables_on_launch && - !launchData.ask_limit_on_launch && - !launchData.ask_scm_branch_on_launch && - !launchData.survey_enabled && - launchData.variables_needed_to_start.length === 0 - ); -} - -function WorkflowJobTemplateModel (method, resource, config) { - Base.call(this, 'workflow_job_templates'); - - this.Constructor = WorkflowJobTemplateModel; - this.optionsLaunch = optionsLaunch.bind(this); - this.getLaunch = getLaunch.bind(this); - this.postLaunch = postLaunch.bind(this); - this.getSurveyQuestions = getSurveyQuestions.bind(this); - this.getLaunchConf = getLaunchConf.bind(this); - this.canLaunchWithoutPrompt = canLaunchWithoutPrompt.bind(this); - - this.model.launch = {}; - - return this.create(method, resource, config); -} - -function WorkflowJobTemplateModelLoader (BaseModel, _$http_) { - Base = BaseModel; - $http = _$http_; - - return WorkflowJobTemplateModel; -} - -WorkflowJobTemplateModelLoader.$inject = [ - 'BaseModel', - '$http', -]; - -export default WorkflowJobTemplateModelLoader; diff --git a/awx/ui/client/lib/models/WorkflowJobTemplateNode.js b/awx/ui/client/lib/models/WorkflowJobTemplateNode.js deleted file mode 100644 index c08cbd2e8c..0000000000 --- a/awx/ui/client/lib/models/WorkflowJobTemplateNode.js +++ /dev/null @@ -1,21 +0,0 @@ -let Base; - -function WorkflowJobTemplateNodeModel (method, resource, config) { - Base.call(this, 'workflow_job_template_nodes'); - - this.Constructor = WorkflowJobTemplateNodeModel; - - return this.create(method, resource, config); -} - -function WorkflowJobTemplateNodeModelLoader (BaseModel) { - Base = BaseModel; - - return WorkflowJobTemplateNodeModel; -} - -WorkflowJobTemplateNodeModelLoader.$inject = [ - 'BaseModel' -]; - -export default WorkflowJobTemplateNodeModelLoader; diff --git a/awx/ui/client/lib/models/index.js b/awx/ui/client/lib/models/index.js deleted file mode 100644 index 6d8cc142e9..0000000000 --- a/awx/ui/client/lib/models/index.js +++ /dev/null @@ -1,72 +0,0 @@ -import atLibServices from '~services'; - -import AdHocCommand from '~models/AdHocCommand'; -import Application from '~models/Application'; -import Base from '~models/Base'; -import Config from '~models/Config'; -import Credential from '~models/Credential'; -import CredentialType from '~models/CredentialType'; -import Instance from '~models/Instance'; -import InstanceGroup from '~models/InstanceGroup'; -import Inventory from '~models/Inventory'; -import InventoryScript from '~models/InventoryScript'; -import InventorySource from '~models/InventorySource'; -import InventoryUpdate from '~models/InventoryUpdate'; -import Job from '~models/Job'; -import JobEvent from '~models/JobEvent'; -import JobTemplate from '~models/JobTemplate'; -import Me from '~models/Me'; -import NotificationTemplate from '~models/NotificationTemplate'; -import Organization from '~models/Organization'; -import Project from '~models/Project'; -import ProjectUpdate from '~models/ProjectUpdate'; -import Schedule from '~models/Schedule'; -import SystemJob from '~models/SystemJob'; -import Token from '~models/Token'; -import UnifiedJob from '~models/UnifiedJob'; -import UnifiedJobTemplate from '~models/UnifiedJobTemplate'; -import User from '~models/User'; -import WorkflowJob from '~models/WorkflowJob'; -import WorkflowJobTemplate from '~models/WorkflowJobTemplate'; -import WorkflowJobTemplateNode from '~models/WorkflowJobTemplateNode'; - -import ModelsStrings from '~models/models.strings'; - -const MODULE_NAME = 'at.lib.models'; - -angular - .module(MODULE_NAME, [ - atLibServices - ]) - .service('AdHocCommandModel', AdHocCommand) - .service('ApplicationModel', Application) - .service('BaseModel', Base) - .service('ConfigModel', Config) - .service('CredentialModel', Credential) - .service('CredentialTypeModel', CredentialType) - .service('InstanceGroupModel', InstanceGroup) - .service('InstanceModel', Instance) - .service('InventoryModel', Inventory) - .service('InventoryScriptModel', InventoryScript) - .service('InventorySourceModel', InventorySource) - .service('InventoryUpdateModel', InventoryUpdate) - .service('JobEventModel', JobEvent) - .service('JobModel', Job) - .service('JobTemplateModel', JobTemplate) - .service('MeModel', Me) - .service('ModelsStrings', ModelsStrings) - .service('NotificationTemplate', NotificationTemplate) - .service('OrganizationModel', Organization) - .service('ProjectModel', Project) - .service('ProjectUpdateModel', ProjectUpdate) - .service('ScheduleModel', Schedule) - .service('SystemJobModel', SystemJob) - .service('TokenModel', Token) - .service('UnifiedJobModel', UnifiedJob) - .service('UnifiedJobTemplateModel', UnifiedJobTemplate) - .service('UserModel', User) - .service('WorkflowJobModel', WorkflowJob) - .service('WorkflowJobTemplateModel', WorkflowJobTemplate) - .service('WorkflowJobTemplateNodeModel', WorkflowJobTemplateNode); - -export default MODULE_NAME; diff --git a/awx/ui/client/lib/models/models.strings.js b/awx/ui/client/lib/models/models.strings.js deleted file mode 100644 index c9385e3db5..0000000000 --- a/awx/ui/client/lib/models/models.strings.js +++ /dev/null @@ -1,56 +0,0 @@ -function ModelsStrings (BaseString) { - BaseString.call(this, 'models'); - - const { t } = this; - const ns = this.models; - - ns.credentials = { - LABEL: t.s('Credentials') - }; - - ns.credential_types = { - LABEL: t.s('Credential Types') - }; - - ns.inventories = { - LABEL: t.s('Inventories') - }; - - ns.inventory_scripts = { - LABEL: t.s('Inventory Scripts') - - }; - - ns.inventory_sources = { - LABEL: t.s('Inventory Sources') - - }; - - ns.job_templates = { - LABEL: t.s('Job Templates') - - }; - - ns.organizations = { - LABEL: t.s('Organizations') - - }; - - ns.projects = { - LABEL: t.s('Projects') - - }; - - ns.workflow_job_templates = { - LABEL: t.s('Workflow Job Templates') - }; - - ns.workflow_job_template_nodes = { - LABEL: t.s('Workflow Job Template Nodes') - - }; -} - -ModelsStrings.$inject = ['BaseStringService']; - -export default ModelsStrings; diff --git a/awx/ui/client/lib/services/app.strings.js b/awx/ui/client/lib/services/app.strings.js deleted file mode 100644 index a844897308..0000000000 --- a/awx/ui/client/lib/services/app.strings.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * This service is used to access the app-wide strings defined in BaseStringService. - */ -function AppStrings (BaseString) { - BaseString.call(this, 'app'); -} - -AppStrings.$inject = ['BaseStringService']; - -export default AppStrings; diff --git a/awx/ui/client/lib/services/base-string.service.js b/awx/ui/client/lib/services/base-string.service.js deleted file mode 100644 index 86119d5e12..0000000000 --- a/awx/ui/client/lib/services/base-string.service.js +++ /dev/null @@ -1,203 +0,0 @@ -import defaults from '~assets/default.strings.json'; - -let i18n; -let $filter; - -function BaseStringService (namespace) { - const ERROR_NO_NAMESPACE = 'BaseString cannot be extended without providing a namespace'; - - if (!namespace) { - throw new Error(ERROR_NO_NAMESPACE); - } - - this[namespace] = {}; - this.t = {}; - - /** - * To translate a singular string by itself or a string with context data, use `translate`. - * For brevity, this is renamed as `t.s` (as in "translate singular"). `t.s` serves a dual - * purpose -- it's to mark strings for translation so they appear in the `.pot` file after - * the grunt-angular-gettext task is run AND it's used to fetch the translated string at - * runtime. - * - * NOTE: View ui/src/i18n.js for where these i18n methods are defined. i18n is a wrapper around - * the library angular-gettext. - * - * @arg {string} string - The string to be translated - * @arg {object=} context - A data object used to populate dynamic context data in a string. - * - * @returns {string} The translated string or the original string in the even the translation - * does not exist. - */ - this.t.s = i18n.translate; - - /** - * To translate a plural string use `t.p`. The `count` supplied will determine whether the - * singular or plural string is returned. - * - * @arg {number} count - The count of the plural object - * @arg {string} singular - The singular version of the string to be translated - * @arg {string} plural - The plural version of the string to be translated - * @arg {object=} context - A data object used to populate dynamic context data in a string. - * - * @returns {string} The translated string or the original string in the even the translation - * does not exist. - */ - this.t.p = i18n.translatePlural; - - const { t } = this; - - /* - * These strings are globally relevant and configured to give priority to values in - * default.strings.json and fall back to defaults defined inline. - */ - this.BRAND_NAME = defaults.BRAND_NAME || 'AWX'; - this.PENDO_API_KEY = defaults.PENDO_API_KEY || ''; - - /* - * Globally relevant strings should be defined here to avoid duplication of content across the - * the project. - */ - this.CANCEL = t.s('CANCEL'); - this.CLOSE = t.s('CLOSE'); - this.SAVE = t.s('SAVE'); - this.SELECT = t.s('SELECT'); - this.OK = t.s('OK'); - this.RUN = t.s('RUN'); - this.NEXT = t.s('NEXT'); - this.SHOW = t.s('SHOW'); - this.HIDE = t.s('HIDE'); - this.ON = t.s('ON'); - this.OFF = t.s('OFF'); - this.YAML = t.s('YAML'); - this.JSON = t.s('JSON'); - this.DELETE = t.s('DELETE'); - this.COPY = t.s('COPY'); - this.YES = t.s('YES'); - this.CLOSE = t.s('CLOSE'); - this.TEST = t.s('TEST'); - this.REMOVE = t.s('REMOVE'); - this.SUCCESSFUL_CREATION = resource => t.s('{{ resource }} successfully created', { resource: $filter('sanitize')(resource) }); - - this.logos = { - AWX_LOGO: t.s('Ansible AWX Logo'), - TOWER_LOGO: t.s('Ansible Tower Logo'), - CUSTOM_LOGO: t.s('Custom Logo') - }; - - this.deleteResource = { - HEADER: t.s('Delete'), - USED_BY: resourceType => t.s('The {{ resourceType }} is currently being used by other resources.', { resourceType }), - UNAVAILABLE: resourceType => t.s('Deleting this {{ resourceType }} will make the following resources unavailable.', { resourceType }), - CONFIRM: resourceType => t.s('Are you sure you want to delete this {{ resourceType }}?', { resourceType }) - }; - - this.removeTeamAccess = { - HEADER: t.s('Team access removal'), - ACTION_TEXT: t.s('REMOVE TEAM ACCESS'), - CONFIRM: (role, name) => t.s('Please confirm that you would like to remove {{ role }} access from the team {{ name }}. This will affect all members of the team. If you would like to only remove access for this particular user, please remove them from the team.', { role, name }), - }; - - this.removeUserAccess = { - HEADER: t.s('Role access removal'), - ACTION_TEXT: t.s('REMOVE ACCESS'), - CONFIRM: (role, name) => t.s('Please confirm that you would like to remove {{ role }} access from {{ name }}.', { role, name }), - }; - - this.cancelJob = { - HEADER: t.s('Cancel'), - SUBMIT_REQUEST: t.s('Are you sure you want to submit the request to cancel this job?'), - CANCEL_JOB: t.s('Cancel Job'), - RETURN: t.s('Return') - }; - - this.error = { - HEADER: t.s('Error!'), - CALL: ({ path, action, status }) => t.s('Call to {{ path }} failed. {{ action }} returned status: {{ status }}.', { path, action, status }), - }; - - this.listActions = { - COPY: resourceType => t.s('Copy {{resourceType}}', { resourceType }), - DELETE: resourceType => t.s('Delete the {{resourceType}}', { resourceType }), - CANCEL: resourceType => t.s('Cancel the {{resourceType}}', { resourceType }) - }; - - this.sort = { - NAME_ASCENDING: t.s('Name (Ascending)'), - NAME_DESCENDING: t.s('Name (Descending)'), - CREATED_ASCENDING: t.s('Created (Ascending)'), - CREATED_DESCENDING: t.s('Created (Descending)'), - MODIFIED_ASCENDING: t.s('Modified (Ascending)'), - MODIFIED_DESCENDING: t.s('Modified (Descending)'), - EXPIRES_ASCENDING: t.s('Expires (Ascending)'), - EXPIRES_DESCENDING: t.s('Expires (Descending)'), - LAST_JOB_RUN_ASCENDING: t.s('Last Run (Ascending)'), - LAST_JOB_RUN_DESCENDING: t.s('Last Run (Descending)'), - LAST_USED_ASCENDING: t.s('Last Used (Ascending)'), - LAST_USED_DESCENDING: t.s('Last Used (Descending)'), - USERNAME_ASCENDING: t.s('Username (Ascending)'), - USERNAME_DESCENDING: t.s('Username (Descending)'), - START_TIME_ASCENDING: t.s('Start Time (Ascending)'), - START_TIME_DESCENDING: t.s('Start Time (Descending)'), - FINISH_TIME_ASCENDING: t.s('Finish Time (Ascending)'), - FINISH_TIME_DESCENDING: t.s('Finish Time (Descending)'), - UUID_ASCENDING: t.s('UUID (Ascending)'), - UUID_DESCENDING: t.s('UUID (Descending)'), - LAUNCHED_BY_ASCENDING: t.s('Launched By (Ascending)'), - LAUNCHED_BY_DESCENDING: t.s('Launched By (Descending)'), - INVENTORY_ASCENDING: t.s('Inventory (Ascending)'), - INVENTORY_DESCENDING: t.s('Inventory (Descending)'), - PROJECT_ASCENDING: t.s('Project (Ascending)'), - PROJECT_DESCENDING: t.s('Project (Descending)'), - ORGANIZATION_ASCENDING: t.s('Organization (Ascending)'), - ORGANIZATION_DESCENDING: t.s('Organization (Descending)'), - CAPACITY_ASCENDING: t.s('Capacity (Ascending)'), - CAPACITY_DESCENDING: t.s('Capacity (Descending)') - }; - - this.ALERT = ({ header, body }) => t.s('{{ header }} {{ body }}', { header, body }); - - /** - * This getter searches the extending class' namespace first for a match then falls back to - * the more globally relevant strings defined here. Strings with with dots as delimeters are - * supported to give flexibility to extending classes to nest strings as necessary. - * - * - * The `t.s` and `t.p` calls should only be used where strings are defined in - * .strings.js` files. To use translated strings elsewhere, access them through this - * common interface. - * - * @arg {string} name - The property name of the string (e.g. 'CANCEL') - * @arg {number=} count - A count of objects referenced in your plural string - * @arg {object=} context - An object containing data to use in the interpolation of the string - */ - this.get = (name, ...args) => { - const keys = name.split('.'); - let value; - - keys.forEach(key => { - if (!value) { - value = this[namespace][key] || this[key]; - } else { - value = value[key]; - } - }); - - if (!value || typeof value === 'string') { - return value; - } - - return value(...args); - }; -} - -function BaseStringServiceLoader (_i18n_, _$filter_) { - i18n = _i18n_; - $filter = _$filter_; - - return BaseStringService; -} - -BaseStringServiceLoader.$inject = ['i18n', '$filter']; - -export default BaseStringServiceLoader; diff --git a/awx/ui/client/lib/services/cache.service.js b/awx/ui/client/lib/services/cache.service.js deleted file mode 100644 index 783b0e0d4c..0000000000 --- a/awx/ui/client/lib/services/cache.service.js +++ /dev/null @@ -1,32 +0,0 @@ -function CacheService ($cacheFactory, $q) { - const cache = $cacheFactory('api'); - - this.put = (key, data) => cache.put(key, data); - this.get = (key) => $q.resolve(cache.get(key)); - - this.remove = (key) => { - if (!key) { - return cache.removeAll(); - } - - return cache.remove(key); - }; - - this.createKey = (method, path, resource) => { - let key = `${method.toUpperCase()}.${path}`; - - if (resource) { - if (resource.id) { - key += `${resource.id}/`; - } else if (Number(resource)) { - key += `${resource}/`; - } - } - - return key; - }; -} - -CacheService.$inject = ['$cacheFactory', '$q']; - -export default CacheService; diff --git a/awx/ui/client/lib/services/event.service.js b/awx/ui/client/lib/services/event.service.js deleted file mode 100644 index d7b7a40538..0000000000 --- a/awx/ui/client/lib/services/event.service.js +++ /dev/null @@ -1,37 +0,0 @@ -function EventService () { - this.addListeners = list => { - const listeners = []; - - list.forEach(args => listeners.push(this.addListener(...args))); - - return listeners; - }; - - this.addListener = (el, name, fn) => { - const listener = { - fn, - name, - el - }; - - if (Array.isArray(name)) { - name.forEach(e => listener.el.addEventListener(e, listener.fn)); - } else { - listener.el.addEventListener(listener.name, listener.fn); - } - - return listener; - }; - - this.remove = listeners => { - listeners.forEach(listener => { - if (Array.isArray(listener.name)) { - listener.name.forEach(name => listener.el.removeEventListener(name, listener.fn)); - } else { - listener.el.removeEventListener(listener.name, listener.fn); - } - }); - }; -} - -export default EventService; diff --git a/awx/ui/client/lib/services/index.js b/awx/ui/client/lib/services/index.js deleted file mode 100644 index 39ed1d8299..0000000000 --- a/awx/ui/client/lib/services/index.js +++ /dev/null @@ -1,17 +0,0 @@ -import AppStrings from '~services/app.strings'; -import BaseStringService from '~services/base-string.service'; -import CacheService from '~services/cache.service'; -import EventService from '~services/event.service'; - -const MODULE_NAME = 'at.lib.services'; - -angular - .module(MODULE_NAME, [ - 'I18N' - ]) - .service('AppStrings', AppStrings) - .service('BaseStringService', BaseStringService) - .service('CacheService', CacheService) - .service('EventService', EventService); - -export default MODULE_NAME; diff --git a/awx/ui/client/lib/theme/_global.less b/awx/ui/client/lib/theme/_global.less deleted file mode 100644 index 01690ab2dd..0000000000 --- a/awx/ui/client/lib/theme/_global.less +++ /dev/null @@ -1,73 +0,0 @@ -/** - * For styles that are used in more than one place throughout the application. - * - * 1. Buttons - * - */ - -// 1. Buttons ------------------------------------------------------------------------------------- - -.at-Button--success { - .at-mixin-Button(); - .at-mixin-ButtonColor('at-color-success', 'at-color-default'); - - &[disabled] { - background: @at-color-disabled; - border-color: @at-color-disabled; - } -} - -.at-Button--add { - &:extend(.at-Button--success all); - &:before { - content: "+"; - font-size: 20px; - } - border: none; - display: inline-flex; - margin-left: @at-space-4x; - - &[aria-expanded="true"] { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - } -} - -.at-Button--info { - .at-mixin-Button(); - .at-mixin-ButtonColor('at-color-info', 'at-color-default'); -} - -.at-Button--error { - .at-mixin-Button(); - .at-mixin-ButtonColor('at-color-error', 'at-color-default'); -} - -.at-ButtonHollow--default { - .at-mixin-Button(); - .at-mixin-ButtonHollow( - 'at-color-default', - 'at-color-button-border-default', - 'at-color-button-text-default' - ); -} - -.at-ButtonIcon { - padding: 4px @at-padding-button-horizontal; - font-size: @at-font-size-body; -} - -.at-ButtonIcon-noborder { - padding: 4px @at-padding-button-horizontal; - font-size: @at-font-size-body; - .at-mixin-Button(); - .at-mixin-ButtonHollow( - 'at-color-default', - 'at-color-default', - 'at-color-button-text-default' - ); -} - -.at-Button--expand { - width: 100%; -} diff --git a/awx/ui/client/lib/theme/_mixins.less b/awx/ui/client/lib/theme/_mixins.less deleted file mode 100644 index 3c3f0c66a5..0000000000 --- a/awx/ui/client/lib/theme/_mixins.less +++ /dev/null @@ -1,117 +0,0 @@ -.at-mixin-Placeholder (@color) { - &:-moz-placeholder { - color: @color; - } - &:-ms-input-placeholder { - color: @color; - } - &::-webkit-input-placeholder { - color: @color; - } -} - -.at-mixin-Heading (@size) { - color: @at-color-body-text; - font-size: @size; - font-weight: @at-font-weight-heading; - line-height: @at-line-height-short; - text-transform: uppercase; - margin: 0; - padding: 0; -} - -.at-mixin-Border (@color: @at-border-default-color) { - border-width: @at-border-default-width; - border-style: @at-border-default-style; - border-color: @color -} - -.at-mixin-Button () { - border-radius: @at-border-radius; - height: @at-height-input; - padding: @at-padding-button-vertical @at-padding-button-horizontal; - font-size: @at-font-size-body; - line-height: 1; -} - -.at-mixin-InputButton () { - height: @at-height-button; - padding: 0 @at-padding-button-horizontal; - - &, &:active, &:hover, &:focus { - color: @at-color-button-text-default; - border-color: @at-color-input-border; - background-color: @at-color-input-button; - cursor: pointer; - } - - &:hover { - background-color: @at-color-input-button-hover; - } -} - -.at-mixin-ButtonColor (@background, @color, @hover: '@{background}-hover') { - background-color: @@background; - border-color: @@background; - - &, &:hover, &:focus { - color: @@color; - } - - &:hover, &:focus { - background-color: @@hover; - border-color: @@hover; - } - - &[disabled] { - background-color: fade(@@background, 60%); - } -} - -.at-mixin-ButtonHollow (@bg, @border, @text) { - @hover: '@{bg}-hover'; - - background-color: @@bg; - color: @@text; - border-color: @@border; - - &:hover, &:active { - color: @@text; - background-color: @@hover; - box-shadow: none; - } - - &:focus { - color: @@text; - background-color: @@hover; - border-color: @@border; - cursor: default; - } - - &[disabled] { - opacity: 0.65; - } -} - -.at-mixin-ButtonIcon () { - line-height: @at-line-height-short; - - & > i { - cursor: pointer; - transition: color @at-transition-icon-button; - } - - & > i:hover { - color: @at-color-icon-hover - } -} - -.at-mixin-FontFixedWidth () { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} - -.at-mixin-VerticallyCenter () { - display: flex; - flex-direction: column; - justify-content: center; -} \ No newline at end of file diff --git a/awx/ui/client/lib/theme/_resets.less b/awx/ui/client/lib/theme/_resets.less deleted file mode 100644 index e7070fa42d..0000000000 --- a/awx/ui/client/lib/theme/_resets.less +++ /dev/null @@ -1,5 +0,0 @@ -// TODO (remove override on cleanup): - -.at-Panel-heading:hover { - cursor: default; -} diff --git a/awx/ui/client/lib/theme/_utility.less b/awx/ui/client/lib/theme/_utility.less deleted file mode 100644 index b3663b74a3..0000000000 --- a/awx/ui/client/lib/theme/_utility.less +++ /dev/null @@ -1,30 +0,0 @@ -.at-u-noSpace { - margin: 0; - padding: 0; -} - -.at-u-flat { - padding-top: 0; - padding-bottom: 0; - margin-top: 0; - margin-bottom: 0; -} - -.at-u-thin { - padding-left: 0; - padding-right: 0; - margin-left: 0; - margin-right: 0; -} - -.at-u-clear { - clear: both; -} - -.at-u-noBorder { - border: none; -} - -.at-u-floatRight { - float: right -} diff --git a/awx/ui/client/lib/theme/_variables.less b/awx/ui/client/lib/theme/_variables.less deleted file mode 100644 index 157adf6cb0..0000000000 --- a/awx/ui/client/lib/theme/_variables.less +++ /dev/null @@ -1,335 +0,0 @@ -/** - * All base variables used. These should only be referenced by the contextual variables defined - * below. In development, unless you are intentionally making a fundamental change, these variables - * should not be modified, removed, or added to. - * - * These variables should not be used directly in development of components or features. If an - * alias doesn't exist for the context you're working within, check with UX to create a new alias - * or to define a more applicable alias. - * - * The goal is for UX to define the contexts for the contextual variables, so it's easy to make - * modifications like, "Change heading text to be smaller" or "Make all warnings a lighter shade - * of orange" - * - * 1. Colors - * 2. Typography - * 3. Layout - * 4. Breakpoints - * - */ - -// 1. Colors -------------------------------------------------------------------------------------- - -@at-gray-fc: #fcfcfc; -@at-gray-fa: #fafafa; -@at-gray-f2: #f2f2f2; -@at-gray-f6: #f6f6f6; -@at-gray-eb: #ebebeb; -@at-gray-e1: #e1e1e1; -@at-gray-d7: #d7d7d7; -@at-gray-b7: #b7b7b7; -@at-gray-a9: #a9a9a9; -@at-gray-646972: #646972; -@at-gray-76: #767676; -@at-gray-60: #606060; -@at-gray-70: #707070; -@at-gray-48: #484848; -@at-gray-161b1f: #161b1f; - -@at-white: #ffffff; -@at-white-hover: #f2f2f2; - -@at-blue: #337ab7; -@at-blue-hover: #286090; - -@at-green: #5cb85c; -@at-green-hover: #449d44; - -@at-orange: #f0ad4e; -@at-orange-hover: #ec971f; - -@at-red: #d9534f; -@at-red-hover: #c9302c; - -@at-red-bright: #ff0000; -@at-red-bright-hover: #d81f1f; - -// 2. Typography ---------------------------------------------------------------------------------- - -@at-font-size: 12px; -@at-font-size-2x: 13px; -@at-font-size-3x: 14px; -@at-font-size-4x: 16px; -@at-font-size-5x: 20px; - -@at-font-weight: 400; -@at-font-weight-2x: 700; - -// 3. Layout -------------------------------------------------------------------------------------- - -@at-space: 5px; -@at-space-2x: 10px; -@at-space-3x: 15px; -@at-space-4x: 20px; -@at-space-5x: 25px; -@at-space-10x: 50px; - -// 4. Breakpoints --------------------------------------------------------------------------------- - -@at-breakpoint-sm: 700px; - -/** - * All variables used in the UI. Use these variables directly during the development of components - * and features. Be sure the context of the variable name applies to the work that's being done. - * For example, it wouldn't make sense to use `@at-input-height` to describe the height of a - * button. Either add an alias if it makes sense to use the same base variable, or add a new - * base variable to reference. - * - * Keep in mind the goal is to be able to modify an item by referencing its context instead of - * an arbitrary variable name. For example, tt should be a simple change when an ask comes in to - * "increase the height of inputs" - * - * 1. Colors - * 2. Typography - * 3. Layout - * 4. Buttons - * 5. Misc - * 6. Breakpoints - * - */ - -// 1. Colors -------------------------------------------------------------------------------------- - -@at-color-default: @at-white; -@at-color-default-hover: @at-white-hover; - -@at-color-unreachable: @at-red-bright; -@at-color-unreachable-hover: @at-red-bright-hover; - -@at-color-error: @at-red; -@at-color-error-hover: @at-red-hover; - -@at-color-warning: @at-orange; -@at-color-warning-hover: @at-orange-hover; - -@at-color-info: @at-blue; -@at-color-info-hover: @at-blue-hover; - -@at-color-success: @at-green; -@at-color-success-hover: @at-green-hover; - -@at-color-disabled: @at-gray-b7; - -@at-color-body-background-dark: @at-gray-70; -@at-color-body-background-light: @at-gray-eb; -@at-color-body-text-dark: @at-white; -@at-color-body-background: @at-gray-fc; -@at-color-body-text: @at-gray-70; - -@at-color-button-border-default: @at-gray-b7; -@at-color-button-text-default: @at-gray-70; - -@at-color-tab-default-active: @at-gray-646972; -@at-color-tab-border-default-active: @at-gray-646972; -@at-color-tab-text-default-active: @at-white; - -@at-color-tab-default-disabled: @at-white; -@at-color-tab-border-default-disabled: @at-gray-b7; -@at-color-tab-text-default-disabled: @at-gray-70; - -@at-color-form-label: @at-gray-70; - -@at-color-input-background: @at-gray-fc; -@at-color-input-border: @at-gray-b7; -@at-color-input-button: @at-white; -@at-color-input-button-hover: @at-gray-f2; -@at-color-input-disabled: @at-gray-eb; -@at-color-input-readonly: @at-color-input-background; - -@at-color-input-error: @at-color-error; -@at-color-input-focus: @at-color-info; -@at-color-input-hint: @at-gray-646972; -@at-color-input-icon: @at-gray-b7; -@at-color-input-placeholder: @at-gray-646972; -@at-color-input-text: @at-gray-161b1f; -@at-color-input-slider-thumb: @at-blue; -@at-color-input-slider-track: @at-gray-b7; - -@at-color-icon-dismiss: @at-gray-d7; -@at-color-icon-popover: @at-gray-646972; -@at-color-icon-hover: @at-gray-646972; - -@at-color-panel-heading: @at-gray-70; -@at-color-panel-border: @at-gray-b7; - -@at-color-search-key-active: @at-blue; - -@at-color-table-header-background: @at-gray-eb; -@at-color-line-separator: @at-gray-e1; - -@at-color-top-nav-background: @at-white; -@at-color-top-nav-border-bottom: @at-gray-b7; -@at-color-top-nav-item-text: @at-gray-70; -@at-color-top-nav-item-icon: @at-gray-646972; -@at-color-top-nav-item-icon-socket-outline: @at-white; -@at-color-top-nav-item-background-hover: @at-gray-fa; -@at-color-side-nav-background: @at-gray-48; -@at-color-side-nav-content: @at-white; -@at-color-side-nav-item-background-hover: @at-gray-76; -@at-color-side-nav-item-border-hover: @at-white; -@at-color-side-nav-item-icon: @at-white; -@at-color-side-nav-item-spacer: @at-gray-d7; -@at-color-side-nav-space-collapsed-border: @at-gray-b7; - -@at-color-list-empty-border: @at-gray-d7; -@at-color-list-empty-background: @at-gray-f6; -@at-color-list-empty: @at-gray-646972; -@at-color-list-border: @at-gray-b7; -@at-color-list-row-item-tag-background: @at-gray-eb; -@at-color-list-row-item-tag: @at-gray-60; -@at-color-list-row-item-label: @at-gray-646972; -@at-color-list-row-action-background: @at-white; -@at-color-list-row-action-icon: @at-gray-646972; -@at-color-list-row-action-hover: @at-blue; -@at-color-list-row-action-hover-danger: @at-red; -@at-color-list-row-action-icon-hover: @at-white; -@at-color-list-row-item-tag-primary-background: @at-blue; -@at-color-list-row-item-tag-primary: @at-white; - -// 2. Typography ---------------------------------------------------------------------------------- - -@at-font-size-body: @at-font-size-3x; -@at-font-size-button: @at-font-size; -@at-font-size-breadcrumb: @at-font-size-3x; -@at-font-size-form-label: @at-font-size-2x; -@at-font-size-help-text: @at-font-size; -@at-font-size-icon: @at-font-size-4x; -@at-font-size-input: @at-font-size-3x; -@at-font-size-panel-heading: @at-font-size-3x; -@at-font-size-panel-inset-heading: @at-font-size-2x; -@at-font-size-modal-heading: @at-font-size-3x; -@at-font-size-modal-dismiss: @at-font-size-3x; -@at-font-size-navigation: @at-font-size-3x; -@at-font-size-table-heading: @at-font-size-3x; -@at-font-size-menu-icon: @at-font-size-5x; -@at-font-size-side-nav-icon: 19px; -@at-font-size-side-nav-space: 11px; -@at-font-size-list-row-item-tag: 10px; -@at-font-size-list-row-action: 19px; -@at-font-size-list-row-action-icon: 19px; -@at-font-size-jumbotron-heading: 24px; -@at-font-size-jumbotron-text: @at-font-size-4x; - -@at-font-weight-body: @at-font-weight; -@at-font-weight-heading: @at-font-weight-2x; - -// 3. Layout -------------------------------------------------------------------------------------- - -@at-padding-button-horizontal: @at-space-2x; -@at-padding-button-vertical: @at-space; -@at-padding-inset: @at-space-3x; -@at-padding-panel: @at-space-4x; -@at-padding-popover: @at-space-2x; -@at-padding-well: @at-space-2x; -@at-padding-input: @at-space-2x; -@at-padding-top-nav-item-sides: @at-space-4x; -@at-padding-side-nav-item-icon: @at-space-3x; -@at-padding-side-nav-item-icon: 10px 15px; -@at-padding-side-nav-item-spacer: 10px 10px 25px 15px; -@at-padding-bottom-side-nav-toggle-mobile: 15px; -@at-padding-top-side-nav-toggle: 5px; -@at-padding-left-side-nav-toggle-icon: 15px; -@at-padding-left-side-nav-item-icon: 10px; -@at-padding-left-side-nav-item-icon-expanded: 15px; -@at-padding-left-side-nav-item-icon-no-tooltip: 18px; -@at-padding-between-side-nav-icon-text: @at-space-3x; -@at-padding-list-empty: @at-space-2x; -@at-padding-list-row-item-tag: 3px 9px; -@at-padding-list-row-action: 7px; -@at-padding-list-row: 10px 20px 10px 10px; -@at-padding-bottom-instances-wrap: 30px; - -@at-margin-input-message: @at-space; -@at-margin-item-column: @at-space-3x; -@at-margin-panel: @at-space-4x; -@at-margin-panel-inset: @at-space-3x; -@at-margin-popover: @at-space-2x; -@at-margin-tag: @at-space-2x; -@at-margin-form-label: @at-space; -@at-margin-form-label-hint: @at-space-2x; -@at-margin-top-nav-item-between-icon-and-name: @at-space-2x; -@at-margin-top-nav-item-icon-socket-top-makeup: -3px; -@at-margin-side-nav-space-collapsed: 5px 0; - -@at-margin-top-search-key: @at-space-2x; - -@at-margin-top-list: @at-space-4x; -@at-margin-bottom-list-toolbar: @at-space-4x; -@at-margin-above-list-toolbar: @at-space-4x; -@at-margin-left-toolbar-action: @at-space-4x; -@at-margin-left-toolbar-carat: @at-space; -@at-margin-bottom-list-header: @at-space; -@at-margin-left-list-row-item-tag: @at-space-2x; -@at-margin-top-list-row-item-tag: 2.25px; -@at-margin-left-list-row-action: @at-space-4x; -@at-margin-right-list-row-item-tag-icon: 8px; -@at-margin-left-list-row-item-tag-container: -10px; -@at-margin-list-row-action-mobile: 10px; -@at-margin-right-list-row-item-status: @at-space-2x; -@at-margin-right-list-row-item-inline: @at-space-4x; -@at-margin-right-list-row-item-inline-label: @at-space-2x; - -@at-height-divider: @at-margin-panel; -@at-height-input: 30px; -@at-height-textarea: 144px; -@at-height-button: 30px; -@at-height-tab: 30px; -@at-height-top-nav: 60px; -@at-height-top-nav-item-icon: 21px; -@at-height-top-nav-item-icon-socket: 18px; -@at-height-side-nav-item-icon: 19px; -@at-height-side-nav-spacer: 20px; -@at-height-top-side-nav-makeup: 55px; -@at-height-list-empty: 200px; -@at-height-toolbar-action: 30px; -@at-height-list-row-item: 27px; -@at-height-list-row-action: 30px; -@at-height-side-nav-toggle-mobile: 40px; - -@at-width-input-button-sm: 72px; -@at-width-input-button-md: 84px; -@at-width-collapsed-side-nav: 55px; -@at-width-expanded-side-nav: 190px; -@at-width-list-row-item-label: 120px; -@at-width-list-row-action: 30px; -@at-width-side-nav-toggle-mobile: 50px; - -@at-line-height-list-row-item-header: @at-space-3x; -@at-line-height-list-row-item-labels: 17px; - -// 4. Transitions --------------------------------------------------------------------------------- - -@at-transition-icon-button: 0.2s; - -// 5. Misc ---------------------------------------------------------------------------------------- - -@at-border-radius: 5px; -@at-border-default-style: solid; -@at-border-default-width: 1px; -@at-border-default-color: @at-gray-b7; -@at-border-style-list-active-indicator: 5px solid @at-color-info; -@at-popover-maxwidth: 320px; -@at-line-height-short: 0.9; -@at-line-height-tall: 2; -@at-line-height: 24px; -@at-highlight-left-border-size: 5px; -@at-highlight-left-border-margin-makeup: -5px; -@at-z-index-nav: 1040; -@at-z-index-side-nav: 1030; -@at-line-height-list-row-item-tag: 14px; - -// 6. Breakpoints --------------------------------------------------------------------------------- - -@at-breakpoint-mobile-layout: @at-breakpoint-sm; -@at-breakpoint-compact-list: @at-breakpoint-sm; -@at-breakpoint-instances-wrap: 1036px; diff --git a/awx/ui/client/lib/theme/index.less b/awx/ui/client/lib/theme/index.less deleted file mode 100644 index c7baad45e4..0000000000 --- a/awx/ui/client/lib/theme/index.less +++ /dev/null @@ -1,160 +0,0 @@ -// Dependency Variables -@import '../../../node_modules/components-font-awesome/less/variables'; - -// App-specific Legacy Variables -@import '../../src/shared/branding/colors.default.less'; -@import '../../src/shared/branding/colors'; - -/** - * Override Variables - * - * NOTE: Used in conditional build scenarios and will need to persist after any refactoring effort. - */ -@import '../../assets/variables'; - -/** - * Legacy Styles - * - * NOTE: Styles below are a mix of 3rd-party dependencies and in-house code. For the 3rd-party - * stuff, we'd be better off managing them via npm where possible. - */ -@import '../../legacy/styles/fonts'; -@import '../../legacy/styles/animations'; -@import '../../legacy/styles/jquery-ui-overrides'; -@import '../../legacy/styles/codemirror'; -@import '../../legacy/styles/angular-scheduler'; -@import '../../legacy/styles/log-viewer'; -@import '../../legacy/styles/event-viewer'; -@import '../../legacy/styles/job-details'; -@import '../../legacy/styles/jobs'; -@import '../../legacy/styles/inventory-edit'; -@import '../../legacy/styles/stdout'; -@import '../../legacy/styles/lists'; -@import '../../legacy/styles/forms'; -@import '../../legacy/styles/dashboard'; -@import '../../legacy/styles/survey-maker'; -@import '../../legacy/styles/text-label'; -@import '../../legacy/styles/bootstrap-datepicker'; -@import '../../legacy/styles/ansible-ui'; -@import '../../legacy/styles/bootstrap-custom-overrides'; - -// Legacy Utilities -@import '../../src/shared/utilities/alerts'; -@import '../../src/shared/utilities/hidden'; -@import '../../src/shared/utilities/icons'; -@import '../../src/shared/utilities/layer'; -@import '../../src/shared/utilities/truncated-text'; -@import '../../src/shared/utilities/unbold'; -@import '../../src/shared/utilities/wordwrap'; - -// Legacy Layout -@import '../../src/shared/layouts/one-plus-one'; -@import '../../src/shared/layouts/one-plus-two'; - -/** - * Legacy Features - * - * NOTE: "dot" namespacing interferes with Less' ability to infer the .less suffix, so it's - * explicitly added to the import statements below. - */ -@import '../../src/about/about.block.less'; -@import '../../src/access/rbac-role-column/roleList.block.less'; -@import '../../src/access/add-rbac.block.less'; -@import '../../src/activity-stream/streamDetailModal/streamDetailModal.block.less'; -@import '../../src/activity-stream/activitystream.block.less'; -@import '../../src/bread-crumb/bread-crumb.block.less'; -@import '../../src/configuration/settings.block.less'; -@import '../../src/credentials/ownerList.block.less'; -@import '../../src/home/dashboard/counts/dashboard-counts.block.less'; -@import '../../src/home/dashboard/graphs/dashboard-graphs.block.less'; -@import '../../src/home/dashboard/lists/dashboard-list.block.less'; -@import '../../src/home/dashboard/dashboard.block.less'; -@import '../../src/instance-groups/capacity-bar/capacity-bar.block.less'; -@import '../../src/instance-groups/capacity-adjuster/capacity-adjuster.block.less'; -@import '../../src/instance-groups/instance-group.block.less'; -@import '../../src/instance-groups/instances/instance-modal.block.less'; -@import '../../src/inventories-hosts/inventories/insights/insights.block.less'; -@import '../../src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.block.less'; -@import '../../src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.block.less'; -@import '../../src/inventories-hosts/inventories/inventories.block.less'; -@import '../../src/inventories-hosts/shared/associate-groups/associate-groups.block.less'; -@import '../../src/inventories-hosts/shared/associate-hosts/associate-hosts.block.less'; -@import '../../src/license/license.block.less'; -@import '../../src/login/loginModal/thirdPartySignOn/thirdPartySignOn.block.less'; -@import '../../src/login/loginModal/loginModal.block.less'; -@import '../../src/login/loginModal/loginModalNotice.block.less'; -@import '../../src/management-jobs/card/mgmtcards.block.less'; -@import '../../src/notifications/notifications.block.less'; -@import '../../src/organizations/linkout/addUsers/addUsers.block.less'; -@import '../../src/organizations/orgcards.block.less'; -@import '../../src/scheduler/repeatFrequencyOptions.block.less'; -@import '../../src/scheduler/schedulerForm.block.less'; -@import '../../src/scheduler/schedulerDatePicker.block.less'; -@import '../../src/scheduler/schedulerFormDetail.block.less'; -@import '../../src/scheduler/schedulertime.block.less'; -@import '../../src/scheduler/spinnerInput.block.less'; -@import '../../src/shared/container/container.block.less'; -@import '../../src/shared/detail-nav/detail-nav.block.less'; -@import '../../src/shared/icon/icon.block.less'; -@import '../../src/shared/instance-groups-multiselect/instance-groups.block.less'; -@import '../../src/shared/lookup/lookup-modal.block.less'; -@import '../../src/shared/modal/modal'; -@import '../../src/shared/multi-select-preview/multi-select-preview.block.less'; -@import '../../src/shared/paginate/paginate.block.less'; -@import '../../src/shared/prompt/prompt'; -@import '../../src/shared/smart-search/smart-search.block.less'; -@import '../../src/shared/button.block.less'; -@import '../../src/shared/download-standard-out.block.less'; -@import '../../src/shared/media-object.block.less'; -@import '../../src/shared/text-label'; -@import '../../src/shared/upgrade/upgrade.block.less'; -@import '../../src/smart-status/smart-status.block.less'; -@import '../../src/workflow-results/standard-out.block.less'; -@import '../../src/templates/prompt/prompt.block.less'; -@import '../../src/templates/job_templates/multi-credential/multi-credential.block.less'; -@import '../../src/templates/job_templates/webhook-credential/webhook-credential.block.less'; -@import '../../src/templates/labels/labelsList.block.less'; -@import '../../src/templates/survey-maker/survey-maker.block.less'; -@import '../../src/templates/survey-maker/survey-maker.block.less'; -@import '../../src/templates/survey-maker/shared/survey-controls.block.less'; -@import '../../src/templates/survey-maker/survey-maker.block.less'; -@import '../../src/templates/workflows/workflow.block.less'; -@import '../../src/templates/workflows/workflow-chart/workflow-chart.block.less'; -@import '../../src/templates/workflows/workflow-controls/workflow-controls.block.less'; -@import '../../src/templates/workflows/workflow-maker/workflow-maker.block.less'; -@import '../../src/tooltip/tooltip.block.less'; -@import '../../src/workflow-results/workflow-status-bar/workflow-status-bar.block.less'; -@import '../../src/workflow-results/workflow-results.block.less'; - -/** - * App-wide style - * - * NOTE: Variables, mixins, and classes below are useful in more than one place across the - * application. When working with Less, if the need for a variable, mixin, class, etc exists in - * more than one location, take a moment to move it to this more general location for easy reuse - * and to avoid duplication. - */ -@import '_variables'; -@import '_mixins'; -@import '_utility'; -@import '_global'; - -/** - * Component and Feature style - * - * NOTE: These index files are aggregation points for components and features. To view the more - * granular imports, view the contents of these files. Variables, classes, etc defined within - * these specific files ought to have no use elsewhere. As we shift to leverage components, very - * few feature-specific styles will exist. - */ -@import '../components/_index'; -@import '../../features/_index'; - -/* - * Resets - * - * NOTE: In some cases, the legacy classes override dependency styles explicitly. In those cases, - * it's necessary to override the overrides. This particular file will only be relevant during - * the transition. - */ -@import '_resets'; diff --git a/awx/ui/client/src/about/about.block.less b/awx/ui/client/src/about/about.block.less deleted file mode 100644 index 3b9a0ad00a..0000000000 --- a/awx/ui/client/src/about/about.block.less +++ /dev/null @@ -1,60 +0,0 @@ -/** @define About */ -.About-ansibleVersion, -.About-cowsayCode { - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; -} - -.About-cowsayContainer { - width: 340px; - margin: 0 auto; -} -.About-cowsayCode { - background-color: @default-bg; - padding-left: 30px; - border-style: none; - max-width: 340px; - padding-left: 30px; -} -.About-modalHeader { - border: none; - padding-bottom: 0px; -} -.About-modalDialog { - max-width: 500px; -} - -.About-modalBody { - padding-top: 0px; - padding-bottom: 0px; -} - -.About-brandImg { - float: @about-modal-float; - width: @about-modal-width; - padding-top: @about-modal-padding-top; - margin-top: @about-modal-margin-top; - margin-left: @about-modal-margin-left; -} - -.About-close { - position: absolute; - top: 15px; - right: 15px; - z-index: 10; -} - -.About-modalFooter { - clear: both; -} - -.About-footerText { - text-align: right; - color: @default-interface-txt; - margin: 0; - font-size: 12px; - padding-top: 10px; -} - -.About-ansibleVersion { - color: @default-data-txt; -} diff --git a/awx/ui/client/src/about/about.controller.js b/awx/ui/client/src/about/about.controller.js deleted file mode 100644 index e2ef6e776a..0000000000 --- a/awx/ui/client/src/about/about.controller.js +++ /dev/null @@ -1,32 +0,0 @@ -export default ['$rootScope', '$scope', '$location', 'ConfigService', 'lastPath', - ($rootScope, $scope, $location, ConfigService, lastPath) => { - - ConfigService.getConfig() - .then(function(config){ - $scope.version = config.version.split('-')[0]; - $scope.ansible_version = config.ansible_version; - $scope.subscription = config.license_info.subscription_name; - $scope.speechBubble = createSpeechBubble($rootScope.BRAND_NAME, config.version); - $scope.currentYear = new Date().getFullYear(); - $('#about-modal').modal('show'); - }); - - $('#about-modal').on('hidden.bs.modal', () => $location.url(lastPath)); - - function createSpeechBubble (brand, version) { - let text = `${brand} ${version}`; - let top = ''; - let bottom = ''; - - for (let i = 0; i < text.length; i++) { - top += '_'; - bottom += '-'; - } - - top = ` __${top}__ \n`; - text = `< ${text} >\n`; - bottom = ` --${bottom}-- `; - - return top + text + bottom; - } -}]; diff --git a/awx/ui/client/src/about/about.partial.html b/awx/ui/client/src/about/about.partial.html deleted file mode 100644 index 2be5f6234b..0000000000 --- a/awx/ui/client/src/about/about.partial.html +++ /dev/null @@ -1,39 +0,0 @@ - diff --git a/awx/ui/client/src/configuration/forms/settings-form.controller.js b/awx/ui/client/src/configuration/forms/settings-form.controller.js deleted file mode 100644 index e78d08baaa..0000000000 --- a/awx/ui/client/src/configuration/forms/settings-form.controller.js +++ /dev/null @@ -1,635 +0,0 @@ -import defaultStrings from '~assets/default.strings.json'; - -export default [ - '$scope', '$rootScope', '$state', '$stateParams', '$q', - 'SettingsService', 'SettingsUtils', 'CreateDialog', 'i18n', 'ProcessErrors', 'Store', - 'Wait', 'configDataResolve', 'ToJSON', 'ConfigService', - //Form definitions - 'configurationAzureForm', - 'configurationGithubForm', - 'configurationGithubOrgForm', - 'configurationGithubTeamForm', - 'configurationGoogleForm', - 'configurationLdapForm', - 'configurationLdap1Form', - 'configurationLdap2Form', - 'configurationLdap3Form', - 'configurationLdap4Form', - 'configurationLdap5Form', - 'configurationRadiusForm', - 'configurationTacacsForm', - 'configurationSamlForm', - 'systemActivityStreamForm', - 'systemLoggingForm', - 'systemMiscForm', - 'ConfigurationJobsForm', - 'ConfigurationUiForm', - 'ngToast', - function( - $scope, $rootScope, $state, $stateParams, $q, - SettingsService, SettingsUtils, CreateDialog, i18n, ProcessErrors, Store, - Wait, configDataResolve, ToJSON, ConfigService, - //Form definitions - configurationAzureForm, - configurationGithubForm, - configurationGithubOrgForm, - configurationGithubTeamForm, - configurationGoogleForm, - configurationLdapForm, - configurationLdap1Form, - configurationLdap2Form, - configurationLdap3Form, - configurationLdap4Form, - configurationLdap5Form, - configurationRadiusForm, - configurationTacacsForm, - configurationSamlForm, - systemActivityStreamForm, - systemLoggingForm, - systemMiscForm, - ConfigurationJobsForm, - ConfigurationUiForm, - ngToast - ) { - const vm = this; - - vm.product = defaultStrings.BRAND_NAME; - vm.activeTab = $stateParams.form; - - const formDefs = { - 'azure': configurationAzureForm, - 'github': configurationGithubForm, - 'github_org': configurationGithubOrgForm, - 'github_team': configurationGithubTeamForm, - 'google_oauth': configurationGoogleForm, - 'ldap': configurationLdapForm, - 'ldap1': configurationLdap1Form, - 'ldap2': configurationLdap2Form, - 'ldap3': configurationLdap3Form, - 'ldap4': configurationLdap4Form, - 'ldap5': configurationLdap5Form, - 'radius': configurationRadiusForm, - 'tacacs': configurationTacacsForm, - 'saml': configurationSamlForm, - 'activity_stream': systemActivityStreamForm, - 'logging': systemLoggingForm, - 'misc': systemMiscForm, - 'jobs': ConfigurationJobsForm, - 'ui': ConfigurationUiForm - }; - - $scope.configDataResolve = configDataResolve; - $scope.formDefs = formDefs; - - // check if it's auditor, show messageBar - $scope.show_auditor_bar = false; - if($rootScope.user_is_system_auditor && Store('show_auditor_bar') !== false) { - $scope.show_auditor_bar = true; - } else { - $scope.show_auditor_bar = false; - } - - var populateFromApi = function() { - SettingsService.getCurrentValues() - .then(function(data) { - $scope.logAggregatorEnabled = data.LOG_AGGREGATOR_ENABLED; - // these two values need to be unnested from the - // OAUTH2_PROVIDER key - data.ACCESS_TOKEN_EXPIRE_SECONDS = data - .OAUTH2_PROVIDER.ACCESS_TOKEN_EXPIRE_SECONDS; - data.REFRESH_TOKEN_EXPIRE_SECONDS = data - .OAUTH2_PROVIDER.REFRESH_TOKEN_EXPIRE_SECONDS; - data.AUTHORIZATION_CODE_EXPIRE_SECONDS = data - .OAUTH2_PROVIDER.AUTHORIZATION_CODE_EXPIRE_SECONDS; - var currentKeys = _.keys(data); - $scope.requiredLogValues = {}; - $scope.originalSettings = data; - _.each(currentKeys, function(key) { - if(key === "LOG_AGGREGATOR_HOST") { - $scope.requiredLogValues.LOG_AGGREGATOR_HOST = data[key]; - } - - if(key === "LOG_AGGREGATOR_TYPE") { - $scope.requiredLogValues.LOG_AGGREGATOR_TYPE = data[key]; - } - - if (data[key] !== null && typeof data[key] === 'object') { - if (Array.isArray(data[key])) { - //handle arrays - //having to do this particular check b/c - // we want the options w/o a space, and - // the ConfigurationUtils.arrayToList() - // does a string.split(', ') w/ an extra space - // behind the comma. - - const isLdap = (key.indexOf("AUTH_LDAP") !== -1); - const isLdapUserSearch = isLdap && (key.indexOf("USER_SEARCH") !== -1); - const isLdapGroupSearch = isLdap && (key.indexOf("GROUP_SEARCH") !== -1); - - if(key === "AD_HOC_COMMANDS"){ - $scope[key] = data[key]; - } else if (isLdapUserSearch || isLdapGroupSearch) { - $scope[key] = JSON.stringify(data[key]); - } else { - $scope[key] = SettingsUtils.arrayToList(data[key], key); - } - - } else { - //handle nested objects - if(SettingsUtils.isEmpty(data[key])) { - $scope[key] = '{}'; - } else { - $scope[key] = JSON.stringify(data[key]); - } - } - } else { - $scope[key] = data[key]; - } - }); - $scope.$broadcast('populated', data); - }); - }; - - populateFromApi(); - - var formTracker = { - lastForm: '', - currentForm: '', - currentAuth: '', - currentSystem: '', - setCurrent: function(form) { - this.lastForm = this.currentForm; - this.currentForm = form; - }, - getCurrent: function() { - return this.currentForm; - }, - currentFormName: function() { - return 'configuration_' + this.currentForm + '_template_form'; - }, - setCurrentAuth: function(form) { - this.currentAuth = form; - this.setCurrent(this.currentAuth); - }, - setCurrentSystem: function(form) { - this.currentSystem = form; - this.setCurrent(this.currentSystem); - }, - }; - - var triggerModal = function(msg, title, buttons) { - if ($scope.removeModalReady) { - $scope.removeModalReady(); - } - $scope.removeModalReady = $scope.$on('ModalReady', function() { - // $('#lookup-save-button').attr('disabled', 'disabled'); - $('#FormModal-dialog').dialog('open'); - }); - - $('#FormModal-dialog').html(msg); - - CreateDialog({ - scope: $scope, - buttons: buttons, - width: 600, - height: 200, - minWidth: 500, - title: title, - id: 'FormModal-dialog', - resizable: false, - callback: 'ModalReady' - }); - }; - - function loginUpdate() { - // Updates the logo and app config so that logos and info are properly shown - // on logout after modifying. - if($scope.CUSTOM_LOGO) { - $rootScope.custom_logo = $scope.CUSTOM_LOGO; - global.$AnsibleConfig.custom_logo = true; - } else { - $rootScope.custom_logo = ''; - global.$AnsibleConfig.custom_logo = false; - } - - if($scope.CUSTOM_LOGIN_INFO) { - $rootScope.custom_login_info = $scope.CUSTOM_LOGIN_INFO; - global.$AnsibleConfig.custom_login_info = $scope.CUSTOM_LOGIN_INFO; - } else { - $rootScope.custom_login_info = ''; - global.$AnsibleConfig.custom_login_info = false; - } - - Store('AnsibleConfig', global.$AnsibleConfig); - - $scope.$broadcast('loginUpdated'); - } - - $scope.resetValue = function(key) { - Wait('start'); - var payload = {}; - if (key === 'ACCESS_TOKEN_EXPIRE_SECONDS' || key === 'REFRESH_TOKEN_EXPIRE_SECONDS' || key === 'AUTHORIZATION_CODE_EXPIRE_SECONDS') { - // the reset for these two keys needs to be nested under OAUTH2_PROVIDER - if (payload.OAUTH2_PROVIDER === undefined) { - payload.OAUTH2_PROVIDER = { - ACCESS_TOKEN_EXPIRE_SECONDS: $scope.ACCESS_TOKEN_EXPIRE_SECONDS, - REFRESH_TOKEN_EXPIRE_SECONDS: $scope.REFRESH_TOKEN_EXPIRE_SECONDS, - AUTHORIZATION_CODE_EXPIRE_SECONDS: $scope.AUTHORIZATION_CODE_EXPIRE_SECONDS - }; - } - payload.OAUTH2_PROVIDER[key] = $scope.configDataResolve[key].default; - } else { - payload[key] = $scope.configDataResolve[key].default; - } - SettingsService.patchConfiguration(payload) - .then(function() { - $scope[key] = $scope.configDataResolve[key].default; - - if(key === "LOG_AGGREGATOR_HOST" || key === "LOG_AGGREGATOR_TYPE") { - $scope.requiredLogValues[key] = $scope.configDataResolve[key].default; - } - - if($scope[key + '_field'].type === "select"){ - // We need to re-instantiate the Select2 element - // after resetting the value. Example: - $scope.$broadcast(key+'_populated', null, false); - if(key === "AD_HOC_COMMANDS"){ - $scope.$broadcast(key+'_reverted', null, false); - } - } - else if($scope[key + '_field'].reset === "CUSTOM_LOGO"){ - $scope.$broadcast(key+'_reverted'); - } - else if($scope[key + '_field'].hasOwnProperty('codeMirror')){ - const isLdap = (key.indexOf("AUTH_LDAP") !== -1); - - const isLdapGroupTypeParams = isLdap && (key.indexOf("GROUP_TYPE_PARAMS") !== -1); - const isLdapUserSearch = isLdap && (key.indexOf("USER_SEARCH") !== -1); - const isLdapGroupSearch = isLdap && (key.indexOf("GROUP_SEARCH") !== -1); - - if (isLdapGroupTypeParams) { - $scope[key] = JSON.stringify($scope.configDataResolve[key].default); - } else if (isLdapUserSearch || isLdapGroupSearch) { - $scope[key] = '[]'; - } else { - $scope[key] = '{}'; - } - $scope.$broadcast('codeMirror_populated', key); - } - loginUpdate(); - }) - .catch(function(data) { - ProcessErrors($scope, data.error, data.status, formDefs[formTracker.getCurrent()], - { - hdr: ` - ${ i18n._('Error!')} `, - msg: i18n._('There was an error resetting value. Returned status: ') + data.error.detail - }); - - }) - .finally(function() { - Wait('stop'); - }); - }; - - function clearApiErrors() { - var currentForm = formDefs[formTracker.getCurrent()]; - for (var fld in currentForm.fields) { - if (currentForm.fields[fld].sourceModel) { - $scope[currentForm.fields[fld].sourceModel + '_' + currentForm.fields[fld].sourceField + '_api_error'] = ''; - $('[name="' + currentForm.fields[fld].sourceModel + '_' + currentForm.fields[fld].sourceField + '"]').removeClass('ng-invalid'); - } else if (currentForm.fields[fld].realName) { - $scope[currentForm.fields[fld].realName + '_api_error'] = ''; - $('[name="' + currentForm.fields[fld].realName + '"]').removeClass('ng-invalid'); - } else { - $scope[fld + '_api_error'] = ''; - $('[name="' + fld + '"]').removeClass('ng-invalid'); - } - if (currentForm.fields[fld].codeMirror) { - $('label[for="' + fld + '"] span').removeClass('error-color'); - $(`#cm-${fld}-container .CodeMirror`).removeClass('error-border'); - } - } - if (!$scope.$$phase) { - $scope.$digest(); - } - } - - // Some dropdowns are listed as "list" type in the API even though they're a dropdown: - var multiselectDropdowns = ['AD_HOC_COMMANDS']; - - var getFormPayload = function() { - var keys = _.keys(formDefs[formTracker.getCurrent()].fields); - var payload = {}; - const errors = {}; - - _.each(keys, function(key) { - if (key === 'ACCESS_TOKEN_EXPIRE_SECONDS' || key === 'REFRESH_TOKEN_EXPIRE_SECONDS' || key === 'AUTHORIZATION_CODE_EXPIRE_SECONDS') { - // These two values need to be POSTed nested under the OAUTH2_PROVIDER key - if (payload.OAUTH2_PROVIDER === undefined) { - payload.OAUTH2_PROVIDER = { - ACCESS_TOKEN_EXPIRE_SECONDS: $scope.ACCESS_TOKEN_EXPIRE_SECONDS, - REFRESH_TOKEN_EXPIRE_SECONDS: $scope.REFRESH_TOKEN_EXPIRE_SECONDS, - AUTHORIZATION_CODE_EXPIRE_SECONDS: $scope.AUTHORIZATION_CODE_EXPIRE_SECONDS - }; - } - payload.OAUTH2_PROVIDER[key] = $scope[key]; - } else if($scope.configDataResolve[key].type === 'choice' || multiselectDropdowns.indexOf(key) !== -1) { - //Parse dropdowns and dropdowns labeled as lists - if($scope[key] === null) { - payload[key] = null; - } else if(!_.isEmpty($scope[`${key}_values`])) { - if(multiselectDropdowns.indexOf(key) !== -1) { - // Handle AD_HOC_COMMANDS - payload[key] = $scope[`${key}_values`]; - } else { - payload[key] = _.map($scope[key], 'value').join(','); - } - } else { - if(multiselectDropdowns.indexOf(key) !== -1) { - // Default AD_HOC_COMMANDS to an empty list - payload[key] = $scope[key].value || []; - } else { - if ($scope[key]) { - payload[key] = $scope[key].value; - } - } - } - } else if($scope.configDataResolve[key].type === 'list' && $scope[key] !== null) { - // Parse lists - try { - payload[key] = SettingsUtils.listToArray($scope[key], key); - } catch (error) { - errors[key] = error; - payload[key] = []; - } - } - else if($scope.configDataResolve[key].type === 'nested object') { - if(!$scope[key]) { - payload[key] = {}; - } else { - // payload[key] = JSON.parse($scope[key]); - payload[key] = ToJSON($scope.parseType, - $scope[key]); - } - } - else { - // Everything else - if (key !== 'LOG_AGGREGATOR_TCP_TIMEOUT' || - ($scope.LOG_AGGREGATOR_PROTOCOL && - ($scope.LOG_AGGREGATOR_PROTOCOL.value === 'https' || - $scope.LOG_AGGREGATOR_PROTOCOL.value === 'tcp'))) { - payload[key] = $scope[key]; - } - } - }); - return [payload, errors]; - }; - - vm.formSave = function() { - var saveDeferred = $q.defer(); - clearApiErrors(); - Wait('start'); - - const [payload, errors] = getFormPayload(); - if (!SettingsUtils.isEmpty(errors)) { - ProcessErrors($scope, errors, null, formDefs[formTracker.getCurrent()], {}); - return; - } - - const [payloadCopy] = getFormPayload(); - SettingsService.patchConfiguration(payloadCopy) - .then(function(data) { - loginUpdate(); - - $scope.requiredLogValues.LOG_AGGREGATOR_HOST = $scope.LOG_AGGREGATOR_HOST; - $scope.requiredLogValues.LOG_AGGREGATOR_TYPE = $scope.LOG_AGGREGATOR_TYPE; - - saveDeferred.resolve(data); - $scope[formTracker.currentFormName()].$setPristine(); - ngToast.success({ - timeout: 2000, - dismissButton: false, - dismissOnTimeout: true, - content: `` + - i18n._('Save Complete') - }); - if(payload.PENDO_TRACKING_STATE && payload.PENDO_TRACKING_STATE !== $scope.originalSettings.PENDO_TRACKING_STATE) { - // Refreshing the page will pull in the new config and - // properly set pendo up/shut it off depending on the - // action - location.reload(); - } - }) - .catch(function(data) { - ProcessErrors($scope, data.data, data.status, formDefs[formTracker.getCurrent()], - { - hdr: ` - ${ i18n._('Error!')} `, - msg: i18n._('Failed to save settings. Returned status: ') + data.status - }); - saveDeferred.reject(data); - }) - .finally(function() { - Wait('stop'); - }); - - return saveDeferred.promise; - }; - - vm.formCancel = function() { - if ($scope[formTracker.currentFormName()].$dirty === true) { - var msg = i18n._('You have unsaved changes. Would you like to proceed without saving?'); - var title = i18n._('Warning: Unsaved Changes'); - var buttons = [{ - label: i18n._("Discard changes"), - "class": "btn Form-cancelButton", - "id": "formmodal-cancel-button", - onClick: function() { - $('#FormModal-dialog').dialog('close'); - $state.go('settings'); - } - }, { - label: i18n._("Save changes"), - onClick: function() { - vm.formSave() - .then(function() { - $('#FormModal-dialog').dialog('close'); - $state.go('settings'); - }); - }, - "class": "btn btn-primary", - "id": "formmodal-save-button" - }]; - triggerModal(msg, title, buttons); - } else { - $state.go('settings'); - } - }; - - vm.resetAllConfirm = function() { - var buttons = [{ - label: i18n._("Cancel"), - "class": "btn btn-default", - "id": "formmodal-cancel-button", - onClick: function() { - $('#FormModal-dialog').dialog('close'); - } - }, { - label: i18n._("Confirm Reset"), - onClick: function() { - resetAll(); - $('#FormModal-dialog').dialog('close'); - }, - "class": "btn btn-primary", - "id": "formmodal-reset-button" - }]; - var msg = i18n._('This will reset all configuration values to their factory defaults. Are you sure you want to proceed?'); - var title = i18n._('Confirm factory reset'); - triggerModal(msg, title, buttons); - }; - - vm.closeMessageBar = function() { - var msg = 'Are you sure you want to hide the notification bar?'; - var title = 'Warning: Closing notification bar'; - var buttons = [{ - label: "Cancel", - "class": "btn Form-cancelButton", - "id": "formmodal-cancel-button", - onClick: function() { - $('#FormModal-dialog').dialog('close'); - } - }, { - label: "OK", - onClick: function() { - $('#FormModal-dialog').dialog('close'); - updateMessageBarPrefs(); - }, - "class": "btn btn-primary", - "id": "formmodal-save-button" - }]; - triggerModal(msg, title, buttons); - }; - - vm.getCurrentFormTitle = function() { - switch($stateParams.form) { - case 'auth': - return 'AUTHENTICATION'; - case 'jobs': - return 'JOBS'; - case 'system': - return 'SYSTEM'; - case 'ui': - return 'USER INTERFACE'; - case 'license': - return 'LICENSE'; - } - }; - - $scope.toggleForm = function(key) { - if($rootScope.user_is_system_auditor) { - // Block system auditors from making changes - event.preventDefault(); - return; - } - - $scope[key] = !$scope[key]; - Wait('start'); - var payload = {}; - payload[key] = $scope[key]; - SettingsService.patchConfiguration(payload) - .then(function(data) { - //TODO consider updating form values with returned data here - if (key === 'LOG_AGGREGATOR_ENABLED') { - $scope.logAggregatorEnabled = data.LOG_AGGREGATOR_ENABLED; - } - }) - .catch(function(data) { - //Change back on unsuccessful update - $scope[key] = !$scope[key]; - ProcessErrors($scope, data.data, data.status, formDefs[formTracker.getCurrent()], - { - hdr: ` - ${ i18n._('Error!')} `, - msg: i18n._('Failed to save toggle settings. Returned status: ') + data.status - }); - }) - .finally(function() { - Wait('stop'); - }); - }; - - function resetAll () { - var keys = _.keys(formDefs[formTracker.getCurrent()].fields); - var payload = {}; - clearApiErrors(); - _.each(keys, function(key) { - if (key === 'ACCESS_TOKEN_EXPIRE_SECONDS' || key === 'REFRESH_TOKEN_EXPIRE_SECONDS' || key === 'AUTHORIZATION_CODE_EXPIRE_SECONDS') { - // the reset for these two keys needs to be nested under OAUTH2_PROVIDER - if (payload.OAUTH2_PROVIDER === undefined) { - payload.OAUTH2_PROVIDER = { - ACCESS_TOKEN_EXPIRE_SECONDS: $scope.ACCESS_TOKEN_EXPIRE_SECONDS, - REFRESH_TOKEN_EXPIRE_SECONDS: $scope.REFRESH_TOKEN_EXPIRE_SECONDS, - AUTHORIZATION_CODE_EXPIRE_SECONDS: $scope.AUTHORIZATION_CODE_EXPIRE_SECONDS - }; - } - payload.OAUTH2_PROVIDER[key] = $scope.configDataResolve[key].default; - } else { - payload[key] = $scope.configDataResolve[key].default; - } - }); - - Wait('start'); - SettingsService.patchConfiguration(payload) - .then(function() { - populateFromApi(); - $scope[formTracker.currentFormName()].$setPristine(); - - let keys = _.keys(formDefs[formTracker.getCurrent()].fields); - _.each(keys, function(key) { - $scope[key] = $scope.configDataResolve[key].default; - if($scope[key + '_field'].type === "select"){ - // We need to re-instantiate the Select2 element - // after resetting the value. Example: - $scope.$broadcast(key+'_populated', null, false); - if(key === "AD_HOC_COMMANDS"){ - $scope.$broadcast(key+'_reverted', null, false); - } - } - else if($scope[key + '_field'].reset === "CUSTOM_LOGO"){ - $scope.$broadcast(key+'_reverted'); - } - else if($scope[key + '_field'].hasOwnProperty('codeMirror')){ - $scope[key] = '{}'; - $scope.$broadcast('codeMirror_populated', key); - } - }); - - }) - .catch(function(data) { - ProcessErrors($scope, data.error, data.status, formDefs[formTracker.getCurrent()], - { - hdr: ` - ${ i18n._('Error!')} `, - msg: i18n._('There was an error resetting values. Returned status: ') + data.error.detail - }); - }) - .finally(function() { - Wait('stop'); - }); - } - - function updateMessageBarPrefs () { - $scope.show_auditor_bar = false; - Store('show_auditor_bar', $scope.show_auditor_bar); - } - - angular.extend(vm, { - formTracker: formTracker, - getFormPayload: getFormPayload, - populateFromApi: populateFromApi, - triggerModal: triggerModal, - }); - } -]; diff --git a/awx/ui/client/src/configuration/forms/settings-form.partial.html b/awx/ui/client/src/configuration/forms/settings-form.partial.html deleted file mode 100644 index da1e15fdd7..0000000000 --- a/awx/ui/client/src/configuration/forms/settings-form.partial.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - System auditors have read-only permissions in this section. - -
- -
-
-
-
{{ vm.getCurrentFormTitle() }}
-
-
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/awx/ui/client/src/configuration/forms/settings-form.route.js b/awx/ui/client/src/configuration/forms/settings-form.route.js deleted file mode 100644 index b75ae5552e..0000000000 --- a/awx/ui/client/src/configuration/forms/settings-form.route.js +++ /dev/null @@ -1,76 +0,0 @@ -import {templateUrl} from '../../shared/template-url/template-url.factory'; -import { N_ } from '../../i18n'; -import SettingsFormController from './settings-form.controller'; - -// Import form controllers -import SettingsAuthController from './auth-form/configuration-auth.controller'; -import SettingsJobsController from './jobs-form/configuration-jobs.controller'; -import SettingsSystemController from './system-form/configuration-system.controller'; -import SettingsUiController from './ui-form/configuration-ui.controller'; - -export default { - name: 'settings.form', - route: '/:form', - ncyBreadcrumb: { - label: N_("{{ vm.getCurrentFormTitle() }}") - }, - views: { - '@': { - templateUrl: templateUrl('configuration/forms/settings-form'), - controller: SettingsFormController, - controllerAs: 'vm' - }, - 'auth@settings.form': { - templateUrl: templateUrl('configuration/forms/auth-form/configuration-auth'), - controller: SettingsAuthController, - controllerAs: 'authVm' - }, - 'jobs@settings.form': { - templateUrl: templateUrl('configuration/forms/jobs-form/configuration-jobs'), - controller: SettingsJobsController, - controllerAs: 'jobsVm' - }, - 'system@settings.form': { - templateUrl: templateUrl('configuration/forms/system-form/configuration-system'), - controller: SettingsSystemController, - controllerAs: 'systemVm' - }, - 'ui@settings.form': { - templateUrl: templateUrl('configuration/forms/ui-form/configuration-ui'), - controller: SettingsUiController, - controllerAs: 'uiVm' - }, - 'license@settings.form': { - templateUrl: templateUrl('license/license'), - controller: 'licenseController' - }, - }, - onEnter: ['$state', 'ConfigService', '$stateParams', (state, configService, stateParams) => { - return configService.getConfig() - .then(config => { - if (_.get(config, 'license_info.license_type') === 'open' && stateParams.form === 'license') { - return state.go('settings'); - } - }); - }], - resolve: { - subscriptionCreds: ['Rest', 'GetBasePath', function(Rest, GetBasePath) { - Rest.setUrl(`${GetBasePath('settings')}system/`); - return Rest.get() - .then(({data}) => { - const subscriptionCreds = {}; - if (data.SUBSCRIPTIONS_USERNAME && data.SUBSCRIPTIONS_USERNAME !== "") { - subscriptionCreds.SUBSCRIPTIONS_USERNAME = data.SUBSCRIPTIONS_USERNAME; - } - - if (data.SUBSCRIPTIONS_PASSWORD && data.SUBSCRIPTIONS_PASSWORD !== "") { - subscriptionCreds.SUBSCRIPTIONS_PASSWORD = data.SUBSCRIPTIONS_PASSWORD; - } - - return subscriptionCreds; - }).catch(() => { - return {}; - }); - }] - } -}; \ No newline at end of file diff --git a/awx/ui/client/src/configuration/forms/system-form/configuration-system.controller.js b/awx/ui/client/src/configuration/forms/system-form/configuration-system.controller.js deleted file mode 100644 index 14b62e2ef9..0000000000 --- a/awx/ui/client/src/configuration/forms/system-form/configuration-system.controller.js +++ /dev/null @@ -1,251 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default [ - '$rootScope', '$scope', '$stateParams', - 'systemActivityStreamForm', - 'systemLoggingForm', - 'systemMiscForm', - 'SettingsUtils', - 'CreateSelect2', - 'GenerateForm', - 'i18n', - 'Rest', - 'ProcessErrors', - 'ngToast', - '$filter', - function ( - $rootScope, $scope, $stateParams, - systemActivityStreamForm, - systemLoggingForm, - systemMiscForm, - SettingsUtils, - CreateSelect2, - GenerateForm, - i18n, - Rest, - ProcessErrors, - ngToast, - $filter - ) { - var systemVm = this; - - var generator = GenerateForm; - var formTracker = $scope.$parent.vm.formTracker; - var activeSystemForm = 'misc'; - - if ($stateParams.form === 'system') { - formTracker.setCurrentSystem(activeSystemForm); - } - - var activeForm = function (tab) { - if (!_.get($scope.$parent, [formTracker.currentFormName(), '$dirty'])) { - systemVm.activeSystemForm = tab; - formTracker.setCurrentSystem(systemVm.activeSystemForm); - } else { - var msg = i18n._('You have unsaved changes. Would you like to proceed without saving?'); - var title = i18n._('Warning: Unsaved Changes'); - var buttons = [{ - label: i18n._('Discard changes'), - "class": "btn Form-cancelButton", - "id": "formmodal-cancel-button", - onClick: function () { - $scope.$parent.vm.populateFromApi(); - $scope.$parent[formTracker.currentFormName()].$setPristine(); - systemVm.activeSystemForm = tab; - formTracker.setCurrentSystem(systemVm.activeSystemForm); - $('#FormModal-dialog').dialog('close'); - } - }, { - label: i18n._('Save changes'), - onClick: function () { - $scope.$parent.vm.formSave() - .then(function () { - $scope.$parent[formTracker.currentFormName()].$setPristine(); - $scope.$parent.vm.populateFromApi(); - systemVm.activeSystemForm = tab; - formTracker.setCurrentSystem(systemVm.activeSystemForm); - $('#FormModal-dialog').dialog('close'); - }); - }, - "class": "btn btn-primary", - "id": "formmodal-save-button" - }]; - $scope.$parent.vm.triggerModal(msg, title, buttons); - } - formTracker.setCurrentSystem(systemVm.activeSystemForm); - }; - - var dropdownOptions = [ - { label: i18n._('Misc. System'), value: 'misc' }, - { label: i18n._('Activity Stream'), value: 'activity_stream' }, - { label: i18n._('Logging'), value: 'logging' }, - ]; - - var systemForms = [{ - formDef: systemLoggingForm, - id: 'system-logging-form' - }, { - formDef: systemActivityStreamForm, - id: 'system-activity-stream-form' - }, { - formDef: systemMiscForm, - id: 'system-misc-form' - }]; - - var forms = _.map(systemForms, 'formDef'); - _.each(forms, function (form) { - var keys = _.keys(form.fields); - _.each(keys, function (key) { - if ($scope.configDataResolve[key].type === 'choice') { - // Create options for dropdowns - var optionsGroup = key + '_options'; - $scope.$parent.$parent[optionsGroup] = []; - _.each($scope.configDataResolve[key].choices, function (choice) { - $scope.$parent.$parent[optionsGroup].push({ - name: choice[0], - label: choice[1], - value: choice[0] - }); - }); - } - addFieldInfo(form, key); - }); - // Disable the save button for system auditors - form.buttons.save.disabled = $rootScope.user_is_system_auditor; - }); - - function addFieldInfo(form, key) { - _.extend(form.fields[key], { - awPopOver: ($scope.configDataResolve[key].defined_in_file) ? - null : $scope.configDataResolve[key].help_text, - label: $scope.configDataResolve[key].label, - name: key, - toggleSource: key, - dataPlacement: 'top', - placeholder: SettingsUtils.formatPlaceholder($scope.configDataResolve[key].placeholder, key) || null, - dataTitle: $scope.configDataResolve[key].label, - required: $scope.configDataResolve[key].required, - ngDisabled: $rootScope.user_is_system_auditor, - disabled: $scope.configDataResolve[key].disabled || null, - readonly: $scope.configDataResolve[key].readonly || null, - definedInFile: $scope.configDataResolve[key].defined_in_file || null - }); - } - - $scope.$parent.$parent.parseType = 'json'; - - _.each(systemForms, function (form) { - generator.inject(form.formDef, { - id: form.id, - mode: 'edit', - scope: $scope.$parent.$parent, - related: true, - noPanel: true - }); - }); - - var dropdownRendered = false; - - $scope.$on('populated', function () { - populateLogAggregator(false); - }); - - $scope.$on('LOG_AGGREGATOR_TYPE_populated', function (e, data, flag) { - populateLogAggregator(flag); - }); - - $scope.$on('LOG_AGGREGATOR_PROTOCOL_populated', function (e, data, flag) { - populateLogAggregator(flag); - }); - - function populateLogAggregator(flag) { - - if ($scope.$parent.$parent.LOG_AGGREGATOR_TYPE !== null) { - $scope.$parent.$parent.LOG_AGGREGATOR_TYPE = _.find($scope.$parent.$parent.LOG_AGGREGATOR_TYPE_options, { value: $scope.$parent.$parent.LOG_AGGREGATOR_TYPE }); - } - - if ($scope.$parent.$parent.LOG_AGGREGATOR_PROTOCOL !== null) { - $scope.$parent.$parent.LOG_AGGREGATOR_PROTOCOL = _.find($scope.$parent.$parent.LOG_AGGREGATOR_PROTOCOL_options, { value: $scope.$parent.$parent.LOG_AGGREGATOR_PROTOCOL }); - } - - if ($scope.$parent.$parent.LOG_AGGREGATOR_LEVEL !== null) { - $scope.$parent.$parent.LOG_AGGREGATOR_LEVEL = _.find($scope.$parent.$parent.LOG_AGGREGATOR_LEVEL_options, { value: $scope.$parent.$parent.LOG_AGGREGATOR_LEVEL }); - } - - if (flag !== undefined) { - dropdownRendered = flag; - } - - if (!dropdownRendered) { - dropdownRendered = true; - CreateSelect2({ - element: '#configuration_logging_template_LOG_AGGREGATOR_TYPE', - multiple: false, - placeholder: i18n._('Select types'), - }); - $scope.$parent.$parent.configuration_logging_template_form.LOG_AGGREGATOR_TYPE.$setPristine(); - $scope.$parent.$parent.configuration_logging_template_form.LOG_AGGREGATOR_PROTOCOL.$setPristine(); - $scope.$parent.$parent.configuration_logging_template_form.LOG_AGGREGATOR_LEVEL.$setPristine(); - } - } - - $scope.$watchGroup(['configuration_logging_template_form.$pending', 'configuration_logging_template_form.$dirty', '!logAggregatorEnabled'], (vals) => { - if (vals.some(val => val === true)) { - $scope.$parent.vm.disableTestButton = true; - $scope.$parent.vm.testTooltip = i18n._('Save and enable log aggregation before testing the log aggregator.'); - } else { - $scope.$parent.vm.disableTestButton = false; - $scope.$parent.vm.testTooltip = i18n._('Send a test log message to the configured log aggregator.'); - } - }); - - $scope.$parent.vm.testLogging = function () { - if (!$scope.$parent.vm.disableTestButton) { - $scope.$parent.vm.disableTestButton = true; - Rest.setUrl("/api/v2/settings/logging/test/"); - Rest.post({}) - .then(() => { - $scope.$parent.vm.disableTestButton = false; - ngToast.success({ - dismissButton: false, - dismissOnTimeout: true, - content: `` + - i18n._('Log aggregator test sent successfully.') - }); - }) - .catch(({ data, status }) => { - $scope.$parent.vm.disableTestButton = false; - if (status === 400 || status === 500) { - ngToast.danger({ - dismissButton: false, - dismissOnTimeout: true, - content: '' + - i18n._('Log aggregator test failed.
Detail: ') + $filter('sanitize')(data.error), - additionalClasses: "LogAggregator-failedNotification" - }); - } else { - ProcessErrors($scope, data, status, null, - { - hdr: i18n._('Error!'), - msg: i18n._('There was an error testing the ' + - 'log aggregator. Returned status: ') + - status - }); - } - }); - } - }; - - angular.extend(systemVm, { - activeForm: activeForm, - activeSystemForm: activeSystemForm, - dropdownOptions: dropdownOptions, - systemForms: systemForms - }); - } -]; diff --git a/awx/ui/client/src/configuration/forms/system-form/configuration-system.partial.html b/awx/ui/client/src/configuration/forms/system-form/configuration-system.partial.html deleted file mode 100644 index c95aadf831..0000000000 --- a/awx/ui/client/src/configuration/forms/system-form/configuration-system.partial.html +++ /dev/null @@ -1,46 +0,0 @@ -
-
-
-
-
- {{opt.label}} -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- - -
-
- -
-
-
-
-
diff --git a/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js b/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js deleted file mode 100644 index 2cc39299ef..0000000000 --- a/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js +++ /dev/null @@ -1,39 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['i18n', function(i18n) { - return { - name: 'configuration_activity_stream_template', - showActions: true, - showHeader: false, - - fields: { - ACTIVITY_STREAM_ENABLED: { - type: 'toggleSwitch', - }, - ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC: { - type: 'toggleSwitch' - } - }, - - buttons: { - reset: { - ngShow: '!user_is_system_auditor', - ngClick: 'vm.resetAllConfirm()', - label: i18n._('Revert all to default'), - class: 'Form-resetAll' - }, - cancel: { - ngClick: 'vm.formCancel()', - }, - save: { - ngClick: 'vm.formSave()', - ngDisabled: true - } - } - }; - } -]; diff --git a/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-logging.form.js b/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-logging.form.js deleted file mode 100644 index 9febbc4363..0000000000 --- a/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-logging.form.js +++ /dev/null @@ -1,96 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['i18n', function(i18n) { - return { - name: 'configuration_logging_template', - showActions: true, - showHeader: false, - - fields: { - LOG_AGGREGATOR_HOST: { - type: 'text', - reset: 'LOG_AGGREGATOR_HOST' - }, - LOG_AGGREGATOR_PORT: { - type: 'text', - reset: 'LOG_AGGREGATOR_PORT' - }, - LOG_AGGREGATOR_TYPE: { - type: 'select', - reset: 'LOG_AGGREGATOR_TYPE', - ngOptions: 'type.label for type in LOG_AGGREGATOR_TYPE_options track by type.value', - }, - LOG_AGGREGATOR_USERNAME: { - type: 'text', - reset: 'LOG_AGGREGATOR_USERNAME' - }, - LOG_AGGREGATOR_PASSWORD: { - type: 'sensitive', - hasShowInputButton: true, - reset: 'LOG_AGGREGATOR_PASSWORD' - }, - LOG_AGGREGATOR_LOGGERS: { - type: 'textarea', - reset: 'LOG_AGGREGATOR_LOGGERS' - }, - LOG_AGGREGATOR_INDIVIDUAL_FACTS: { - type: 'toggleSwitch', - }, - LOG_AGGREGATOR_PROTOCOL: { - type: 'select', - reset: 'LOG_AGGREGATOR_PROTOCOL', - ngOptions: 'type.label for type in LOG_AGGREGATOR_PROTOCOL_options track by type.value', - disableChooseOption: true - }, - LOG_AGGREGATOR_TCP_TIMEOUT: { - type: 'text', - reset: 'LOG_AGGREGATOR_TCP_TIMEOUT', - ngShow: 'LOG_AGGREGATOR_PROTOCOL.value === "tcp" || LOG_AGGREGATOR_PROTOCOL.value === "https"', - awRequiredWhen: { - reqExpression: "LOG_AGGREGATOR_PROTOCOL.value === 'tcp' || LOG_AGGREGATOR_PROTOCOL.value === 'https'", - init: "false" - }, - }, - LOG_AGGREGATOR_LEVEL: { - type: 'select', - reset: 'LOG_AGGREGATOR_LEVEL', - ngOptions: 'type.label for type in LOG_AGGREGATOR_LEVEL_options track by type.value', - disableChooseOption: true - }, - LOG_AGGREGATOR_VERIFY_CERT: { - type: 'toggleSwitch', - ngShow: "LOG_AGGREGATOR_PROTOCOL.value === 'https'" - } - }, - - buttons: { - reset: { - ngShow: '!user_is_system_auditor', - ngClick: 'vm.resetAllConfirm()', - label: i18n._('Revert all to default'), - class: 'Form-resetAll' - }, - testLogging: { - ngClass: "{'Form-button--disabled': vm.disableTestButton}", - ngClick: 'vm.testLogging()', - label: i18n._('Test'), - class: 'Form-primaryButton', - awToolTip: '{{vm.testTooltip}}', - dataTipWatch: 'vm.testTooltip', - dataPlacement: 'top', - }, - cancel: { - ngClick: 'vm.formCancel()', - }, - save: { - ngClick: 'vm.formSave()', - ngDisabled: true - } - } - }; - } -]; diff --git a/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-misc.form.js b/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-misc.form.js deleted file mode 100644 index 911e9c26ba..0000000000 --- a/awx/ui/client/src/configuration/forms/system-form/sub-forms/system-misc.form.js +++ /dev/null @@ -1,108 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - name: 'configuration_misc_template', - showHeader: false, - showActions: true, - - fields: { - TOWER_URL_BASE: { - type: 'text', - reset: 'TOWER_URL_BASE', - }, - ORG_ADMINS_CAN_SEE_ALL_USERS: { - type: 'toggleSwitch', - }, - MANAGE_ORGANIZATION_AUTH: { - type: 'toggleSwitch', - }, - SESSION_COOKIE_AGE: { - type: 'number', - integer: true, - min: 61, - reset: 'SESSION_COOKIE_AGE', - }, - SESSIONS_PER_USER: { - type: 'number', - integer: true, - spinner: true, - min: -1, - reset: 'SESSIONS_PER_USER', - }, - AUTH_BASIC_ENABLED: { - type: 'toggleSwitch', - }, - ALLOW_OAUTH2_FOR_EXTERNAL_USERS: { - type: 'toggleSwitch', - }, - LOGIN_REDIRECT_OVERRIDE: { - type: 'text', - reset: 'LOGIN_REDIRECT_OVERRIDE' - }, - ACCESS_TOKEN_EXPIRE_SECONDS: { - type: 'text', - reset: 'ACCESS_TOKEN_EXPIRE_SECONDS' - }, - REFRESH_TOKEN_EXPIRE_SECONDS: { - type: 'text', - reset: 'REFRESH_TOKEN_EXPIRE_SECONDS' - }, - AUTHORIZATION_CODE_EXPIRE_SECONDS: { - type: 'text', - reset: 'AUTHORIZATION_CODE_EXPIRE_SECONDS' - }, - REMOTE_HOST_HEADERS: { - type: 'textarea', - reset: 'REMOTE_HOST_HEADERS' - }, - CUSTOM_VENV_PATHS: { - type: 'textarea', - reset: 'CUSTOM_VENV_PATHS' - }, - INSIGHTS_TRACKING_STATE: { - type: 'toggleSwitch' - }, - REDHAT_USERNAME: { - type: 'text', - reset: 'REDHAT_USERNAME', - }, - REDHAT_PASSWORD: { - type: 'sensitive', - hasShowInputButton: true, - reset: 'REDHAT_PASSWORD', - }, - AUTOMATION_ANALYTICS_URL: { - type: 'text', - reset: 'AUTOMATION_ANALYTICS_URL', - }, - AUTOMATION_ANALYTICS_GATHER_INTERVAL: { - type: 'number', - integer: true, - min: 1800, - reset: 'AUTOMATION_ANALYTICS_GATHER_INTERVAL', - } - }, - - buttons: { - reset: { - ngShow: '!user_is_system_auditor', - ngClick: 'vm.resetAllConfirm()', - label: i18n._('Revert all to default'), - class: 'Form-resetAll' - }, - cancel: { - ngClick: 'vm.formCancel()', - }, - save: { - ngClick: 'vm.formSave()', - ngDisabled: true - } - } - }; -} -]; diff --git a/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.controller.js b/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.controller.js deleted file mode 100644 index f35e8b6090..0000000000 --- a/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.controller.js +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default [ - '$scope', - '$rootScope', - 'ConfigurationUiForm', - 'CreateSelect2', - 'GenerateForm', - 'i18n', - '$stateParams', - function( - $scope, - $rootScope, - ConfigurationUiForm, - CreateSelect2, - GenerateForm, - i18n, - $stateParams - ) { - var generator = GenerateForm; - var form = ConfigurationUiForm; - - const formTracker = $scope.$parent.vm.formTracker; - if ($stateParams.form === 'ui') { - formTracker.setCurrentAuth('ui'); - } - - var keys = _.keys(form.fields); - _.each(keys, function(key) { - if($scope.configDataResolve[key].type === 'choice') { - // Create options for dropdowns - var optionsGroup = key + '_options'; - $scope.$parent.$parent[optionsGroup] = []; - _.each($scope.configDataResolve[key].choices, function(choice){ - $scope.$parent.$parent[optionsGroup].push({ - name: choice[0], - label: choice[1], - value: choice[0] - }); - }); - } - addFieldInfo(form, key); - }); - - // Disable the save button for system auditors - form.buttons.save.disabled = $rootScope.user_is_system_auditor; - - function addFieldInfo(form, key) { - _.extend(form.fields[key], { - awPopOver: ($scope.configDataResolve[key].defined_in_file) ? - null: $scope.configDataResolve[key].help_text, - label: $scope.configDataResolve[key].label, - name: key, - toggleSource: key, - dataPlacement: 'top', - dataTitle: $scope.configDataResolve[key].label, - required: $scope.configDataResolve[key].required, - ngDisabled: $rootScope.user_is_system_auditor, - disabled: $scope.configDataResolve[key].disabled || null, - readonly: $scope.configDataResolve[key].readonly || null, - definedInFile: $scope.configDataResolve[key].defined_in_file || null - }); - } - - generator.inject(form, { - id: 'configure-ui-form', - mode: 'edit', - scope: $scope.$parent.$parent, - related: true, - noPanel: true - }); - - // Flag to avoid re-rendering and breaking Select2 dropdowns on tab switching - var dropdownRendered = false; - - function populatePendoTrackingState(flag){ - if($scope.$parent.$parent.PENDO_TRACKING_STATE !== null) { - $scope.$parent.$parent.PENDO_TRACKING_STATE = _.find($scope.$parent.$parent.PENDO_TRACKING_STATE_options, { value: $scope.$parent.$parent.PENDO_TRACKING_STATE }); - } - - if(flag !== undefined){ - dropdownRendered = flag; - } - - if(!dropdownRendered) { - dropdownRendered = true; - CreateSelect2({ - element: '#configuration_ui_template_PENDO_TRACKING_STATE', - multiple: false, - placeholder: i18n._('Select commands') - }); - } - } - - $scope.$on('PENDO_TRACKING_STATE_populated', function(e, data, flag) { - populatePendoTrackingState(flag); - }); - - $scope.$on('populated', function(){ - populatePendoTrackingState(false); - }); - } - ]; diff --git a/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.form.js b/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.form.js deleted file mode 100644 index 4bb9fd3401..0000000000 --- a/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.form.js +++ /dev/null @@ -1,49 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - showHeader: false, - name: 'configuration_ui_template', - showActions: true, - - fields: { - PENDO_TRACKING_STATE: { - type: 'select', - ngChange: 'changedPendo()', - ngOptions: 'choice.label for choice in PENDO_TRACKING_STATE_options track by choice.value', - reset: 'PENDO_TRACKING_STATE' - }, - CUSTOM_LOGO: { - type: 'custom', - reset: 'CUSTOM_LOGO', - control: `` - }, - CUSTOM_LOGIN_INFO: { - type: 'textarea', - reset: 'CUSTOM_LOGIN_INFO', - rows: 6 - } - }, - - buttons: { - reset: { - ngShow: '!user_is_system_auditor', - ngClick: 'vm.resetAllConfirm()', - label: i18n._('Revert all to default'), - class: 'Form-resetAll' - }, - cancel: { - ngClick: 'vm.formCancel()', - }, - save: { - ngClick: 'vm.formSave()', - ngDisabled: true - } - } - }; -} -]; diff --git a/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.partial.html b/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.partial.html deleted file mode 100644 index 82ab146e93..0000000000 --- a/awx/ui/client/src/configuration/forms/ui-form/configuration-ui.partial.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
-
-
-
-
-
diff --git a/awx/ui/client/src/configuration/main.js b/awx/ui/client/src/configuration/main.js deleted file mode 100644 index 809f3312fd..0000000000 --- a/awx/ui/client/src/configuration/main.js +++ /dev/null @@ -1,74 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import settingsService from './settings.service'; -import settingsUtils from './settingsUtils.service'; - -// Import forms -//authorization sub-forms -import configurationAzureForm from './forms/auth-form/sub-forms/auth-azure.form.js'; -import configurationGithubForm from './forms/auth-form/sub-forms/auth-github.form.js'; -import configurationGithubOrgForm from './forms/auth-form/sub-forms/auth-github-org.form'; -import configurationGithubTeamForm from './forms/auth-form/sub-forms/auth-github-team.form'; -import configurationGoogleForm from './forms/auth-form/sub-forms/auth-google-oauth2.form'; -import configurationLdapForm from './forms/auth-form/sub-forms/auth-ldap.form.js'; -import configurationLdap1Form from './forms/auth-form/sub-forms/auth-ldap1.form.js'; -import configurationLdap2Form from './forms/auth-form/sub-forms/auth-ldap2.form.js'; -import configurationLdap3Form from './forms/auth-form/sub-forms/auth-ldap3.form.js'; -import configurationLdap4Form from './forms/auth-form/sub-forms/auth-ldap4.form.js'; -import configurationLdap5Form from './forms/auth-form/sub-forms/auth-ldap5.form.js'; -import configurationRadiusForm from './forms/auth-form/sub-forms/auth-radius.form.js'; -import configurationTacacsForm from './forms/auth-form/sub-forms/auth-tacacs.form.js'; -import configurationSamlForm from './forms/auth-form/sub-forms/auth-saml.form'; - -//system sub-forms -import systemActivityStreamForm from './forms/system-form/sub-forms/system-activity-stream.form.js'; -import systemLoggingForm from './forms/system-form/sub-forms/system-logging.form.js'; -import systemMiscForm from './forms/system-form/sub-forms/system-misc.form.js'; - -import configurationJobsForm from './forms/jobs-form/configuration-jobs.form'; -import configurationUiForm from './forms/ui-form/configuration-ui.form'; - -// Wrapper form route -import settingsFormRoute from './forms/settings-form.route'; - -import settingsRoute from './settings.route'; -import settingsController from './settings.controller.js'; - -export default -angular.module('configuration', []) - .controller('SettingsController', settingsController) - //auth forms - .factory('configurationAzureForm', configurationAzureForm) - .factory('configurationGithubForm', configurationGithubForm) - .factory('configurationGithubOrgForm', configurationGithubOrgForm) - .factory('configurationGithubTeamForm', configurationGithubTeamForm) - .factory('configurationGoogleForm', configurationGoogleForm) - .factory('configurationLdapForm', configurationLdapForm) - .factory('configurationLdap1Form', configurationLdap1Form) - .factory('configurationLdap2Form', configurationLdap2Form) - .factory('configurationLdap3Form', configurationLdap3Form) - .factory('configurationLdap4Form', configurationLdap4Form) - .factory('configurationLdap5Form', configurationLdap5Form) - .factory('configurationRadiusForm', configurationRadiusForm) - .factory('configurationTacacsForm', configurationTacacsForm) - .factory('configurationSamlForm', configurationSamlForm) - //system forms - .factory('systemActivityStreamForm', systemActivityStreamForm) - .factory('systemLoggingForm', systemLoggingForm) - .factory('systemMiscForm', systemMiscForm) - - //other forms - .factory('ConfigurationJobsForm', configurationJobsForm) - .factory('ConfigurationUiForm', configurationUiForm) - - //helpers and services - .factory('SettingsUtils', settingsUtils) - .service('SettingsService', settingsService) - .run(['$stateExtender', function($stateExtender) { - $stateExtender.addState(settingsFormRoute); - $stateExtender.addState(settingsRoute); - }]); diff --git a/awx/ui/client/src/configuration/settings.block.less b/awx/ui/client/src/configuration/settings.block.less deleted file mode 100644 index 33cafba674..0000000000 --- a/awx/ui/client/src/configuration/settings.block.less +++ /dev/null @@ -1,195 +0,0 @@ -.Form-resetValue, .Form-resetAll { - text-transform: uppercase; - font-weight: normal; - cursor: pointer; - font-size: 10px; -} - -.Form-resetValue { - float: right; -} - -.Form-resetAll { - border: none; - padding: 0; - background-color: @white; - margin-right: auto; - color: @default-link; - - &:hover { - color: @default-link-hov; - } -} - -.Form-tab { - min-width: 77px; -} - -.Form-button--left { - margin-right: auto; - margin-left: 0; -} - -.Form-nav--dropdownContainer { - align-items: center; - width: 100%; - margin: 0 0 22px auto; - display: flex; - justify-content: flex-start; - border-bottom: 1px solid @at-gray-b7; - padding-bottom: 22px; -} - -.Form-nav--ldapDropdownContainer { - align-items: center; - width: 100%; - margin: 0 0 auto auto; - display: flex; -} - -.Form-nav--dropdown { - width: 285px; -} - -.Form-nav--dropdown .select2-container { - margin: 0; -} - -.Form-nav--dropdownLabel { - text-transform: uppercase; - color: @default-interface-txt; - font-size: 14px; - font-weight: bold; - padding-right: 15px; -} - -.Form-tabRow { - display: flex; -} - -input.Form-filePicker { - width: 0.1px; - height: 0.1px; - opacity: 0; - overflow: hidden; - position: absolute; - z-index: -1; -} -label#filePickerButton { - cursor: pointer; - background-color: #fff; - color: @default-interface-txt; - margin-bottom: 0; -} -input#filePickerText { - cursor: default; - border-radius: 0 5px 5px 0; - background-color: #fff; -} - -.Form-filePicker--selectedFile { - margin: 12px 0; -} - -.Form-filePicker--thumbnail { - max-height: 40px; - max-width: 40px; -} - -// Messagebar for system auditor role notifications -.Section-messageBar { - width: 120%; - margin-left: -20px; - padding: 10px 10px 10px 20px; - color: @white; - background-color: @default-link; -} - -.Section-messageBar-text { - margin-left: @at-space-2x; -} - -.Section-messageBar-warning { - color: @at-color-warning; -} - -.Section-messageBar--close { - position: absolute; - right: 0; - background: none; - border: none; - color: @info-close; -} - -.Section-messageBar--close:hover { - color: @white; -} - -//Needed to show the not-allowed cursor over a Codemirror instance -.Form-formGroup--disabled { - cursor: not-allowed; - position: relative; - display: inline-block; - - // Filepicker disabling - .Form-browseButton, .Form-filePicker--textBox { - pointer-events: none; - cursor: not-allowed; - } - - // Adding explanatory tooltips for disabled fields - // Borrows styling from .popover - .Form-tooltip--disabled { - visibility: hidden; - background-color: @default-interface-txt; - color: @default-bg; - text-align: center; - border-radius: 6px; - - position: absolute; - z-index: 1; - width: 200px; - bottom: 110%; - left: 50%; - margin-left: -100px; - - background-clip: padding-box; - border: 1px solid rgba(0,0,0,.2); - -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2); - box-shadow: 0 5px 10px rgba(0,0,0,.2); - white-space: normal; - - padding: 9px 14px; - font-size: 12px; - font-weight: bold; - } - - &:hover .Form-tooltip--disabled { - visibility: visible; - } - - .Form-tooltip--disabled::after { - content: " "; - position: absolute; - top: 100%; - left: 50%; - margin-left: -11px; - border-width: 11px; - border-style: solid; - border-color: @default-interface-txt transparent transparent transparent; - } -} - -.LogAggregator-failedNotification{ - max-width: 500px; - word-break: break-word; -} - -hr { - height: 1px; -} - -.ConfigureTower-errorIcon{ - margin-right:5px; - color:@red; -} diff --git a/awx/ui/client/src/configuration/settings.controller.js b/awx/ui/client/src/configuration/settings.controller.js deleted file mode 100644 index 88ea0745cd..0000000000 --- a/awx/ui/client/src/configuration/settings.controller.js +++ /dev/null @@ -1,13 +0,0 @@ -import defaultStrings from '~assets/default.strings.json'; - -export default [ '$state', - function ($state) { - const vm = this; - - vm.product = defaultStrings.BRAND_NAME; - - vm.goToCard = (card) => { - $state.go('settings.form', { form: card }); - }; - } -]; diff --git a/awx/ui/client/src/configuration/settings.partial.html b/awx/ui/client/src/configuration/settings.partial.html deleted file mode 100644 index ebfb5b5eb0..0000000000 --- a/awx/ui/client/src/configuration/settings.partial.html +++ /dev/null @@ -1,17 +0,0 @@ - - - Enable simplified login for your Tower applications - - - Update settings pertaining to Jobs within Tower - - - Define system-level features and functions - - - Set preferences for data collection, logos, and logins - - - View and edit your license information - - \ No newline at end of file diff --git a/awx/ui/client/src/configuration/settings.route.js b/awx/ui/client/src/configuration/settings.route.js deleted file mode 100644 index e975a5f6ba..0000000000 --- a/awx/ui/client/src/configuration/settings.route.js +++ /dev/null @@ -1,40 +0,0 @@ -import { N_ } from '../i18n'; -import {templateUrl} from '../shared/template-url/template-url.factory'; -import SettingsController from './settings.controller'; -// Import form controllers - -export default { - name: 'settings', - route: '/settings', - ncyBreadcrumb: { - label: N_("SETTINGS") - }, - resolve: { - configDataResolve: ['SettingsService', function(SettingsService){ - return SettingsService.getConfigurationOptions(); - }], - features: ['CheckLicense', '$rootScope', - function(CheckLicense, $rootScope) { - if($rootScope.licenseMissing === undefined){ - return CheckLicense.notify(); - } - - }], - config: ['ConfigService', 'CheckLicense', '$rootScope', - function(ConfigService, CheckLicense, $rootScope) { - ConfigService.delete(); - return ConfigService.getConfig() - .then(function(config){ - $rootScope.licenseMissing = (CheckLicense.valid(config.license_info) === false) ? true : false; - return config; - }); - }], - }, - views: { - '': { - templateUrl: templateUrl('configuration/settings'), - controller: SettingsController, - controllerAs: 'vm' - } - } -}; \ No newline at end of file diff --git a/awx/ui/client/src/configuration/settings.service.js b/awx/ui/client/src/configuration/settings.service.js deleted file mode 100644 index 0c74a4fe9f..0000000000 --- a/awx/ui/client/src/configuration/settings.service.js +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['GetBasePath', '$q', 'Rest', 'i18n', - function(GetBasePath, $q, Rest, i18n) { - var url = GetBasePath('settings') + 'all'; - - return { - getConfigurationOptions: function() { - var deferred = $q.defer(); - var returnData = {}; - - Rest.setUrl(url); - Rest.options() - .then(({data}) => { - // Compare GET actions with PUT actions and flag discrepancies - // for disabling in the UI - // - // since OAUTH2_PROVIDER returns two of the keys in a nested format, - // we need to split those out into the root of the options payload - // in order for them to be consumed - var appendOauth2ProviderKeys = (optsFromAPI) => { - var unnestOauth2ProviderKey = (key, help_text, label, parentKey) => { - optsFromAPI[key] = _.cloneDeep(optsFromAPI[parentKey]); - optsFromAPI[key].label = label; - optsFromAPI[key].help_text = help_text; - optsFromAPI[key].type = optsFromAPI[parentKey].child.type; - optsFromAPI[key].min_value = optsFromAPI[parentKey].child.min_value; - if (optsFromAPI[parentKey].default) { - optsFromAPI[key].default = optsFromAPI[parentKey].default[key]; - } - delete optsFromAPI[key].child; - }; - if (optsFromAPI.OAUTH2_PROVIDER) { - unnestOauth2ProviderKey('ACCESS_TOKEN_EXPIRE_SECONDS', - i18n._('The duration (in seconds) access tokens remain valid since their creation.'), - i18n._('Access Token Expiration'), - 'OAUTH2_PROVIDER'); - unnestOauth2ProviderKey('REFRESH_TOKEN_EXPIRE_SECONDS', - i18n._('The duration (in seconds) refresh tokens remain valid after the expiration of their associated access token.'), - i18n._('Refresh Token Expiration'), - 'OAUTH2_PROVIDER'); - unnestOauth2ProviderKey('AUTHORIZATION_CODE_EXPIRE_SECONDS', - i18n._('The duration (in seconds) authorization codes remain valid since their creation.'), - i18n._('Authorization Code Expiration'), - 'OAUTH2_PROVIDER'); - } - return optsFromAPI; - }; - var getActions = appendOauth2ProviderKeys(data.actions.GET); - var getKeys = _.keys(getActions); - var putActions = data.actions.PUT ? appendOauth2ProviderKeys(data.actions.PUT) : {}; - - _.each(getKeys, function(key) { - if(putActions && putActions[key]) { - returnData[key] = putActions[key]; - } else { - returnData[key] = _.extend(getActions[key], { - required: false, - disabled: true - }); - } - }); - - deferred.resolve(returnData); - }) - .catch(({error}) => { - deferred.reject(error); - }); - - return deferred.promise; - }, - - patchConfiguration: function(body) { - var deferred = $q.defer(); - - Rest.setUrl(url); - Rest.patch(body) - .then(({data}) => { - deferred.resolve(data); - }) - .catch((error) => { - deferred.reject(error); - }); - - return deferred.promise; - }, - - getCurrentValues: function() { - var deferred = $q.defer(); - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - deferred.resolve(data); - }) - .catch((error) => { - deferred.reject(error); - }); - - return deferred.promise; - } - }; - } -]; diff --git a/awx/ui/client/src/configuration/settingsUtils.service.js b/awx/ui/client/src/configuration/settingsUtils.service.js deleted file mode 100644 index bf6b354177..0000000000 --- a/awx/ui/client/src/configuration/settingsUtils.service.js +++ /dev/null @@ -1,108 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$q', - function($q) { - - return { - listToArray: function(input) { - var payload; - - if (input.indexOf('[') !== -1) { - payload = JSON.parse(input); - - if (!Array.isArray(payload)) { - payload = []; - } - } else if (input.indexOf('\n') !== -1) { - //Parse multiline input - payload = input.replace(/^\s+|\s+$/g, "").split('\n'); - } else { - if (input === '' || input === '{}') { - payload = []; - } else { - payload = input.replace(/^\s+|\s+$/g, "") - .split(/\s*,\s*/); - } - } - return payload; - }, - - arrayToList: function(input) { - var multiLineInput = false; - _.each(input, function(statement) { - if (statement.indexOf(',') !== -1) { - multiLineInput = true; - } - }); - if (multiLineInput === false) { - return input.join(', '); - } else { - return input.join('\n'); - } - }, - - isEmpty: function(map) { - for (var key in map) { - if (map.hasOwnProperty(key)) { - return false; - } - } - return true; - }, - - formatPlaceholder: function(input) { - if (input !== null && typeof input === 'object') { - if (Array.isArray(input)) { - var multiLineInput = false; - _.each(input, function(statement) { - if (statement.indexOf(',') !== -1) { - multiLineInput = true; - } - }); - if (multiLineInput === false) { - return input.join(', '); - } else { - return input.join('\n'); - } - } else { - return JSON.stringify(input); - } - } else { - return input; - } - }, - - imageProcess: function(file) { - var deferred = $q.defer(); - var SIZELIMIT = 1000000; // 1 MB - var ACCEPTEDFORMATS = ['image/png', 'image/gif', 'image/jpeg']; //Basic check - - if(file.size < SIZELIMIT && ACCEPTEDFORMATS.indexOf(file.type) !== -1) { - var reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = function () { - deferred.resolve(reader.result); - }; - reader.onerror = function () { - deferred.reject('File could not be parsed'); - }; - } else { - var error = 'Error: '; - if(file.size > SIZELIMIT) { - error += 'Must be under ' + SIZELIMIT / 1000000 + 'MB. '; - } - if(ACCEPTEDFORMATS.indexOf(file.type) === -1) { - error += 'Wrong file type - must be png, gif, or jpg.'; - } - deferred.reject(error); - } - return deferred.promise; - } - - }; - } -]; diff --git a/awx/ui/client/src/credential-types/add/add.controller.js b/awx/ui/client/src/credential-types/add/add.controller.js deleted file mode 100644 index 2d44414962..0000000000 --- a/awx/ui/client/src/credential-types/add/add.controller.js +++ /dev/null @@ -1,124 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['Rest', 'Wait', - 'CredentialTypesForm', 'ProcessErrors', 'GetBasePath', - 'GenerateForm', '$scope', '$state', 'Alert', 'GetChoices', 'ParseTypeChange', 'ToJSON', 'CreateSelect2', 'i18n', - function(Rest, Wait, - CredentialTypesForm, ProcessErrors, GetBasePath, - GenerateForm, $scope, $state, Alert, GetChoices, ParseTypeChange, ToJSON, CreateSelect2, i18n - ) { - var form = CredentialTypesForm, - url = GetBasePath('credential_types'); - - init(); - - function init() { - - // for add, don't show ssh - $scope.$on('loadCredentialKindOptions', function() { - $scope.credential_kind_options = $scope.credential_kind_options - .filter(val => val.value === 'net' || - val.value === 'cloud'); - }); - - // Load the list of options for Kind - $scope.$parent.optionsDefer.promise - .then(function(options) { - GetChoices({ - scope: $scope, - url: url, - field: 'kind', - variable: 'credential_kind_options', - options: options, - callback: 'loadCredentialKindOptions' - }); - - const docs_url = 'https://docs.ansible.com/ansible-tower/latest/html/userguide/credential_types.html#getting-started-with-credential-types'; - const docs_help_text = `

${i18n._('Getting Started with Credential Types')}`; - - const api_inputs_help_text = _.get(options, 'actions.POST.inputs.help_text', "Specification for credential type inputs."); - const api_injectors_help_text = _.get(options, 'actions.POST.injectors.help_text', "Specification for credential type injector."); - - $scope.inputs_help_text = api_inputs_help_text + docs_help_text; - $scope.injectors_help_text = api_injectors_help_text + docs_help_text; - - if (!options.actions.POST) { - $state.go("^"); - Alert('Permission Error', 'You do not have permission to add a credential type.', 'alert-info'); - } - }); - - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - // @issue @jmitchell - this setting probably collides with new RBAC can* implementation? - $scope.canEdit = true; - - var callback = function() { - // Make sure the form controller knows there was a change - $scope[form.name + '_form'].$setDirty(); - }; - $scope.parseTypeInputs = 'yaml'; - $scope.parseTypeInjectors = 'yaml'; - ParseTypeChange({ - scope: $scope, - field_id: 'credential_type_inputs', - variable: 'inputs', - onChange: callback, - parse_variable: 'parseTypeInputs' - }); - ParseTypeChange({ - scope: $scope, - field_id: 'credential_type_injectors', - variable: 'injectors', - onChange: callback, - parse_variable: 'parseTypeInjectors' - }); - - CreateSelect2({ - element: '#credential_type_kind', - multiple: false, - }); - } - - // Save - $scope.formSave = function() { - GenerateForm.clearApiErrors($scope); - Wait('start'); - Rest.setUrl(url); - var inputs = ToJSON($scope.parseTypeInputs, $scope.inputs); - var injectors = ToJSON($scope.parseTypeInjectors, $scope.injectors); - if (inputs === null) { - inputs = {}; - } - if (injectors === null) { - injectors = {}; - } - Rest.post({ - name: $scope.name, - description: $scope.description, - kind: "cloud", - inputs: inputs, - injectors: injectors - }) - .then(({data}) => { - $state.go('credentialTypes.edit', { credential_type_id: data.id }, { reload: true }); - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to add new credential type. PUT returned status: ' + status - }); - }); - }; - - $scope.formCancel = function() { - $state.go('^'); - }; - } -]; diff --git a/awx/ui/client/src/credential-types/add/main.js b/awx/ui/client/src/credential-types/add/main.js deleted file mode 100644 index 9344da0e98..0000000000 --- a/awx/ui/client/src/credential-types/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './add.controller'; - -export default - angular.module('credentialTypesAdd', []) - .controller('CredentialTypesAddController', controller); diff --git a/awx/ui/client/src/credential-types/credential-types.form.js b/awx/ui/client/src/credential-types/credential-types.form.js deleted file mode 100644 index 6f55465478..0000000000 --- a/awx/ui/client/src/credential-types/credential-types.form.js +++ /dev/null @@ -1,84 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:CredentialType - * @description This form is for adding/editing a credential type -*/ - -export default ['i18n', function(i18n) { - return { - - addTitle: i18n._('NEW CREDENTIAL TYPE'), - editTitle: '{{ name }}', - name: 'credential_type', - basePath: 'credential_types', - stateTree: 'credentialTypes', - breadcrumbName: i18n._('CREDENTIAL TYPE'), - showActions: true, - - // TODO: update fields to be the schema for credential types instead of inventory scripts - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(credential_type.summary_fields.user_capabilities.edit || canAdd)', - required: true, - capitalize: false - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(credential_type.summary_fields.user_capabilities.edit || canAdd)' - }, - inputs: { - label: i18n._('Input Configuration'), - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - type: 'textarea', - rows: 6, - default: '---', - showParseTypeToggle: true, - parseTypeName: 'parseTypeInputs', - awPopOverWatch: "inputs_help_text", - dataTitle: i18n._('Input Configuration'), - dataPlacement: 'right', - dataContainer: "body", - ngDisabled: '!(credential_type.summary_fields.user_capabilities.edit || canAdd)' - }, - injectors: { - label: i18n._('Injector Configuration'), - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - type: 'textarea', - rows: 6, - default: '---', - showParseTypeToggle: true, - parseTypeName: 'parseTypeInjectors', - awPopOverWatch: "injectors_help_text", - dataTitle: i18n._('Injector Configuration'), - dataPlacement: 'right', - dataContainer: "body", - ngDisabled: '!(credential_type.summary_fields.user_capabilities.edit || canAdd)' - }, - }, - - buttons: { //for now always generates - -
- - - - diff --git a/awx/ui/client/src/instance-groups/instances/instances-list.partial.html b/awx/ui/client/src/instance-groups/instances/instances-list.partial.html deleted file mode 100644 index 510f73e6d7..0000000000 --- a/awx/ui/client/src/instance-groups/instances/instances-list.partial.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - {{:: vm.strings.get('tab.DETAILS') }} - {{:: vm.strings.get('tab.INSTANCES') }} - {{:: vm.strings.get('tab.JOBS') }} - - - -
- - - -
- -
-
-
- - - - -
- -
-
-
- - -
- - - - -
-
-
- - - - -
-
-
-
-
- - -
diff --git a/awx/ui/client/src/instance-groups/instances/instances.controller.js b/awx/ui/client/src/instance-groups/instances/instances.controller.js deleted file mode 100644 index 566161d850..0000000000 --- a/awx/ui/client/src/instance-groups/instances/instances.controller.js +++ /dev/null @@ -1,196 +0,0 @@ -function InstancesController ($scope, $state, $http, $transitions, models, strings, Dataset, ProcessErrors) { - const { instanceGroup } = models; - const vm = this || {}; - let paginateQuerySet = {}; - vm.strings = strings; - vm.panelTitle = instanceGroup.get('name'); - vm.instance_group_id = instanceGroup.get('id'); - vm.policy_instance_list = instanceGroup.get('policy_instance_list'); - vm.isSuperuser = $scope.$root.user_is_superuser; - - let tabs = {}; - let addInstancesRoute =""; - if ($state.is("instanceGroups.instances")) { - tabs={ state: { - details: { - _go: 'instanceGroups.edit' - }, - instances: { - _active: true, - _go: 'instanceGroups.instances' - }, - jobs: { - _go: 'instanceGroups.jobs' - } - } - }; - addInstancesRoute = 'instanceGroups.instances.modal.add'; - } else if ($state.is("instanceGroups.containerGroupInstances")) { - tabs={ - state: { - details: { - _go: 'instanceGroups.editContainerGroup' - }, - instances: { - _active: true, - _go: 'instanceGroups.containerGroupInstances' - }, - jobs: { - _go: 'instanceGroups.containerGroupJobs' - } - } - }; - addInstancesRoute = 'instanceGroups.containerGroupInstances.modal.add'; - } - - vm.list = { - name: 'instances', - iterator: 'instance', - basePath: `/api/v2/instance_groups/${vm.instance_group_id}/instances/` - }; - vm.instance_dataset = Dataset.data; - vm.instances = Dataset.data.results; - - const toolbarSortDefault = { - label: `${strings.get('sort.NAME_ASCENDING')}`, - value: 'hostname' - }; - - vm.addInstances = () => { - - return $state.go(`${addInstancesRoute}`); - }; - - - vm.toolbarSortValue = toolbarSortDefault; - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${strings.get('sort.NAME_DESCENDING')}`, value: '-hostname' }, - { label: `${strings.get('sort.UUID_ASCENDING')}`, value: 'uuid' }, - { label: `${strings.get('sort.UUID_DESCENDING')}`, value: '-uuid' }, - { label: `${strings.get('sort.CREATED_ASCENDING')}`, value: 'created' }, - { label: `${strings.get('sort.CREATED_DESCENDING')}`, value: '-created' }, - { label: `${strings.get('sort.MODIFIED_ASCENDING')}`, value: 'modified' }, - { label: `${strings.get('sort.MODIFIED_DESCENDING')}`, value: '-modified' }, - { label: `${strings.get('sort.CAPACITY_ASCENDING')}`, value: 'capacity' }, - { label: `${strings.get('sort.CAPACITY_DESCENDING')}`, value: '-capacity' } - ]; - - const removeStateParamsListener = $scope.$watchCollection('$state.params', () => { - setToolbarSort(); - }); - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'instance_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - - const queryParams = Object.assign( - {}, - $state.params.instance_search, - paginateQuerySet, - { order_by: sort.value } - ); - - $state.go('.', { - instance_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - const tabObj = {}; - const params = { instance_group_id: instanceGroup.get('id') }; - - tabObj.details = { _go: tabs.state.details._go, _params: params }; - tabObj.instances = { _go: tabs.state.instances._go, _params: params, _active: true }; - tabObj.jobs = { _go: tabs.state.jobs._go, _params: params }; - vm.tab = tabObj; - - - vm.tooltips = { - add: strings.get('tooltips.ASSOCIATE_INSTANCES') - }; - - vm.rowAction = { - toggle: { - _disabled: !vm.isSuperuser - }, - capacity_adjustment: { - _disabled: !vm.isSuperuser - } - }; - - vm.toggle = (toggled) => { - const instance = _.find(vm.instances, ['id', toggled.id]); - instance.enabled = !instance.enabled; - - const data = { - "capacity_adjustment": instance.capacity_adjustment, - "enabled": instance.enabled - }; - - const req = { - method: 'PUT', - url: instance.url, - data - }; - $http(req).then(vm.onSaveSuccess) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call failed. Return status: ' + status - }); - }); - }; - - vm.onSaveSuccess = () => { - $state.transitionTo($state.current, $state.params, { - reload: true, location: true, inherit: false, notify: true - }); - }; - - $scope.isActive = function(id) { - let selected = parseInt($state.params.instance_id); - return id === selected; - }; - - const removeUpdateDatasetListener = $scope.$on('updateDataset', (e, dataset, queryset) => { - vm.instances = dataset.results; - vm.instance_dataset = dataset; - paginateQuerySet = queryset; - }); - - const removeStateChangeListener = $transitions.onSuccess({}, function(trans) { - if (trans.to().name === 'instanceGroups.instances.modal.add') { - removeUpdateDatasetListener(); - removeStateChangeListener(); - removeStateParamsListener(); - } - }); - - $scope.$on('$destroy', function() { - removeUpdateDatasetListener(); - removeStateChangeListener(); - removeStateParamsListener(); - }); -} - -InstancesController.$inject = [ - '$scope', - '$state', - '$http', - '$transitions', - 'resolvedModels', - 'InstanceGroupsStrings', - 'Dataset', - 'ProcessErrors', -]; - -export default InstancesController; diff --git a/awx/ui/client/src/instance-groups/jobs/instanceGroupsJobsListContainer.controller.js b/awx/ui/client/src/instance-groups/jobs/instanceGroupsJobsListContainer.controller.js deleted file mode 100644 index bffe4d6064..0000000000 --- a/awx/ui/client/src/instance-groups/jobs/instanceGroupsJobsListContainer.controller.js +++ /dev/null @@ -1,61 +0,0 @@ - -function InstanceGroupJobsContainerController ($scope, strings, $state) { - const vm = this || {}; - const instanceGroupId = $state.params.instance_group_id; - - let tabs = {}; - if ($state.is('instanceGroups.jobs')) { - tabs = { - state: { - details: { - _go: 'instanceGroups.edit' - }, - instances: { - _go: 'instanceGroups.instances' - }, - jobs: { - _active: true, - _go: 'instanceGroups.jobs' - } - } - }; - } else if ($state.is('instanceGroups.containerGroupJobs')) { - tabs = { - state: { - details: { - _go: 'instanceGroups.editContainerGroup' - }, - instances: { - _go: 'instanceGroups.containerGroupInstances' - }, - jobs: { - _active: true, - _go: 'instanceGroups.containerGroupJobs' - } - } - }; - } - - vm.panelTitle = strings.get('jobs.PANEL_TITLE'); - vm.strings = strings; - const tabObj = {}; - - tabObj.details = { _go: tabs.state.details._go, _params: { instance_group_id: parseInt(instanceGroupId) } }; - tabObj.instances = { _go: tabs.state.instances._go, _params: { instance_group_id: parseInt(instanceGroupId) } }; - tabObj.jobs = { _go: tabs.state.jobs._go, _params: { instance_group_id: parseInt(instanceGroupId) }, _active: true }; - vm.tab = tabObj; - - $scope.$on('updateCount', (e, count) => { - if (typeof count === 'number') { - vm.count = count; - } - }); -} - -InstanceGroupJobsContainerController.$inject = [ - '$scope', - 'InstanceGroupsStrings', - '$state' -]; - -export default InstanceGroupJobsContainerController; diff --git a/awx/ui/client/src/instance-groups/jobs/instanceGroupsJobsListContainer.partial.html b/awx/ui/client/src/instance-groups/jobs/instanceGroupsJobsListContainer.partial.html deleted file mode 100644 index de8808bda8..0000000000 --- a/awx/ui/client/src/instance-groups/jobs/instanceGroupsJobsListContainer.partial.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - {{:: vm.strings.get('tab.DETAILS') }} - {{:: vm.strings.get('tab.INSTANCES') }} - {{:: vm.strings.get('tab.JOBS') }} - -
-
diff --git a/awx/ui/client/src/instance-groups/jobs/instanceJobsListContainer.controller.js b/awx/ui/client/src/instance-groups/jobs/instanceJobsListContainer.controller.js deleted file mode 100644 index 7e661ab41d..0000000000 --- a/awx/ui/client/src/instance-groups/jobs/instanceJobsListContainer.controller.js +++ /dev/null @@ -1,23 +0,0 @@ - -function InstanceGroupJobsContainerController ($scope, strings) { - const vm = this || {}; - - init(); - function init() { - vm.panelTitle = strings.get('jobs.PANEL_TITLE'); - vm.strings = strings; - } - - $scope.$on('updateCount', (e, count) => { - if (typeof count === 'number') { - vm.count = count; - } - }); -} - -InstanceGroupJobsContainerController.$inject = [ - '$scope', - 'InstanceGroupsStrings' -]; - -export default InstanceGroupJobsContainerController; diff --git a/awx/ui/client/src/instance-groups/jobs/instanceJobsListContainer.partial.html b/awx/ui/client/src/instance-groups/jobs/instanceJobsListContainer.partial.html deleted file mode 100644 index 744b4af256..0000000000 --- a/awx/ui/client/src/instance-groups/jobs/instanceJobsListContainer.partial.html +++ /dev/null @@ -1,5 +0,0 @@ - - - -
-
diff --git a/awx/ui/client/src/instance-groups/list/instance-groups-list.controller.js b/awx/ui/client/src/instance-groups/list/instance-groups-list.controller.js deleted file mode 100644 index 1433231dd9..0000000000 --- a/awx/ui/client/src/instance-groups/list/instance-groups-list.controller.js +++ /dev/null @@ -1,164 +0,0 @@ -export default [ - '$rootScope', - '$scope', - '$filter', - '$state', - 'Alert', - 'resolvedModels', - 'Dataset', - 'InstanceGroupsStrings', - 'ProcessErrors', - 'Prompt', - 'Wait', - function( - $rootScope, - $scope, - $filter, - $state, - Alert, - resolvedModels, - Dataset, - strings, - ProcessErrors, - Prompt, - Wait - ) { - const vm = this; - const { instanceGroup } = resolvedModels; - let paginateQuerySet = {}; - - vm.strings = strings; - vm.isSuperuser = $scope.$root.user_is_superuser; - - init(); - - function init(){ - $rootScope.breadcrumb.instance_group_name = $filter('sanitize')(instanceGroup.get('name')); - $scope.list = { - iterator: 'instance_group', - name: 'instance_groups' - }; - - $scope.collection = { - basePath: 'instance_groups', - iterator: 'instance_group' - }; - - $scope[`${$scope.list.iterator}_dataset`] = Dataset.data; - $scope[$scope.list.name] = $scope[`${$scope.list.iterator}_dataset`].results; - $scope.instanceGroupCount = Dataset.data.count; - - $scope.$on('updateDataset', function(e, dataset, queryset) { - $scope[`${$scope.list.iterator}_dataset`] = dataset; - $scope[$scope.list.name] = dataset.results; - paginateQuerySet = queryset; - }); - } - - $scope.$watchCollection('$state.params', () => { - vm.activeId = parseInt($state.params.instance_group_id); - setToolbarSort(); - }); - - const toolbarSortDefault = { - label: `${strings.get('sort.NAME_ASCENDING')}`, - value: 'name' - }; - - vm.toolbarSortOptions = [ - toolbarSortDefault, - { label: `${strings.get('sort.NAME_DESCENDING')}`, value: '-name' }, - { label: `${strings.get('sort.CREATED_ASCENDING')}`, value: 'created' }, - { label: `${strings.get('sort.CREATED_DESCENDING')}`, value: '-created' }, - { label: `${strings.get('sort.MODIFIED_ASCENDING')}`, value: 'modified' }, - { label: `${strings.get('sort.MODIFIED_DESCENDING')}`, value: '-modified' } - ]; - - vm.toolbarSortValue = toolbarSortDefault; - - function setToolbarSort () { - const orderByValue = _.get($state.params, 'instance_group_search.order_by'); - const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue); - if (sortValue) { - vm.toolbarSortValue = sortValue; - } else { - vm.toolbarSortValue = toolbarSortDefault; - } - } - - vm.onToolbarSort = (sort) => { - vm.toolbarSortValue = sort; - - const queryParams = Object.assign( - {}, - $state.params.instance_group_search, - paginateQuerySet, - { order_by: sort.value } - ); - - // Update URL with params - $state.go('.', { - instance_group_search: queryParams - }, { notify: false, location: 'replace' }); - }; - - vm.tooltips = { - add: strings.get('tooltips.ADD_INSTANCE_GROUP') - }; - - vm.rowAction = { - trash: instance_group => { - return vm.isSuperuser && instance_group.name !== 'tower' && !instance_group.is_controller && !instance_group.is_isolated; - } - }; - - vm.deleteInstanceGroup = instance_group => { - if (!instance_group) { - Alert(strings.get('error.DELETE'), strings.get('alert.MISSING_PARAMETER')); - return; - } - - Prompt({ - action() { - $('#prompt-modal').modal('hide'); - Wait('start'); - instanceGroup - .request('delete', instance_group.id) - .then(() => handleSuccessfulDelete(instance_group)) - .catch(createErrorHandler('delete instance group', 'DELETE')) - .finally(() => Wait('stop')); - }, - hdr: strings.get('DELETE'), - resourceName: $filter('sanitize')(instance_group.name), - body: `${strings.get('deleteResource.CONFIRM', 'instance group')}` - }); - }; - - function handleSuccessfulDelete(instance_group) { - let reloadListStateParams = null; - - if($scope.instance_groups.length === 1 && $state.params.instance_group_search && _.has($state, 'params.instance_group_search.page') && $state.params.instance_group_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.instance_group_search.page = (parseInt(reloadListStateParams.instance_group_search.page)-1).toString(); - } - - if (parseInt($state.params.instance_group_id, 0) === instance_group.id) { - $state.go('instanceGroups', reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, { reload: true }); - } - } - - function createErrorHandler(path, action) { - return ({ data, status }) => { - const hdr = strings.get('error.HEADER'); - const msg = strings.get('error.CALL', { path, action, status }); - ProcessErrors($scope, data, status, null, { hdr, msg }); - }; - } - - $scope.createInstanceGroup = () => { - $state.go('instanceGroups.add'); - }; - } -]; diff --git a/awx/ui/client/src/instance-groups/list/instance-groups-list.partial.html b/awx/ui/client/src/instance-groups/list/instance-groups-list.partial.html deleted file mode 100644 index 4f5a45845d..0000000000 --- a/awx/ui/client/src/instance-groups/list/instance-groups-list.partial.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - -
-
-
- - - - -
-
-
- {{vm.strings.get('container.BADGE_TEXT') }} -
-
-
-
-
-
- {{vm.strings.get('instance.BADGE_TEXT') }} -
-
-
-
-
- - - - - - -
-
-
-
-
- - -
-
-
-
-
- - -
-
-
-
- - -
- diff --git a/awx/ui/client/src/instance-groups/main.js b/awx/ui/client/src/instance-groups/main.js deleted file mode 100644 index 1c0d80bbf7..0000000000 --- a/awx/ui/client/src/instance-groups/main.js +++ /dev/null @@ -1,470 +0,0 @@ -import { - templateUrl -} from '../shared/template-url/template-url.factory'; -import CapacityAdjuster from './capacity-adjuster/capacity-adjuster.directive'; -import AddContainerGroup from './container-groups/add-container-group.view.html'; -import EditContainerGroupController from './container-groups/edit-container-group.controller'; -import AddContainerGroupController from './container-groups/add-container-group.controller'; -import CapacityBar from './capacity-bar/capacity-bar.directive'; -import instanceGroupsMultiselect from '../shared/instance-groups-multiselect/instance-groups.directive'; -import instanceGroupsModal from '../shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.directive'; - -import AddEditTemplate from './add-edit/add-edit-instance-groups.view.html'; -import AddInstanceGroupController from './add-edit/add-instance-group.controller'; -import EditInstanceGroupController from './add-edit/edit-instance-group.controller'; - -import InstanceGroupsTemplate from './list/instance-groups-list.partial.html'; -import InstanceGroupsListController from './list/instance-groups-list.controller'; - -import InstancesTemplate from './instances/instances-list.partial.html'; -import InstanceListController from './instances/instances.controller'; - -import InstanceModalTemplate from './instances/instance-modal.partial.html'; -import InstanceModalController from './instances/instance-modal.controller.js'; - -import list from './instance-groups.list'; -import service from './instance-groups.service'; - -import InstanceGroupsStrings from './instance-groups.strings'; - -import {instanceGroupJobsRoute, containerGroupJobsRoute} from '~features/jobs/routes/instanceGroupJobs.route.js'; -import instanceJobsRoute from '~features/jobs/routes/instanceJobs.route.js'; - - -const MODULE_NAME = 'instanceGroups'; - -function InstanceGroupsResolve($q, $stateParams, InstanceGroup, Credential, Instance, ProcessErrors, strings) { - const instanceGroupId = $stateParams.instance_group_id; - const instanceId = $stateParams.instance_id; - let promises = {}; - - if (!instanceGroupId && !instanceId) { - promises.instanceGroup = new InstanceGroup(['get', 'options']); - promises.credential = new Credential(['get', 'options']); - return $q.all(promises); - } - - if (instanceGroupId && instanceId) { - promises.instance = new Instance(['get', 'options'], [instanceId, instanceId]) - .then((instance) => instance.extend('get', 'jobs', { - params: { - page_size: "10", - order_by: "-finished" - } - })); - return $q.all(promises); - } - - promises.instanceGroup = new InstanceGroup(['get', 'options'], [instanceGroupId, instanceGroupId]) - .then((instanceGroup) => instanceGroup.extend('get', 'jobs', { - params: { - page_size: "10", - order_by: "-finished" - } - })) - .then((instanceGroup) => instanceGroup.extend('get', 'instances')); - - promises.credential = new Credential(); - - return $q.all(promises) - .then(models => models) - .catch(({ - data, - status, - config - }) => { - ProcessErrors(null, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { - path: `${config.url}`, - status - }) - }); - return $q.reject(); - }); -} - -InstanceGroupsResolve.$inject = [ - '$q', - '$stateParams', - 'InstanceGroupModel', - 'CredentialModel', - 'InstanceModel', - 'ProcessErrors', - 'InstanceGroupsStrings' -]; - -function InstanceGroupsRun($stateExtender, strings) { - $stateExtender.addState({ - name: 'instanceGroups', - url: '/instance_groups', - searchPrefix: 'instance_group', - ncyBreadcrumb: { - label: strings.get('state.INSTANCE_GROUPS_BREADCRUMB_LABEL') - }, - params: { - instance_group_search: { - value: { - page_size: '10', - order_by: 'name' - }, - dynamic: true - } - }, - data: { - alwaysShowRefreshButton: true, - }, - views: { - '@': { - templateUrl: templateUrl('./instance-groups/instance-groups'), - }, - 'list@instanceGroups': { - templateUrl: InstanceGroupsTemplate, - controller: 'InstanceGroupsListController', - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: InstanceGroupsResolve, - Dataset: ['InstanceGroupList', 'QuerySet', '$stateParams', 'GetBasePath', - function (list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ] - } - }); - - $stateExtender.addState({ - name: 'instanceGroups.add', - url: '/add', - ncyBreadcrumb: { - label: strings.get('state.ADD_BREADCRUMB_LABEL') - }, - params: { - instance_search: { - value: { - order_by: 'hostname', - page_size: '10' - } - } - }, - views: { - 'add@instanceGroups': { - templateUrl: AddEditTemplate, - controller: AddInstanceGroupController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: InstanceGroupsResolve, - Dataset: [ - '$stateParams', - 'GetBasePath', - 'QuerySet', - ($stateParams, GetBasePath, qs) => { - const searchParams = $stateParams.instance_search; - const searchPath = GetBasePath('instances'); - return qs.search(searchPath, searchParams); - } - ] - } - }); - $stateExtender.addState({ - name: 'instanceGroups.addContainerGroup', - url: '/container_group', - views: { - 'addContainerGroup@instanceGroups': { - templateUrl: AddContainerGroup, - controller: AddContainerGroupController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: InstanceGroupsResolve, - DataSet: ['Rest', 'GetBasePath', (Rest, GetBasePath) => { - Rest.setUrl(`${GetBasePath('instance_groups')}`); - return Rest.options(); - }] - }, - ncyBreadcrumb: { - label: strings.get('state.ADD_CONTAINER_GROUP_BREADCRUMB_LABEL') - }, - }); - - $stateExtender.addState({ - name: 'instanceGroups.addContainerGroup.credentials', - url: '/credential?selected', - searchPrefix: 'credential', - params: { - credential_search: { - value: { - credential_type__kind: 'kubernetes', - order_by: 'name', - page_size: 5, - }, - dynamic: true, - squash: '' - } - }, - data: { - basePath: 'credentials', - formChildState: true - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'credentials@instanceGroups.addContainerGroup': { - templateProvider: (ListDefinition, generateList) => { - const html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - return `${html}`; - } - } - }, - resolve: { - ListDefinition: ['CredentialList', list => list], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', (list, qs, $stateParams, GetBasePath) => { - - - const searchPath = GetBasePath('credentials'); - return qs.search( - searchPath, - $stateParams[`${list.iterator}_search`] - ); - }] - }, - onExit ($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } - }); - - $stateExtender.addState({ - name: 'instanceGroups.editContainerGroup', - url: '/container_group/:instance_group_id', - views: { - 'editContainerGroup@instanceGroups': { - templateUrl: AddContainerGroup, - controller: EditContainerGroupController, - controllerAs: 'vm' - } - }, - - resolve: { - resolvedModels: InstanceGroupsResolve, - EditContainerGroupDataset: ['GetBasePath', 'QuerySet', '$stateParams', - function (GetBasePath, qs, $stateParams) { - let path = `${GetBasePath('instance_groups')}${$stateParams.instance_group_id}`; - return qs.search(path, $stateParams); - } - ], - }, - ncyBreadcrumb: { - label: '{{breadcrumb.instance_group_name}}' - }, - }); - - $stateExtender.addState({ - name: 'instanceGroups.editContainerGroup.credentials', - url: '/credential?selected', - searchPrefix: 'credential', - params: { - credential_search: { - value: { - credential_type__kind: 'kubernetes', - order_by: 'name', - page_size: 5, - }, - dynamic: true, - squash: '' - } - }, - data: { - basePath: 'credentials', - formChildState: true - }, - views: { - 'credentials@instanceGroups.editContainerGroup': { - templateProvider: (ListDefinition, generateList) => { - const html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - return `${html}`; - } - } - }, - resolve: { - ListDefinition: ['CredentialList', list => list], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', (list, qs, $stateParams, GetBasePath) => { - const searchPath = GetBasePath('credentials'); - return qs.search( - searchPath, - $stateParams[`${list.iterator}_search`] - ); - }] - }, - onExit ($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } - }); - - $stateExtender.addState({ - name: 'instanceGroups.edit', - route: '/:instance_group_id', - ncyBreadcrumb: { - label: '{{breadcrumb.instance_group_name}}' - }, - params: { - instance_search: { - value: { - order_by: 'hostname', - page_size: '10' - } - } - }, - views: { - 'edit@instanceGroups': { - templateUrl: AddEditTemplate, - controller: EditInstanceGroupController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: InstanceGroupsResolve, - Dataset: [ - '$stateParams', - 'GetBasePath', - 'QuerySet', - ($stateParams, GetBasePath, qs) => { - const searchParams = $stateParams.instance_search; - const searchPath = GetBasePath('instances'); - return qs.search(searchPath, searchParams); - } - ] - } - }); - - $stateExtender.addState({ - name: 'instanceGroups.instances', - url: '/:instance_group_id/instances', - searchPrefix: 'instance', - ncyBreadcrumb: { - parent: 'instanceGroups.edit', - label: strings.get('state.INSTANCES_BREADCRUMB_LABEL') - }, - params: { - instance_search: { - value: { - order_by: 'hostname', - page_size: '10' - }, - dynamic: true - } - }, - views: { - 'instances@instanceGroups': { - templateUrl: InstancesTemplate, - controller: 'InstanceListController', - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: InstanceGroupsResolve, - Dataset: ['GetBasePath', 'QuerySet', '$stateParams', - function (GetBasePath, qs, $stateParams) { - let path = `${GetBasePath('instance_groups')}${$stateParams.instance_group_id}/instances`; - return qs.search(path, $stateParams[`instance_search`]); - } - ], - } - }); - - $stateExtender.addState({ - name: 'instanceGroups.instances.modal', - abstract: true, - ncyBreadcrumb: { - skip: true, - }, - views: { - "modal": { - template: ` - `, - } - } - }); - - $stateExtender.addState({ - name: 'instanceGroups.instances.modal.add', - url: '/add', - ncyBreadcrumb: { - skip: true, - }, - searchPrefix: 'add_instance', - params: { - add_instance_search: { - value: { - page_size: '10', - order_by: 'hostname' - }, - dynamic: true - } - }, - views: { - "modal": { - templateUrl: InstanceModalTemplate, - controller: InstanceModalController, - controllerAs: 'vm' - } - }, - resolve: { - resolvedModels: InstanceGroupsResolve, - Dataset: ['GetBasePath', 'QuerySet', '$stateParams', - function (GetBasePath, qs, $stateParams) { - let path = `${GetBasePath('instances')}`; - return qs.search(path, $stateParams[`add_instance_search`]); - } - ], - routeData: [function () { - return "instanceGroups.instances"; - }] - } - }); - - $stateExtender.addState(instanceJobsRoute); - $stateExtender.addState(instanceGroupJobsRoute); - $stateExtender.addState(containerGroupJobsRoute); -} - -InstanceGroupsRun.$inject = [ - '$stateExtender', - 'InstanceGroupsStrings', - 'Rest' -]; - -angular.module(MODULE_NAME, []) - .service('InstanceGroupsService', service) - .factory('InstanceGroupList', list) - .controller('InstanceGroupsListController', InstanceGroupsListController) - .controller('InstanceListController', InstanceListController) - .directive('instanceGroupsMultiselect', instanceGroupsMultiselect) - .directive('instanceGroupsModal', instanceGroupsModal) - .directive('capacityAdjuster', CapacityAdjuster) - .directive('capacityBar', CapacityBar) - .service('InstanceGroupsStrings', InstanceGroupsStrings) - .run(InstanceGroupsRun); - -export default MODULE_NAME; diff --git a/awx/ui/client/src/inventories-hosts/hosts/edit/host-edit.controller.js b/awx/ui/client/src/inventories-hosts/hosts/edit/host-edit.controller.js deleted file mode 100644 index ab304cb37c..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/edit/host-edit.controller.js +++ /dev/null @@ -1,46 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default - ['$scope', '$state', 'HostsService', 'host', '$rootScope', - function($scope, $state, HostsService, host, $rootScope){ - $scope.parseType = 'yaml'; - $scope.formCancel = function(){ - $state.go('^', null, {reload: true}); - }; - $scope.toggleHostEnabled = function(){ - $scope.host.enabled = !$scope.host.enabled; - }; - $scope.toggleEnabled = function(){ - $scope.host.enabled = !$scope.host.enabled; - }; - $scope.groupsTab = function(){ - let id = $scope.host.summary_fields.inventory.id; - $state.go('hosts.edit.nested_groups', {inventory_id: id}); - }; - $scope.formSave = function(){ - var host = { - id: $scope.host.id, - variables: $scope.variables === '---' || $scope.variables === '{}' ? null : $scope.variables, - name: $scope.name, - description: $scope.description, - enabled: $scope.host.enabled - }; - HostsService.put(host).then(function(){ - $state.go('.', null, {reload: true}); - }); - - }; - var init = function(){ - $scope.host = host.data; - $rootScope.breadcrumb.host_name = host.data.name; - $scope.name = host.data.name; - $scope.description = host.data.description; - $scope.variables = host.data.variables; - }; - - init(); - }]; diff --git a/awx/ui/client/src/inventories-hosts/hosts/edit/main.js b/awx/ui/client/src/inventories-hosts/hosts/edit/main.js deleted file mode 100644 index 2f0c5aee39..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/edit/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './host-edit.controller'; - -export default -angular.module('hostsEdit', []) - .controller('HostEditController', controller); diff --git a/awx/ui/client/src/inventories-hosts/hosts/host.form.js b/awx/ui/client/src/inventories-hosts/hosts/host.form.js deleted file mode 100644 index e8d42123a3..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/host.form.js +++ /dev/null @@ -1,130 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Hosts - * @description This form is for adding/editing a host on the inventory page -*/ - -export default ['i18n', -function(i18n) { - return { - - addTitle: i18n._('CREATE HOST'), - editTitle: '{{ host.name }}', - name: 'host', - basePath: 'hosts', - well: false, - formLabelSize: 'col-lg-3', - formFieldSize: 'col-lg-9', - iterator: 'host', - detailsClick: "$state.go('hosts.edit', null, {reload:true})", - activeEditState: 'hosts.edit', - stateTree: 'hosts', - headerFields:{ - enabled: { - class: 'Form-header-field', - ngClick: 'toggleHostEnabled(host)', - type: 'toggle', - awToolTip: "

" + - i18n._("Indicates if a host is available and should be included in running jobs.") + - "

" + - i18n._("For hosts that are part of an external" + - " inventory, this may be" + - " reset by the inventory sync process.") + - "

", - dataTitle: i18n._('Host Enabled'), - } - }, - fields: { - name: { - label: i18n._('Host Name'), - type: 'text', - required: true, - awPopOver: "

" + - i18n._("Provide a host name, ip address, or ip address:port. Examples include:") + - "

" + - "
myserver.domain.com
" + - "127.0.0.1
" + - "10.1.0.140:25
" + - "server.example.com:25" + - "
", - dataTitle: i18n._('Host Name'), - dataPlacement: 'right', - dataContainer: 'body', - ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd)' - }, - description: { - label: i18n._('Description'), - ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd)', - type: 'text' - }, - variables: { - label: i18n._('Variables'), - type: 'code_mirror', - variables: 'variables', - class: 'Form-formGroup--fullWidth', - "default": "---", - awPopOver: "

" + i18n._("Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - "JSON:
\n" + - "
{
 "somevar": "somevalue",
 "password": "magic"
}
\n" + - "YAML:
\n" + - "
---
somevar: somevalue
password: magic
\n" + - '

' + i18n.sprintf(i18n._('View JSON examples at %s'), 'www.json.org') + '

' + - '

' + i18n.sprintf(i18n._('View YAML examples at %s'), 'docs.ansible.com') + '

', - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(host.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(host.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(host.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - related: { - ansible_facts: { - name: 'ansible_facts', - awToolTip: i18n._('Please save before viewing facts.'), - dataPlacement: 'top', - title: i18n._('Facts'), - skipGenerator: true - }, - groups: { - name: 'groups', - awToolTip: i18n._('Please save before defining groups.'), - dataPlacement: 'top', - ngClick: "$state.go('hosts.edit.groups')", - title: i18n._('Groups'), - iterator: 'group', - skipGenerator: true - }, - insights: { - name: 'insights', - awToolTip: i18n._('Please save before viewing Insights.'), - dataPlacement: 'top', - title: i18n._('Insights'), - skipGenerator: true, - ngIf: "host.insights_system_id!==null && host.summary_fields.inventory.hasOwnProperty('insights_credential_id')" - }, - completed_jobs: { - name: 'completed_jobs', - title: i18n._('Completed Jobs'), - skipGenerator: true - } - } - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/hosts/host.list.js b/awx/ui/client/src/inventories-hosts/hosts/host.list.js deleted file mode 100644 index 9cf8f98274..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/host.list.js +++ /dev/null @@ -1,124 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - name: 'hosts', - iterator: 'host', - editTitle: '{{ selected_group }}', - singleSearchParam: { - param: 'host_filter' - }, - showTitle: false, - well: true, - index: false, - hover: true, - hasChildren: true, - 'class': 'table-no-border', - trackBy: 'host.id', - basePath: 'hosts', - title: false, - actionHolderClass: 'List-actionHolder', - layoutClass: 'List-staticColumnLayout--hostsWithCheckbox', - staticColumns: [ - { - field: 'toggleHost', - content: { - label: '', - columnClass: 'List-staticColumn--toggle', - type: "toggle", - ngClick: "toggleHost($event, host)", - awToolTip: "

" + - i18n._("Indicates if a host is available and should be included in running jobs.") + - "

" + - i18n._("For hosts that are part of an external" + - " inventory, this flag may be" + - " reset by the inventory sync process.") + - "

", - dataPlacement: "right", - nosort: true, - } - }, { - field: 'active_failures', - content: { - label: '', - iconOnly: true, - nosort: true, - // do not remove this ng-click directive - // the list generator case to handle fields without ng-click - // cannot handle the aw-* directives - ngClick: 'noop()', - awPopOver: "{{ host.job_status_html }}", - dataTitle: "{{ host.job_status_title }}", - awToolTip: "{{ host.badgeToolTip }}", - dataPlacement: 'top', - icon: "{{ 'fa icon-job-' + host.active_failures }}", - id: 'active-failures-action', - columnClass: 'status-column List-staticColumn--smallStatus' - } - } - ], - - fields: { - name: { - key: true, - label: i18n._('Name'), - ngClick: "editHost(host.id)", - columnClass: 'col-sm-4', - dataHostId: "{{ host.id }}", - dataType: "host", - }, - inventory: { - label: i18n._('Inventory'), - sourceModel: 'inventory', - sourceField: 'name', - columnClass: 'd-none d-sm-flex col-sm-4 elllipsis', - ngClick: "editInventory(host)" - } - }, - - fieldActions: { - - columnClass: 'col-sm-4 col-xs-5 text-right', - edit: { - ngClick: "editHost(host.id)", - icon: 'icon-edit', - awToolTip: i18n._('Edit host'), - dataPlacement: 'top', - ngShow: 'host.summary_fields.user_capabilities.edit' - }, - view: { - ngClick: "editHost(host.id)", - awToolTip: i18n._('View host'), - dataPlacement: 'top', - ngShow: '!host.summary_fields.user_capabilities.edit' - } - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshGroups()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - smart_inventory: { - mode: 'all', - ngClick: "smartInventory()", - awToolTip: "{{ smartInventoryButtonTooltip }}", - dataTipWatch: 'smartInventoryButtonTooltip', - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('SMART INVENTORY'), - ngShow: 'canAdd && (hosts.length > 0 || !(searchTags | isEmpty))', - dataPlacement: "top", - ngDisabled: '!enableSmartInventoryButton', - showTipWhenDisabled: true - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/hosts/hosts.partial.html b/awx/ui/client/src/inventories-hosts/hosts/hosts.partial.html deleted file mode 100644 index 7f594d599d..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/hosts.partial.html +++ /dev/null @@ -1,106 +0,0 @@ -
- -
-
-
-
-
-
INVENTORIES
-
HOSTS
-
-
-
-
-
-
-
-
-
-
- - -
- -
-
No records matched your search.
-
-
NO HOSTS HAVE BEEN CREATED
-
-
-
-
-
-
-
-
-
-
-
Actions
-
-
-
-
-
- -
-
-
- - - -
-
-
-
- -
-
-
- {{ host.description }} -
-
- -
-
- - - -
-
-
-
-
-
-
- - -
-
- diff --git a/awx/ui/client/src/inventories-hosts/hosts/list/host-list.controller.js b/awx/ui/client/src/inventories-hosts/hosts/list/host-list.controller.js deleted file mode 100644 index 52d82796b9..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/list/host-list.controller.js +++ /dev/null @@ -1,108 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -function HostsList($scope, HostsList, $rootScope, GetBasePath, - rbacUiControlService, Dataset, $state, $filter, Prompt, Wait, - HostsService, SetStatus, canAdd, $transitions, InventoryHostsStrings) { - - let list = HostsList; - - init(); - - function init(){ - $scope.canAdd = canAdd; - $scope.enableSmartInventoryButton = false; - $scope.smartInventoryButtonTooltip = InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - $scope.strings = InventoryHostsStrings; - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $rootScope.flashMessage = null; - - $scope.$watchCollection(list.name, function() { - $scope[list.name] = _.map($scope.hosts, function(value) { - value.inventory_name = value.summary_fields.inventory.name; - value.inventory_id = value.summary_fields.inventory.id; - return value; - }); - setJobStatus(); - }); - - $transitions.onSuccess({}, function(trans) { - if(trans.params('to') && trans.params('to').host_search) { - let hasMoreThanDefaultKeys = false; - angular.forEach(trans.params('to').host_search, function(value, key) { - if(key !== 'order_by' && key !== 'page_size' && key !== 'page') { - hasMoreThanDefaultKeys = true; - } - }); - $scope.enableSmartInventoryButton = hasMoreThanDefaultKeys ? true : false; - $scope.smartInventoryButtonTooltip = hasMoreThanDefaultKeys ? InventoryHostsStrings.get('smartinventorybutton.ENABLED_INSTRUCTIONS') : InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - } - else { - $scope.enableSmartInventoryButton = false; - $scope.smartInventoryButtonTooltip = InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - } - }); - - } - - function setJobStatus(){ - _.forEach($scope.hosts, function(value) { - SetStatus({ - scope: $scope, - host: value - }); - }); - } - - $scope.createHost = function(){ - $state.go('hosts.add'); - }; - $scope.editHost = function(id){ - $state.go('hosts.edit', {host_id: id}); - }; - $scope.goToInsights = function(id){ - $state.go('hosts.edit.insights', {host_id:id}); - }; - $scope.toggleHost = function(event, host) { - try { - $(event.target).tooltip('hide'); - } catch (e) { - // ignore - } - - host.enabled = !host.enabled; - HostsService.patch(host.id, { - enabled: host.enabled - }); - }; - - $scope.smartInventory = function() { - $state.go('inventories.addSmartInventory', {hostfilter: JSON.stringify({"host_filter":`${$state.params.host_search.host_filter}`})}); - }; - - $scope.editInventory = function(host) { - if(host.summary_fields && host.summary_fields.inventory) { - if(host.summary_fields.inventory.kind && host.summary_fields.inventory.kind === 'smart') { - $state.go('inventories.editSmartInventory', {smartinventory_id: host.inventory}); - } - else { - $state.go('inventories.edit', {inventory_id: host.inventory}); - } - } - }; - -} - -export default ['$scope', 'HostsList', '$rootScope', 'GetBasePath', - 'rbacUiControlService', 'Dataset', '$state', '$filter', 'Prompt', 'Wait', - 'HostsService', 'SetStatus', 'canAdd', '$transitions', 'InventoryHostsStrings', HostsList -]; diff --git a/awx/ui/client/src/inventories-hosts/hosts/list/main.js b/awx/ui/client/src/inventories-hosts/hosts/list/main.js deleted file mode 100644 index 0682898494..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/list/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './host-list.controller'; - -export default -angular.module('hostsList', []) - .controller('HostListController', controller); diff --git a/awx/ui/client/src/inventories-hosts/hosts/main.js b/awx/ui/client/src/inventories-hosts/hosts/main.js deleted file mode 100644 index 575a2a8e49..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/main.js +++ /dev/null @@ -1,117 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - import hostEdit from './edit/main'; - import hostList from './list/main'; - import HostsList from './host.list'; - import HostsForm from './host.form'; - import { templateUrl } from '../../shared/template-url/template-url.factory'; - import { N_ } from '../../i18n'; - import ansibleFactsRoute from '../shared/ansible-facts/ansible-facts.route'; - import insightsRoute from '../inventories/insights/insights.route'; - import hostGroupsRoute from './related/groups/hosts-related-groups.route'; - import hostGroupsAssociateRoute from './related/groups/hosts-related-groups-associate.route'; - import hostCompletedJobsRoute from '~features/jobs/routes/hostCompletedJobs.route.js'; - import hostGroups from './related/groups/main'; - -export default -angular.module('host', [ - hostEdit.name, - hostList.name, - hostGroups.name - ]) - .factory('HostsForm', HostsForm) - .factory('HostsList', HostsList) - .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', - function($stateProvider, stateDefinitionsProvider, $stateExtenderProvider) { - let stateDefinitions = stateDefinitionsProvider.$get(), - stateExtender = $stateExtenderProvider.$get(); - - let generateHostStates = function(){ - let hostTree = stateDefinitions.generateTree({ - parent: 'hosts', // top-most node in the generated tree (will replace this state definition) - modes: ['edit'], - list: 'HostsList', - form: 'HostsForm', - controllers: { - edit: 'HostEditController' - }, - breadcrumbs: { - edit: '{{breadcrumb.host_name}}' - }, - urls: { - list: '/hosts' - }, - data: { - activityStream: true, - activityStreamTarget: 'host' - }, - resolve: { - edit: { - host: ['Rest', '$stateParams', 'GetBasePath', - function(Rest, $stateParams, GetBasePath) { - let path = GetBasePath('hosts') + $stateParams.host_id; - Rest.setUrl(path); - return Rest.get(); - } - ] - }, - list: { - canAdd: ['rbacUiControlService', function(rbacUiControlService) { - return rbacUiControlService.canAdd('hosts') - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - } - }, - views: { - '@': { - templateUrl: templateUrl('inventories-hosts/hosts/hosts'), - controller: 'HostListController' - } - }, - ncyBreadcrumb: { - label: N_('HOSTS') - } - }); - - let hostAnsibleFacts = _.cloneDeep(ansibleFactsRoute); - hostAnsibleFacts.name = 'hosts.edit.ansible_facts'; - - let hostInsights = _.cloneDeep(insightsRoute); - hostInsights.name = 'hosts.edit.insights'; - - let hostCompletedJobs = _.cloneDeep(hostCompletedJobsRoute); - hostCompletedJobs.name = 'hosts.edit.completed_jobs'; - - return Promise.all([ - hostTree - ]).then((generated) => { - return { - states: _.reduce(generated, (result, definition) => { - return result.concat(definition.states); - }, [ - stateExtender.buildDefinition(hostAnsibleFacts), - stateExtender.buildDefinition(hostInsights), - stateExtender.buildDefinition(hostGroupsRoute), - stateExtender.buildDefinition(hostGroupsAssociateRoute), - stateExtender.buildDefinition(hostCompletedJobs) - ]) - }; - }); - }; - - $stateProvider.state({ - name: 'hosts.**', - url: '/hosts', - lazyLoad: () => generateHostStates() - }); - } - ]); diff --git a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups-associate.route.js b/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups-associate.route.js deleted file mode 100644 index 9ed6dbfa0b..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups-associate.route.js +++ /dev/null @@ -1,32 +0,0 @@ -export default { - name: 'hosts.edit.groups.associate', - squashSearchUrl: true, - url: '/associate?inventory_id', - ncyBreadcrumb:{ - skip:true - }, - views: { - 'modal@hosts.edit': { - templateProvider: function() { - return ``; - }, - controller: function($scope, $q, GroupsService, $state){ - $scope.associateGroups = function(selectedItems){ - var deferred = $q.defer(); - return $q.all( _.map(selectedItems, (selectedItem) => GroupsService.associateHost({id: parseInt($state.params.host_id)}, selectedItem.id)) ) - .then( () =>{ - deferred.resolve(); - }, (error) => { - deferred.reject(error); - }); - }; - } - } - }, - onExit: function($state) { - if ($state.transition) { - $('#associate-groups-modal').modal('hide'); - $('body').removeClass('modal-open'); - } - }, -}; diff --git a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.controller.js b/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.controller.js deleted file mode 100644 index 72b1ad7bc9..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.controller.js +++ /dev/null @@ -1,74 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - export default - ['$scope', '$rootScope', '$state', '$stateParams', 'HostsRelatedGroupsList', 'InventoryHostsStrings', - 'CancelSourceUpdate', 'rbacUiControlService', 'GetBasePath', 'Dataset', 'Find', 'QuerySet', 'inventoryData', 'host', 'GroupsService', - function($scope, $rootScope, $state, $stateParams, HostsRelatedGroupsList, InventoryHostsStrings, - CancelSourceUpdate, rbacUiControlService, GetBasePath, Dataset, Find, qs, inventoryData, host, GroupsService){ - - let list = HostsRelatedGroupsList; - - init(); - - function init(){ - $scope.inventory_id = inventoryData.id; - $scope.canAdd = false; - $scope.strings = InventoryHostsStrings; - - rbacUiControlService.canAdd(GetBasePath('inventory') + $scope.inventory_id + "/groups") - .then(function(canAdd) { - $scope.canAdd = canAdd; - }); - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - } - - $scope.editGroup = function(id){ - $state.go('inventories.edit.groups.edit', {inventory_id: $scope.inventory_id, group_id: id}); - }; - - $scope.goToGroupGroups = function(id){ - $state.go('inventories.edit.groups.edit.nested_groups', {inventory_id: $scope.inventory_id, group_id: id}); - }; - - $scope.associateGroup = function() { - $state.go('.associate', {inventory_id: $scope.inventory_id}); - }; - - $scope.disassociateHost = function(group){ - $scope.disassociateGroup = {}; - angular.extend($scope.disassociateGroup, group); - $('#host-disassociate-modal').modal('show'); - }; - - $scope.confirmDisassociate = function(){ - - $('#host-disassociate-modal').off('hidden.bs.modal').on('hidden.bs.modal', function () { - $('#host-disassociate-modal').off('hidden.bs.modal'); - - let reloadListStateParams = null; - - if($scope.groups.length === 1 && $state.params.group_search && !_.isEmpty($state.params.group_search.page) && $state.params.group_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.group_search.page = (parseInt(reloadListStateParams.group_search.page)-1).toString(); - } - - $state.go('.', reloadListStateParams, {reload: true}); - }); - - GroupsService.disassociateHost(host.id, $scope.disassociateGroup.id).then(() => { - $state.go($state.current, null, {reload: true}); - $('#host-disassociate-modal').modal('hide'); - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - }); - - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js b/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js deleted file mode 100644 index ee7b5cb560..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js +++ /dev/null @@ -1,77 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - name: 'groups', - iterator: 'group', - editTitle: '{{ host.name }}', - well: true, - wellOverride: true, - index: false, - hover: true, - trackBy: 'group.id', - basePath: 'api/v2/hosts/{{$stateParams.host_id}}/groups/', - layoutClass: 'List-staticColumnLayout--statusOrCheckbox', - staticColumns: [ - { - field: 'failed_hosts', - content: { - label: '', - nosort: true, - mode: 'all', - iconOnly: true, - awToolTip: "{{ group.hosts_status_tip }}", - dataPlacement: "top", - icon: "{{ 'fa icon-job-' + group.hosts_status_class }}", - columnClass: 'status-column' - } - } - ], - - fields: { - name: { - label: i18n._('Groups'), - key: true, - ngClick: "goToGroupGroups(group.id)", - columnClass: 'col-lg-6 col-md-6 col-sm-6 col-xs-6', - } - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshGroups()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - associate: { - mode: 'all', - ngClick: "associateGroup()", - awToolTip: i18n._("Associate this host with a new group"), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd', - dataPlacement: "top", - } - }, - - fieldActions: { - columnClass: 'col-lg-6 col-md-6 col-sm-6 col-xs-6 text-right', - "delete": { - //label: 'Delete', - mode: 'all', - ngClick: "disassociateHost(group)", - awToolTip: i18n._('Disassociate group'), - iconClass: 'fa fa-times', - dataPlacement: "top", - ngShow: "group.summary_fields.user_capabilities.delete" - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html b/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html deleted file mode 100644 index 93aeab36bf..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html +++ /dev/null @@ -1,35 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js b/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js deleted file mode 100644 index fd21ff7b1d..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js +++ /dev/null @@ -1,62 +0,0 @@ -import { N_ } from '../../../../i18n'; -import {templateUrl} from '../../../../shared/template-url/template-url.factory'; - -export default { - name: "hosts.edit.groups", - url: "/groups?{group_search:queryset}", - resolve: { - Dataset: ['HostsRelatedGroupsList', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - host: ['$stateParams', 'HostsService', function($stateParams, HostsService) { - if($stateParams.host_id){ - return HostsService.get({ id: $stateParams.host_id }).then(function(res) { - return res.data.results[0]; - }); - } - }], - inventoryData: ['InventoriesService', '$stateParams', 'host', function(InventoriesService, $stateParams, host) { - var id = ($stateParams.inventory_id) ? $stateParams.inventory_id : host.summary_fields.inventory.id; - return InventoriesService.getInventory(id).then(res => res.data); - }] - }, - params: { - group_search: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash: "" - } - }, - ncyBreadcrumb: { - parent: "hosts.edit", - label: N_("GROUPS") - }, - views: { - 'related': { - templateProvider: function(HostsRelatedGroupsList, generateList, $templateRequest) { - let html = generateList.build({ - list: HostsRelatedGroupsList, - mode: 'edit' - }); - - return $templateRequest(templateUrl('inventories-hosts/hosts/related/groups/hosts-related-groups')).then((template) => { - return html.concat(template); - }); - }, - controller: 'HostsRelatedGroupsController' - } - } -}; diff --git a/awx/ui/client/src/inventories-hosts/hosts/related/groups/main.js b/awx/ui/client/src/inventories-hosts/hosts/related/groups/main.js deleted file mode 100644 index 7caaa49f41..0000000000 --- a/awx/ui/client/src/inventories-hosts/hosts/related/groups/main.js +++ /dev/null @@ -1,14 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './hosts-related-groups.controller'; -import hostGroupsDefinition from './hosts-related-groups.list'; - - -export default - angular.module('hostGroups', []) - .factory('HostsRelatedGroupsList', hostGroupsDefinition) - .controller('HostsRelatedGroupsController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc-credential.route.js b/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc-credential.route.js deleted file mode 100644 index c62ba4d547..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc-credential.route.js +++ /dev/null @@ -1,52 +0,0 @@ -export default { - searchPrefix: 'credential', - url: '/credential', - data: { - formChildState: true - }, - params: { - credential_search: { - value: { - page_size: '5', - credential_type: null - }, - squash: true, - dynamic: true - } - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'related': { - templateProvider: function(ListDefinition, generateList) { - let list_html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - return `${list_html}`; - - } - } - }, - resolve: { - ListDefinition: ['CredentialList', function(CredentialList) { - let list = _.cloneDeep(CredentialList); - return list; - }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => { - let path = GetBasePath(list.name) || GetBasePath(list.basePath); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ] - }, - onExit: function($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.controller.js b/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.controller.js deleted file mode 100644 index f4cc2b447f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.controller.js +++ /dev/null @@ -1,320 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Adhoc - * @description This controller controls the adhoc form creation, command launching and navigating to standard out after command has been succesfully ran. -*/ -function adhocController($q, $scope, $stateParams, - $state, CheckPasswords, PromptForPasswords, CreateLaunchDialog, CreateSelect2, adhocForm, - GenerateForm, Rest, ProcessErrors, GetBasePath, GetChoices, - KindChange, Wait, ParseTypeChange, machineCredentialType) { - - // this is done so that we can access private functions for testing, but - // we don't want to populate the "public" scope with these internal - // functions - var privateFn = {}; - this.privateFn = privateFn; - - var id = $stateParams.inventory_id ? $stateParams.inventory_id : $stateParams.smartinventory_id, - hostPattern = $stateParams.pattern; - - // note: put any urls that the controller will use in here!!!! - privateFn.setAvailableUrls = function() { - return { - adhocUrl: GetBasePath('inventory') + id + '/ad_hoc_commands/', - inventoryUrl: GetBasePath('inventory') + id + '/', - machineCredentialUrl: GetBasePath('credentials') + '?credential_type__namespace=ssh' - }; - }; - - var urls = privateFn.setAvailableUrls(); - - // set the default options for the selects of the adhoc form - privateFn.setFieldDefaults = function(verbosity_options, forks_default) { - var verbosity; - for (verbosity in verbosity_options) { - if (verbosity_options[verbosity].isDefault) { - $scope.verbosity = verbosity_options[verbosity]; - } - } - if (forks_default !== 0) { - $("#forks-number").spinner("value", forks_default); - $scope.forks = forks_default; - } - }; - - // set when "working" starts and stops - privateFn.setLoadingStartStop = function() { - var asyncHelper = {}, - formReadyPromise = 0; - - Wait('start'); - - if (asyncHelper.removeChoicesReady) { - asyncHelper.removeChoicesReady(); - } - asyncHelper.removeChoicesReady = $scope.$on('adhocFormReady', - isFormDone); - - // check to see if all requests have completed - function isFormDone() { - formReadyPromise++; - - if (formReadyPromise === 2) { - privateFn.setFieldDefaults($scope.adhoc_verbosity_options, - $scope.forks_field.default); - - CreateSelect2({ - element: '#adhoc_module_name', - multiple: false - }); - - CreateSelect2({ - element: '#adhoc_verbosity', - multiple: false - }); - - Wait('stop'); - } - } - }; - - // set the arguments help to watch on change of the module - privateFn.instantiateArgumentHelp = function() { - $scope.$watch('module_name', function(val) { - if (val) { - // give the docs for the selected module in the popover - $scope.argsPopOver = '

These arguments are used with the ' + - 'specified module. You can find information about the ' + - val.value + ' module here.

'; - } else { - // no module selected - $scope.argsPopOver = "

These arguments are used with the" + - " specified module.

"; - } - }, true); - - // initially set to the same as no module selected - $scope.argsPopOver = "

These arguments are used with the " + - "specified module.

"; - }; - - // pre-populate host patterns from the inventory page and - // delete the value off of rootScope - privateFn.instantiateHostPatterns = function(hostPattern) { - $scope.limit = hostPattern; - $scope.providedHostPatterns = $scope.limit; - }; - - // call helpers to initialize lookup and select fields through get - // requests - privateFn.initializeFields = function(machineCredentialUrl, adhocUrl) { - - // setup module name select - GetChoices({ - scope: $scope, - url: adhocUrl, - field: 'module_name', - variable: 'adhoc_module_options', - callback: 'adhocFormReady' - }); - - // setup verbosity options select - GetChoices({ - scope: $scope, - url: adhocUrl, - field: 'verbosity', - variable: 'adhoc_verbosity_options', - callback: 'adhocFormReady' - }); - }; - - // instantiate all variables on scope for display in the partial - privateFn.initializeForm = function(id, urls, hostPattern) { - // inject the adhoc command form - GenerateForm.inject(adhocForm, - { mode: 'add', related: true, scope: $scope }); - - // set when "working" starts and stops - privateFn.setLoadingStartStop(); - - // put the inventory id on scope for the partial to use - $scope.inv_id = id; - - // set the arguments help to watch on change of the module - privateFn.instantiateArgumentHelp(); - - // pre-populate host patterns from the inventory page and - // delete the value off of rootScope - privateFn.instantiateHostPatterns(hostPattern); - - privateFn.initializeFields(urls.machineCredentialUrl, urls.adhocUrl); - }; - - privateFn.initializeForm(id, urls, hostPattern); - - // init codemirror - $scope.extra_vars = '---'; - $scope.parseType = 'yaml'; - $scope.envParseType = 'yaml'; - ParseTypeChange({ scope: $scope, field_id: 'adhoc_extra_vars' , variable: "extra_vars"}); - - $scope.toggleForm = function(key) { - $scope[key] = !$scope[key]; - }; - - $scope.formCancel = function(){ - $state.go('^'); - }; - - // remove all data input into the form and reset the form back to defaults - $scope.formReset = function () { - GenerateForm.reset(); - - // pre-populate host patterns from the inventory page and - // delete the value off of rootScope - privateFn.instantiateHostPatterns($scope.providedHostPatterns); - - KindChange({ scope: $scope, form: adhocForm, reset: false }); - - // set the default options for the selects of the adhoc form - privateFn.setFieldDefaults($scope.adhoc_verbosity_options, - $scope.forks_default); - }; - - // launch the job with the provided form data - $scope.launchJob = function () { - var adhocUrl = GetBasePath('inventory') + id + - '/ad_hoc_commands/', fld, data={}, html; - - html = '
'; - - // stub the payload with defaults from DRF - data = { - "job_type": "run", - "limit": "", - "credential": "", - "module_name": "command", - "module_args": "", - "forks": 0, - "verbosity": 0, - "extra_vars": "", - "privilege_escalation": "" - }; - - GenerateForm.clearApiErrors($scope); - - // populate data with the relevant form values - for (fld in adhocForm.fields) { - if (adhocForm.fields[fld].type === 'select') { - data[fld] = $scope[fld].value; - } else if ($scope[fld]) { - data[fld] = $scope[fld]; - } - } - - Wait('start'); - - if ($scope.removeStartAdhocRun) { - $scope.removeStartAdhocRun(); - } - $scope.removeStartAdhocRun = $scope.$on('StartAdhocRun', function() { - var password; - for (password in $scope.passwords) { - data[$scope.passwords[password]] = $scope[ - $scope.passwords[password] - ]; - } - // Launch the adhoc job - Rest.setUrl(GetBasePath('inventory') + id + '/ad_hoc_commands/'); - Rest.post(data) - .then(({data}) => { - Wait('stop'); - $state.go('output', {id: data.id, type: 'command'}); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, adhocForm, { - hdr: 'Error!', - msg: 'Failed to launch adhoc command. POST ' + - 'returned status: ' + status }); - }); - }); - - if ($scope.removeCreateLaunchDialog) { - $scope.removeCreateLaunchDialog(); - } - $scope.removeCreateLaunchDialog = $scope.$on('CreateLaunchDialog', - function(e, html, url) { - CreateLaunchDialog({ - scope: $scope, - html: html, - url: url, - callback: 'StartAdhocRun' - }); - }); - - if ($scope.removePromptForPasswords) { - $scope.removePromptForPasswords(); - } - $scope.removePromptForPasswords = $scope.$on('PromptForPasswords', - function(e, passwords_needed_to_start,html, url) { - PromptForPasswords({ scope: $scope, - passwords: passwords_needed_to_start, - callback: 'CreateLaunchDialog', - html: html, - url: url - }); - }); - - if ($scope.removeContinueCred) { - $scope.removeContinueCred(); - } - $scope.removeContinueCred = $scope.$on('ContinueCred', function(e, - passwords) { - if(passwords.length>0){ - $scope.passwords_needed_to_start = passwords; - // only go through the password prompting steps if there are - // passwords to prompt for - $scope.$emit('PromptForPasswords', passwords, html, adhocUrl); - } else { - // if not, go straight to trying to run the job. - $scope.$emit('StartAdhocRun', adhocUrl); - } - }); - - // start adhoc launching routine - CheckPasswords({ - scope: $scope, - credential: $scope.credential, - callback: 'ContinueCred' - }); - }; - - $scope.lookupCredential = function(){ - $state.go('.credential', { - credential_search: { - credential_type: machineCredentialType, - page_size: '5', - page: '1' - } - }); - }; - -} - -export default ['$q', '$scope', '$stateParams', - '$state', 'CheckPasswords', 'PromptForPasswords', 'CreateLaunchDialog', 'CreateSelect2', - 'adhocForm', 'GenerateForm', 'Rest', 'ProcessErrors', 'GetBasePath', - 'GetChoices', 'KindChange', 'Wait', 'ParseTypeChange', 'machineCredentialType', - adhocController]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.form.js b/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.form.js deleted file mode 100644 index 1be324754a..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.form.js +++ /dev/null @@ -1,167 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Adhoc - * @description This form is for executing an adhoc command -*/ - -export default ['i18n', function(i18n) { - return { - addTitle: i18n._('EXECUTE COMMAND'), - name: 'adhoc', - well: true, - forceListeners: true, - - fields: { - module_name: { - label: i18n._('Module'), - excludeModal: true, - type: 'select', - ngOptions: 'module.label for module in adhoc_module_options' + - ' track by module.value', - ngChange: 'moduleChange()', - required: true, - awPopOver: i18n._('These are the modules that {{BRAND_NAME}} supports running commands against.'), - dataTitle: i18n._('Module'), - dataPlacement: 'right', - dataContainer: 'body' - }, - module_args: { - label: 'Arguments', - type: 'text', - awPopOverWatch: 'argsPopOver', - awPopOver: '{{ argsPopOver }}', - dataTitle: i18n._('Arguments'), - dataPlacement: 'right', - dataContainer: 'body', - autocomplete: false - }, - limit: { - label: i18n._('Limit'), - type: 'text', - - awPopOver: '

The pattern used to target hosts in the ' + - 'inventory. Leaving the field blank, all, and * will ' + - 'all target all hosts in the inventory. You can find ' + - 'more information about Ansible\'s host patterns ' + - 'here.

', - dataTitle: i18n._('Limit'), - dataPlacement: 'right', - dataContainer: 'body' - }, - credential: { - label: i18n._('Machine Credential'), - type: 'lookup', - list: 'CredentialList', - basePath: 'credentials', - sourceModel: 'credential', - sourceField: 'name', - class: 'squeeze', - ngClick: 'lookupCredential()', - awPopOver: '

Select the credential you want to use when ' + - 'accessing the remote hosts to run the command. ' + - 'Choose the credential containing ' + - 'the username and SSH key or password that Ansible ' + - 'will need to log into the remote hosts.

', - dataTitle: i18n._('Credential'), - dataPlacement: 'right', - dataContainer: 'body', - awRequiredWhen: { - reqExpression: 'credRequired', - init: 'false' - } - }, - verbosity: { - label: i18n._('Verbosity'), - excludeModal: true, - type: 'select', - ngOptions: 'verbosity.label for verbosity in ' + - 'adhoc_verbosity_options ' + - 'track by verbosity.value', - required: true, - awPopOver:'

These are the verbosity levels for standard ' + - 'out of the command run that are supported.', - dataTitle: i18n._('Verbosity'), - dataPlacement: 'right', - dataContainer: 'body', - "default": 1 - }, - forks: { - label: i18n._('Forks'), - id: 'forks-number', - type: 'number', - integer: true, - min: 1, - spinner: true, - 'class': "input-small", - column: 1, - awPopOver: '

' + i18n.sprintf(i18n._('The number of parallel or simultaneous processes to use while executing the playbook. Inputting no value will use ' + - 'the default value from the %sansible configuration file%s.'), '' + - '', '') +'

', - placeholder: 'DEFAULT', - dataTitle: i18n._('Forks'), - dataPlacement: 'right', - dataContainer: "body" - }, - diff_mode: { - label: i18n._('Show Changes'), - type: 'toggleSwitch', - toggleSource: 'diff_mode', - dataTitle: i18n._('Show Changes'), - dataPlacement: 'right', - dataContainer: 'body', - awPopOver: "

" + i18n._("If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode.") + "

", - }, - become_enabled: { - label: i18n._('Enable Privilege Escalation'), - type: 'checkbox', - column: 2, - awPopOver: "

If enabled, run this playbook as an administrator. This is the equivalent of passing the --become option to the ansible command.

", - dataPlacement: 'right', - dataTitle: i18n._('Become Privilege Escalation'), - dataContainer: "body" - }, - extra_vars: { - label: i18n._('Extra Variables'), - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - "default": "---", - column: 2, - awPopOver: "

" + i18n.sprintf(i18n._("Pass extra command line variables. This is the %s or %s command line parameter " + - "for %s. Provide key/value pairs using either YAML or JSON."), '-e', '--extra-vars', 'ansible') + "

" + - "JSON:
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - "YAML:
\n" + - "
---
somevar: somevalue
password: magic
\n", - dataTitle: i18n._('Extra Variables'), - dataPlacement: 'right', - dataContainer: "body" - } - }, - buttons: { - reset: { - ngClick: 'formReset()', - ngDisabled: true, - label: i18n._('Reset'), - 'class': 'btn btn-sm Form-cancelButton' - }, - launch: { - label: i18n._('Save'), - ngClick: 'launchJob()', - ngDisabled: true, - 'class': 'btn btn-sm List-buttonSubmit launchButton' - } - }, - - related: {} - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.partial.html b/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.partial.html deleted file mode 100644 index 7d2a014836..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.partial.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.route.js b/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.route.js deleted file mode 100644 index 81ef6fa4c9..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/adhoc/adhoc.route.js +++ /dev/null @@ -1,50 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - import {templateUrl} from '../../../shared/template-url/template-url.factory'; - import { N_ } from '../../../i18n'; - - function ResolveMachineCredentialType (GetBasePath, Rest, ProcessErrors) { - Rest.setUrl(GetBasePath('credential_types') + '?kind=ssh'); - - return Rest.get() - .then(({ data }) => { - return data.results[0].id; - }) - .catch(({ data, status }) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get credential type data: ' + status - }); - }); -} - -ResolveMachineCredentialType.$inject = ['GetBasePath', 'Rest', 'ProcessErrors']; - -export default { - url: '/adhoc', - params:{ - pattern: { - value: 'all', - squash: true - } - }, - data: { - formChildState: true - }, - views: { - 'adhocForm@inventories': { - templateUrl: templateUrl('inventories-hosts/inventories/adhoc/adhoc'), - controller: 'adhocController' - } - }, - ncyBreadcrumb: { - label: N_("RUN COMMAND") - }, - resolve: { - machineCredentialType: ResolveMachineCredentialType, - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/adhoc/main.js b/awx/ui/client/src/inventories-hosts/inventories/adhoc/main.js deleted file mode 100644 index 1931e8f1d1..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/adhoc/main.js +++ /dev/null @@ -1,7 +0,0 @@ -import adhocController from './adhoc.controller'; -import form from './adhoc.form'; - -export default - angular.module('adhoc', []) - .controller('adhocController', adhocController) - .factory('adhocForm', form); diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.block.less b/awx/ui/client/src/inventories-hosts/inventories/insights/insights.block.less deleted file mode 100644 index 6f3684ef59..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.block.less +++ /dev/null @@ -1,145 +0,0 @@ -.InsightsLastCheck{ - display: flex; - justify-content: flex-end; - padding-bottom: 20px; - align-items: baseline; -} - -.InsightsNav{ - width: 100%; - display: flex; - border: 1px solid #B7B7B7; - border-radius:5px; - flex-wrap: wrap; - font-size: 14px; - font-weight: bold; -} - -.InsightsNav-rightSide{ - align-items: center; - display: flex; - flex: 1 0 auto; - flex-wrap: wrap; - max-width: 100%; - padding-left: 10px; -} - -.InsightsNav-leftSide{ - align-items: center; - display: flex; - flex: 1 0 auto; - justify-content: flex-end; - flex-wrap: wrap; - max-width: 100%; - padding-right: 10px; -} - -.InsightsNav-badgeTitle{ - color: #707070; - font-size: 14px; - margin-right: 10px; - font-weight: normal; - text-transform: uppercase; - margin-left: 10px; -} - -.InsightsIcon{ - height: 30px; - width:30px; -} - -.InsightsIcon-warning{ - color:@default-warning; - padding-right: 7px; -} - -.InsightsNav-anchor{ - display:flex; - align-items: center; - cursor:pointer; - height: 40px; - padding-right:10px; -} - -.InsightsNav-anchor.is-currentFilter{ - background-color: @f2grey; - padding-top: 5px; - border-bottom: 5px solid @b7grey; -} - -.InsightsNav-anchor:hover{ - background-color: @f2grey; - padding-top: 5px; - border-bottom: 5px solid @b7grey; -} - -.InsightsNav-totalIssues{ - background-color: @default-link; - color: @default-bg; -} - -.InsightsNav-criticalIssues{ - background-color: @default-err; -} - -.InsightsNav-highIssues{ - background-color:@default-warning; -} - -.InsightsNav-mediumIssues{ - background-color: @insights-yellow; -} - -.InsightsNav-lowIssues{ - background-color: @default-succ; -} - -.InsightsNav-solvableBadge{ - background-color: @b7grey; -} - -.InsightsNav-refresh{ - color: @default-icon; - cursor: pointer; - margin-left: 10px; - margin-right: 10px; -} - -.InsightsNav-refresh:hover{ - color: @default-link; -} - -.InsightsBody-missingIssues{ - color: @default-icon; - margin: 10px 0px 10px 0px; -} - -.InsightsRow{ - margin-top:10px; -} -.InsightsRow-title{ - display: flex; - align-items: center; -} - -.InsightsRow-description{ - font-size:14px; - font-weight: bold; - padding-left: 5px; -} - -.InsightsRow-category{ - margin-left: 10px; -} - -.InsightsRow-body{ - padding-left: 35px; -} - -.InsightsRow-plan{ - padding-left: 35px; -} - -.Insights-cancelButton{ - margin-left: 0px!important; -} diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.controller.js b/awx/ui/client/src/inventories-hosts/inventories/insights/insights.controller.js deleted file mode 100644 index 5d2daa58b6..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.controller.js +++ /dev/null @@ -1,56 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default [ 'InsightsData', '$scope', 'moment', '$state', 'InventoryData', - 'InsightsService', 'CanRemediate', 'InsightsStrings', -function (data, $scope, moment, $state, InventoryData, InsightsService, - CanRemediate, strings) { - - $scope.strings = strings; - - function init() { - $scope.reports = (data && data.reports) ? data.reports : []; - $scope.reports_dataset = (data) ? data : {}; - $scope.currentFilter = "total"; - $scope.solvable_count = filter('solvable').length; - $scope.not_solvable_count = filter('not_solvable').length; - $scope.critical_count = filter('critical').length; - $scope.high_count = filter('high').length; - $scope.med_count = filter('medium').length; - $scope.low_count =filter('low').length; - let a = moment(), b = moment($scope.reports_dataset.last_check_in); - $scope.last_check_in = a.diff(b, 'hours'); - $scope.inventory = (InventoryData) ? InventoryData : {}; - $scope.insights_credential = (InventoryData && InventoryData.summary_fields && - InventoryData.summary_fields.insights_credential && InventoryData.summary_fields.insights_credential.id) ? - InventoryData.summary_fields.insights_credential.id : null; - $scope.canRemediate = CanRemediate; - $scope.platformId = $scope.reports_dataset.platform_id; - } - - function filter(str){ - return InsightsService.filter(str, $scope.reports_dataset.reports); - } - - init(); - - $scope.filterReports = function(str){ - $scope.currentFilter = str; - $scope.reports = filter(str); - }; - - $scope.viewDataInInsights = function(){ - window.open(`https://cloud.redhat.com/insights/inventory/${$scope.platformId}/insights`, '_blank'); - }; - - $scope.remediateInventory = function(inv_id, insights_credential){ - $state.go('templates.addJobTemplate', {inventory_id: inv_id, credential_id: insights_credential}); - }; - - $scope.formCancel = function(){ - $state.go('inventories', null, {reload: true}); - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.partial.html b/awx/ui/client/src/inventories-hosts/inventories/insights/insights.partial.html deleted file mode 100644 index 6a90ef81bd..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.partial.html +++ /dev/null @@ -1,93 +0,0 @@ -
- - This machine has not checked in with Insights in {{last_check_in}} hours -
-
-
-
-
Total Issues
- {{reports_dataset.reports.length}} -
- -
-
Critical
- {{critical_count}} -
-
-
High
- {{high_count}} -
-
-
Medium
- {{med_count}} -
-
-
Low
- {{low_count}} -
-
-
- -
-
Solvable With Playbook
- {{solvable_count}} -
-
-
No Remediation Playbook Available
- {{not_solvable_count}} -
-
- - -
-
-
- -
-
- No data is available. There are no issues to report. -
-
- The Insights Credential for {{inventory.name}} was not found. -
-
-
- - - - -
ISSUE: {{report.rule.description}}
- {{report.rule.category}} -
-
{{report.rule.summary}}
-
-
-
-
-
- -
- - - -
diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.route.js b/awx/ui/client/src/inventories-hosts/inventories/insights/insights.route.js deleted file mode 100644 index cd116fa062..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.route.js +++ /dev/null @@ -1,98 +0,0 @@ -import {templateUrl} from '../../../shared/template-url/template-url.factory'; -import { N_ } from '../../../i18n'; - -export default { - url: '/insights', - ncyBreadcrumb: { - label: N_("INSIGHTS") - }, - views: { - 'related': { - controller: 'InsightsController', - templateUrl: templateUrl('inventories-hosts/inventories/insights/insights') - } - }, - resolve: { - InsightsData: ['Rest', '$stateParams', 'GetBasePath', 'ProcessErrors', - (Rest, $stateParams, GetBasePath, ProcessErrors) => { - var path = `${GetBasePath('hosts')}${$stateParams.host_id}/insights`; - Rest.setUrl(path); - return Rest.get() - .then(function(data) { - return (data.data.insights_content); - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: 'Error!', - msg: 'Failed to get insights info. GET returned status: ' + - response.status - }); - }); - } - ], - InventoryData: ['Rest', '$stateParams', 'GetBasePath', 'ProcessErrors', 'resourceData', - (Rest, $stateParams, GetBasePath, ProcessErrors, resourceData) => { - if(resourceData.data.type === "host"){ - var path = `${GetBasePath('inventory')}${resourceData.data.inventory}`; - Rest.setUrl(path); - return Rest.get() - .then(function(data) { - return (data.data); - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: 'Error!', - msg: 'Failed to get insights info. GET returned status: ' + - response.status - }); - }); - } - else if(resourceData.data.type === 'inventory'){ - return resourceData.data; - } - } - ], - checkProjectPermission: ['InventoryData', '$stateParams', 'Rest', 'GetBasePath', - function(InventoryData, $stateParams, Rest, GetBasePath){ - if(_.has(InventoryData, 'summary_fields.insights_credential')){ - let credential_id = InventoryData.summary_fields.insights_credential.id, - path = `${GetBasePath('projects')}?credential__id=${credential_id}&role_level=use_role`; - Rest.setUrl(path); - return Rest.get().then(({data}) => { - if (data.results.length > 0){ - return true; - } - else { - return false; - } - }).catch(() => { - return false; - }); - } - else { - return false; - } - }], - checkInventoryPermission: ['InventoryData', '$stateParams', 'Rest', 'GetBasePath', - function(InventoryData, $stateParams, Rest, GetBasePath){ - if(_.has(InventoryData, 'summary_fields.insights_credential')){ - let path = `${GetBasePath('inventory')}${InventoryData.id}/?role_level=use_role`; - Rest.setUrl(path); - return Rest.get().then(() => { - return true; - }).catch(() => { - return false; - }); - } - else { - return false; - } - }], - CanRemediate: ['checkProjectPermission', 'checkInventoryPermission', - function(checkProjectPermission, checkInventoryPermission){ - // the user can remediate an insights - // inv if the user has "use" permission on - // an insights project and the inventory - // being edited: - return checkProjectPermission === true && checkInventoryPermission === true; - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.service.js b/awx/ui/client/src/inventories-hosts/inventories/insights/insights.service.js deleted file mode 100644 index 36082a71ed..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.service.js +++ /dev/null @@ -1,36 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default [ () => { - var val = { - filter: function(str, reports_dataset){ - let filteredSet; - if(str === "total"){ - filteredSet = reports_dataset; - } - if(str === "solvable"){ - filteredSet = _.filter(reports_dataset, (report)=>{return (report.maintenance_actions.length > 0);}); - } - if(str === "not_solvable"){ - filteredSet = _.filter(reports_dataset, (report)=>{return (report.maintenance_actions.length === 0);}); - } - if(str === "critical"){ - filteredSet = _.filter(reports_dataset, (report)=>{return (report.rule.severity === 'CRITICAL');}); - } - if(str === "high"){ - filteredSet = _.filter(reports_dataset, (report)=>{return (report.rule.severity === 'ERROR');}); - } - if(str === "medium"){ - filteredSet = _.filter(reports_dataset, (report)=>{return (report.rule.severity === 'WARN');}); - } - if(str === "low"){ - filteredSet = _.filter(reports_dataset, (report)=>{return (report.rule.severity === 'INFO');}); - } - return filteredSet; - } - }; - return val; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.strings.js b/awx/ui/client/src/inventories-hosts/inventories/insights/insights.strings.js deleted file mode 100644 index 5b6ae0913d..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/insights.strings.js +++ /dev/null @@ -1,21 +0,0 @@ -function InsightsStrings (BaseString) { - BaseString.call(this, 'instanceGroups'); - - const { t } = this; - const ns = this.instanceGroups; - - ns.tooltips = { - REFRESH_INSIGHTS: t.s('Refresh Insights'), - }; - - ns.risks = { - CRITICAL_RISK: t.s('Critical Risk'), - HIGH_RISK: t.s('High Risk'), - MEDIUM_RISK: t.s('Medium Risk'), - LOW_RISK: t.s('Low Risk'), - }; -} - -InsightsStrings.$inject = ['BaseStringService']; - -export default InsightsStrings; diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/main.js b/awx/ui/client/src/inventories-hosts/inventories/insights/main.js deleted file mode 100644 index 24a264a6f7..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/main.js +++ /dev/null @@ -1,17 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './insights.controller'; -import planFilter from './plan-filter'; -import service from './insights.service'; -import strings from './insights.strings'; - -export default -angular.module('insightsDashboard', []) - .filter('planFilter', planFilter) - .controller('InsightsController', controller) - .service('InsightsService', service) - .service('InsightsStrings', strings); diff --git a/awx/ui/client/src/inventories-hosts/inventories/insights/plan-filter.js b/awx/ui/client/src/inventories-hosts/inventories/insights/plan-filter.js deleted file mode 100644 index df023b75aa..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/insights/plan-filter.js +++ /dev/null @@ -1,16 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default function(){ - return function(plan) { - if(plan === null || plan === undefined){ - return "PLAN: Not Available CREATE A NEW PLAN IN INSIGHTS"; - } else { - let name = (plan.name === null) ? "Unnamed Plan" : plan.name; - return `${name} (${plan.id})`; - } - }; - } diff --git a/awx/ui/client/src/inventories-hosts/inventories/inventories.block.less b/awx/ui/client/src/inventories-hosts/inventories/inventories.block.less deleted file mode 100644 index 60facf6c2c..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/inventories.block.less +++ /dev/null @@ -1,12 +0,0 @@ -.Inventories-hostStatus { - margin-left: 10px; -} -#inventories-panel { - .completed_jobsList.List-well { - margin: 0; - - .List-noItems { - margin: 0; - } - } -} diff --git a/awx/ui/client/src/inventories-hosts/inventories/inventories.partial.html b/awx/ui/client/src/inventories-hosts/inventories/inventories.partial.html deleted file mode 100644 index c9343ba636..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/inventories.partial.html +++ /dev/null @@ -1,21 +0,0 @@ -
- -
-
-
-
-
-
-
-
-
-
-
-
INVENTORIES
-
HOSTS
-
-
-
-
-
-
diff --git a/awx/ui/client/src/inventories-hosts/inventories/inventories.route.js b/awx/ui/client/src/inventories-hosts/inventories/inventories.route.js deleted file mode 100644 index 2fb8425009..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/inventories.route.js +++ /dev/null @@ -1,66 +0,0 @@ -import {templateUrl} from '../../shared/template-url/template-url.factory'; -import { N_ } from '../../i18n'; - -export default { - name: 'inventories', // top-most node in the generated tree (will replace this state definition) - route: '/inventories', - ncyBreadcrumb: { - label: N_('INVENTORIES') - }, - data: { - activityStream: true, - activityStreamTarget: 'inventory', - socket: { - "groups": { - inventories: ["status_changed"] - } - } - }, - views: { - '@': { - templateUrl: templateUrl('inventories-hosts/inventories/inventories') - }, - 'list@inventories': { - templateProvider: function(InventoryList, generateList) { - let html = generateList.build({ - list: InventoryList, - mode: 'edit' - }); - return html; - }, - controller: 'InventoryListController' - } - }, - searchPrefix: 'inventory', - resolve: { - Dataset: ['InventoryList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - canAdd: ['rbacUiControlService', function(rbacUiControlService) { - return rbacUiControlService.canAdd('inventory') - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }], - InstanceGroupsData: ['Rest', 'GetBasePath', 'ProcessErrors', (Rest, GetBasePath, ProcessErrors) => { - const url = GetBasePath('instance_groups'); - Rest.setUrl(url); - return Rest.get() - .then(({data}) => { - return data.results.map((i) => ({name: i.name, id: i.id})); - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get instance groups info. GET returned status: ' + status - }); - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/inventory.list.js b/awx/ui/client/src/inventories-hosts/inventories/inventory.list.js deleted file mode 100644 index e19c4d7e00..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/inventory.list.js +++ /dev/null @@ -1,136 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default ['i18n', function(i18n) { - return { - - name: 'inventories', - iterator: 'inventory', - selectTitle: i18n._('Add Inventories'), - editTitle: i18n._('INVENTORIES'), - listTitle: i18n._('INVENTORIES'), - selectInstructions: i18n.sprintf(i18n._("Click on a row to select it, and click Finished when done. Click the %s button to create a new inventory."), " "), - index: false, - hover: true, - basePath: 'inventory', - title: false, - disableRow: "{{ inventory.pending_deletion }}", - disableRowValue: 'inventory.pending_deletion', - layoutClass: 'List-staticColumnLayout--toggleOnOff', - staticColumns: [ - { - field: 'status', - content: { - label: '', - nosort: true, - ngClick: "null", - iconOnly: true, - excludeModal: true, - template: ``, - icons: [{ - icon: "{{ 'icon-cloud-' + inventory.syncStatus }}", - awToolTip: "{{ inventory.syncTip }}", - awTipPlacement: "right", - ngClick: "showSourceSummary($event, inventory.id)", - ngClass: "inventory.launch_class" - },{ - icon: "{{ 'icon-job-' + inventory.hostsStatus }}", - awToolTip: false, - ngClick: "showHostSummary($event, inventory.id)" - }] - } - } - ], - - fields: { - name: { - key: true, - label: i18n._('Name'), - columnClass: 'col-md-4 col-sm-4 col-xs-8', - modalColumnClass: 'col-md-12', - awToolTip: "{{ inventory.description | sanitize }}", - awTipPlacement: "top", - uiSref: '{{inventory.linkToDetails}}' - }, - kind: { - label: i18n._('Type'), - ngBind: 'inventory.kind_label', - columnClass: 'd-none d-sm-flex col-sm-2' - }, - organization: { - label: i18n._('Organization'), - ngBind: 'inventory.summary_fields.organization.name', - linkTo: '/#/organizations/{{ inventory.organization }}', - sourceModel: 'organization', - sourceField: 'name', - excludeModal: true, - columnClass: 'd-none d-sm-flex col-md-3 col-sm-2' - } - }, - - actions: { - add: { - mode: 'all', // One of: edit, select, all - type: 'buttonDropdown', - basePaths: ['inventories'], - awToolTip: i18n._('Create a new inventory'), - actionClass: 'at-Button--add', - actionId: 'button-add', - options: [ - { - optionContent: i18n._('Inventory'), - optionSref: 'inventories.add', - ngShow: 'canAddInventory' - }, - { - optionContent: i18n._('Smart Inventory'), - optionSref: 'inventories.addSmartInventory', - ngShow: 'canAddInventory' - } - ], - ngShow: 'canAddInventory' - } - }, - - fieldActions: { - columnClass: 'col-md-3 col-sm-4 col-xs-4', - edit: { - label: i18n._('Edit'), - ngClick: 'editInventory(inventory)', - awToolTip: i18n._('Edit inventory'), - dataPlacement: 'top', - ngShow: '!inventory.pending_deletion && inventory.summary_fields.user_capabilities.edit' - }, - copy: { - label: i18n._('Copy'), - ngClick: 'copyInventory(inventory)', - awToolTip: "{{ inventory.copyTip }}", - dataTipWatch: "inventory.copyTip", - dataPlacement: 'top', - ngShow: '!inventory.pending_deletion && inventory.summary_fields.user_capabilities.copy', - ngClass: 'inventory.copyClass' - }, - view: { - label: i18n._('View'), - ngClick: 'editInventory(inventory)', - awToolTip: i18n._('View inventory'), - dataPlacement: 'top', - ngShow: '!inventory.summary_fields.user_capabilities.edit' - }, - "delete": { - label: i18n._('Delete'), - ngClick: "deleteInventory(inventory.id, inventory.name)", - awToolTip: i18n._('Delete inventory'), - dataPlacement: 'top', - ngShow: '!inventory.pending_deletion && inventory.summary_fields.user_capabilities.delete' - - }, - pending_deletion: { - label: i18n._('Pending Delete'), - } - } - };}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.block.less b/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.block.less deleted file mode 100644 index 325fbf2b25..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.block.less +++ /dev/null @@ -1,3 +0,0 @@ -.HostSummaryPopover-noSourceSummary { - margin-left: 15px; -} diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.controller.js b/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.controller.js deleted file mode 100644 index 8ed36170ce..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.controller.js +++ /dev/null @@ -1,29 +0,0 @@ -export default [ '$scope', 'Empty', 'Wait', 'GetBasePath', 'Rest', 'ProcessErrors', - function($scope, Empty, Wait, GetBasePath, Rest, ProcessErrors) { - - $scope.gatherRecentJobs = function(event) { - if (!Empty($scope.inventory.id)) { - if ($scope.inventory.total_hosts > 0) { - Wait('start'); - - let url = GetBasePath('unified_jobs') + '?'; - url += `&or__job__inventory=${$scope.inventory.id}`; - url += `&or__workflowjob__inventory=${$scope.inventory.id}`; - url += `&failed=${$scope.inventory.has_active_failures ? "true" : "false"}`; - url += "&order_by=-finished&page_size=5"; - - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - $scope.generateTable(data, event); - }) - .catch(({data, status}) => { - ProcessErrors( $scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + ' failed. GET returned: ' + status - }); - }); - } - } - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js b/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js deleted file mode 100644 index e4cfdfb0d9..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js +++ /dev/null @@ -1,120 +0,0 @@ -export default ['templateUrl', 'Wait', '$filter', '$compile', 'i18n', '$log', - function(templateUrl, Wait, $filter, $compile, i18n, $log) { - return { - restrict: 'E', - replace: false, - scope: { - inventory: '=' - }, - controller: 'HostSummaryPopoverController', - templateUrl: templateUrl('inventories-hosts/inventories/list/host-summary-popover/host-summary-popover'), - link: function(scope) { - - function ellipsis(a) { - if (a.length > 20) { - return a.substr(0,20) + '...'; - } - return a; - } - - function attachElem(event, html, title) { - var elem = $(event.target).parent(); - - try { - elem.tooltip('hide'); - elem.popover('dispose'); - } - catch(err) { - $log.debug(err); - } - $('.popover').each(function() { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - $(this).remove(); - }); - $('.tooltip').each( function() { - // close any lingering tooltips - $(this).hide(); - }); - elem.attr({ - "aw-pop-over": html, - "data-popover-title": title, - "data-placement": "right" }); - elem.removeAttr('ng-click'); - $compile(elem)(scope); - scope.triggerPopover(event); - } - - scope.generateTable = function(data, event){ - var html, title = (scope.inventory.has_active_failures) ? i18n._("Recent Failed Jobs") : i18n._("Recent Successful Jobs"); - Wait('stop'); - if (data.count > 0) { - html = ` - - - - - - - - - - `; - - data.results.forEach(function(row) { - let href = ''; - switch (row.type) { - case 'job': - case 'ad_hoc_command': - case 'system_job': - case 'project_update': - case 'inventory_update': - href = `#/jobs/${row.id}`; - break; - case 'workflow_job': - href = `#/workflows/${row.id}`; - break; - default: - break; - } - if ((scope.inventory.has_active_failures && row.status === 'failed') || (!scope.inventory.has_active_failures && row.status === 'successful')) { - html += ` - - - - - - `; - } - }); - html += `
${i18n._("Status")}${i18n._("Finished")}${i18n._("Name")}
- - - - ${($filter('longDate')(row.finished))} - ${$filter('sanitize')(ellipsis(row.name))} -
`; - } - else { - html = `

${i18n._("No recent job data available for this inventory.")}

`; - } - - attachElem(event, html, title); - }; - - scope.showHostSummary = function(event) { - try{ - var elem = $(event.target).parent(); - // if the popover is visible already, then exit the function here - if(elem.data()['bs.popover'].tip().hasClass('in')){ - return; - } - } - catch(err){ - scope.gatherRecentJobs(event); - } - }; - - } - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html b/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html deleted file mode 100644 index 2b04b43217..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/main.js b/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/main.js deleted file mode 100644 index e2b88a1d06..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/host-summary-popover/main.js +++ /dev/null @@ -1,7 +0,0 @@ -import directive from './host-summary-popover.directive'; -import controller from './host-summary-popover.controller'; - -export default -angular.module('HostSummaryPopoverModule', []) - .directive('hostSummaryPopover', directive) - .controller('HostSummaryPopoverController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/inventory-list.controller.js b/awx/ui/client/src/inventories-hosts/inventories/list/inventory-list.controller.js deleted file mode 100644 index 85174c2652..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/inventory-list.controller.js +++ /dev/null @@ -1,199 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Inventories - * @description This controller's for the Inventory page - */ - -function InventoriesList($scope, - $filter, qs, InventoryList, Prompt, - ProcessErrors, GetBasePath, Wait, $state, - Dataset, canAdd, i18n, Inventory, InventoryHostsStrings, - ngToast) { - - let inventory = new Inventory(); - - let list = InventoryList, - defaultUrl = GetBasePath('inventory'); - - init(); - - function init(){ - $scope.canAddInventory = canAdd; - - $scope.$watchCollection(list.name, function(){ - _.forEach($scope[list.name], processInventoryRow); - }); - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - } - - function processInventoryRow(inventory) { - inventory.launch_class = ""; - - if (inventory.has_inventory_sources) { - inventory.copyTip = i18n._('Inventories with sources cannot be copied'); - inventory.copyClass = "btn-disabled"; - if (inventory.inventory_sources_with_failures > 0) { - inventory.syncStatus = 'error'; - inventory.syncTip = inventory.inventory_sources_with_failures + i18n._(' sources with sync failures. Click for details'); - } - else { - inventory.syncStatus = 'successful'; - inventory.syncTip = i18n._('No inventory sync failures. Click for details.'); - } - } - else { - inventory.copyTip = i18n._('Copy Inventory'); - inventory.copyClass = ""; - inventory.syncStatus = 'na'; - inventory.syncTip = i18n._('Not configured for inventory sync.'); - inventory.launch_class = "btn-disabled"; - } - - if (inventory.has_active_failures) { - inventory.hostsStatus = 'error'; - inventory.hostsTip = inventory.hosts_with_active_failures + i18n._(' hosts with failures. Click for details.'); - } - else if (inventory.total_hosts) { - inventory.hostsStatus = 'successful'; - inventory.hostsTip = i18n._('No hosts with failures. Click for details.'); - } - else { - inventory.hostsStatus = 'none'; - inventory.hostsTip = i18n._('Inventory contains 0 hosts.'); - } - - inventory.kind_label = inventory.kind === '' ? 'Inventory' : (inventory.kind === 'smart' ? i18n._('Smart Inventory'): i18n._('Inventory')); - - inventory.linkToDetails = (inventory.kind && inventory.kind === 'smart') ? `inventories.editSmartInventory({smartinventory_id:${inventory.id}})` : `inventories.edit({inventory_id:${inventory.id}})`; - } - - $scope.copyInventory = inventory => { - if (!inventory.has_inventory_sources) { - Wait('start'); - new Inventory('get', inventory.id) - .then(model => model.copy()) - .then(copiedInv => { - ngToast.success({ - content: ` -
-
- -
-
- ${InventoryHostsStrings.get('SUCCESSFUL_CREATION', copiedInv.name)} -
-
`, - dismissButton: false, - dismissOnTimeout: true - }); - $state.go('.', null, { reload: true }); - }) - .catch(({ data, status }) => { - const params = { hdr: 'Error!', msg: `Call to copy failed. Return status: ${status}` }; - ProcessErrors($scope, data, status, null, params); - }) - .finally(() => Wait('stop')); - } - }; - - $scope.editInventory = function (inventory, reload) { - const goOptions = reload ? { reload: true } : null; - if(inventory.kind && inventory.kind === 'smart') { - $state.go('inventories.editSmartInventory', {smartinventory_id: inventory.id}, goOptions); - } - else { - $state.go('inventories.edit', {inventory_id: inventory.id}, goOptions); - } - }; - - $scope.deleteInventory = function (id, name) { - var action = function () { - var url = defaultUrl + id + '/'; - Wait('start'); - $('#prompt-modal').modal('hide'); - inventory.request('delete', id) - .then(() => { - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors( $scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - inventory.getDependentResourceCounts(id) - .then((counts) => { - const invalidateRelatedLines = []; - let deleteModalBody = `
${InventoryHostsStrings.get('deleteResource.CONFIRM', 'inventory')}
`; - - counts.forEach(countObj => { - if(countObj.count && countObj.count > 0) { - invalidateRelatedLines.push(`
${countObj.label}${countObj.count}
`); - } - }); - - if (invalidateRelatedLines && invalidateRelatedLines.length > 0) { - deleteModalBody = `
${InventoryHostsStrings.get('deleteResource.USED_BY', 'inventory')} ${InventoryHostsStrings.get('deleteResource.CONFIRM', 'inventory')}
`; - invalidateRelatedLines.forEach(invalidateRelatedLine => { - deleteModalBody += invalidateRelatedLine; - }); - } - - deleteModalBody += '
Note: ' + i18n._('The inventory will be in a pending status until the final delete is processed.') + '
'; - - Prompt({ - hdr: i18n._('Delete'), - resourceName: $filter('sanitize')(name), - body: deleteModalBody, - action: action, - actionText: i18n._('DELETE') - }); - }); - }; - - $scope.$on(`ws-inventories`, function(e, data){ - let inventory = $scope.inventories.find((inventory) => inventory.id === data.inventory_id); - if (data.status === 'pending_deletion' && inventory !== undefined) { - inventory.pending_deletion = true; - } - if (data.status === 'deleted') { - let reloadListStateParams = _.cloneDeep($state.params); - - if($scope.inventories.length === 1 && $state.params.inventory_search && _.hasIn($state, 'params.inventory_search.page') && $state.params.inventory_search.page !== '1') { - reloadListStateParams.inventory_search.page = (parseInt(reloadListStateParams.inventory_search.page)-1).toString(); - } - - if (parseInt($state.params.inventory_id) === data.inventory_id || parseInt($state.params.smartinventory_id) === data.inventory_id) { - $state.go("inventories", reloadListStateParams, {reload: true}); - } else { - Wait('start'); - $state.go('.', reloadListStateParams); - const path = GetBasePath($scope.list.basePath) || GetBasePath($scope.list.name); - qs.search(path, reloadListStateParams.inventory_search) - .then((searchResponse) => { - $scope.inventories_dataset = searchResponse.data; - $scope.inventories = searchResponse.data.results; - }) - .finally(() => Wait('stop')); - } - } - }); -} - -export default ['$scope', - '$filter', 'QuerySet', 'InventoryList', 'Prompt', - 'ProcessErrors', 'GetBasePath', 'Wait', - '$state', 'Dataset', 'canAdd', 'i18n', 'InventoryModel', - 'InventoryHostsStrings', 'ngToast', InventoriesList -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/main.js b/awx/ui/client/src/inventories-hosts/inventories/list/main.js deleted file mode 100644 index 4df9ff834f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/main.js +++ /dev/null @@ -1,16 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './inventory-list.controller'; -import hostSummaryPopover from './host-summary-popover/main'; -import sourceSummaryPopover from './source-summary-popover/main'; - -export default -angular.module('InventoryList', [ - hostSummaryPopover.name, - sourceSummaryPopover.name - ]) - .controller('InventoryListController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/main.js b/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/main.js deleted file mode 100644 index 4b6659f510..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/main.js +++ /dev/null @@ -1,7 +0,0 @@ -import directive from './source-summary-popover.directive'; -import controller from './source-summary-popover.controller'; - -export default -angular.module('SourceSummaryPopoverModule', []) - .directive('sourceSummaryPopover', directive) - .controller('SourceSummaryPopoverController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.controller.js b/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.controller.js deleted file mode 100644 index 70ae7aeacd..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.controller.js +++ /dev/null @@ -1,27 +0,0 @@ -export default [ '$scope', 'Wait', 'Empty', 'Rest', 'ProcessErrors', '$state', - function($scope, Wait, Empty, Rest, ProcessErrors, $state) { - - $scope.gatherSourceJobs = function(event) { - if (!Empty($scope.inventory.id)) { - Wait('start'); - Rest.setUrl($scope.inventory.related.inventory_sources + '?order_by=-last_job_run&page_size=5'); - Rest.get() - .then(({data}) => { - $scope.generateTable(data, event); - }) - .catch(({data, status}) => { - ProcessErrors( $scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + $scope.inventory.related.inventory_sources + ' failed. GET returned status: ' + status - }); - }); - } - }; - - $scope.viewJob = function(url) { - // Pull the id out of the URL - var id = url.replace(/^\//, '').split('/')[3]; - $state.go('output', { id, type: 'inventory' } ); - }; - - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js b/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js deleted file mode 100644 index c10e12a032..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js +++ /dev/null @@ -1,98 +0,0 @@ -export default ['templateUrl', '$compile', 'Wait', '$filter', 'i18n', - function(templateUrl, $compile, Wait, $filter, i18n) { - return { - restrict: 'E', - replace: false, - scope: { - inventory: '=' - }, - controller: 'SourceSummaryPopoverController', - templateUrl: templateUrl('inventories-hosts/inventories/list/source-summary-popover/source-summary-popover'), - link: function(scope) { - - function ellipsis(a) { - if (a.length > 20) { - return a.substr(0,20) + '...'; - } - return a; - } - - function attachElem(event, html, title) { - var elem = $(event.target).parent(); - try { - elem.tooltip('hide'); - elem.popover('dispose'); - } - catch(err) { - //ignore - } - $('.popover').each(function() { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - $(this).remove(); - }); - $('.tooltip').each( function() { - // close any lingering tool tipss - $(this).hide(); - }); - elem.attr({ - "aw-pop-over": html, - "data-popover-title": title, - "data-placement": "right" }); - elem.removeAttr('ng-click'); - $compile(elem)(scope); - scope.triggerPopover(event); - } - - scope.generateTable = function(data, event) { - var html, title; - - Wait('stop'); - - // Build the html for our popover - html = "\n"; - html += "\n"; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += "\n"; - html += "\n"; - data.results.forEach( function(row) { - if (row.related.last_update) { - html += ""; - html += ``; - html += ""; - html += ""; - html += "\n"; - } - else { - html += ""; - html += ``; - html += ""; - html += ""; - html += "\n"; - } - }); - html += "\n"; - html += "
" + i18n._("Status") + "" + i18n._("Last Sync") + "" + i18n._("Source") + "
" + ($filter('longDate')(row.last_updated)) + "" + $filter('sanitize')(ellipsis(row.name)) + "
NA" + $filter('sanitize')(ellipsis(row.name)) + "
\n"; - title = i18n._("Sync Status"); - attachElem(event, html, title); - }; - - scope.showSourceSummary = function(event) { - try{ - var elem = $(event.target).parent(); - // if the popover is visible already, then exit the function here - if(elem.data()['bs.popover'].tip().hasClass('in')){ - return; - } - } - catch(err){ - scope.gatherSourceJobs(event); - } - }; - } - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html b/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html deleted file mode 100644 index b1b3331c4c..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/awx/ui/client/src/inventories-hosts/inventories/main.js b/awx/ui/client/src/inventories-hosts/inventories/main.js deleted file mode 100644 index a3160d7b1f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/main.js +++ /dev/null @@ -1,441 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ -import { N_ } from '../../i18n'; - -import adhoc from './adhoc/main'; -import group from './related/groups/main'; -import sources from './related/sources/main'; -import relatedHost from './related/hosts/main'; -import inventoryList from './list/main'; -import InventoryList from './inventory.list'; -import adHocRoute from './adhoc/adhoc.route'; -import insights from './insights/main'; -import completedJobsRoute from '~features/jobs/routes/inventoryCompletedJobs.route.js'; -import inventorySourceEditRoute from './related/sources/edit/sources-edit.route'; -import inventorySourceEditNotificationsRoute from './related/sources/edit/sources-notifications.route'; -import inventorySourceAddRoute from './related/sources/add/sources-add.route'; -import inventorySourceListRoute from './related/sources/list/sources-list.route'; -import inventorySourceListScheduleRoute from './related/sources/list/schedule/sources-schedule.route'; -import inventorySourceListScheduleAddRoute from './related/sources/list/schedule/sources-schedule-add.route'; -import inventorySourceListScheduleEditRoute from './related/sources/list/schedule/sources-schedule-edit.route'; -import adhocCredentialRoute from './adhoc/adhoc-credential.route'; -import inventoryGroupsList from './related/groups/list/groups-list.route'; -import inventoryGroupsAdd from './related/groups/add/groups-add.route'; -import inventoryGroupsEdit from './related/groups/edit/groups-edit.route'; -import groupNestedGroupsRoute from './related/groups/related/nested-groups/group-nested-groups.route'; -import hostNestedGroupsRoute from './related/hosts/related/nested-groups/host-nested-groups.route'; -import nestedGroupsAdd from './related/groups/related/nested-groups/group-nested-groups-add.route'; -import nestedHostsRoute from './related/groups/related/nested-hosts/group-nested-hosts.route'; -import inventoryHosts from './related/hosts/related-host.route'; -import smartInventoryHosts from './smart-inventory/smart-inventory-hosts.route'; -import inventoriesList from './inventories.route'; -import inventoryHostsAdd from './related/hosts/add/host-add.route'; -import inventoryHostsEdit from './related/hosts/edit/standard-host-edit.route'; -import smartInventoryHostsEdit from './related/hosts/edit/smart-host-edit.route'; -import ansibleFactsRoute from '../shared/ansible-facts/ansible-facts.route'; -import insightsRoute from './insights/insights.route'; -import inventorySourcesCredentialRoute from './related/sources/lookup/sources-lookup-credential.route'; -import inventorySourcesInventoryScriptRoute from './related/sources/lookup/sources-lookup-inventory-script.route'; -import inventorySourcesProjectRoute from './related/sources/lookup/sources-lookup-project.route'; -import SmartInventory from './smart-inventory/main'; -import StandardInventory from './standard-inventory/main'; -import hostNestedGroupsAssociateRoute from './related/hosts/related/nested-groups/host-nested-groups-associate.route'; -import groupNestedGroupsAssociateRoute from './related/groups/related/nested-groups/group-nested-groups-associate.route'; -import nestedHostsAssociateRoute from './related/groups/related/nested-hosts/group-nested-hosts-associate.route'; -import nestedHostsAddRoute from './related/groups/related/nested-hosts/group-nested-hosts-add.route'; -import hostCompletedJobsRoute from '~features/jobs/routes/hostCompletedJobs.route.js'; - -export default -angular.module('inventory', [ - adhoc.name, - group.name, - sources.name, - relatedHost.name, - inventoryList.name, - insights.name, - SmartInventory.name, - StandardInventory.name, - ]) - .factory('InventoryList', InventoryList) - .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', - function($stateProvider, stateDefinitionsProvider, $stateExtenderProvider) { - let stateDefinitions = stateDefinitionsProvider.$get(), - stateExtender = $stateExtenderProvider.$get(); - - function generateInventoryStates() { - - let standardInventoryAdd = stateDefinitions.generateTree({ - name: 'inventories.add', // top-most node in the generated tree (will replace this state definition) - url: '/inventory/add', - modes: ['add'], - form: 'InventoryForm', - controllers: { - add: 'InventoryAddController' - }, - resolve: { - add: { - canAdd: ['rbacUiControlService', '$state', function(rbacUiControlService, $state) { - return rbacUiControlService.canAdd('inventory') - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - $state.go('inventories'); - }); - }] - } - } - }); - - let standardInventoryEdit = stateDefinitions.generateTree({ - name: 'inventories.edit', - url: '/inventory/:inventory_id', - modes: ['edit'], - form: 'InventoryForm', - controllers: { - edit: 'InventoryEditController' - }, - breadcrumbs: { - edit: '{{breadcrumb.inventory_name}}' - }, - data: { - activityStream: true, - activityStreamTarget: 'inventory' - }, - resolve: { - edit: { - smartInventoryRedirect: ['resourceData', '$state', '$stateParams', - function(resourceData, $state, $stateParams){ - if(resourceData.data.kind === "smart"){ - $state.go("inventories.editSmartInventory", {"smartinventory_id": $stateParams.inventory_id}, {reload: true}); - } - }], - InstanceGroupsData: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', - function($stateParams, Rest, GetBasePath, ProcessErrors){ - let path = `${GetBasePath('inventory')}${$stateParams.inventory_id}/instance_groups/`; - Rest.setUrl(path); - return Rest.get() - .then(({data}) => { - if (data.results.length > 0) { - return data.results; - } - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get instance groups. GET returned ' + - 'status: ' + status - }); - }); - }], - checkProjectPermission: ['resourceData', '$stateParams', 'Rest', 'GetBasePath', 'credentialTypesLookup', - function(resourceData, $stateParams, Rest, GetBasePath, credentialTypesLookup){ - if(_.has(resourceData, 'data.summary_fields.insights_credential')){ - return credentialTypesLookup() - .then(kinds => { - let insightsKind = kinds.insights; - let path = `${GetBasePath('projects')}?credential__credential_type=${insightsKind}&role_level=use_role`; - Rest.setUrl(path); - return Rest.get().then(({data}) => { - if (data.results.length > 0){ - return true; - } - else { - return false; - } - }).catch(() => { - return false; - }); - }); - } - else { - return false; - } - }], - checkInventoryPermission: ['resourceData', '$stateParams', 'Rest', 'GetBasePath', - function(resourceData, $stateParams, Rest, GetBasePath){ - if(_.has(resourceData, 'data.summary_fields.insights_credential')){ - let path = `${GetBasePath('inventory')}${$stateParams.inventory_id}/?role_level=use_role`; - Rest.setUrl(path); - return Rest.get().then(() => { - return true; - }).catch(() => { - return false; - }); - } - else { - return false; - } - }], - CanRemediate: ['checkProjectPermission', 'checkInventoryPermission', - function(checkProjectPermission, checkInventoryPermission){ - // the user can remediate an insights - // inv if the user has "use" permission on - // an insights project and the inventory - // being edited: - return checkProjectPermission === true && checkInventoryPermission === true; - }] - }, - - } - }); - - let smartInventoryAdd = stateDefinitions.generateTree({ - name: 'inventories.addSmartInventory', // top-most node in the generated tree (will replace this state definition) - url: '/smart/add?hostfilter', - modes: ['add'], - form: 'smartInventoryForm', - controllers: { - add: 'SmartInventoryAddController' - }, - resolve: { - add: { - canAdd: ['rbacUiControlService', '$state', function(rbacUiControlService, $state) { - return rbacUiControlService.canAdd('inventory') - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - $state.go('inventories'); - }); - }] - } - } - }); - - let smartInventoryEdit = stateDefinitions.generateTree({ - name: 'inventories.editSmartInventory', - url: '/smart/:smartinventory_id', - modes: ['edit'], - form: 'smartInventoryForm', - controllers: { - edit: 'SmartInventoryEditController' - }, - breadcrumbs: { - edit: '{{breadcrumb.inventory_name}}' - }, - data: { - activityStream: true, - activityStreamTarget: 'inventory', - activityStreamId: 'smartinventory_id' - }, - resolve: { - edit: { - InstanceGroupsData: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', - function($stateParams, Rest, GetBasePath, ProcessErrors){ - let path = `${GetBasePath('inventory')}${$stateParams.smartinventory_id}/instance_groups/`; - Rest.setUrl(path); - return Rest.get() - .then(({data}) => { - if (data.results.length > 0) { - return data.results; - } - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get instance groups. GET returned ' + - 'status: ' + status - }); - }); - }] - } - } - }); - - let relatedHostsAnsibleFacts = _.cloneDeep(ansibleFactsRoute); - relatedHostsAnsibleFacts.name = 'inventories.edit.hosts.edit.ansible_facts'; - - let relatedHostsInsights = _.cloneDeep(insightsRoute); - relatedHostsInsights.name = 'inventories.edit.hosts.edit.insights'; - - let addSourceCredential = _.cloneDeep(inventorySourcesCredentialRoute); - addSourceCredential.name = 'inventories.edit.inventory_sources.add.credential'; - - let addSourceInventoryScript = _.cloneDeep(inventorySourcesInventoryScriptRoute); - addSourceInventoryScript.name = 'inventories.edit.inventory_sources.add.inventory_script'; - addSourceInventoryScript.url = '/inventory_script'; - - let editSourceCredential = _.cloneDeep(inventorySourcesCredentialRoute); - editSourceCredential.name = 'inventories.edit.inventory_sources.edit.credential'; - - let addSourceProject = _.cloneDeep(inventorySourcesProjectRoute); - addSourceProject.name = 'inventories.edit.inventory_sources.add.project'; - addSourceProject.url = '/project'; - - let editSourceProject = _.cloneDeep(inventorySourcesProjectRoute); - editSourceProject.name = 'inventories.edit.inventory_sources.edit.project'; - editSourceProject.url = '/project'; - - let editSourceInventoryScript = _.cloneDeep(inventorySourcesInventoryScriptRoute); - editSourceInventoryScript.name = 'inventories.edit.inventory_sources.edit.inventory_script'; - editSourceInventoryScript.url = '/inventory_script'; - - let inventoryCompletedJobsRoute = _.cloneDeep(completedJobsRoute); - inventoryCompletedJobsRoute.name = 'inventories.edit.completed_jobs'; - - let smartInventoryCompletedJobsRoute = _.cloneDeep(completedJobsRoute); - smartInventoryCompletedJobsRoute.name = 'inventories.editSmartInventory.completed_jobs'; - - let inventoryAdhocRoute = _.cloneDeep(adHocRoute); - inventoryAdhocRoute.name = 'inventories.edit.adhoc'; - - let smartInventoryAdhocRoute = _.cloneDeep(adHocRoute); - smartInventoryAdhocRoute.name = 'inventories.editSmartInventory.adhoc'; - - let inventoryAdhocCredential = _.cloneDeep(adhocCredentialRoute); - inventoryAdhocCredential.name = 'inventories.edit.adhoc.credential'; - - let smartInventoryAdhocCredential = _.cloneDeep(adhocCredentialRoute); - smartInventoryAdhocCredential.name = 'inventories.editSmartInventory.adhoc.credential'; - - let relatedHostCompletedJobs = _.cloneDeep(hostCompletedJobsRoute); - relatedHostCompletedJobs.name = 'inventories.edit.hosts.edit.completed_jobs'; - - let inventoryRootGroupsList = _.cloneDeep(inventoryGroupsList); - inventoryRootGroupsList.name = "inventories.edit.rootGroups"; - inventoryRootGroupsList.url = "/root_groups?{group_search:queryset}", - inventoryRootGroupsList.ncyBreadcrumb.label = N_("ROOT GROUPS");// jshint ignore:line - inventoryRootGroupsList.resolve.listDefinition = ['GroupList', (list) => { - const rootGroupList = _.cloneDeep(list); - rootGroupList.basePath = 'api/v2/inventories/{{$stateParams.inventory_id}}/root_groups/'; - rootGroupList.fields.name.uiSref = "inventories.edit.rootGroups.edit({group_id:group.id})"; - return rootGroupList; - }]; - - let inventoryRootGroupsAdd = _.cloneDeep(inventoryGroupsAdd); - inventoryRootGroupsAdd.name = "inventories.edit.rootGroups.add"; - inventoryRootGroupsAdd.ncyBreadcrumb.parent = "inventories.edit.rootGroups"; - - let inventoryRootGroupsEdit = _.cloneDeep(inventoryGroupsEdit); - inventoryRootGroupsEdit.name = "inventories.edit.rootGroups.edit"; - inventoryRootGroupsEdit.ncyBreadcrumb.parent = "inventories.edit.rootGroups"; - inventoryRootGroupsEdit.views = { - 'groupForm@inventories': { - templateProvider: function(GenerateForm, GroupForm) { - let form = _.cloneDeep(GroupForm); - form.activeEditState = 'inventories.edit.rootGroups.edit'; - form.detailsClick = "$state.go('inventories.edit.rootGroups.edit')"; - form.parent = 'inventories.edit.rootGroups'; - form.related.nested_groups.ngClick = "$state.go('inventories.edit.rootGroups.edit.nested_groups')"; - form.related.nested_hosts.ngClick = "$state.go('inventories.edit.rootGroups.edit.nested_hosts')"; - - return GenerateForm.buildHTML(form, { - mode: 'edit', - related: false - }); - }, - controller: 'GroupEditController' - } - }; - inventoryGroupsEdit.views = { - 'groupForm@inventories': { - templateProvider: function(GenerateForm, GroupForm) { - let form = GroupForm; - - return GenerateForm.buildHTML(form, { - mode: 'edit', - related: false - }); - }, - controller: 'GroupEditController' - } - }; - - let rootGroupNestedGroupsRoute = _.cloneDeep(groupNestedGroupsRoute); - rootGroupNestedGroupsRoute.name = 'inventories.edit.rootGroups.edit.nested_groups'; - rootGroupNestedGroupsRoute.ncyBreadcrumb.parent = "inventories.edit.rootGroups.edit"; - - let rootNestedGroupsAdd = _.cloneDeep(nestedGroupsAdd); - rootNestedGroupsAdd.name = "inventories.edit.rootGroups.edit.nested_groups.add"; - rootNestedGroupsAdd.ncyBreadcrumb.parent = "inventories.edit.groups.edit.nested_groups"; - - let rootGroupNestedGroupsAssociateRoute = _.cloneDeep(groupNestedGroupsAssociateRoute); - rootGroupNestedGroupsAssociateRoute.name = 'inventories.edit.rootGroups.edit.nested_groups.associate'; - - let rootGroupNestedHostsRoute = _.cloneDeep(nestedHostsRoute); - rootGroupNestedHostsRoute.name = 'inventories.edit.rootGroups.edit.nested_hosts'; - rootGroupNestedHostsRoute.ncyBreadcrumb.parent = "inventories.edit.rootGroups.edit"; - - let rootNestedHostsAdd = _.cloneDeep(nestedHostsAddRoute); - rootNestedHostsAdd.name = "inventories.edit.rootGroups.edit.nested_hosts.add"; - rootNestedHostsAdd.ncyBreadcrumb.parent = "inventories.edit.rootGroups.edit.nested_hosts"; - - let rootGroupNestedHostsAssociateRoute = _.cloneDeep(nestedHostsAssociateRoute); - rootGroupNestedHostsAssociateRoute.name = 'inventories.edit.rootGroups.edit.nested_hosts.associate'; - - return Promise.all([ - standardInventoryAdd, - standardInventoryEdit, - smartInventoryAdd, - smartInventoryEdit - ]).then((generated) => { - return { - states: _.reduce(generated, (result, definition) => { - return result.concat(definition.states); - }, [ - stateExtender.buildDefinition(inventoriesList), - stateExtender.buildDefinition(inventoryAdhocRoute), - stateExtender.buildDefinition(smartInventoryAdhocRoute), - stateExtender.buildDefinition(inventoryAdhocCredential), - stateExtender.buildDefinition(smartInventoryAdhocCredential), - stateExtender.buildDefinition(inventorySourceListScheduleRoute), - stateExtender.buildDefinition(inventorySourceListScheduleAddRoute), - stateExtender.buildDefinition(inventorySourceListScheduleEditRoute), - stateExtender.buildDefinition(relatedHostsAnsibleFacts), - stateExtender.buildDefinition(relatedHostsInsights), - stateExtender.buildDefinition(inventoryGroupsList), - stateExtender.buildDefinition(inventoryRootGroupsList), - stateExtender.buildDefinition(inventoryGroupsAdd), - stateExtender.buildDefinition(rootNestedGroupsAdd), - stateExtender.buildDefinition(inventoryRootGroupsAdd), - stateExtender.buildDefinition(inventoryGroupsEdit), - stateExtender.buildDefinition(inventoryRootGroupsEdit), - stateExtender.buildDefinition(groupNestedGroupsRoute), - stateExtender.buildDefinition(rootGroupNestedGroupsRoute), - stateExtender.buildDefinition(nestedHostsRoute), - stateExtender.buildDefinition(rootGroupNestedHostsRoute), - stateExtender.buildDefinition(inventoryHosts), - stateExtender.buildDefinition(smartInventoryHosts), - stateExtender.buildDefinition(inventoryHostsAdd), - stateExtender.buildDefinition(inventoryHostsEdit), - stateExtender.buildDefinition(smartInventoryHostsEdit), - stateExtender.buildDefinition(hostNestedGroupsRoute), - stateExtender.buildDefinition(inventorySourceListRoute), - stateExtender.buildDefinition(inventorySourceAddRoute), - stateExtender.buildDefinition(inventorySourceEditRoute), - stateExtender.buildDefinition(inventorySourceEditNotificationsRoute), - stateExtender.buildDefinition(inventoryCompletedJobsRoute), - stateExtender.buildDefinition(smartInventoryCompletedJobsRoute), - stateExtender.buildDefinition(addSourceCredential), - stateExtender.buildDefinition(addSourceInventoryScript), - stateExtender.buildDefinition(editSourceCredential), - stateExtender.buildDefinition(editSourceInventoryScript), - stateExtender.buildDefinition(addSourceProject), - stateExtender.buildDefinition(editSourceProject), - stateExtender.buildDefinition(groupNestedGroupsAssociateRoute), - stateExtender.buildDefinition(rootGroupNestedGroupsAssociateRoute), - stateExtender.buildDefinition(hostNestedGroupsAssociateRoute), - stateExtender.buildDefinition(nestedHostsAssociateRoute), - stateExtender.buildDefinition(rootGroupNestedHostsAssociateRoute), - stateExtender.buildDefinition(nestedGroupsAdd), - stateExtender.buildDefinition(nestedHostsAddRoute), - stateExtender.buildDefinition(rootNestedHostsAdd), - stateExtender.buildDefinition(relatedHostCompletedJobs) - ]) - }; - }); - - } - - $stateProvider.state({ - name: 'inventories.**', - url: '/inventories', - reloadOnSearch: true, - lazyLoad: () => generateInventoryStates() - }); - } - ]); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/groups-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/groups-add.controller.js deleted file mode 100644 index 80a1d917b7..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/groups-add.controller.js +++ /dev/null @@ -1,62 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$state', '$stateParams', '$scope', 'GroupForm', - 'ParseTypeChange', 'GenerateForm', 'inventoryData', 'GroupsService', - 'GetChoices', 'GetBasePath', 'CreateSelect2', - 'rbacUiControlService', 'ToJSON', - function($state, $stateParams, $scope, GroupForm, ParseTypeChange, - GenerateForm, inventoryData, GroupsService, GetChoices, - GetBasePath, CreateSelect2, rbacUiControlService, - ToJSON) { - - let form = GroupForm; - init(); - - function init() { - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/groups") - .then(function(canAdd) { - $scope.canAdd = canAdd; - }); - $scope.parseType = 'yaml'; - $scope.envParseType = 'yaml'; - ParseTypeChange({ - scope: $scope, - field_id: 'group_group_variables', - variable: 'group_variables', - }); - } - - $scope.formCancel = function() { - $state.go('^'); - }; - - $scope.formSave = function() { - var json_data; - json_data = ToJSON($scope.parseType, $scope.group_variables, true); - - var group = { - variables: json_data, - name: $scope.name, - description: $scope.description, - inventory: inventoryData.id - }; - - GroupsService.post(group).then(res => { - if ($stateParams.group_id && _.has(res, 'data')) { - return GroupsService.associateGroup(res.data, $stateParams.group_id) - .then(() => $state.go('^', null, { reload: true })); - } else if(_.has(res, 'data.id')){ - $state.go('^.edit', { group_id: res.data.id }, { reload: true }); - } - }); - - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js deleted file mode 100644 index 7f9e58ff9f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js +++ /dev/null @@ -1,22 +0,0 @@ -import { N_ } from '../../../../../i18n'; - -export default { - name: "inventories.edit.groups.add", - url: "/add", - ncyBreadcrumb: { - parent: "inventories.edit.groups", - label: N_("CREATE GROUP") - }, - views: { - 'groupForm@inventories': { - templateProvider: function(GenerateForm, GroupForm) { - let form = GroupForm; - return GenerateForm.buildHTML(form, { - mode: 'add', - related: false - }); - }, - controller: 'GroupAddController' - } - }, -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/main.js deleted file mode 100644 index 8de2bc98de..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './groups-add.controller'; - -export default -angular.module('groupAdd', []) - .controller('GroupAddController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/groups-edit.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/groups-edit.controller.js deleted file mode 100644 index a187043159..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/groups-edit.controller.js +++ /dev/null @@ -1,61 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$state', '$stateParams', '$scope', 'ParseVariableString', 'rbacUiControlService', 'ToJSON', - 'ParseTypeChange', 'GroupsService', 'GetChoices', 'GetBasePath', 'CreateSelect2', 'groupData', '$rootScope', - function($state, $stateParams, $scope, ParseVariableString, rbacUiControlService, ToJSON, - ParseTypeChange, GroupsService, GetChoices, GetBasePath, CreateSelect2, groupData, $rootScope) { - - init(); - - function init() { - rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/groups") - .then(function(canAdd) { - $scope.canAdd = canAdd; - }); - - $scope = angular.extend($scope, groupData); - - $rootScope.breadcrumb.group_name = groupData.name; - - $scope.$watch('summary_fields.user_capabilities.edit', function(val) { - $scope.canAdd = val; - }); - - // init codemirror(s) - $scope.group_variables = $scope.variables === null || $scope.variables === '' ? '---' : ParseVariableString($scope.variables); - $scope.parseType = 'yaml'; - $scope.envParseType = 'yaml'; - - - ParseTypeChange({ - scope: $scope, - field_id: 'group_group_variables', - variable: 'group_variables', - readOnly: !$scope.summary_fields.user_capabilities.edit - }); - } - - $scope.formCancel = function() { - $state.go('^'); - }; - - $scope.formSave = function() { - var json_data; - json_data = ToJSON($scope.parseType, $scope.group_variables, true); - // group fields - var group = { - variables: json_data, - name: $scope.name, - description: $scope.description, - inventory: $scope.inventory, - id: groupData.id - }; - GroupsService.put(group).then(() => $state.go($state.current, null, { reload: true })); - }; - - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/groups-edit.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/groups-edit.route.js deleted file mode 100644 index 6d1a670168..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/groups-edit.route.js +++ /dev/null @@ -1,13 +0,0 @@ -export default { - name: "inventories.edit.groups.edit", - url: "/edit/:group_id", - ncyBreadcrumb: { - parent: "inventories.edit.groups", - label: "{{breadcrumb.group_name}}" - }, - resolve: { - groupData: ['$stateParams', 'GroupsService', function($stateParams, GroupsService) { - return GroupsService.get({ id: $stateParams.group_id }).then(response => response.data.results[0]); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/main.js deleted file mode 100644 index 0c52e2d6b9..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/edit/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './groups-edit.controller'; - -export default -angular.module('groupEdit', []) - .controller('GroupEditController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/groups.form.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/groups.form.js deleted file mode 100644 index 74448958b0..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/groups.form.js +++ /dev/null @@ -1,103 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Groups - * @description This form is for adding/editing a Group on the inventory page -*/ - -export default ['i18n', -function(i18n){ - return { - addTitle: i18n._('CREATE GROUP'), - editTitle: '{{ name }}', - showTitle: true, - name: 'group', - basePath: 'groups', - parent: 'inventories.edit.groups', - // the parent node this generated state definition tree expects to attach to - stateTree: 'inventories', - // form generator inspects the current state name to determine whether or not to set an active (.is-selected) class on a form tab - // this setting is optional on most forms, except where the form's edit state name is not parentStateName.edit - activeEditState: 'inventories.edit.groups.edit', - detailsClick: "$state.go('inventories.edit.groups.edit')", - well: false, - tabs: true, - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - tab: 'properties' - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)', - tab: 'properties' - }, - group_variables: { - realName: 'variables', - label: i18n._('Variables'), - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - dataTitle: i18n._('Group Variables'), - dataPlacement: 'right', - parseTypeName: 'parseType', - awPopOver: "

Variables defined here apply to all child groups and hosts.

" + - "

Enter variables using either JSON or YAML syntax. Use the " + - "radio button to toggle between the two.

" + - "JSON:
\n" + - "
{
  \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - "YAML:
\n" + - "
---
somevar: somevalue
password: magic
\n" + - '

View JSON examples at www.json.org

' + - '

View YAML examples at docs.ansible.com

', - dataContainer: 'body', - tab: 'properties' - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(group_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(group_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - related: { - nested_groups: { - name: 'nested_groups', - awToolTip: i18n._('Please save before defining groups.'), - dataPlacement: 'top', - ngClick: "$state.go('inventories.edit.groups.edit.nested_groups')", - title: i18n._('Groups'), - iterator: 'nested_group' - }, - nested_hosts: { - name: 'nested_hosts', - awToolTip: i18n._('Please save before defining hosts.'), - dataPlacement: 'top', - ngClick: "$state.go('inventories.edit.groups.edit.nested_hosts')", - include: "NestedHostsListDefinition", - title: i18n._('Hosts'), - iterator: 'nested_hosts' - }, - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/groups.list.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/groups.list.js deleted file mode 100644 index ffd048de78..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/groups.list.js +++ /dev/null @@ -1,113 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['i18n', function(i18n) { - return { - name: 'groups', - iterator: 'group', - editTitle: '{{ inventory.name }}', - well: true, - wellOverride: true, - index: false, - hover: true, - multiSelect: true, - trackBy: 'group.id', - basePath: 'api/v2/inventories/{{$stateParams.inventory_id}}/groups/', - layoutClass: 'List-staticColumnLayout--groups', - actionHolderClass: 'List-actionHolder List-actionHolder--rootGroups', - fields: { - name: { - label: i18n._('Groups'), - key: true, - uiSref: "inventories.edit.groups.edit({group_id:group.id})", - columnClass: 'col-lg-10 col-md-10 col-sm-10 col-xs-10', - } - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshGroups()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - groupsToggle: { - mode: 'all', - type: 'toggle', - buttons: [ - { - text: i18n._('ALL GROUPS'), - ngClick: "$state.go('inventories.edit.groups')", - ngClass: "{'btn-primary': $state.includes('inventories.edit.groups'), 'Button-primary--hollow': $state.includes('inventories.edit.rootGroups')}" - }, - { - text: i18n._('ROOT GROUPS'), - ngClick: "$state.go('inventories.edit.rootGroups')", - ngClass: "{'btn-primary': $state.includes('inventories.edit.rootGroups'), 'Button-primary--hollow': $state.includes('inventories.edit.groups')}" - } - ] - }, - launch: { - mode: 'all', - ngDisabled: '!groupsSelected', - ngClick: 'setAdhocPattern()', - awToolTip: i18n._("Select an inventory source by clicking the check box beside it. The inventory source can be a single group or a selection of multiple groups."), - dataPlacement: 'top', - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('RUN COMMANDS'), - showTipWhenDisabled: true, - tooltipInnerClass: "Tooltip-wide", - ngShow: 'canAdhoc' - // TODO: set up a tip watcher and change text based on when - // things are selected/not selected. This is started and - // commented out in the inventory controller within the watchers. - // awToolTip: "{{ adhocButtonTipContents }}", - // dataTipWatch: "adhocButtonTipContents" - }, - create: { - mode: 'all', - ngClick: "createGroup()", - awToolTip: i18n._("Create a new group"), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd', - dataPlacement: "top", - } - }, - - fieldActions: { - - columnClass: 'col-lg-2 col-md-2 col-sm-2 col-xs-2 text-right', - - edit: { - //label: 'Edit', - mode: 'all', - ngClick: "editGroup(group.id)", - awToolTip: i18n._('Edit group'), - dataPlacement: "top", - ngShow: "group.summary_fields.user_capabilities.edit" - }, - view: { - //label: 'Edit', - mode: 'all', - ngClick: "editGroup(group.id)", - awToolTip: i18n._('View group'), - dataPlacement: "top", - ngShow: "!group.summary_fields.user_capabilities.edit" - }, - "delete": { - //label: 'Delete', - mode: 'all', - ngClick: "deleteGroup(group)", - awToolTip: i18n._('Delete group'), - dataPlacement: "top", - ngShow: "group.summary_fields.user_capabilities.delete" - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.controller.js deleted file mode 100644 index b0e451aed0..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.controller.js +++ /dev/null @@ -1,216 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - export default - ['$scope', '$state', '$stateParams', 'listDefinition', 'InventoryUpdate', - 'GroupsService', 'CancelSourceUpdate', 'Dataset', 'inventoryData', 'canAdd', - 'InventoryHostsStrings', '$transitions', 'GetBasePath', 'Rest', - function($scope, $state, $stateParams, listDefinition, InventoryUpdate, - GroupsService, CancelSourceUpdate, Dataset, inventoryData, canAdd, - InventoryHostsStrings, $transitions, GetBasePath, Rest){ - - let list = listDefinition; - - init(); - - function init(){ - $scope.inventory_id = $stateParams.inventory_id; - $scope.canAdhoc = inventoryData.summary_fields.user_capabilities.adhoc; - $scope.canAdd = canAdd; - - $scope.strings = { - deleteModal: {}, - close: InventoryHostsStrings.get('CLOSE') - }; - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - if($state.current.name === "inventories.edit.groups") { - $scope.rowBeingEdited = $state.params.group_id; - $scope.listBeingEdited = "groups"; - } - - $scope.inventory_id = $stateParams.inventory_id; - - $scope.$watchCollection(list.name, function(){ - _.forEach($scope[list.name], processRow); - }); - - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - if(!$scope.groupsSelected) { - $scope.groupsSelected = []; - } - $scope.groupsSelected.push(item); - } else { - _.remove($scope.groupsSelected, { id: item.id }); - if($scope.groupsSelected.length === 0) { - $scope.groupsSelected = null; - } - } - }); - - } - - function processRow(group){ - if (group === undefined || group === null) { - group = {}; - } - - angular.forEach($scope.groupsSelected, function(selectedGroup){ - if(selectedGroup.id === group.id) { - group.isSelected = true; - } - }); - } - - $scope.createGroup = function(){ - if ($state.includes('inventories.edit.groups')) { - $state.go('inventories.edit.groups.add'); - } else if ($state.includes('inventories.edit.rootGroups')) { - $state.go('inventories.edit.rootGroups.add'); - } - }; - $scope.editGroup = function(id){ - if ($state.includes('inventories.edit.groups')) { - $state.go('inventories.edit.groups.edit', {group_id: id}); - } else if ($state.includes('inventories.edit.rootGroups')) { - $state.go('inventories.edit.rootGroups.edit', {group_id: id}); - } - }; - $scope.goToGroupGroups = function(id){ - $state.go('inventories.edit.groups.edit.nested_groups', {group_id: id}); - }; - $scope.deleteGroup = function(group){ - const promises = []; - - Rest.setUrl(group.related.hosts); - promises.push(Rest.get()); - - Rest.setUrl(group.related.children); - promises.push(Rest.get()); - - Promise.all(promises) - .then(([hostResponse, groupResponse]) => { - $scope.toDelete = {}; - $scope.strings.deleteModal = {}; - $scope.toDelete.hostCount = _.get(hostResponse, ['data', 'count'], 0); - $scope.toDelete.groupCount = _.get(groupResponse, ['data', 'count'], 0); - angular.extend($scope.toDelete, group); - - if($scope.toDelete.groupCount === 0 && $scope.toDelete.hostCount === 0) { - // This group doesn't have any child groups or hosts - the user is just trying to delete - // the group - $scope.deleteOption = "delete"; - } - else { - $scope.strings.deleteModal.group = InventoryHostsStrings.get('deletegroup.GROUP', $scope.toDelete.groupCount); - $scope.strings.deleteModal.host = InventoryHostsStrings.get('deletegroup.HOST', $scope.toDelete.hostCount); - - if($scope.toDelete.groupCount === 0 || $scope.toDelete.groupCount === 0) { - if($scope.toDelete.groupCount === 0) { - $scope.strings.deleteModal.deleteGroupsHosts = InventoryHostsStrings.get('deletegroup.DELETE_HOST', $scope.toDelete.hostCount); - $scope.strings.deleteModal.promoteGroupsHosts = InventoryHostsStrings.get('deletegroup.PROMOTE_HOST', $scope.toDelete.hostCount); - } - else if($scope.toDelete.hostCount === 0) { - $scope.strings.deleteModal.deleteGroupsHosts = InventoryHostsStrings.get('deletegroup.DELETE_GROUP', $scope.toDelete.groupCount); - $scope.strings.deleteModal.promoteGroupsHosts = InventoryHostsStrings.get('deletegroup.PROMOTE_GROUP', $scope.toDelete.groupCount); - } - } - else { - $scope.strings.deleteModal.deleteGroupsHosts = InventoryHostsStrings.get('deletegroup.DELETE_GROUPS_AND_HOSTS', {groups: $scope.toDelete.groupCount, hosts: $scope.toDelete.hostCount}); - $scope.strings.deleteModal.promoteGroupsHosts = InventoryHostsStrings.get('deletegroup.PROMOTE_GROUPS_AND_HOSTS', {groups: $scope.toDelete.groupCount, hosts: $scope.toDelete.hostCount}); - } - } - - $('#group-delete-modal').modal('show'); - }); - - - }; - $scope.confirmDelete = function(){ - let reloadListStateParams = null; - - if($scope.groups.length === 1 && $state.params.group_search && _.has($state, 'params.group_search.page') && $state.params.group_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.group_search.page = (parseInt(reloadListStateParams.group_search.page)-1).toString(); - } - - switch($scope.deleteOption){ - case 'promote': - GroupsService.promote($scope.toDelete.id, $stateParams.inventory_id) - .then(() => { - if (parseInt($state.params.group_id) === $scope.toDelete.id) { - $state.go("^", reloadListStateParams, {reload: true}); - } else { - $state.go($state.current, reloadListStateParams, {reload: true}); - } - setTimeout(function(){ - $('#group-delete-modal').modal('hide'); - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - }, 1000); - }); - break; - default: - GroupsService.delete($scope.toDelete.id).then(() => { - if (parseInt($state.params.group_id) === $scope.toDelete.id) { - $state.go("^", reloadListStateParams, {reload: true}); - } else { - $state.go($state.current, reloadListStateParams, {reload: true}); - } - setTimeout(function(){ - $('#group-delete-modal').modal('hide'); - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - }, 1000); - }); - } - }; - $scope.updateGroup = function(group) { - GroupsService.getInventorySource({group: group.id}).then(res =>InventoryUpdate({ - scope: $scope, - group_id: group.id, - url: res.data.results[0].related.update, - group_name: group.name, - group_source: res.data.results[0].source - })); - }; - - $scope.cancelUpdate = function (id) { - CancelSourceUpdate({ scope: $scope, id: id }); - }; - - var cleanUpStateChangeListener = $transitions.onSuccess({}, function(trans) { - if (trans.to().name === "inventories.edit.groups.edit") { - $scope.rowBeingEdited = trans.params('to').group_id; - $scope.listBeingEdited = "groups"; - } - else { - delete $scope.rowBeingEdited; - delete $scope.listBeingEdited; - } - }); - - // Remove the listener when the scope is destroyed to avoid a memory leak - $scope.$on('$destroy', function() { - cleanUpStateChangeListener(); - }); - - $scope.setAdhocPattern = function(){ - var pattern = _($scope.groupsSelected) - .map(function(item){ - return item.name; - }).value().join(':'); - - $state.go('inventories.edit.adhoc', {pattern: pattern}); - }; - - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html b/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html deleted file mode 100644 index 5c9e7cccf7..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html +++ /dev/null @@ -1,56 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js deleted file mode 100644 index 2ad7a90a0a..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js +++ /dev/null @@ -1,73 +0,0 @@ -import { N_ } from '../../../../../i18n'; -import {templateUrl} from '../../../../../shared/template-url/template-url.factory'; - -export default { - name: "inventories.edit.groups", - url: "/groups?{group_search:queryset}", - resolve: { - listDefinition: ['GroupList', (list) => list], - Dataset: ['listDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - inventoryData: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.getInventory($stateParams.inventory_id).then(res => res.data); - }], - canAdd: ['rbacUiControlService', '$state', 'GetBasePath', '$stateParams', function(rbacUiControlService, $state, GetBasePath, $stateParams) { - return rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/groups") - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - }, - params: { - group_search: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash: "" - } - }, - ncyBreadcrumb: { - parent: "inventories.edit", - label: N_("ALL GROUPS") - }, - views: { - 'related': { - templateProvider: function(listDefinition, generateList, $templateRequest, $stateParams, GetBasePath) { - let list = _.cloneDeep(listDefinition); - if($stateParams && $stateParams.group) { - list.basePath = GetBasePath('groups') + _.last($stateParams.group) + '/children'; - } - else { - //reaches here if the user is on the root level group - list.basePath = GetBasePath('inventory') + $stateParams.inventory_id + '/groups'; - } - - let html = generateList.build({ - list: list, - mode: 'edit' - }); - // Include the custom group delete modal template - return $templateRequest(templateUrl('inventories-hosts/inventories/related/groups/list/groups-list')).then((template) => { - return html.concat(template); - }); - }, - controller: 'GroupsListController' - } - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/main.js deleted file mode 100644 index 6c030c9869..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/list/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './groups-list.controller'; - -export default - angular.module('groupsList', []) - .controller('GroupsListController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/main.js deleted file mode 100644 index 940bcf5645..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/main.js +++ /dev/null @@ -1,24 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import groupList from './list/main'; -import groupAdd from './add/main'; -import groupEdit from './edit/main'; -import groupFormDefinition from './groups.form'; -import groupListDefinition from './groups.list'; -import nestedGroups from './related/nested-groups/main'; -import nestedHosts from './related/nested-hosts/main'; - -export default - angular.module('group', [ - groupList.name, - groupAdd.name, - groupEdit.name, - nestedGroups.name, - nestedHosts.name - ]) - .factory('GroupForm', groupFormDefinition) - .factory('GroupList', groupListDefinition); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.controller.js deleted file mode 100644 index 25633199bd..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.controller.js +++ /dev/null @@ -1,58 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$state', '$stateParams', '$scope', 'NestedGroupForm', - 'ParseTypeChange', 'GenerateForm', 'inventoryData', 'GroupsService', - 'GetChoices', 'GetBasePath', 'CreateSelect2', - 'rbacUiControlService', 'ToJSON', 'canAdd', - function($state, $stateParams, $scope, NestedGroupForm, ParseTypeChange, - GenerateForm, inventoryData, GroupsService, GetChoices, - GetBasePath, CreateSelect2, rbacUiControlService, - ToJSON, canAdd) { - - let form = NestedGroupForm; - init(); - - function init() { - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - $scope.canAdd = canAdd; - $scope.parseType = 'yaml'; - $scope.envParseType = 'yaml'; - ParseTypeChange({ - scope: $scope, - field_id: 'nested_group_nested_group_variables', - variable: 'nested_group_variables', - }); - } - - $scope.formCancel = function() { - $state.go('^'); - }; - - $scope.formSave = function() { - var json_data; - json_data = ToJSON($scope.parseType, $scope.nested_group_variables, true); - - var group = { - variables: json_data, - name: $scope.name, - description: $scope.description, - inventory: inventoryData.id - }; - - GroupsService.post(group).then(res => { - if ($stateParams.group_id && _.has(res, 'data')) { - return GroupsService.associateGroup(res.data, $stateParams.group_id) - .then(() => $state.go('^', null, { reload: true })); - } else if(_.has(res, 'data.id')){ - $state.go('^.edit', { group_id: res.data.id }, { reload: true }); - } - }); - - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js deleted file mode 100644 index 2aba06a290..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js +++ /dev/null @@ -1,33 +0,0 @@ -import { N_ } from '../../../../../../i18n'; - -export default { - name: "inventories.edit.groups.edit.nested_groups.add", - url: "/add", - ncyBreadcrumb: { - parent: "inventories.edit.groups.edit.nested_groups", - label: N_("CREATE GROUP") - }, - views: { - 'nestedGroupForm@inventories': { - templateProvider: function(GenerateForm, NestedGroupForm) { - let form = NestedGroupForm; - return GenerateForm.buildHTML(form, { - mode: 'add', - related: false - }); - }, - controller: 'NestedGroupsAddController' - } - }, - resolve: { - canAdd: ['rbacUiControlService', '$state', 'GetBasePath', '$stateParams', function(rbacUiControlService, $state, GetBasePath, $stateParams) { - return rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/groups") - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-associate.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-associate.route.js deleted file mode 100644 index 0df6fdc481..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-associate.route.js +++ /dev/null @@ -1,32 +0,0 @@ -export default { - name: 'inventories.edit.groups.edit.nested_groups.associate', - squashSearchUrl: true, - url: '/associate', - ncyBreadcrumb:{ - skip:true - }, - views: { - 'modal@^.^': { - templateProvider: function() { - return ``; - }, - controller: function($scope, $q, GroupsService, $state){ - $scope.associateGroups = function(selectedItems){ - var deferred = $q.defer(); - return $q.all( _.map(selectedItems, (selectedItem) => GroupsService.associateGroup({id: selectedItem.id}, $state.params.group_id)) ) - .then( () =>{ - deferred.resolve(); - }, (error) => { - deferred.reject(error); - }); - }; - } - } - }, - onExit: function($state) { - if ($state.transition) { - $('#associate-groups-modal').modal('hide'); - $('body').removeClass('modal-open'); - } - }, -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html deleted file mode 100644 index ce1e432932..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-list.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-list.controller.js deleted file mode 100644 index aa87266985..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-list.controller.js +++ /dev/null @@ -1,138 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - export default - ['$scope', '$rootScope', '$state', '$stateParams', 'NestedGroupListDefinition', 'InventoryUpdate', - 'GroupsService', 'CancelSourceUpdate', 'rbacUiControlService', 'GetBasePath', - 'Dataset', 'Find', 'QuerySet', 'inventoryData', 'canAdd', 'groupData', 'ProcessErrors', - '$transitions', - function($scope, $rootScope, $state, $stateParams, NestedGroupListDefinition, InventoryUpdate, - GroupsService, CancelSourceUpdate, rbacUiControlService, GetBasePath, - Dataset, Find, qs, inventoryData, canAdd, groupData, ProcessErrors, - $transitions){ - - let list = NestedGroupListDefinition; - - init(); - - function init(){ - $scope.inventory_id = $stateParams.inventory_id; - $scope.canAdhoc = inventoryData.summary_fields.user_capabilities.adhoc; - $scope.canAdd = canAdd; - $scope.disassociateFrom = groupData; - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - if($state.current.name === "inventories.edit.groups.edit.nested_groups.edit") { - $scope.rowBeingEdited = $state.params.group_id; - $scope.listBeingEdited = "groups"; - } - - $scope.inventory_id = $stateParams.inventory_id; - - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - if(!$scope.groupsSelected) { - $scope.groupsSelected = []; - } - $scope.groupsSelected.push(item); - } else { - _.remove($scope.groupsSelected, { id: item.id }); - if($scope.groupsSelected.length === 0) { - $scope.groupsSelected = null; - } - } - }); - - } - - $scope.disassociateGroup = function(group){ - $scope.toDisassociate = {}; - angular.extend($scope.toDisassociate, group); - $('#group-disassociate-modal').modal('show'); - }; - - $scope.confirmDisassociate = function(){ - - // Bind an even listener for the modal closing. Trying to $state.go() before the modal closes - // will mean that these two things are running async and the modal may not finish closing before - // the state finishes transitioning. - $('#group-disassociate-modal').off('hidden.bs.modal').on('hidden.bs.modal', function () { - // Remove the event handler so that we don't end up with multiple bindings - $('#group-disassociate-modal').off('hidden.bs.modal'); - - let reloadListStateParams = null; - - if($scope.nested_groups.length === 1 && $state.params.nested_group_search && !_.isEmpty($state.params.nested_group_search.page) && $state.params.nested_group_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.nested_group_search.page = (parseInt(reloadListStateParams.nested_group_search.page)-1).toString(); - } - - // Reload the inventory manage page and show that the group has been removed - $state.go('.', reloadListStateParams, {reload: true}); - }); - - let closeModal = function(){ - $('#group-disassociate-modal').modal('hide'); - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - }; - - GroupsService.disassociateGroup($scope.toDisassociate.id, $scope.disassociateFrom.id) - .then(() => { - closeModal(); - }).catch((error) => { - closeModal(); - ProcessErrors(null, error.data, error.status, null, { - hdr: 'Error!', - msg: 'Failed to disassociate group from parent group: POST returned status' + - error.status - }); - }); - }; - - $scope.editGroup = function(id){ - if ($state.includes('inventories.edit.groups')) { - $state.go('inventories.edit.groups.edit', {group_id: id}); - } else if ($state.includes('inventories.edit.rootGroups')) { - $state.go('inventories.edit.rootGroups.edit', {group_id: id}); - } - }; - - $scope.goToGroupGroups = function(id){ - $state.go('inventories.edit.groups.edit.nested_groups', {group_id: id}); - }; - - var cleanUpStateChangeListener = $transitions.onSuccess({}, function(trans) { - if (trans.to().name === "inventories.edit.groups.edit.nested_groups.edit") { - $scope.rowBeingEdited = trans.params('to').group_id; - $scope.listBeingEdited = "groups"; - } - else { - delete $scope.rowBeingEdited; - delete $scope.listBeingEdited; - } - }); - - // Remove the listener when the scope is destroyed to avoid a memory leak - $scope.$on('$destroy', function() { - cleanUpStateChangeListener(); - }); - - $scope.setAdhocPattern = function(){ - var pattern = _($scope.groupsSelected) - .map(function(item){ - return item.name; - }).value().join(':'); - - $state.go('inventories.edit.adhoc', {pattern: pattern}); - }; - - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js deleted file mode 100644 index adc2cab8ab..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js +++ /dev/null @@ -1,94 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Groups - * @description This form is for adding/editing a Group on the inventory page -*/ - -export default ['i18n', -function(i18n){ - return { - addTitle: i18n._('CREATE GROUP'), - editTitle: '{{ name }}', - showTitle: true, - name: 'nested_group', - iterator: "nested_group", - basePath: 'groups', - parent: 'inventories.edit.groups.edit.nested_groups', - // the parent node this generated state definition tree expects to attach to - stateTree: 'inventories', - // form generator inspects the current state name to determine whether or not to set an active (.is-selected) class on a form tab - // this setting is optional on most forms, except where the form's edit state name is not parentStateName.edit - activeEditState: 'inventories.edit.groups.edit.nested_groups.edit', - detailsClick: "$state.go('inventories.edit.groups.edit.nested_groups.edit')", - well: false, - tabs: true, - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - tab: 'properties' - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)', - tab: 'properties' - }, - nested_group_variables: { - realName: 'variables', - label: i18n._('Variables'), - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - dataTitle: i18n._('Group Variables'), - dataPlacement: 'right', - parseTypeName: 'parseType', - awPopOver: "

Variables defined here apply to all child groups and hosts.

" + - "

Enter variables using either JSON or YAML syntax. Use the " + - "radio button to toggle between the two.

" + - "JSON:
\n" + - "
{
  \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - "YAML:
\n" + - "
---
somevar: somevalue
password: magic
\n" + - '

View JSON examples at www.json.org

' + - '

View YAML examples at docs.ansible.com

', - dataContainer: 'body', - tab: 'properties' - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(group_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(group_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - related: { - nested_groups: { - name: 'related_groups', - ngClick: "$state.go('inventories.edit.groups.edit.related_groups')", - title: i18n._('Groups'), - iterator: 'related_group' - }, - - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js deleted file mode 100644 index 8041662dc3..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js +++ /dev/null @@ -1,106 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['i18n', function(i18n) { - return { - name: 'nested_groups', - iterator: 'nested_group', - editTitle: '{{ inventory.name }}', - well: true, - wellOverride: true, - index: false, - hover: true, - multiSelect: true, - trackBy: 'nested_group.id', - basePath: 'api/v2/groups/{{$stateParams.group_id}}/children/', - layoutClass: 'List-staticColumnLayout--groups', - fields: { - name: { - label: i18n._('Groups'), - key: true, - uiSref: "inventories.edit.groups.edit({group_id:nested_group.id})", - columnClass: 'col-lg-6 col-md-6 col-sm-6 col-xs-6', - } - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshGroups()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - launch: { - mode: 'all', - ngDisabled: '!groupsSelected', - ngClick: 'setAdhocPattern()', - awToolTip: i18n._("Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups."), - dataPlacement: 'top', - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('RUN COMMANDS'), - showTipWhenDisabled: true, - tooltipInnerClass: "Tooltip-wide", - ngShow: 'canAdhoc' - // TODO: set up a tip watcher and change text based on when - // things are selected/not selected. This is started and - // commented out in the inventory controller within the watchers. - // awToolTip: "{{ adhocButtonTipContents }}", - // dataTipWatch: "adhocButtonTipContents" - }, - add: { - mode: 'all', - type: 'buttonDropdown', - awToolTip: i18n._("Add a group"), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd', - dataPlacement: "top", - options: [ - { - optionContent: i18n._('Existing Group'), - optionSref: '.associate', - ngShow: 'canAdd' - }, - { - optionContent: i18n._('New Group'), - optionSref: '.add', - ngShow: 'canAdd' - } - ], - } - }, - - fieldActions: { - - columnClass: 'col-lg-6 col-md-6 col-sm-6 col-xs-6 text-right', - - edit: { - mode: 'all', - ngClick: "editGroup(nested_group.id)", - awToolTip: i18n._('Edit group'), - dataPlacement: "top", - ngShow: "nested_group.summary_fields.user_capabilities.edit" - }, - view: { - mode: 'all', - ngClick: "editGroup(nested_group.id)", - awToolTip: i18n._('View group'), - dataPlacement: "top", - ngShow: "!nested_group.summary_fields.user_capabilities.edit" - }, - "delete": { - mode: 'all', - ngClick: "disassociateGroup(nested_group)", - awToolTip: i18n._('Disassociate group'), - iconClass: 'fa fa-times', - dataPlacement: "top", - ngShow: "nested_group.summary_fields.user_capabilities.delete" - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js deleted file mode 100644 index 66495716ac..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js +++ /dev/null @@ -1,80 +0,0 @@ -import {templateUrl} from '../../../../../../shared/template-url/template-url.factory'; -import { N_ } from '../../../../../../i18n'; - -export default { - name: 'inventories.edit.groups.edit.nested_groups', - url: "/nested_groups?{nested_group_search:queryset}", - params: { - nested_group_search: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash: "" - } - }, - ncyBreadcrumb: { - parent: "inventories.edit.groups.edit", - label: N_("ASSOCIATED GROUPS") - }, - views: { - // 'related@inventories.edit.groups.edit': { - 'related': { - templateProvider: function(NestedGroupListDefinition, generateList, $templateRequest) { - let list = _.cloneDeep(NestedGroupListDefinition); - - let html = generateList.build({ - list: list, - mode: 'edit' - }); - - return $templateRequest(templateUrl('inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate')).then((template) => { - return html.concat(template); - }); - }, - controller: 'NestedGroupsListController' - } - }, - resolve: { - Dataset: ['NestedGroupListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - if($stateParams.group_id){ - path = GetBasePath('groups') + $stateParams.group_id + '/children'; - } - else if($stateParams.host_id){ - path = GetBasePath('hosts') + $stateParams.host_id + '/all_groups'; - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - host: ['$stateParams', 'HostsService', function($stateParams, HostsService) { - if($stateParams.host_id){ - return HostsService.get({ id: $stateParams.host_id }).then(function(res) { - return res.data.results[0]; - }); - } - }], - inventoryData: ['InventoriesService', '$stateParams', 'host', function(InventoriesService, $stateParams, host) { - var id = ($stateParams.inventory_id) ? $stateParams.inventory_id : host.summary_fields.inventory.id; - return InventoriesService.getInventory(id).then(res => res.data); - }], - canAdd: ['rbacUiControlService', '$state', 'GetBasePath', '$stateParams', function(rbacUiControlService, $state, GetBasePath, $stateParams) { - return rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/groups") - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/main.js deleted file mode 100644 index 445854d120..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-groups/main.js +++ /dev/null @@ -1,17 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import nestedGroupListDefinition from './group-nested-groups.list'; -import controller from './group-nested-groups-list.controller'; -import addController from './group-nested-groups-add.controller'; -import NestedGroupForm from './group-nested-groups.form'; - -export default - angular.module('nestedGroups', []) - .factory('NestedGroupForm', NestedGroupForm) - .factory('NestedGroupListDefinition', nestedGroupListDefinition) - .controller('NestedGroupsListController', controller) - .controller('NestedGroupsAddController', addController); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.controller.js deleted file mode 100644 index 85019412e2..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.controller.js +++ /dev/null @@ -1,49 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$state', '$stateParams', '$scope', 'RelatedHostsFormDefinition', 'ParseTypeChange', - 'GenerateForm', 'HostsService', 'ToJSON', 'canAdd', 'GroupsService', - function($state, $stateParams, $scope, RelatedHostsFormDefinition, ParseTypeChange, - GenerateForm, HostsService, ToJSON, canAdd, GroupsService) { - - init(); - - function init() { - $scope.canAdd = canAdd; - $scope.parseType = 'yaml'; - $scope.host = { enabled: true }; - // apply form definition's default field values - GenerateForm.applyDefaults(RelatedHostsFormDefinition, $scope); - - ParseTypeChange({ - scope: $scope, - field_id: 'host_host_variables', - variable: 'host_variables', - parse_variable: 'parseType' - }); - } - $scope.formCancel = function() { - $state.go('^'); - }; - $scope.toggleHostEnabled = function() { - $scope.host.enabled = !$scope.host.enabled; - }; - $scope.formSave = function(){ - var json_data = ToJSON($scope.parseType, $scope.host_variables, true), - params = { - variables: json_data,// $scope.variables === '---' || $scope.variables === '{}' ? null : $scope.variables, - name: $scope.name, - description: $scope.description, - enabled: $scope.host.enabled, - inventory: $stateParams.inventory_id - }; - HostsService.post(params).then(function(res) { - return GroupsService.associateHost(res.data, $stateParams.group_id) - .then(() => $state.go('^', null, { reload: true })); - }); - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js deleted file mode 100644 index 438aa4a5f2..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js +++ /dev/null @@ -1,33 +0,0 @@ -import { N_ } from '../../../../../../i18n'; - -export default { - name: "inventories.edit.groups.edit.nested_hosts.add", - url: "/add", - ncyBreadcrumb: { - parent: "inventories.edit.groups.edit.nested_hosts", - label: N_("CREATE HOST") - }, - views: { - 'hostForm@inventories': { - templateProvider: function(GenerateForm, RelatedHostsFormDefinition, NestedHostsFormDefinition, $stateParams) { - let form = ($stateParams.group_id) ? NestedHostsFormDefinition : RelatedHostsFormDefinition; - return GenerateForm.buildHTML(form, { - mode: 'add', - related: false - }); - }, - controller: 'NestedHostsAddController' - } - }, - resolve: { - canAdd: ['rbacUiControlService', 'GetBasePath', '$stateParams', function(rbacUiControlService, GetBasePath, $stateParams) { - return rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/hosts") - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-associate.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-associate.route.js deleted file mode 100644 index 220a5a4285..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-associate.route.js +++ /dev/null @@ -1,32 +0,0 @@ -export default { - name: 'inventories.edit.groups.edit.nested_hosts.associate', - squashSearchUrl: true, - url: '/associate', - ncyBreadcrumb:{ - skip:true - }, - views: { - 'modal@^.^': { - templateProvider: function() { - return ``; - }, - controller: function($scope, $q, GroupsService, $state){ - $scope.associateHosts = function(selectedItems){ - var deferred = $q.defer(); - return $q.all( _.map(selectedItems, (selectedItem) => GroupsService.associateHost({id: selectedItem.id}, $state.params.group_id)) ) - .then( () =>{ - deferred.resolve(); - }, (error) => { - deferred.reject(error); - }); - }; - } - } - }, - onExit: function($state) { - if ($state.transition) { - $('#associate-groups-modal').modal('hide'); - $('body').removeClass('modal-open'); - } - }, -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html deleted file mode 100644 index 0ba72e03e0..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-list.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-list.controller.js deleted file mode 100644 index 07fe46ea95..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-list.controller.js +++ /dev/null @@ -1,169 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', 'NestedHostsListDefinition', '$rootScope', 'GetBasePath', - 'rbacUiControlService', 'Dataset', '$state', '$filter', 'Prompt', 'Wait', - 'HostsService', 'SetStatus', 'canAdd', 'GroupsService', 'ProcessErrors', 'groupData', 'inventoryData', 'InventoryHostsStrings', - '$transitions', - function($scope, NestedHostsListDefinition, $rootScope, GetBasePath, - rbacUiControlService, Dataset, $state, $filter, Prompt, Wait, - HostsService, SetStatus, canAdd, GroupsService, ProcessErrors, groupData, inventoryData, InventoryHostsStrings, - $transitions) { - - let list = NestedHostsListDefinition; - - init(); - - function init(){ - $scope.canAdd = canAdd; - $scope.enableSmartInventoryButton = false; - $scope.disassociateFrom = groupData; - $scope.smartInventoryButtonTooltip = InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $scope.inventory_obj = inventoryData; - - $rootScope.flashMessage = null; - - $scope.$watchCollection(list.name, function() { - $scope[list.name] = _.map($scope.nested_hosts, function(value) { - angular.forEach(value.summary_fields.groups.results, function(directParentGroup) { - if(directParentGroup.id === parseInt($state.params.group_id)) { - value.can_disassociate = true; - } - }); - angular.forEach($scope.hostsSelected, function(selectedHost){ - if(selectedHost.id === value.id) { - value.isSelected = true; - } - }); - return value; - }); - setJobStatus(); - }); - - $transitions.onSuccess({}, function(trans) { - if(trans.params('to') && trans.params('to').host_search) { - let hasMoreThanDefaultKeys = false; - angular.forEach(trans.params('to').host_search, function(value, key) { - if(key !== 'order_by' && key !== 'page_size' && key !== 'page') { - hasMoreThanDefaultKeys = true; - } - }); - $scope.enableSmartInventoryButton = hasMoreThanDefaultKeys ? true : false; - $scope.smartInventoryButtonTooltip = hasMoreThanDefaultKeys ? InventoryHostsStrings.get('smartinventorybutton.ENABLED_INSTRUCTIONS') : InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - } - else { - $scope.enableSmartInventoryButton = false; - $scope.smartInventoryButtonTooltip = InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - } - }); - - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - if(!$scope.hostsSelected) { - $scope.hostsSelected = []; - } - $scope.hostsSelected.push(item); - } else { - _.remove($scope.hostsSelected, { id: item.id }); - if($scope.hostsSelected.length === 0) { - $scope.hostsSelected = null; - } - } - }); - - } - - function setJobStatus(){ - _.forEach($scope.nested_hosts, function(value) { - SetStatus({ - scope: $scope, - host: value - }); - }); - } - - $scope.associateHost = function(){ - $state.go('inventories.edit.groups.edit.nested_hosts.associate'); - }; - $scope.editHost = function(id){ - $state.go('inventories.edit.hosts.edit', {host_id: id}); - }; - $scope.disassociateHost = function(host){ - $scope.toDisassociate = {}; - angular.extend($scope.toDisassociate, host); - $('#host-disassociate-modal').modal('show'); - }; - - $scope.confirmDisassociate = function(){ - - // Bind an even listener for the modal closing. Trying to $state.go() before the modal closes - // will mean that these two things are running async and the modal may not finish closing before - // the state finishes transitioning. - $('#host-disassociate-modal').off('hidden.bs.modal').on('hidden.bs.modal', function () { - // Remove the event handler so that we don't end up with multiple bindings - $('#host-disassociate-modal').off('hidden.bs.modal'); - - let reloadListStateParams = null; - - if($scope.nested_hosts.length === 1 && $state.params.nested_host_search && !_.isEmpty($state.params.nested_host_search.page) && $state.params.nested_host_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.nested_host_search.page = (parseInt(reloadListStateParams.nested_host_search.page)-1).toString(); - } - - // Reload the inventory manage page and show that the group has been removed - $state.go('.', reloadListStateParams, {reload: true}); - }); - - let closeModal = function(){ - $('#host-disassociate-modal').modal('hide'); - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - }; - - GroupsService.disassociateHost($scope.toDisassociate.id, $scope.disassociateFrom.id) - .then(() => { - closeModal(); - }).catch((error) => { - closeModal(); - ProcessErrors(null, error.data, error.status, null, { - hdr: 'Error!', - msg: 'Failed to disassociate host from group: POST returned status' + - error.status - }); - }); - }; - - $scope.toggleHost = function(event, host) { - try { - $(event.target).tooltip('hide'); - } catch (e) { - // ignore - } - - host.enabled = !host.enabled; - - HostsService.put(host).then(function(){ - $state.go($state.current, null, {reload: true}); - }); - }; - - $scope.setAdhocPattern = function(){ - var pattern = _($scope.hostsSelected) - .map(function(item){ - return item.name; - }).value().join(':'); - - $state.go('inventories.edit.adhoc', {pattern: pattern}); - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js deleted file mode 100644 index 4f9d8512ab..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js +++ /dev/null @@ -1,118 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Hosts - * @description This form is for adding/editing a host on the inventory page -*/ - -export default ['i18n', -function(i18n) { - return { - - addTitle: i18n._('CREATE HOST'), - editTitle: '{{ host.name }}', - name: 'host', - basePath: 'hosts', - well: false, - formLabelSize: 'col-lg-3', - formFieldSize: 'col-lg-9', - iterator: 'host', - activeEditState: 'inventories.edit.groups.edit.nested_hosts.edit', - stateTree: 'inventories.edit.groups.edit.nested_hosts', - headerFields:{ - enabled: { - class: 'Form-header-field', - ngClick: 'toggleHostEnabled(host)', - type: 'toggle', - awToolTip: "

" + - i18n._("Indicates if a host is available and should be included in running jobs.") + - "

" + - i18n._("For hosts that are part of an external" + - " inventory, this may be" + - " reset by the inventory sync process.") + - "

", - dataTitle: i18n._('Host Enabled'), - } - }, - fields: { - name: { - label: i18n._('Host Name'), - type: 'text', - required: true, - awPopOver: "

" + - i18n._("Provide a host name, ip address, or ip address:port. Examples include:") + - "

" + - "
myserver.domain.com
" + - "127.0.0.1
" + - "10.1.0.140:25
" + - "server.example.com:25" + - "
", - dataTitle: i18n._('Host Name'), - dataPlacement: 'right', - dataContainer: 'body', - ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd)' - }, - description: { - label: i18n._('Description'), - ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd)', - type: 'text' - }, - host_variables: { - label: i18n._('Variables'), - type: 'textarea', - rows: 6, - class: 'Form-formGroup--fullWidth', - "default": "---", - awPopOver: "

" + i18n._("Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - "JSON:
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - "YAML:
\n" + - "
---
somevar: somevalue
password: magic
\n" + - '

' + i18n.sprintf(i18n._('View JSON examples at %s'), 'www.json.org') + '

' + - '

' + i18n.sprintf(i18n._('View YAML examples at %s'), 'docs.ansible.com') + '

', - dataTitle: i18n._('Host Variables'), - dataPlacement: 'right', - dataContainer: 'body' - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(host.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(host.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(host.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - related: { - ansible_facts: { - name: 'ansible_facts', - awToolTip: i18n._('Please save before viewing facts.'), - dataPlacement: 'top', - title: i18n._('Facts'), - skipGenerator: true - }, - nested_groups: { - name: 'nested_groups', - awToolTip: i18n._('Please save before defining groups.'), - dataPlacement: 'top', - ngClick: "$state.go('inventories.edit.groups.edit.nested_hosts.edit.nested_groups')", - title: i18n._('Groups'), - iterator: 'nested_group' - } - } - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js deleted file mode 100644 index d0722dcf9e..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js +++ /dev/null @@ -1,155 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - name: 'nested_hosts', - iterator: 'nested_host', - editTitle: '{{ nested_host.name }}', // i don't think this is correct - // showTitle: false, - well: true, - wellOverride: true, - index: false, - hover: true, - // hasChildren: true, - multiSelect: true, - trackBy: 'nested_host.id', - basePath: 'api/v2/groups/{{$stateParams.group_id}}/all_hosts/', - layoutClass: 'List-staticColumnLayout--hostsWithCheckbox', - staticColumns: [ - { - field: 'toggleHost', - content: { - ngDisabled: '!nested_host.summary_fields.user_capabilities.edit', - label: '', - columnClass: 'List-staticColumn--toggle', - type: "toggle", - ngClick: "toggleHost($event, nested_host)", - awToolTip: "

" + - i18n._("Indicates if a host is available and should be included in running jobs.") + - "

" + - i18n._("For hosts that are part of an external" + - " inventory, this flag may be" + - " reset by the inventory sync process.") + - "

", - dataPlacement: "right", - nosort: true, - } - }, - { - field: 'active_failures', - content: { - label: '', - iconOnly: true, - nosort: true, - // do not remove this ng-click directive - // the list generator case to handle fields without ng-click - // cannot handle the aw-* directives - ngClick: 'noop()', - awPopOver: "{{ nested_host.job_status_html }}", - dataTitle: "{{ nested_host.job_status_title }}", - awToolTip: "{{ nested_host.badgeToolTip }}", - dataPlacement: 'top', - icon: "{{ 'fa icon-job-' + nested_host.active_failures }}", - id: 'active-failures-action', - columnClass: 'status-column List-staticColumn--smallStatus' - } - } - ], - - fields: { - name: { - key: true, - label: i18n._('Hosts'), - uiSref: "inventories.edit.hosts.edit({host_id: nested_host.id})", - ngClass: "{ 'host-disabled-label': !nested_host.enabled }", - columnClass: 'col-lg-4 col-md-8 col-sm-8 col-xs-7', - dataHostId: "{{ nested_host.id }}", - dataType: "nested_host", - }, - description: { - label: i18n._('Description'), - columnClass: 'd-none d-lg-flex col-lg-4', - template: ` -
- {{ nested_host.description }} -
- ` - }, - }, - - fieldActions: { - - columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-5 text-right', - edit: { - ngClick: "editHost(nested_host.id)", - icon: 'icon-edit', - awToolTip: i18n._('Edit host'), - dataPlacement: 'top', - ngShow: 'nested_host.summary_fields.user_capabilities.edit' - }, - view: { - ngClick: "editHost(nested_host.id)", - awToolTip: i18n._('View host'), - dataPlacement: 'top', - ngShow: '!nested_host.summary_fields.user_capabilities.edit' - }, - "delete": { - //label: 'Delete', - ngClick: "disassociateHost(nested_host)", - iconClass: 'fa fa-times', - awToolTip: i18n._('Disassociate host'), - dataPlacement: 'top', - ngShow: 'nested_host.summary_fields.user_capabilities.delete' - } - }, - - actions: { - launch: { - mode: 'all', - ngDisabled: '!hostsSelected', - ngClick: 'setAdhocPattern()', - awToolTip: i18n._("Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups."), - dataPlacement: 'top', - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('RUN COMMANDS'), - showTipWhenDisabled: true, - tooltipInnerClass: "Tooltip-wide", - // TODO: we don't always want to show this - ngShow: 'inventory_obj.summary_fields.user_capabilities.adhoc' - }, - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshGroups()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - add: { - mode: 'all', - type: 'buttonDropdown', - awToolTip: i18n._("Add a host"), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd', - dataPlacement: "top", - options: [ - { - optionContent: i18n._('Existing Host'), - optionSref: '.associate', - ngShow: 'canAdd' - }, - { - optionContent: i18n._('New Host'), - optionSref: '.add', - ngShow: 'canAdd' - } - ], - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js deleted file mode 100644 index 456da422d9..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js +++ /dev/null @@ -1,66 +0,0 @@ -import { N_ } from '../../../../../../i18n'; -import {templateUrl} from '../../../../../../shared/template-url/template-url.factory'; - -export default { - name: "inventories.edit.groups.edit.nested_hosts", - url: "/nested_hosts?{nested_host_search:queryset}", - params: { - nested_host_search: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash: "" - } - }, - ncyBreadcrumb: { - parent: "inventories.edit.groups.edit", - label: N_("ASSOCIATED HOSTS") - }, - views: { - // 'related@inventories.edit.groups.edit': { - 'related': { - templateProvider: function(NestedHostsListDefinition, generateList, $templateRequest) { - let list = _.cloneDeep(NestedHostsListDefinition); - - let html = generateList.build({ - list: list, - mode: 'edit' - }); - return $templateRequest(templateUrl('inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate')).then((template) => { - return html.concat(template); - }); - }, - controller: 'NestedHostsListController' - } - }, - resolve: { - Dataset: ['NestedHostsListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - path = `api/v2/groups/${$stateParams.group_id}/all_hosts`; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - inventoryData: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.getInventory($stateParams.inventory_id).then(res => res.data); - }], - canAdd: ['rbacUiControlService', function(rbacUiControlService) { - return rbacUiControlService.canAdd('hosts') - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/main.js deleted file mode 100644 index 6905795f3d..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/main.js +++ /dev/null @@ -1,17 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import nestedHostsListDefinition from './group-nested-hosts.list'; -import nestedHostsFormDefinition from './group-nested-hosts.form'; -import controller from './group-nested-hosts-list.controller'; -import addController from './group-nested-hosts-add.controller'; - -export default - angular.module('nestedHosts', []) - .factory('NestedHostsListDefinition', nestedHostsListDefinition) - .factory('NestedHostsFormDefinition', nestedHostsFormDefinition) - .controller('NestedHostsAddController', addController) - .controller('NestedHostsListController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/host-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/host-add.controller.js deleted file mode 100644 index 37f3eefc8f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/host-add.controller.js +++ /dev/null @@ -1,41 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$state', '$stateParams', '$scope', 'RelatedHostsFormDefinition', - 'GenerateForm', 'HostsService', 'ToJSON', 'canAdd', - function($state, $stateParams, $scope, RelatedHostsFormDefinition, - GenerateForm, HostsService, ToJSON, canAdd) { - - init(); - - function init() { - $scope.canAdd = canAdd; - $scope.host = { enabled: true }; - // apply form definition's default field values - GenerateForm.applyDefaults(RelatedHostsFormDefinition, $scope); - } - $scope.formCancel = function() { - $state.go('^'); - }; - $scope.toggleHostEnabled = function() { - $scope.host.enabled = !$scope.host.enabled; - }; - $scope.formSave = function(){ - var json_data = ToJSON($scope.parseType, $scope.host_variables, true), - params = { - variables: json_data,// $scope.variables === '---' || $scope.variables === '{}' ? null : $scope.variables, - name: $scope.name, - description: $scope.description, - enabled: $scope.host.enabled, - inventory: $stateParams.inventory_id - }; - HostsService.post(params).then(function(res) { - $state.go('^.edit', { host_id: res.data.id }, { reload: true }); - }) - .catch(function(){}); - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js deleted file mode 100644 index 7621eeb045..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js +++ /dev/null @@ -1,22 +0,0 @@ -import { N_ } from '../../../../../i18n'; - -export default { - name: "inventories.edit.hosts.add", - url: "/add", - ncyBreadcrumb: { - parent: "inventories.edit.hosts", - label: N_("CREATE HOST") - }, - views: { - 'hostForm@inventories': { - templateProvider: function(GenerateForm, RelatedHostsFormDefinition) { - let form = RelatedHostsFormDefinition; - return GenerateForm.buildHTML(form, { - mode: 'add', - related: false - }); - }, - controller: 'RelatedHostAddController' - } - }, -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/main.js deleted file mode 100644 index 7a55327c9f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './host-add.controller'; - -export default -angular.module('relatedHostsAdd', []) - .controller('RelatedHostAddController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/host-edit.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/host-edit.controller.js deleted file mode 100644 index e54127f176..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/host-edit.controller.js +++ /dev/null @@ -1,46 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default - ['$scope', '$state', 'HostsService', 'host', '$rootScope', - function($scope, $state, HostsService, host, $rootScope){ - $scope.isSmartInvHost = $state.includes('inventories.editSmartInventory.hosts.edit'); - $scope.parseType = 'yaml'; - $scope.formCancel = function(){ - $state.go('^', null, {reload: true}); - }; - $scope.toggleHostEnabled = function(){ - $scope.host.enabled = !$scope.host.enabled; - }; - $scope.toggleEnabled = function(){ - $scope.host.enabled = !$scope.host.enabled; - }; - $scope.formSave = function(){ - var host = { - id: $scope.host.id, - variables: $scope.host_variables === '---' || $scope.host_variables === '{}' ? null : $scope.host_variables, - name: $scope.name, - description: $scope.description, - enabled: $scope.host.enabled - }; - if (typeof $scope.host.instance_id !== 'undefined') { - host.instance_id = $scope.host.instance_id; - } - HostsService.put(host).then(function(){ - $state.go('.', null, {reload: true}); - }); - - }; - var init = function(){ - $scope.host = host; - $scope.name = host.name; - $rootScope.breadcrumb.host_name = host.name; - $scope.description = host.description; - $scope.host_variables = host.variables; - }; - - init(); - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/main.js deleted file mode 100644 index 9536f686dc..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/main.js +++ /dev/null @@ -1,10 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ -import controller from './host-edit.controller'; - -export default -angular.module('relatedHostEdit', []) - .controller('RelatedHostEditController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/smart-host-edit.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/smart-host-edit.route.js deleted file mode 100644 index 033e6054ca..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/smart-host-edit.route.js +++ /dev/null @@ -1,29 +0,0 @@ -export default { - name: "inventories.editSmartInventory.hosts.edit", - url: "/edit/:host_id", - ncyBreadcrumb: { - parent: "inventories.editSmartInventory.hosts", - label: "{{breadcrumb.host_name}}" - }, - views: { - 'hostForm@inventories': { - templateProvider: function(GenerateForm, RelatedHostsFormDefinition) { - let form = _.cloneDeep(RelatedHostsFormDefinition); - form.stateTree = 'inventories.editSmartInventory.hosts'; - delete form.related; - return GenerateForm.buildHTML(form, { - mode: 'edit', - related: false - }); - }, - controller: 'RelatedHostEditController' - } - }, - resolve: { - host: ['$stateParams', 'InventoriesService', function($stateParams, InventoriesService) { - return InventoriesService.getHost($stateParams.smartinventory_id, $stateParams.host_id).then(function(res) { - return res.data.results[0]; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/standard-host-edit.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/standard-host-edit.route.js deleted file mode 100644 index 432037658f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/edit/standard-host-edit.route.js +++ /dev/null @@ -1,25 +0,0 @@ -export default { - name: "inventories.edit.hosts.edit", - url: "/edit/:host_id", - ncyBreadcrumb: { - parent: "inventories.edit.hosts", - label: "{{breadcrumb.host_name}}" - }, - views: { - 'hostForm@inventories': { - templateProvider: function(GenerateForm, RelatedHostsFormDefinition) { - let form = RelatedHostsFormDefinition; - return GenerateForm.buildHTML(form, { - mode: 'edit', - related: false - }); - }, - controller: 'RelatedHostEditController' - } - }, - resolve: { - host: ['$stateParams', 'HostsService', function($stateParams, HostsService) { - return HostsService.get({ id: $stateParams.host_id }).then((response) => response.data.results[0]); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js deleted file mode 100644 index cf79463247..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js +++ /dev/null @@ -1,167 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -// import HostsService from './../hosts/host.service'; -export default ['$scope', 'ListDefinition', '$rootScope', 'GetBasePath', - 'rbacUiControlService', 'Dataset', '$state', '$filter', 'Prompt', 'Wait', - 'HostsService', 'SetStatus', 'canAdd', 'i18n', 'InventoryHostsStrings', '$transitions', - function($scope, ListDefinition, $rootScope, GetBasePath, - rbacUiControlService, Dataset, $state, $filter, Prompt, Wait, - HostsService, SetStatus, canAdd, i18n, InventoryHostsStrings, $transitions) { - - let list = ListDefinition; - - init(); - - function init(){ - $scope.canAdd = canAdd; - $scope.enableSmartInventoryButton = false; - $scope.smartInventoryButtonTooltip = InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $rootScope.flashMessage = null; - - $scope.$watchCollection(list.name, function() { - $scope[list.name] = _.map($scope.hosts, function(value) { - value.inventory_name = value.summary_fields.inventory.name; - value.inventory_id = value.summary_fields.inventory.id; - angular.forEach($scope.hostsSelected, function(selectedHost){ - if(selectedHost.id === value.id) { - value.isSelected = true; - } - }); - return value; - }); - setJobStatus(); - }); - - $transitions.onSuccess({}, function(trans) { - if(trans.params('to') && trans.params('to').host_search) { - let hasMoreThanDefaultKeys = false; - angular.forEach(trans.params('to').host_search, function(value, key) { - if(key !== 'order_by' && key !== 'page_size' && key !== 'page') { - hasMoreThanDefaultKeys = true; - } - }); - $scope.enableSmartInventoryButton = hasMoreThanDefaultKeys ? true : false; - $scope.smartInventoryButtonTooltip = hasMoreThanDefaultKeys ? InventoryHostsStrings.get('smartinventorybutton.ENABLED_INSTRUCTIONS') : InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - } - else { - $scope.enableSmartInventoryButton = false; - $scope.smartInventoryButtonTooltip = InventoryHostsStrings.get('smartinventorybutton.DISABLED_INSTRUCTIONS'); - } - }); - - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - if(!$scope.hostsSelected) { - $scope.hostsSelected = []; - } - $scope.hostsSelected.push(item); - } else { - _.remove($scope.hostsSelected, { id: item.id }); - if($scope.hostsSelected.length === 0) { - $scope.hostsSelected = null; - } - } - }); - - } - - function setJobStatus(){ - _.forEach($scope.hosts, function(value) { - SetStatus({ - scope: $scope, - host: value - }); - }); - } - - $scope.createHost = function(){ - $state.go('inventories.edit.hosts.add'); - }; - $scope.editHost = function(host){ - if($state.includes('inventories.edit.hosts')) { - $state.go('inventories.edit.hosts.edit', {host_id: host.id}); - } - else if($state.includes('inventories.editSmartInventory.hosts')) { - $state.go('inventories.editSmartInventory.hosts.edit', {host_id: host.id}); - } - }; - $scope.goToInsights = function(host){ - $state.go('inventories.edit.hosts.edit.insights', {inventory_id: host.inventory_id, host_id:host.id}); - }; - $scope.deleteHost = function(id, name){ - var body = '
' + i18n._('Are you sure you want to permanently delete the host below from the inventory?') + '
' + $filter('sanitize')(name) + '
'; - var action = function(){ - delete $rootScope.promptActionBtnClass; - Wait('start'); - HostsService.delete(id).then(() => { - $('#prompt-modal').modal('hide'); - - let reloadListStateParams = null; - - if($scope.hosts.length === 1 && $state.params.host_search && _.has($state, 'params.host_search.page') && $state.params.host_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.host_search.page = (parseInt(reloadListStateParams.host_search.page)-1).toString(); - } - - if (parseInt($state.params.host_id) === id) { - $state.go('^', reloadListStateParams, {reload: true}); - } else { - $state.go('.', reloadListStateParams, {reload: true}); - } - Wait('stop'); - }); - }; - // Prompt depends on having $rootScope.promptActionBtnClass available... - Prompt({ - hdr: i18n._('Delete Host'), - body: body, - action: action, - actionText: i18n._('DELETE'), - }); - $rootScope.promptActionBtnClass = 'Modal-errorButton'; - }; - - $scope.toggleHost = function(event, host) { - try { - $(event.target).tooltip('hide'); - } catch (e) { - // ignore - } - - host.enabled = !host.enabled; - - HostsService.put(host).then(function(){ - $state.go($state.current, null, {reload: true}); - }); - }; - - $scope.smartInventory = function() { - $state.go('inventories.addSmartInventory'); - }; - - $scope.setAdhocPattern = function(){ - var pattern = _($scope.hostsSelected) - .map(function(item){ - return item.name; - }).value().join(':'); - - if($state.includes('inventories.edit')) { - $state.go('inventories.edit.adhoc', {pattern: pattern}); - } - else if($state.includes('inventories.editSmartInventory')) { - $state.go('inventories.editSmartInventory.adhoc', {pattern: pattern}); - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/list/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/list/main.js deleted file mode 100644 index 6cb8d2dda5..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/list/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import RelatedHostListController from './host-list.controller'; - -export default -angular.module('relatedHostList', []) - .controller('RelatedHostListController', RelatedHostListController); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/main.js deleted file mode 100644 index 08b0cdc5b6..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/main.js +++ /dev/null @@ -1,24 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - import relatedHostAdd from './add/main'; - import relatedHostEdit from './edit/main'; - import relatedHostList from './list/main'; - import relatedHostsListDefinition from './related-host.list'; - import relatedHostsFormDefinition from './related-host.form'; - import relatedGroupsLabels from './related-groups-labels/main'; - import nestedGroups from './related/nested-groups/main'; - -export default -angular.module('relatedHost', [ - relatedHostAdd.name, - relatedHostEdit.name, - relatedHostList.name, - relatedGroupsLabels.name, - nestedGroups.name - ]) - .factory('RelatedHostsFormDefinition', relatedHostsFormDefinition) - .factory('RelatedHostsListDefinition', relatedHostsListDefinition); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/main.js deleted file mode 100644 index a3be739b8a..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import relatedGroupsabelsList from './relatedGroupsLabelsList.directive'; - -export default - angular.module('relatedGroupsLabels', []) - .directive('relatedGroupsLabelsList', relatedGroupsabelsList); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.block.less b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.block.less deleted file mode 100644 index 092a13a041..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.block.less +++ /dev/null @@ -1,5 +0,0 @@ -.RelatedGroupsLabelsCell{ - width:100%; - display: flex; - align-items: center; -} diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js deleted file mode 100644 index 7ecdee5973..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js +++ /dev/null @@ -1,104 +0,0 @@ -/* jshint unused: vars */ -export default - [ 'templateUrl', - 'Wait', - 'Rest', - 'GetBasePath', - 'ProcessErrors', - 'Prompt', - '$q', - '$filter', - '$state', - 'i18n', - function(templateUrl, Wait, Rest, GetBasePath, ProcessErrors, Prompt, $q, $filter, $state, i18n) { - return { - restrict: 'E', - scope: false, - templateUrl: templateUrl('inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList'), - link: function(scope, element, attrs) { - scope.showDelete = attrs.showDelete === 'true'; - scope.seeMoreInactive = true; - - var getNext = function(data, arr, resolve) { - Rest.setUrl(data.next); - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, arr.concat(data.results), resolve); - } else { - resolve.resolve(arr.concat(data.results)); - } - }); - }; - - scope.seeMore = function () { - var seeMoreResolve = $q.defer(); - Rest.setUrl(`${scope[scope.$parent.list.iterator].related.groups}?order_by=id`); - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, data.results, seeMoreResolve); - } else { - seeMoreResolve.resolve(data.results); - } - }); - - seeMoreResolve.promise.then(function (groups) { - scope.related_groups = groups; - scope.seeMoreInactive = false; - }); - }; - - scope.seeLess = function() { - // Trim the groups array back down to 5 items - scope.related_groups = scope.related_groups.slice(0, 5); - // Re-set the seeMoreInteractive flag so that the "See More" will be displayed - scope.seeMoreInactive = true; - }; - - scope.deleteLabel = function(host, group) { - var action = function () { - $('#prompt-modal').modal('hide'); - scope.seeMoreInactive = true; - Wait('start'); - let url = `${GetBasePath('groups')}${group.id}/hosts`; - if(url) { - Rest.setUrl(url); - Rest.post({"disassociate": true, "id": host.id}) - .then(() => { - Wait('stop'); - $state.go('.', null, {reload: true}); - }) - .catch(({data, status}) => { - Wait('stop'); - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Could not disassociate host from group. Call to ' + url + ' failed. DELETE returned status: ' + status }); - }); - } - }; - - Prompt({ - hdr: i18n._('Remove host from ') + group.name , - body: '
' + i18n._('Confirm the removal of the') + ' ' + $filter('sanitize')(host.name) + ' ' + i18n._('from the') + ' ' + $filter('sanitize')(group.name) + ' ' + i18n._('group') + '.
', - action: action, - actionText: i18n._('REMOVE') - }); - }; - - scope.$watchCollection(scope.$parent.list.iterator, function() { - // To keep the array of groups fresh, we need to set up a watcher - otherwise, the - // array will get set initially and then never be updated as groups are removed - if (scope[scope.$parent.list.iterator].summary_fields.groups){ - scope.related_groups = scope[scope.$parent.list.iterator].summary_fields.groups.results; - scope.count = scope[scope.$parent.list.iterator].summary_fields.groups.count; - } - else{ - scope.related_groups = null; - scope.count = null; - } - }); - - } - }; - } - ]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html deleted file mode 100644 index 8b40988fdd..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
- {{ related_group.name }} -
-
- -
-
-
View More
-
View Less
diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.form.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.form.js deleted file mode 100644 index 1e1b935fa7..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.form.js +++ /dev/null @@ -1,140 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Hosts - * @description This form is for adding/editing a host on the inventory page -*/ - -export default ['i18n', -function(i18n) { - return { - - addTitle: i18n._('CREATE HOST'), - editTitle: '{{ host.name }}', - name: 'host', - basePath: 'hosts', - well: false, - formLabelSize: 'col-lg-3', - formFieldSize: 'col-lg-9', - iterator: 'host', - detailsClick: "$state.go('inventories.edit.hosts.edit', null, {reload:true})", - stateTree: 'inventories.edit.hosts', - headerFields:{ - enabled: { - class: 'Form-header-field', - ngClick: 'toggleHostEnabled(host)', - type: 'toggle', - awToolTip: "

" + - i18n._("Indicates if a host is available and should be included in running jobs.") + - "

" + - i18n._("For hosts that are part of an external" + - " inventory, this may be" + - " reset by the inventory sync process.") + - "

", - dataTitle: i18n._('Host Enabled'), - dataPlacement: "right", - ngDisabled: '!host.summary_fields.user_capabilities.edit || isSmartInvHost' - } - }, - fields: { - name: { - label: i18n._('Host Name'), - type: 'text', - required: true, - awPopOver: "

" + - i18n._("Provide a host name, ip address, or ip address:port. Examples include:") + - "

" + - "
myserver.domain.com
" + - "127.0.0.1
" + - "10.1.0.140:25
" + - "server.example.com:25" + - "
", - dataTitle: i18n._('Host Name'), - dataPlacement: 'right', - dataContainer: 'body', - ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd) || isSmartInvHost' - }, - description: { - label: i18n._('Description'), - ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd) || isSmartInvHost', - type: 'text' - }, - host_variables: { - label: i18n._('Variables'), - type: 'code_mirror', - class: 'Form-formGroup--fullWidth', - "default": "---", - variables: 'host_variables', - awPopOver: `

${i18n._("Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two.")}

- JSON:
-
- {
 "somevar": "somevalue",
 "password": "magic"
} -
- YAML:
-
- ---
- somevar: somevalue
- password: magic
-
-

${i18n.sprintf(i18n._( - 'View JSON examples at %s'), - 'www.json.org' - )}

-

${i18n.sprintf(i18n._('View YAML examples at %s'), 'docs.ansible.com')}

`, - ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd) || isSmartInvHost' - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(host.summary_fields.user_capabilities.edit || canAdd) && !isSmartInvHost' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(host.summary_fields.user_capabilities.edit || canAdd) || isSmartInvHost' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(host.summary_fields.user_capabilities.edit || canAdd) && !isSmartInvHost' - } - }, - - related: { - ansible_facts: { - name: 'ansible_facts', - awToolTip: i18n._('Please save before viewing facts.'), - dataPlacement: 'top', - title: i18n._('Facts'), - skipGenerator: true - }, - nested_groups: { - name: 'nested_groups', - awToolTip: i18n._('Please save before defining groups.'), - dataPlacement: 'top', - ngClick: "$state.go('inventories.edit.hosts.edit.nested_groups')", - title: i18n._('Groups'), - iterator: 'nested_group' - }, - insights: { - name: 'insights', - awToolTip: i18n._('Please save before viewing Insights.'), - dataPlacement: 'top', - title: i18n._('Insights'), - skipGenerator: true, - ngIf: "host.insights_system_id!==null && host.summary_fields.inventory.hasOwnProperty('insights_credential_id')" - }, - completed_jobs: { - name: 'completed_jobs', - title: i18n._('Completed Jobs'), - skipGenerator: true - } - } - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.list.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.list.js deleted file mode 100644 index fdef44a350..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.list.js +++ /dev/null @@ -1,147 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - name: 'hosts', - iterator: 'host', - editTitle: '{{ selected_group }}', - showTitle: false, - well: true, - wellOverride: true, - index: false, - hover: true, - multiSelect: true, - trackBy: 'host.id', - basePath: 'api/v2/inventories/{{$stateParams.inventory_id}}/hosts/', - layoutClass: 'List-staticColumnLayout--hostsWithCheckbox', - staticColumns: [ - { - field: 'toggleHost', - content: { - ngDisabled: '!host.summary_fields.user_capabilities.edit', - label: '', - type: "toggle", - ngClick: "toggleHost($event, host)", - awToolTip: "

" + - i18n._("Indicates if a host is available and should be included in running jobs.") + - "

" + - i18n._("For hosts that are part of an external" + - " inventory, this may be" + - " reset by the inventory sync process.") + - "

", - dataPlacement: "right", - nosort: true, - } - }, - { - field: 'active_failures', - content: { - label: '', - iconOnly: true, - nosort: true, - // do not remove this ng-click directive - // the list generator case to handle fields without ng-click - // cannot handle the aw-* directives - ngClick: 'noop()', - awPopOver: "{{ host.job_status_html }}", - dataTitle: "{{ host.job_status_title }}", - awToolTip: "{{ host.badgeToolTip }}", - dataPlacement: 'top', - icon: "{{ 'fa icon-job-' + host.active_failures }}", - id: 'active-failures-action', - columnClass: 'status-column' - } - } - ], - - fields: { - name: { - key: true, - label: i18n._('Hosts'), - uiSref: ".edit({inventory_id: host.inventory_id,host_id: host.id})", - ngClass: "{ 'host-disabled-label': !host.enabled }", - columnClass: 'col-lg-3 col-md-3 col-sm-3 col-xs-7', - dataHostId: "{{ host.id }}", - dataType: "host", - }, - description: { - label: i18n._('Description'), - columnClass: 'd-none d-lg-flex col-lg-3', - template: ` -
- {{ host.description }} -
- ` - }, - groups: { - label: i18n._("Related Groups"), - type: 'related_groups', - nosort: true, - showDelete: true, - columnClass: 'd-none d-lg-flex List-tableCell col-lg-3' - } - }, - - fieldActions: { - - columnClass: 'col-lg-3 col-md-6 col-sm-4 col-xs-5 text-right', - edit: { - ngClick: "editHost(host)", - icon: 'icon-edit', - awToolTip: i18n._('Edit host'), - dataPlacement: 'top', - ngShow: 'host.summary_fields.user_capabilities.edit' - }, - insights: { - ngClick: "goToInsights(host)", - icon: 'fa-info', - awToolTip: i18n._('View Insights Data'), - dataPlacement: 'top', - ngShow: 'host.insights_system_id && host.summary_fields.inventory.hasOwnProperty("insights_credential_id")', - ngClass: "{'List-actionButton--selected': $stateParams['host_id'] == host.id && $state.is('inventories.edit.hosts.edit.insights')}" - }, - view: { - ngClick: "editHost(host)", - awToolTip: i18n._('View host'), - dataPlacement: 'top', - ngShow: '!host.summary_fields.user_capabilities.edit' - }, - "delete": { - ngClick: "deleteHost(host.id, host.name)", - icon: 'icon-trash', - awToolTip: i18n._('Delete host'), - dataPlacement: 'top', - ngShow: 'host.summary_fields.user_capabilities.delete' - } - }, - - actions: { - launch: { - mode: 'all', - ngDisabled: '!hostsSelected', - ngClick: 'setAdhocPattern()', - awToolTip: i18n._("Select an inventory source by clicking the check box beside it. The inventory source can be a single host or a selection of multiple hosts."), - dataPlacement: 'top', - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('RUN COMMANDS'), - showTipWhenDisabled: true, - tooltipInnerClass: "Tooltip-wide", - // TODO: we don't always want to show this - ngShow: 'inventory_obj.summary_fields.user_capabilities.adhoc' - }, - create: { - mode: 'all', - ngClick: "createHost()", - awToolTip: i18n._("Create a new host"), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd', - dataPlacement: "top", - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.route.js deleted file mode 100644 index 0c8f6cb23a..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related-host.route.js +++ /dev/null @@ -1,83 +0,0 @@ -import { N_ } from '../../../../i18n'; - -export default { - name: "inventories.edit.hosts", - url: "/hosts?{host_search:queryset}", - params: { - host_search: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash:"" - } - }, - ncyBreadcrumb: { - parent: "inventories.edit", - label: N_("HOSTS") - }, - views: { - 'related': { - templateProvider: function(ListDefinition, generateList, $stateParams, GetBasePath) { - let list = _.cloneDeep(ListDefinition); - if($stateParams && $stateParams.group) { - list.basePath = GetBasePath('groups') + _.last($stateParams.group) + '/all_hosts'; - } - else { - //reaches here if the user is on the root level group - list.basePath = GetBasePath('inventory') + $stateParams.inventory_id + '/hosts'; - } - let html = generateList.build({ - list: list, - mode: 'edit' - }); - return html; - }, - controller: 'RelatedHostListController' - } - }, - resolve: { - ListDefinition: ['RelatedHostsListDefinition', '$stateParams', 'GetBasePath', (RelatedHostsListDefinition, $stateParams, GetBasePath) => { - let list = _.cloneDeep(RelatedHostsListDefinition); - list.basePath = GetBasePath('inventory') + $stateParams.inventory_id + '/hosts'; - return list; - }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - hostsUrl: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return $stateParams.group && $stateParams.group.length > 0 ? - // nested context - provide all hosts managed by nodes - InventoriesService.childHostsUrl(_.last($stateParams.group)) : - // root context - provide all hosts in an inventory - InventoriesService.rootHostsUrl($stateParams.inventory_id); - }], - hostsDataset: ['ListDefinition', 'QuerySet', '$stateParams', 'hostsUrl', (list, qs, $stateParams, hostsUrl) => { - let path = hostsUrl; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - }], - inventoryData: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.getInventory($stateParams.inventory_id).then(res => res.data); - }], - canAdd: ['rbacUiControlService', function(rbacUiControlService) { - return rbacUiControlService.canAdd('hosts') - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-associate.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-associate.route.js deleted file mode 100644 index c710a76754..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-associate.route.js +++ /dev/null @@ -1,32 +0,0 @@ -export default { - name: 'inventories.edit.hosts.edit.nested_groups.associate', - squashSearchUrl: true, - url: '/associate', - ncyBreadcrumb:{ - skip:true - }, - views: { - 'modal@inventories.edit.hosts.edit': { - templateProvider: function() { - return ``; - }, - controller: function($scope, $q, GroupsService, $state){ - $scope.associateGroups = function(selectedItems){ - var deferred = $q.defer(); - return $q.all( _.map(selectedItems, (selectedItem) => GroupsService.associateHost({id: parseInt($state.params.host_id)}, selectedItem.id)) ) - .then( () =>{ - deferred.resolve(); - }, (error) => { - deferred.reject(error); - }); - }; - } - } - }, - onExit: function($state) { - if ($state.transition) { - $('#associate-groups-modal').modal('hide'); - $('body').removeClass('modal-open'); - } - }, -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html deleted file mode 100644 index 2d379f686f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html +++ /dev/null @@ -1,37 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-list.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-list.controller.js deleted file mode 100644 index 9fdeb7d652..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-list.controller.js +++ /dev/null @@ -1,112 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - export default - ['$scope', '$rootScope', '$state', '$stateParams', 'HostNestedGroupListDefinition', 'InventoryUpdate', - 'GroupsService', 'CancelSourceUpdate', 'rbacUiControlService', 'GetBasePath', - 'Dataset', 'Find', 'QuerySet', 'inventoryData', 'canAdd', 'ProcessErrors', 'host', - function($scope, $rootScope, $state, $stateParams, HostNestedGroupListDefinition, InventoryUpdate, - GroupsService, CancelSourceUpdate, rbacUiControlService, GetBasePath, - Dataset, Find, qs, inventoryData, canAdd, ProcessErrors, host){ - - let list = HostNestedGroupListDefinition; - - init(); - - function init(){ - $scope.toDisassociate = host; - $scope.inventory_id = $stateParams.inventory_id; - $scope.canAdhoc = inventoryData.summary_fields.user_capabilities.adhoc; - $scope.canAdd = canAdd; - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - if(!$scope.groupsSelected) { - $scope.groupsSelected = []; - } - $scope.groupsSelected.push(item); - } else { - _.remove($scope.groupsSelected, { id: item.id }); - if($scope.groupsSelected.length === 0) { - $scope.groupsSelected = null; - } - } - }); - - } - - $scope.associateGroup = function() { - $state.go('.associate'); - }; - - $scope.disassociateGroup = function(group){ - $scope.disassociateFrom = group; - $('#group-disassociate-modal').modal('show'); - }; - - $scope.confirmDisassociate = function(){ - - // Bind an even listener for the modal closing. Trying to $state.go() before the modal closes - // will mean that these two things are running async and the modal may not finish closing before - // the state finishes transitioning. - $('#group-disassociate-modal').off('hidden.bs.modal').on('hidden.bs.modal', function () { - // Remove the event handler so that we don't end up with multiple bindings - $('#group-disassociate-modal').off('hidden.bs.modal'); - - let reloadListStateParams = null; - - if($scope.nested_groups.length === 1 && $state.params.nested_group_search && !_.isEmpty($state.params.nested_group_search.page) && $state.params.nested_group_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.nested_group_search.page = (parseInt(reloadListStateParams.nested_group_search.page)-1).toString(); - } - - // Reload the inventory manage page and show that the group has been removed - $state.go('.', reloadListStateParams, {reload: true}); - }); - - let closeModal = function(){ - $('#group-disassociate-modal').modal('hide'); - $('body').removeClass('modal-open'); - $('.modal-backdrop').remove(); - }; - - GroupsService.disassociateHost($scope.toDisassociate.id, $scope.disassociateFrom.id) - .then(() => { - closeModal(); - }).catch((error) => { - closeModal(); - ProcessErrors(null, error.data, error.status, null, { - hdr: 'Error!', - msg: 'Failed to disassociate group from parent group: POST returned status' + - error.status - }); - }); - }; - - $scope.editGroup = function(id){ - $state.go('inventories.edit.groups.edit', {group_id: id}); - }; - - $scope.goToGroupGroups = function(id){ - $state.go('inventories.edit.groups.edit.nested_groups', {group_id: id}); - }; - - $scope.setAdhocPattern = function(){ - var pattern = _($scope.groupsSelected) - .map(function(item){ - return item.name; - }).value().join(':'); - - $state.go('^.^.^.adhoc', {pattern: pattern}); - }; - - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js deleted file mode 100644 index f945bb5458..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js +++ /dev/null @@ -1,110 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['i18n', function(i18n) { - return { - name: 'nested_groups', - iterator: 'nested_group', - editTitle: '{{ inventory.name }}', - well: true, - wellOverride: true, - index: false, - hover: true, - multiSelect: true, - trackBy: 'nested_group.id', - basePath: 'api/v2/hosts/{{$stateParams.host_id}}/all_groups/', - layoutClass: 'List-staticColumnLayout--hostNestedGroups', - staticColumns: [ - { - field: 'failed_hosts', - content: { - label: '', - nosort: true, - mode: 'all', - iconOnly: true, - awToolTip: "{{ nested_group.hosts_status_tip }}", - dataPlacement: "top", - icon: "{{ 'fa icon-job-' + nested_group.hosts_status_class }}", - columnClass: 'status-column' - } - } - ], - - fields: { - name: { - label: i18n._('Groups'), - key: true, - ngClick: "goToGroupGroups(nested_group.id)", - columnClass: 'col-lg-6 col-md-6 col-sm-6 col-xs-6', - } - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshGroups()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - launch: { - mode: 'all', - ngDisabled: '!groupsSelected', - ngClick: 'setAdhocPattern()', - awToolTip: i18n._("Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups."), - dataPlacement: 'top', - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('RUN COMMANDS'), - showTipWhenDisabled: true, - tooltipInnerClass: "Tooltip-wide", - ngShow: 'canAdhoc' - // TODO: set up a tip watcher and change text based on when - // things are selected/not selected. This is started and - // commented out in the inventory controller within the watchers. - // awToolTip: "{{ adhocButtonTipContents }}", - // dataTipWatch: "adhocButtonTipContents" - }, - associate: { - mode: 'all', - ngClick: 'associateGroup()', - awToolTip: i18n._("Associate an existing group"), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd', - dataPlacement: "top", - } - }, - - fieldActions: { - - columnClass: 'col-lg-6 col-md-6 col-sm-6 col-xs-6 text-right', - - edit: { - mode: 'all', - ngClick: "editGroup(nested_group.id)", - awToolTip: i18n._('Edit group'), - dataPlacement: "top", - ngShow: "nested_group.summary_fields.user_capabilities.edit" - }, - view: { - mode: 'all', - ngClick: "editGroup(nested_group.id)", - awToolTip: i18n._('View group'), - dataPlacement: "top", - ngShow: "!nested_group.summary_fields.user_capabilities.edit" - }, - "delete": { - mode: 'all', - ngClick: "disassociateGroup(nested_group)", - awToolTip: i18n._('Disassociate group'), - iconClass: 'fa fa-times', - dataPlacement: "top", - ngShow: "nested_group.summary_fields.user_capabilities.delete" - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js deleted file mode 100644 index 7f3a82a493..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js +++ /dev/null @@ -1,78 +0,0 @@ -import {templateUrl} from '../../../../../../shared/template-url/template-url.factory'; -import { N_ } from '../../../../../../i18n'; - -export default { - name: 'inventories.edit.hosts.edit.nested_groups', - url: "/nested_groups?{nested_group_search:queryset}", - params: { - nested_group_search: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash: "" - } - }, - ncyBreadcrumb: { - parent: "inventories.edit.hosts.edit", - label: N_("ASSOCIATED GROUPS") - }, - views: { - // 'related@inventories.edit.groups.edit': { - 'related': { - templateProvider: function(HostNestedGroupListDefinition, generateList, $templateRequest) { - let list = _.cloneDeep(HostNestedGroupListDefinition); - - let html = generateList.build({ - list: list, - mode: 'edit' - }); - - return $templateRequest(templateUrl('inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate')).then((template) => { - return html.concat(template); - }); - }, - controller: 'HostNestedGroupsListController' - } - }, - resolve: { - Dataset: ['HostNestedGroupListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - if($stateParams.group_id){ - path = GetBasePath('groups') + $stateParams.group_id + '/children'; - } - else if($stateParams.host_id){ - path = GetBasePath('hosts') + $stateParams.host_id + '/all_groups'; - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - host: ['$stateParams', 'HostsService', function($stateParams, HostsService) { - if($stateParams.host_id){ - return HostsService.get({ id: $stateParams.host_id }).then((res) => res.data.results[0]); - } - }], - inventoryData: ['InventoriesService', '$stateParams', 'host', function(InventoriesService, $stateParams, host) { - var id = ($stateParams.inventory_id) ? $stateParams.inventory_id : host.summary_fields.inventory.id; - return InventoriesService.getInventory(id).then(res => res.data); - }], - canAdd: ['rbacUiControlService', '$state', 'GetBasePath', '$stateParams', function(rbacUiControlService, $state, GetBasePath, $stateParams) { - return rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/groups") - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/main.js deleted file mode 100644 index d2ec22fe62..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/main.js +++ /dev/null @@ -1,13 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import HostNestedGroupListDefinition from './host-nested-groups.list'; -import HostNestedGroupsListController from './host-nested-groups-list.controller'; - -export default - angular.module('hostNestedGroups', []) - .factory('HostNestedGroupListDefinition', HostNestedGroupListDefinition) - .controller('HostNestedGroupsListController', HostNestedGroupsListController); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/main.js deleted file mode 100644 index 04cfc8ba9a..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './sources-add.controller'; - -export default -angular.module('sourcesAdd', []) - .controller('SourcesAddController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js deleted file mode 100644 index 382edb320b..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js +++ /dev/null @@ -1,233 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$state', 'ConfigData', '$scope', 'SourcesFormDefinition', 'ParseTypeChange', - 'GenerateForm', 'inventoryData', 'GetChoices', - 'GetBasePath', 'CreateSelect2', 'GetSourceTypeOptions', - 'SourcesService', 'Empty', 'Wait', 'Rest', 'Alert', 'ProcessErrors', - 'inventorySourcesOptions', '$rootScope', 'i18n', 'InventorySourceModel', 'InventoryHostsStrings', - function($state, ConfigData, $scope, SourcesFormDefinition, ParseTypeChange, - GenerateForm, inventoryData, GetChoices, - GetBasePath, CreateSelect2, GetSourceTypeOptions, - SourcesService, Empty, Wait, Rest, Alert, ProcessErrors, - inventorySourcesOptions,$rootScope, i18n, InventorySource, InventoryHostsStrings) { - - let form = SourcesFormDefinition; - $scope.mode = 'add'; - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope, true); - $scope.canAdd = inventorySourcesOptions.actions.POST; - $scope.envParseType = 'yaml'; - const virtualEnvs = ConfigData.custom_virtualenvs || []; - $scope.custom_virtualenvs_options = virtualEnvs; - - GetChoices({ - scope: $scope, - field: 'verbosity', - variable: 'verbosity_options', - options: inventorySourcesOptions - }); - - CreateSelect2({ - element: '#inventory_source_verbosity', - multiple: false - }); - - $scope.verbosity = $scope.verbosity_options[1]; - - CreateSelect2({ - element: '#inventory_source_custom_virtualenv', - multiple: false, - opts: $scope.custom_virtualenvs_options - }); - - GetSourceTypeOptions({ - scope: $scope, - variable: 'source_type_options' - }); - - const inventorySource = new InventorySource(); - - var getInventoryFiles = function (project) { - var url; - - if (!Empty(project)) { - url = GetBasePath('projects') + project + '/inventories/'; - Wait('start'); - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - $scope.inventory_files = data; - $scope.inventory_files.push("/ (project root)"); - CreateSelect2({ - element:'#inventory-file-select', - addNew: true, - multiple: false, - scope: $scope, - options: 'inventory_files', - model: 'inventory_file' - }); - Wait('stop'); - }) - .catch(() => { - Alert('Cannot get inventory files', 'Unable to retrieve the list of inventory files for this project.', 'alert-info'); - Wait('stop'); - }); - } - }; - - // Register a watcher on project_name - if ($scope.getInventoryFilesUnregister) { - $scope.getInventoryFilesUnregister(); - } - $scope.getInventoryFilesUnregister = $scope.$watch('project', function (newValue, oldValue) { - if (newValue !== oldValue) { - getInventoryFiles(newValue); - } - }); - - $scope.lookupCredential = function(){ - // For most source type selections, we filter for 1-1 matches to credential_type namespace. - let searchKey = 'credential_type__namespace'; - let searchValue = $scope.source.value; - - // SCM and custom source types are more generic in terms of the credentials they - // accept - any cloud or user-defined credential type can be used. We filter for - // these using the credential_type kind field, which categorizes all cloud and - // user-defined credentials as 'cloud'. - if ($scope.source.value === 'scm') { - searchKey = 'credential_type__kind'; - searchValue = 'cloud'; - } - - if ($scope.source.value === 'custom') { - searchKey = 'credential_type__kind'; - searchValue = 'cloud'; - } - - // When the selection is 'ec2' we actually want to filter for the 'aws' namespace. - if ($scope.source.value === 'ec2') { - searchValue = 'aws'; - } - - $state.go('.credential', { - credential_search: { - [searchKey]: searchValue, - page_size: '5', - page: '1' - } - }); - }; - - $scope.lookupProject = function(){ - $state.go('.project', { - project_search: { - page_size: '5', - page: '1' - } - }); - }; - - $scope.sourceChange = function(source) { - source = (source && source.value) ? source.value : ''; - if ($scope.source.value === "scm" && $scope.source.value === "custom") { - $scope.credentialBasePath = GetBasePath('credentials') + '?credential_type__kind__in=cloud,network'; - } - else{ - $scope.credentialBasePath = (source === 'ec2') ? GetBasePath('credentials') + '?credential_type__namespace=aws' : GetBasePath('credentials') + (source === '' ? '' : '?credential_type__namespace=' + (source)); - } - if (true) { - $scope.envParseType = 'yaml'; - - var varName; - if (source === 'scm') { - varName = 'custom_variables'; - } else { - varName = source + '_variables'; - } - - $scope[varName] = $scope[varName] === (null || undefined) ? '---' : $scope[varName]; - ParseTypeChange({ - scope: $scope, - field_id: varName, - variable: varName, - parse_variable: 'envParseType' - }); - } - - if (source === 'scm') { - $scope.projectBasePath = GetBasePath('projects') + '?not__status=never updated'; - } - - $scope.cloudCredentialRequired = source !== '' && source !== 'scm' && source !== 'custom' && source !== 'ec2' ? true : false; - $scope.credential = null; - $scope.credential_name = null; - $scope.overwrite_vars = false; - }; - - $scope.$on('sourceTypeOptionsReady', function() { - CreateSelect2({ - element: '#inventory_source_source', - multiple: false - }); - }); - - $scope.formCancel = function() { - $state.go('^'); - }; - - $scope.formSave = function() { - var params; - - params = { - name: $scope.name, - description: $scope.description, - inventory: inventoryData.id, - source_script: $scope.inventory_script, - credential: $scope.credential, - overwrite: $scope.overwrite, - overwrite_vars: $scope.overwrite_vars, - update_on_launch: $scope.update_on_launch, - verbosity: $scope.verbosity.value, - update_cache_timeout: $scope.update_cache_timeout || 0, - custom_virtualenv: $scope.custom_virtualenv || null, - enabled_var: $scope.enabled_var, - enabled_value: $scope.enabled_value, - host_filter: $scope.host_filter - }; - - if ($scope.source) { - let source_vars = $scope.source.value === 'scm' ? $scope.custom_variables : $scope[$scope.source.value + '_variables']; - params.source_vars = source_vars === '---' || source_vars === '{}' ? null : source_vars; - params.source = $scope.source.value; - if ($scope.source.value === 'scm') { - params.update_on_project_update = $scope.update_on_project_update; - params.source_project = $scope.project; - - if ($scope.inventory_file === '/ (project root)') { - params.source_path = ""; - } else { - params.source_path = $scope.inventory_file; - } - } - } else { - params.source = null; - } - - inventorySource.request('post', { - data: params - }).then((response) => { - let inventory_source_id = response.data.id; - $state.go('^.edit', {inventory_source_id: inventory_source_id}, {reload: true}); - }).catch(({ data, status, config }) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: InventoryHostsStrings.get('error.CALL', { path: `${config.url}`, status }) - }); - }); - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js deleted file mode 100644 index dc53ded31a..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js +++ /dev/null @@ -1,40 +0,0 @@ -import { N_ } from '../../../../../i18n'; - -export default { - name: "inventories.edit.inventory_sources.add", - url: "/add", - ncyBreadcrumb: { - parent: "inventories.edit.inventory_sources", - label: N_("CREATE INVENTORY SOURCE") - }, - views: { - 'sourcesForm@inventories': { - templateProvider: function(GenerateForm, SourcesFormDefinition) { - let form = SourcesFormDefinition; - return GenerateForm.buildHTML(form, { - mode: 'add', - related: false - }); - }, - controller: 'SourcesAddController' - } - }, - resolve: { - inventorySourcesOptions: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.inventorySourcesOptions($stateParams.inventory_id) - .then(function(res) { - return res.data; - }); - }], - ConfigData: ['ConfigService', 'ProcessErrors', 'i18n', (ConfigService, ProcessErrors, i18n) => { - return ConfigService.getConfig() - .then(response => response) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get config. GET returned status: ') + status - }); - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/main.js deleted file mode 100644 index 8c68bc5544..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './sources-edit.controller'; - -export default -angular.module('sourcesEdit', []) - .controller('SourcesEditController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js deleted file mode 100644 index b8207fe5f2..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js +++ /dev/null @@ -1,315 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$state', '$scope', 'ParseVariableString', 'ParseTypeChange', - 'GetChoices', 'GetBasePath', 'CreateSelect2', 'GetSourceTypeOptions', - 'SourcesService', 'inventoryData', 'inventorySourcesOptions', 'Empty', - 'Wait', 'Rest', 'Alert', '$rootScope', 'i18n', 'InventoryHostsStrings', - 'ProcessErrors', 'inventorySource', 'isNotificationAdmin', 'ConfigData', - function($state, $scope, ParseVariableString, ParseTypeChange, - GetChoices, GetBasePath, CreateSelect2, GetSourceTypeOptions, - SourcesService, inventoryData, inventorySourcesOptions, Empty, - Wait, Rest, Alert, $rootScope, i18n, InventoryHostsStrings, - ProcessErrors, inventorySource, isNotificationAdmin, ConfigData) { - - const inventorySourceData = inventorySource.get(); - - // To toggle notifications a user needs to have a read role on the inventory - // _and_ have at least a notification template admin role on an org. - // If the user has gotten this far it's safe to say they have - // at least read access to the inventory - $scope.sufficientRoleForNotifToggle = isNotificationAdmin; - $scope.sufficientRoleForNotif = isNotificationAdmin || $scope.user_is_system_auditor; - $scope.projectBasePath = GetBasePath('projects') + '?not__status=never updated'; - $scope.canAdd = inventorySourcesOptions.actions.POST; - const virtualEnvs = ConfigData.custom_virtualenvs || []; - $scope.custom_virtualenvs_options = virtualEnvs; - // instantiate expected $scope values from inventorySourceData - _.assign($scope, - {credential: inventorySourceData.credential}, - {overwrite: inventorySourceData.overwrite}, - {overwrite_vars: inventorySourceData.overwrite_vars}, - {update_on_launch: inventorySourceData.update_on_launch}, - {update_cache_timeout: inventorySourceData.update_cache_timeout}, - {inventory_script: inventorySourceData.source_script}, - {verbosity: inventorySourceData.verbosity}); - - $scope.inventory_source_obj = inventorySourceData; - $scope.breadcrumb.inventory_source_name = inventorySourceData.name; - if (inventorySourceData.credential) { - $scope.credential_name = inventorySourceData.summary_fields.credential.name; - } - - if(inventorySourceData.source === 'scm') { - $scope.project = inventorySourceData.source_project; - $scope.project_name = inventorySourceData.summary_fields.source_project.name; - updateSCMProject(); - } - - // display custom inventory_script name - if (inventorySourceData.source === 'custom' && inventorySourceData.summary_fields.source_script) { - $scope.inventory_script_name = inventorySourceData.summary_fields.source_script.name; - } - $scope = angular.extend($scope, inventorySourceData); - - $scope.$watch('summary_fields.user_capabilities.edit', function(val) { - $scope.canAdd = val; - }); - - $scope.$on('sourceTypeOptionsReady', function() { - $scope.source = _.find($scope.source_type_options, { value: inventorySourceData.source }); - var source = $scope.source && $scope.source.value ? $scope.source.value : null; - $scope.cloudCredentialRequired = source !== '' && source !== 'scm' && source !== 'custom' && source !== 'ec2' ? true : false; - CreateSelect2({ - element: '#inventory_source_source', - multiple: false - }); - - if (true) { - var varName; - if (source === 'scm') { - varName = 'custom_variables'; - } else { - varName = source + '_variables'; - } - - $scope[varName] = ParseVariableString(inventorySourceData - .source_vars); - - ParseTypeChange({ - scope: $scope, - field_id: varName, - variable: varName, - parse_variable: 'envParseType', - readOnly: !$scope.summary_fields.user_capabilities.edit - }); - } - }); - - $scope.envParseType = 'yaml'; - - GetSourceTypeOptions({ - scope: $scope, - variable: 'source_type_options' - }); - - GetChoices({ - scope: $scope, - field: 'verbosity', - variable: 'verbosity_options', - options: inventorySourcesOptions - }); - - var i; - for (i = 0; i < $scope.verbosity_options.length; i++) { - if ($scope.verbosity_options[i].value === $scope.verbosity) { - $scope.verbosity = $scope.verbosity_options[i]; - } - } - - CreateSelect2({ - element: '#inventory_source_custom_virtualenv', - multiple: false, - opts: $scope.custom_virtualenvs_options - }); - - initVerbositySelect(); - - $scope.$watch('verbosity', initVerbositySelect); - - // Register a watcher on project_name - if ($scope.getInventoryFilesUnregister) { - $scope.getInventoryFilesUnregister(); - } - $scope.getInventoryFilesUnregister = $scope.$watch('project', function (newValue, oldValue) { - if (newValue !== oldValue) { - updateSCMProject(); - } - }); - - function initVerbositySelect(){ - CreateSelect2({ - element: '#inventory_source_verbosity', - multiple: false - }); - } - - function sync_inventory_file_select2() { - CreateSelect2({ - element:'#inventory-file-select', - addNew: true, - multiple: false, - scope: $scope, - options: 'inventory_files', - model: 'inventory_file' - }); - - // TODO: figure out why the inventory file model is being set to - // dirty - } - - function updateSCMProject() { - var url; - - if (!Empty($scope.project)) { - url = GetBasePath('projects') + $scope.project + '/inventories/'; - Wait('start'); - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - $scope.inventory_files = data; - $scope.inventory_files.push("/ (project root)"); - - if (inventorySourceData.source_path !== "") { - $scope.inventory_file = inventorySourceData.source_path; - if ($scope.inventory_files.indexOf($scope.inventory_file) < 0) { - $scope.inventory_files.push($scope.inventory_file); - } - } else { - $scope.inventory_file = "/ (project root)"; - } - sync_inventory_file_select2(); - Wait('stop'); - }) - .catch(() => { - Alert('Cannot get inventory files', 'Unable to retrieve the list of inventory files for this project.', 'alert-info'); - Wait('stop'); - }); - } - } - - $scope.lookupProject = function(){ - $state.go('.project', { - project_search: { - page_size: '5', - page: '1' - } - }); - }; - - $scope.lookupCredential = function(){ - // For most source type selections, we filter for 1-1 matches to credential_type namespace. - let searchKey = 'credential_type__namespace'; - let searchValue = $scope.source.value; - - // SCM and custom source types are more generic in terms of the credentials they - // accept - any cloud or user-defined credential type can be used. We filter for - // these using the credential_type kind field, which categorizes all cloud and - // user-defined credentials as 'cloud'. - if ($scope.source.value === 'scm') { - searchKey = 'credential_type__kind'; - searchValue = 'cloud'; - } - - if ($scope.source.value === 'custom') { - searchKey = 'credential_type__kind'; - searchValue = 'cloud'; - } - - // When the selection is 'ec2' we actually want to filter for the 'aws' namespace. - if ($scope.source.value === 'ec2') { - searchValue = 'aws'; - } - - $state.go('.credential', { - credential_search: { - [searchKey]: searchValue, - page_size: '5', - page: '1' - } - }); - }; - - $scope.formCancel = function() { - $state.go('^'); - }; - $scope.formSave = function() { - var params; - - console.log($scope); - - params = { - id: inventorySourceData.id, - name: $scope.name, - description: $scope.description, - inventory: inventoryData.id, - source_script: $scope.inventory_script, - credential: $scope.credential, - overwrite: $scope.overwrite, - overwrite_vars: $scope.overwrite_vars, - update_on_launch: $scope.update_on_launch, - update_cache_timeout: $scope.update_cache_timeout || 0, - verbosity: $scope.verbosity.value, - custom_virtualenv: $scope.custom_virtualenv || null, - enabled_var: $scope.enabled_var, - enabled_value: $scope.enabled_value, - host_filter: $scope.host_filter - }; - - if ($scope.source) { - let source_vars = $scope.source.value === 'scm' ? $scope.custom_variables : $scope[$scope.source.value + '_variables']; - params.source_vars = source_vars === '---' || source_vars === '{}' ? null : source_vars; - params.source = $scope.source.value; - if ($scope.source.value === 'scm') { - params.update_on_project_update = $scope.update_on_project_update; - params.source_project = $scope.project; - - if ($scope.inventory_file === '/ (project root)') { - params.source_path = ""; - } else { - params.source_path = $scope.inventory_file; - } - } - } else { - params.source = null; - } - - inventorySource.request('put', { - data: params - }).then(() => { - $state.go('.', null, { reload: true }); - }).catch(({ data, status, config }) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: InventoryHostsStrings.get('error.CALL', { path: `${config.url}`, status }) - }); - }); - }; - - $scope.sourceChange = function(source) { - source = (source && source.value) ? source.value : ''; - if ($scope.source.value === "scm" && $scope.source.value === "custom") { - $scope.credentialBasePath = GetBasePath('credentials') + '?credential_type__kind__in=cloud,network'; - } - else{ - $scope.credentialBasePath = (source === 'ec2') ? GetBasePath('credentials') + '?credential_type__namespace=aws' : GetBasePath('credentials') + (source === '' ? '' : 'credential_type__namespace=' + (source)); - } - if (source === 'ec2' || source === 'custom' || source === 'vmware' || source === 'openstack' || source === 'scm' || source === 'cloudforms' || source === "satellite6") { - $scope.envParseType = 'yaml'; - - var varName; - if (source === 'scm') { - varName = 'custom_variables'; - } else { - varName = source + '_variables'; - } - - $scope[varName] = $scope[varName] === (null || undefined) ? '---' : $scope[varName]; - ParseTypeChange({ - scope: $scope, - field_id: varName, - variable: varName, - parse_variable: 'envParseType' - }); - } - - $scope.cloudCredentialRequired = source !== '' && source !== 'scm' && source !== 'custom' && source !== 'ec2' ? true : false; - $scope.credential = null; - $scope.credential_name = null; - $scope.overwrite_vars = false; - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js deleted file mode 100644 index e66cb0b691..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js +++ /dev/null @@ -1,53 +0,0 @@ -export default { - name: "inventories.edit.inventory_sources.edit", - url: "/edit/:inventory_source_id", - ncyBreadcrumb: { - parent: "inventories.edit.inventory_sources", - label: '{{breadcrumb.inventory_source_name}}' - }, - views: { - 'groupForm@inventories': { - templateProvider: function(GenerateForm, SourcesFormDefinition) { - let form = SourcesFormDefinition; - return GenerateForm.buildHTML(form, { - mode: 'edit', - related: false - }); - }, - controller: 'SourcesEditController' - } - }, - resolve: { - inventorySource: ['InventorySourceModel', '$stateParams', (InventorySource, $stateParams) => { - return new InventorySource('get', $stateParams.inventory_source_id); - }], - inventorySourcesOptions: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.inventorySourcesOptions($stateParams.inventory_id) - .then((response) => response.data); - }], - isNotificationAdmin: ['Rest', 'ProcessErrors', 'GetBasePath', 'i18n', - function(Rest, ProcessErrors, GetBasePath, i18n) { - Rest.setUrl(`${GetBasePath('organizations')}?role_level=notification_admin_role&page_size=1`); - return Rest.get() - .then(({data}) => { - return data.count > 0; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get organizations for which this user is a notification administrator. GET returned ') + status - }); - }); - }], - ConfigData: ['ConfigService', 'ProcessErrors', 'i18n', (ConfigService, ProcessErrors, i18n) => { - return ConfigService.getConfig() - .then(response => response) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get config. GET returned status: ') + status - }); - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js deleted file mode 100644 index b739f2287d..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js +++ /dev/null @@ -1,89 +0,0 @@ -import { N_ } from '../../../../../i18n'; - -export default { - searchPrefix: 'notification', - name: "inventories.edit.inventory_sources.edit.notifications", - url: `/notifications`, - ncyBreadcrumb: { - parent: "inventories.edit.inventory_sources.edit", - label: N_("NOTIFICATIONS") - }, - params: { - [ 'notification_search']: { - value: { order_by: 'name' } - } - }, - views: { - 'related': { - templateProvider: function(FormDefinition, GenerateForm, $stateParams, SourcesFormDefinition) { - var form, html; - if($stateParams && $stateParams.inventory_source_id){ - form = SourcesFormDefinition; - } - else { - form = typeof(FormDefinition) === 'function' ? - FormDefinition() : FormDefinition; - } - html = GenerateForm.buildCollection({ - mode: 'edit', - related: `notifications`, - form: form - }); - return html; - }, - controller: ['$scope', 'NotificationsList', 'Dataset', 'ToggleNotification', 'NotificationsListInit', 'GetBasePath', '$stateParams', - function($scope, list, Dataset, ToggleNotification, NotificationsListInit, GetBasePath, $stateParams) { - var params = $stateParams, - id = params.inventory_source_id, - url = GetBasePath('inventory_sources'); - - function init() { - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - - NotificationsListInit({ - scope: $scope, - url: url, - id: id - }); - - $scope.$watch(`${list.iterator}_dataset`, function() { - // The list data has changed and we need to update which notifications are on/off - $scope.$emit('relatednotifications'); - }); - } - - $scope.toggleNotification = function(event, notifier_id, column) { - var notifier = this.notification; - try { - $(event.target).tooltip('hide'); - } - catch(e) { - // ignore - } - ToggleNotification({ - scope: $scope, - url: url + id, - notifier: notifier, - column: column, - callback: 'NotificationRefresh' - }); - }; - - init(); - - } - ] - } - }, - resolve: { - Dataset: ['NotificationsList', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => { - let path = GetBasePath(list.basePath); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/cancel-source-update.factory.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/cancel-source-update.factory.js deleted file mode 100644 index 97388e03f2..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/cancel-source-update.factory.js +++ /dev/null @@ -1,63 +0,0 @@ -export default - function CancelSourceUpdate(Empty, Rest, ProcessErrors, Alert, Wait, Find) { - return function(params) { - var scope = params.scope, - id = params.id, - inventory_source = params.inventory_source; - - // Cancel the update process - if (Empty(inventory_source)) { - inventory_source = Find({ list: scope.inventory_sources, key: 'id', val: id }); - scope.selected_inventory_source_id = inventory_source.id; - } - - if (inventory_source && (inventory_source.status === 'running' || inventory_source.status === 'pending')) { - // We found the inventory_source, and there is a running update - Wait('start'); - Rest.setUrl(inventory_source.url); - Rest.get() - .then(({data}) => { - // Check that we have access to cancelling an update - var url = (data.related.current_update) ? data.related.current_update : data.related.last_update; - url += 'cancel/'; - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - if (data.can_cancel) { - // Cancel the update process - Rest.setUrl(url); - Rest.post() - .then(() => { - Wait('stop'); - //Alert('Inventory Sync Canceled', 'Request to cancel the sync process was submitted to the task manger. ' + - // 'Click the button to monitor the status.', 'alert-info'); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + ' failed. POST status: ' + status - }); - }); - } - else { - Wait('stop'); - } - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + ' failed. GET status: ' + status - }); - }); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + inventory_source.url + ' failed. GET status: ' + status - }); - }); - } - }; - } - -CancelSourceUpdate.$inject = - [ 'Empty', 'Rest', 'ProcessErrors', - 'Alert', 'Wait', 'Find' - ]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/get-source-type-options.factory.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/get-source-type-options.factory.js deleted file mode 100644 index 33e9b83ca7..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/get-source-type-options.factory.js +++ /dev/null @@ -1,37 +0,0 @@ -export default - function GetSourceTypeOptions(Rest, ProcessErrors, GetBasePath) { - return function(params) { - var scope = params.scope, - variable = params.variable; - - if (scope[variable] === undefined) { - scope[variable] = []; - Rest.setUrl(GetBasePath('inventory_sources')); - Rest.options() - .then(({data}) => { - var i, choices = data.actions.GET.source.choices; - for (i = 0; i < choices.length; i++) { - if (choices[i][0] !== 'file' && choices[i][0] !== "") { - scope[variable].push({ - label: choices[i][1], - value: choices[i][0] - }); - } - } - scope.cloudCredentialRequired = false; - scope.$emit('sourceTypeOptionsReady'); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed to retrieve options for inventory_sources.source. OPTIONS status: ' + status - }); - }); - } - }; - } - -GetSourceTypeOptions.$inject = - [ 'Rest', - 'ProcessErrors', - 'GetBasePath' - ]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js deleted file mode 100644 index 772af4c68b..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js +++ /dev/null @@ -1,61 +0,0 @@ -export default - function GetSyncStatusMsg(i18n) { - return function(params) { - var status = params.status, - launch_class = '', - launch_tip = i18n._('Start sync process'), - schedule_tip = i18n._('Schedule inventory syncs'), - stat, stat_class, status_tip; - - stat = status; - stat_class = stat; - - switch (status) { - case 'never updated': - stat = 'never'; - stat_class = 'na'; - status_tip = i18n._('Sync not performed. Click') + ' ' + i18n._('to start it now.'); - break; - case 'none': - case 'ok': - case '': - launch_class = 'btn-disabled'; - stat = 'n/a'; - stat_class = 'na'; - status_tip = i18n._('Cloud source not configured. Click') + ' ' + i18n._('to update.'); - launch_tip = i18n._('Cloud source not configured.'); - break; - case 'canceled': - status_tip = i18n._('Sync canceled. Click to view log.'); - break; - case 'failed': - status_tip = i18n._('Sync failed. Click to view log.'); - break; - case 'successful': - status_tip = i18n._('Sync completed. Click to view log.'); - break; - case 'pending': - status_tip = i18n._('Sync pending.'); - launch_class = "btn-disabled"; - launch_tip = "Sync pending"; - break; - case 'updating': - case 'running': - launch_class = "btn-disabled"; - launch_tip = i18n._("Sync running"); - status_tip = i18n._("Sync running. Click to view log."); - break; - } - - return { - "class": stat_class, - "tooltip": status_tip, - "status": stat, - "launch_class": launch_class, - "launch_tip": launch_tip, - "schedule_tip": schedule_tip - }; - }; - } - -GetSyncStatusMsg.$inject = ['i18n']; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/view-update-status.factory.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/view-update-status.factory.js deleted file mode 100644 index 5b928e5cf5..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/factories/view-update-status.factory.js +++ /dev/null @@ -1,35 +0,0 @@ -export default - function ViewUpdateStatus($state, Rest, ProcessErrors, Alert, Wait, Empty, Find) { - return function(params) { - var scope = params.scope, - inventory_source_id = params.inventory_source_id, - inventory_source = Find({ list: scope.inventory_sources, key: 'id', val: inventory_source_id }); - - if (inventory_source) { - if (Empty(inventory_source.status) || inventory_source.status === "never updated") { - Alert('No Status Available', '
An inventory sync has not been performed for the selected group. Start the process by ' + - 'clicking the button.
', 'alert-info', null, null, null, null, true); - } else { - Wait('start'); - Rest.setUrl(inventory_source.url); - Rest.get() - .then(({data}) => { - // Get the ID from the correct summary field - var update_id = (data.summary_fields.current_update) ? data.summary_fields.current_update.id : data.summary_fields.last_update.id; - - $state.go('output', { id: update_id, type: 'inventory' }); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed to retrieve inventory source: ' + inventory_source.url + - ' GET returned status: ' + status }); - }); - } - } - }; - } - -ViewUpdateStatus.$inject = - [ '$state', 'Rest', 'ProcessErrors', - 'Alert', 'Wait', 'Empty', 'Find' - ]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/main.js deleted file mode 100644 index 2c7c3b62f8..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './sources-list.controller'; - -export default - angular.module('sourcesList', []) - .controller('SourcesListController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js deleted file mode 100644 index 0b38774378..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js +++ /dev/null @@ -1,17 +0,0 @@ -import { N_ } from '../../../../../../i18n'; -import {templateUrl} from '../../../../../../shared/template-url/template-url.factory'; - -export default { - name: 'inventories.edit.inventory_sources.edit.schedules.add', - url: '/add', - ncyBreadcrumb: { - parent: 'inventories.edit.inventory_sources.edit.schedules', - label: N_("CREATE SCHEDULE") - }, - views: { - 'scheduler@inventories': { - controller: 'schedulerAddController', - templateUrl: templateUrl("scheduler/schedulerForm") - } - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-edit.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-edit.route.js deleted file mode 100644 index 2c956fd6cd..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-edit.route.js +++ /dev/null @@ -1,18 +0,0 @@ -import {templateUrl} from '../../../../../../shared/template-url/template-url.factory'; -import editScheduleResolve from '../../../../../../scheduler/editSchedule.resolve'; - -export default { - name: 'inventories.edit.inventory_sources.edit.schedules.edit', - url: '/:schedule_id', - ncyBreadcrumb: { - parent: 'inventories.edit.inventory_sources.edit.schedules', - label: "{{breadcrumb.schedule_name}}" - }, - views: { - 'scheduler@inventories': { - templateUrl: templateUrl("scheduler/schedulerForm"), - controller: 'schedulerEditController', - } - }, - resolve: editScheduleResolve() -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js deleted file mode 100644 index 89cd27dffe..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js +++ /dev/null @@ -1,54 +0,0 @@ -import { N_ } from '../../../../../../i18n'; - -export default { - searchPrefix: 'schedule', - name: 'inventories.edit.inventory_sources.edit.schedules', - url: '/schedules', - ncyBreadcrumb: { - parent: 'inventories.edit.inventory_sources.edit', - label: N_('SCHEDULES') - }, - views: { - 'related': { - templateProvider: function(ScheduleList, generateList){ - let html = generateList.build({ - list: ScheduleList, - mode: 'edit' - }); - return html; - }, - controller: 'schedulerListController' - } - }, - resolve: { - Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath', 'inventorySource', - function(list, qs, $stateParams, GetBasePath, inventorySource) { - let path = `${inventorySource.get().related.schedules}`; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ParentObject: ['inventorySource', function(inventorySource) { - return inventorySource.get(); - }], - UnifiedJobsOptions: ['Rest', 'GetBasePath', '$stateParams', '$q', - function(Rest, GetBasePath, $stateParams, $q) { - Rest.setUrl(GetBasePath('unified_jobs')); - var val = $q.defer(); - Rest.options() - .then(function(data) { - val.resolve(data.data); - }, function(data) { - val.reject(data); - }); - return val.promise; - }], - ScheduleList: ['SchedulesList', 'inventorySource', - (SchedulesList, inventorySource) => { - let list = _.cloneDeep(SchedulesList); - list.basePath = `${inventorySource.get().related.schedules}`; - list.title = false; - return list; - } - ] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js deleted file mode 100644 index 5efa694624..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js +++ /dev/null @@ -1,217 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - export default - ['$scope', '$rootScope', '$state', '$stateParams', 'SourcesListDefinition', - 'InventoryUpdate', 'CancelSourceUpdate', - 'ViewUpdateStatus', 'rbacUiControlService', 'GetBasePath', - 'GetSyncStatusMsg', 'Dataset', 'Find', 'QuerySet', - 'inventoryData', '$filter', 'Prompt', 'Wait', 'SourcesService', 'inventorySourceOptions', - 'canAdd', 'hasSyncableSources', 'i18n', 'InventoryHostsStrings', 'InventorySourceModel', 'ProcessErrors', - function($scope, $rootScope, $state, $stateParams, SourcesListDefinition, - InventoryUpdate, CancelSourceUpdate, - ViewUpdateStatus, rbacUiControlService, GetBasePath, GetSyncStatusMsg, - Dataset, Find, qs, inventoryData, $filter, Prompt, - Wait, SourcesService, inventorySourceOptions, canAdd, hasSyncableSources, i18n, - InventoryHostsStrings, InventorySource, ProcessErrors){ - - let inventorySource = new InventorySource(); - - let list = SourcesListDefinition; - var inventory_source; - - init(); - - function init(){ - $scope.inventory_id = $stateParams.inventory_id; - $scope.canAdhoc = inventoryData.summary_fields.user_capabilities.adhoc; - $scope.canAdd = canAdd; - $scope.showSyncAll = hasSyncableSources; - - // Search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $scope.inventory_id = $stateParams.inventory_id; - _.forEach($scope[list.name], buildStatusIndicators); - optionsRequestDataProcessing(); - - $scope.$on(`ws-jobs`, function(e, data){ - inventory_source = Find({ list: $scope.inventory_sources, key: 'id', val: data.inventory_source_id }); - - if (inventory_source) { - var status = GetSyncStatusMsg({ - status: data.status - }); - inventory_source.status = data.status; - inventory_source.status_class = status.class; - inventory_source.status_tooltip = status.tooltip; - inventory_source.launch_tooltip = status.launch_tip; - inventory_source.launch_class = status.launch_class; - } - }); - - $scope.$watchCollection(`${$scope.list.name}`, function() { - _.forEach($scope[list.name], buildStatusIndicators); - optionsRequestDataProcessing(); - }); - } - - function optionsRequestDataProcessing(){ - if ($scope[list.name] !== undefined) { - $scope[list.name].forEach(function(item, item_idx) { - var itm = $scope[list.name][item_idx]; - - // Set the item source label - if (list.fields.source && inventorySourceOptions && inventorySourceOptions.hasOwnProperty('source')) { - inventorySourceOptions.source.choices.forEach(function(choice) { - if (choice[0] === item.source) { - itm.source_label = choice[1]; - } - }); - } - }); - } - } - - function buildStatusIndicators(inventory_source){ - if (inventory_source === undefined || inventory_source === null) { - inventory_source = {}; - } - - let inventory_source_status; - - inventory_source_status = GetSyncStatusMsg({ - status: inventory_source.status, - has_inventory_sources: inventory_source.has_inventory_sources, - source: ( (inventory_source) ? inventory_source.source : null ) - }); - _.assign(inventory_source, - {status_class: inventory_source_status.class}, - {status_tooltip: inventory_source_status.tooltip}, - {launch_tooltip: inventory_source_status.launch_tip}, - {launch_class: inventory_source_status.launch_class}, - {source: inventory_source ? inventory_source.source : null}, - {status: inventory_source ? inventory_source.status : null}); - } - - $scope.createSource = function(){ - $state.go('inventories.edit.inventory_sources.add'); - }; - $scope.editSource = function(id){ - $state.go('inventories.edit.inventory_sources.edit', {inventory_source_id: id}); - }; - $scope.deleteSource = function(inventory_source){ - var action = function(){ - $rootScope.promptActionBtnClass = "Modal-errorButton--sourcesDelete"; - Wait('start'); - let hostDelete = SourcesService.deleteHosts(inventory_source.id).catch(({data, status}) => { - $('#prompt-modal').modal('hide'); - Wait('stop'); - ProcessErrors($scope, data, status, null, - { - hdr: i18n._('Error!'), - msg: i18n._('There was an error deleting inventory source hosts. Returned status: ') + - status - }); - }); - let groupDelete = SourcesService.deleteGroups(inventory_source.id).catch(({data, status}) => { - $('#prompt-modal').modal('hide'); - Wait('stop'); - ProcessErrors($scope, data, status, null, - { - hdr: i18n._('Error!'), - msg: i18n._('There was an error deleting inventory source groups. Returned status: ') + - status - }); - }); - Promise.all([hostDelete, groupDelete]).then(() => { - SourcesService.delete(inventory_source.id).then(() => { - $('#prompt-modal').modal('hide'); - delete $rootScope.promptActionBtnClass; - let reloadListStateParams = null; - - if($scope.inventory_sources.length === 1 && $state.params.inventory_source_search && !_.isEmpty($state.params.inventory_source_search.page) && $state.params.inventory_source_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.inventory_source_search.page = (parseInt(reloadListStateParams.inventory_source_search.page)-1).toString(); - } - if (parseInt($state.params.inventory_source_id) === inventory_source.id) { - $state.go('^', reloadListStateParams, {reload: true}); - } else { - $state.go('.', reloadListStateParams, {reload: true}); - } - Wait('stop'); - }) - .catch(({data, status}) => { - $('#prompt-modal').modal('hide'); - Wait('stop'); - ProcessErrors($scope, data, status, null, - { - hdr: i18n._('Error!'), - msg: i18n._('There was an error deleting inventory source. Returned status: ') + - status - }); - }); - }); - }; - - inventorySource.getDependentResourceCounts(inventory_source.id) - .then((counts) => { - const invalidateRelatedLines = []; - let deleteModalBody = `
${InventoryHostsStrings.get('deleteResource.CONFIRM', 'inventory source')}
`; - - counts.forEach(countObj => { - if(countObj.count && countObj.count > 0) { - invalidateRelatedLines.push(`
${countObj.label}${countObj.count}
`); - } - }); - - if (invalidateRelatedLines && invalidateRelatedLines.length > 0) { - deleteModalBody = `
${InventoryHostsStrings.get('deleteResource.USED_BY', 'inventory source')} ${InventoryHostsStrings.get('deleteResource.CONFIRM', 'inventory source')}
`; - invalidateRelatedLines.forEach(invalidateRelatedLine => { - deleteModalBody += invalidateRelatedLine; - }); - } - - Prompt({ - hdr: i18n._('Delete Source'), - resourceName: $filter('sanitize')(inventory_source.name), - body: deleteModalBody, - action: action, - actionText: i18n._('DELETE') - }); - $rootScope.promptActionBtnClass = 'Modal-errorButton'; - }); - - }; - - $scope.updateSource = function(inventory_source) { - InventoryUpdate({ - scope: $scope, - url: inventory_source.related.update - }); - }; - - $scope.cancelUpdate = function (id) { - CancelSourceUpdate({ scope: $scope, id: id }); - }; - - $scope.viewUpdateStatus = function (id) { - ViewUpdateStatus({ - scope: $scope, - inventory_source_id: id - }); - }; - - $scope.syncAllSources = function() { - InventoryUpdate({ - scope: $scope, - url: inventoryData.related.update_inventory_sources, - updateAllSources: true - }); - }; - - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html b/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html deleted file mode 100644 index 5ac271784d..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html +++ /dev/null @@ -1,29 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js deleted file mode 100644 index 0bc50c9e75..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js +++ /dev/null @@ -1,90 +0,0 @@ -import { N_ } from '../../../../../i18n'; - -export default { - name: "inventories.edit.inventory_sources", - url: "/inventory_sources?{inventory_source_search:queryset}", - params: { - inventory_source_search: { - value: { - page_size: "20", - order_by: "name", - not__source: "" - }, - dynamic: true, - squash: "" - } - }, - data: { - socket: { - groups: { - jobs: ["status_changed"], - inventories: ["status_changed"] - } - } - }, - ncyBreadcrumb: { - parent: "inventories.edit", - label: N_("SOURCES") - }, - views: { - 'related': { - templateProvider: function(SourcesListDefinition, generateList) { - let list = _.cloneDeep(SourcesListDefinition); - let html = generateList.build({ - list: list, - mode: 'edit' - }); - return html; - }, - controller: 'SourcesListController' - } - }, - resolve: { - inventorySourceOptions: ['SourcesService', (SourcesService) => { - return SourcesService.options().then(response => response.data.actions.GET); - }], - Dataset: ['SourcesListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - inventoryData: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.getInventory($stateParams.inventory_id).then(res => res.data); - }], - canAdd: ['rbacUiControlService', 'GetBasePath', '$stateParams', function(rbacUiControlService, GetBasePath, $stateParams) { - return rbacUiControlService.canAdd(GetBasePath('inventory') + $stateParams.inventory_id + "/inventory_sources") - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - return false; - }); - }], - hasSyncableSources: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.updateInventorySourcesGet($stateParams.inventory_id) - .then(function(res) { - let canUpdateFound = false; - if(res.data && res.data.length > 0) { - res.data.forEach(function(source) { - if(source.can_update) { - canUpdateFound = true; - } - }); - } - - return canUpdateFound; - }) - .catch(function() { - return false; - }); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-credential.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-credential.route.js deleted file mode 100644 index a61e96725e..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-credential.route.js +++ /dev/null @@ -1,55 +0,0 @@ -export default { - params: { - credential_search: { - value: { - page_size:"5", - order_by:"name", - role_level:"use_role", - kind: null, - credential_type__kind: null - }, - dynamic:true, - squash:"" - } - }, - data: { - basePath:"credentials", - formChildState:true - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'modal': { - templateProvider: function(ListDefinition, generateList) { - let list_html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - return `${list_html}`; - - } - } - }, - resolve: { - ListDefinition: ['CredentialList', function(list) { - return list; - }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$transition$', - (list, qs, $stateParams, GetBasePath, $transition$) => { - const toState = $transition$.to(); - toState.params.credential_search.value.credential_type__namespace = _.get($stateParams, 'credential_search.credential_type__namespace', null); - toState.params.credential_search.value.credential_type__kind = _.get($stateParams, 'credential_search.credential_type__kind', null); - return qs.search(GetBasePath('credentials'), $stateParams[`${list.iterator}_search`]); - } - ] - }, - onExit: function($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-inventory-script.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-inventory-script.route.js deleted file mode 100644 index c2a9ab71b9..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-inventory-script.route.js +++ /dev/null @@ -1,65 +0,0 @@ -export default { - params: { - inventory_script_search: { - value: { - page_size: "5", - order_by: "name", - role_level: "admin_role", - }, - dynamic: true, - squash: "" - } - }, - data: { - basePath: "inventory_scripts", - formChildState: true - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'modal': { - templateProvider: function(ListDefinition, generateList) { - let list_html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - return `${list_html}`; - - } - } - }, - resolve: { - ListDefinition: ['InventoryScriptsList', function(list) { - return list; - }], - OrganizationId: ['ListDefinition', 'InventoriesService', '$stateParams', '$rootScope', - function(list, InventoriesService, $stateParams, $rootScope){ - if($rootScope.$$childTail && - $rootScope.$$childTail.$resolve && - $rootScope.$$childTail.$resolve.hasOwnProperty('inventoryData')){ - return $rootScope.$$childTail.$resolve.inventoryData.summary_fields.organization.id; - } - else { - return InventoriesService.getInventory($stateParams.inventory_id).then(res => res.data.summary_fields.organization.id); - } - }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', '$state', 'OrganizationId', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope, $state, OrganizationId) => { - - $stateParams[`${list.iterator}_search`].role_level = "admin_role"; - $stateParams[`${list.iterator}_search`].organization = OrganizationId; - - return qs.search(GetBasePath('inventory_scripts'), $stateParams[`${list.iterator}_search`]); - } - ] - }, - onExit: function($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-project.route.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-project.route.js deleted file mode 100644 index 53869691a7..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/lookup/sources-lookup-project.route.js +++ /dev/null @@ -1,51 +0,0 @@ -export default { - params: { - project_search: { - value: { - page_size:"5", - order_by:"name", - not__status:"never updated", - role_level:"use_role", - }, - dynamic:true, - squash:"" - } - }, - data: { - basePath:"projects", - formChildState:true - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'modal': { - templateProvider: function(ListDefinition, generateList) { - let list_html = generateList.build({ - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }); - return `${list_html}`; - - } - } - }, - resolve: { - ListDefinition: ['ProjectList', function(list) { - return list; - }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', - (list, qs, $stateParams, GetBasePath) => { - return qs.search(GetBasePath('projects'), $stateParams[`${list.iterator}_search`]); - } - ] - }, - onExit: function($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/main.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/main.js deleted file mode 100644 index 51eafc26c6..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/main.js +++ /dev/null @@ -1,30 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import sourcesList from './list/main'; -import sourcesAdd from './add/main'; -import sourcesEdit from './edit/main'; -import sourcesFormDefinition from './sources.form'; -import sourcesListDefinition from './sources.list'; -import service from './sources.service'; -import GetSyncStatusMsg from './factories/get-sync-status-msg.factory'; -import ViewUpdateStatus from './factories/view-update-status.factory'; -import CancelSourceUpdate from './factories/cancel-source-update.factory'; -import GetSourceTypeOptions from './factories/get-source-type-options.factory'; - -export default - angular.module('sources', [ - sourcesList.name, - sourcesAdd.name, - sourcesEdit.name - ]) - .factory('SourcesFormDefinition', sourcesFormDefinition) - .factory('SourcesListDefinition', sourcesListDefinition) - .factory('GetSyncStatusMsg', GetSyncStatusMsg) - .factory('ViewUpdateStatus', ViewUpdateStatus) - .factory('CancelSourceUpdate', CancelSourceUpdate) - .factory('GetSourceTypeOptions', GetSourceTypeOptions) - .service('SourcesService', service); diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.form.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.form.js deleted file mode 100644 index 01e322e24d..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.form.js +++ /dev/null @@ -1,534 +0,0 @@ -/************************************************* - * Copyright (c) 2019 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['NotificationsList', 'i18n', function(NotificationsList, i18n){ - - var notifications_object = { - generateList: true, - include: "NotificationsList", - ngIf: "(sufficientRoleForNotif) && !(inventory_source_obj.source === undefined || inventory_source_obj.source === '')", - ngClick: "$state.go('inventories.edit.inventory_sources.edit.notifications')" - }; - let clone = _.clone(NotificationsList); - notifications_object = angular.extend(clone, notifications_object); - return { - addTitle: i18n._('CREATE SOURCE'), - editTitle: '{{ name }}', - showTitle: true, - name: 'inventory_source', - basePath: 'inventory_sources', - parent: 'inventories.edit.sources', - // the parent node this generated state definition tree expects to attach to - stateTree: 'inventories', - tabs: true, - // form generator inspects the current state name to determine whether or not to set an active (.is-selected) class on a form tab - // this setting is optional on most forms, except where the form's edit state name is not parentStateName.edit - activeEditState: 'inventories.edit.inventory_sources.edit', - detailsClick: "$state.go('inventories.edit.inventory_sources.edit')", - well: false, - subFormTitles: { - sourceSubForm: i18n._('Source Details'), - }, - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - tab: 'properties' - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - tab: 'properties' - }, - source: { - label: i18n._('Source'), - type: 'select', - required: true, - ngOptions: 'source.label for source in source_type_options track by source.value', - ngChange: 'sourceChange(source)', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - ngModel: 'source', - hasSubForm: true - }, - custom_virtualenv: { - label: i18n._('Ansible Environment'), - type: 'select', - defaultText: i18n._('Use Default Environment'), - ngOptions: 'venv for venv in custom_virtualenvs_options track by venv', - - awPopOver: "

" + i18n._("Select the custom Python virtual environment for this inventory source sync to run on.") + "

", - dataTitle: i18n._('Ansible Environment'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - ngShow: 'custom_virtualenvs_options.length > 1' - }, - credential: { - label: i18n._('Credential'), - type: 'lookup', - list: 'CredentialList', - basePath: 'credentials', - ngShow: "source && source.value !== ''", - sourceModel: 'credential', - sourceField: 'name', - ngClick: 'lookupCredential()', - awRequiredWhen: { - reqExpression: "cloudCredentialRequired", - init: "false" - }, - subForm: 'sourceSubForm', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - watchBasePath: "credentialBasePath" - }, - project: { - // initializes a default value for this search param - // search params with default values set will not generate user-interactable search tags - label: i18n._('Project'), - type: 'lookup', - list: 'ProjectList', - basePath: 'projects', - ngShow: "source && source.value === 'scm'", - sourceModel: 'project', - sourceField: 'name', - ngClick: 'lookupProject()', - awRequiredWhen: { - reqExpression: "source && source.value === 'scm'", - init: "false" - }, - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - watchBasePath: "projectBasePath", - subForm: 'sourceSubForm' - }, - inventory_file: { - label: i18n._('Inventory File'), - type:'select', - defaultText: i18n._('Choose an inventory file'), - ngOptions: 'file for file in inventory_files track by file', - ngShow: "source && source.value === 'scm'", - ngDisabled: "!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd) || disableInventoryFileBecausePermissionDenied", - id: 'inventory-file-select', - awRequiredWhen: { - reqExpression: "source && source.value === 'scm'", - init: "true" - }, - column: 1, - awPopOver: "

" + i18n._("Select the inventory file to be synced by this source. " + - "You can select from the dropdown or enter a file within the input.") + "

", - dataTitle: i18n._('Inventory File'), - dataPlacement: 'right', - dataContainer: "body", - includeInventoryFileNotFoundError: true, - subForm: 'sourceSubForm' - }, - inventory_script: { - label : i18n._("Custom Inventory Script"), - type: 'lookup', - basePath: 'inventory_scripts', - list: 'InventoryScriptsList', - ngShow: "source && source.value === 'custom'", - sourceModel: 'inventory_script', - sourceField: 'name', - awRequiredWhen: { - reqExpression: "source && source.value === 'custom'", - init: "false" - }, - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - subForm: 'sourceSubForm' - }, - custom_variables: { - id: 'custom_variables', - label: i18n._('Environment Variables'), //"{{vars_label}}" , - ngShow: "source && source.value=='custom' || source.value === 'scm'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Environment Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Provide environment variables to pass to the custom inventory script.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - ec2_variables: { - id: 'ec2_variables', - label: i18n._('Source Variables'), //"{{vars_label}}" , - ngShow: "source && source.value == 'ec2'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "aws_ec2 " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - vmware_variables: { - id: 'vmware_variables', - label: i18n._('Source Variables'), //"{{vars_label}}" , - ngShow: "source && source.value == 'vmware'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "vmware_vm_inventory " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - openstack_variables: { - id: 'openstack_variables', - label: i18n._('Source Variables'), //"{{vars_label}}" , - ngShow: "source && source.value == 'openstack'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "openstack " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - cloudforms_variables: { - id: 'cloudforms_variables', - label: i18n._('Source Variables'), - ngShow: "source && source.value == 'cloudforms'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: i18n._("Override variables found in cloudforms.ini and used by the inventory update script. For an example variable configuration") + - '' + - i18n._("view cloudforms.ini in the Ansible Collections github repo.") + "" + i18n._(" Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax."), - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - satellite6_variables: { - id: 'satellite6_variables', - label: i18n._('Source Variables'), - ngShow: "source && source.value == 'satellite6'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "foreman " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - azure_rm_variables: { - id: 'azure_rm_variables', - label: i18n._('Source Variables'), //"{{vars_label}}" , - ngShow: "source && source.value == 'azure_rm'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "azure_rm " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - gce_variables: { - id: 'gce_variables', - label: i18n._('Source Variables'), //"{{vars_label}}" , - ngShow: "source && source.value == 'gce'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "gcp_compute " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - tower_variables: { - id: 'tower_variables', - label: i18n._('Source Variables'), //"{{vars_label}}" , - ngShow: "source && source.value == 'tower'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "tower " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - rhv_variables: { - id: 'rhv_variables', - label: i18n._('Source Variables'), //"{{vars_label}}" , - ngShow: "source && source.value == 'rhv'", - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - 'default': '---', - parseTypeName: 'envParseType', - dataTitle: i18n._("Source Variables"), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Enter variables to configure the inventory source. For a detailed description of how to configure this plugin, see ") + - "" + - i18n._("Inventory Plugins") + " " + i18n._("in the documentation and the ") + - "ovirt " + - i18n._("plugin configuration guide.") + "

" + - "

" + i18n._("Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - i18n._("JSON:") + "
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - i18n._("YAML:") + "
\n" + - "
---
somevar: somevalue
password: magic
\n" + - "

" + i18n._("View JSON examples at ") + 'www.json.org

' + - "

" + i18n._("View YAML examples at ") + 'docs.ansible.com

', - dataContainer: 'body', - subForm: 'sourceSubForm' - }, - verbosity: { - label: i18n._('Verbosity'), - type: 'select', - ngOptions: 'v.label for v in verbosity_options track by v.value', - ngShow: "source && (source.value !== '' && source.value !== null)", - disableChooseOption: true, - column: 1, - awPopOver: "

" + i18n._("Control the level of output ansible will produce for inventory source update jobs.") + "

", - dataTitle: i18n._('Verbosity'), - dataPlacement: 'right', - dataContainer: "body", - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - subForm: 'sourceSubForm' - }, - host_filter: { - label: i18n._("Host Filter"), - type: 'text', - dataTitle: i18n._('Host Filter'), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Regular expression where only matching host names will be imported. The filter is applied as a post-processing step after any inventory plugin filters are applied.") + "

", - dataContainer: 'body', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - subForm: 'sourceSubForm' - }, - enabled_var: { - label: i18n._("Enabled Variable"), - type: 'text', - dataTitle: i18n._('Enabled Variable'), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified using dot notation, e.g: 'foo.bar'") + "

", - dataContainer: 'body', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - subForm: 'sourceSubForm' - }, - enabled_value: { - label: i18n._("Enabled Value"), - type: 'text', - dataTitle: i18n._('Enabled Value'), - dataPlacement: 'right', - awPopOver: "

" + i18n._("This field is ignored unless an Enabled Variable is set. If the enabled variable matches this value, the host will be enabled on import.") + "

", - dataContainer: 'body', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - subForm: 'sourceSubForm' - }, - checkbox_group: { - label: i18n._('Update Options'), - type: 'checkbox_group', - ngShow: "source && (source.value !== '' && source.value !== null)", - subForm: 'sourceSubForm', - fields: [{ - name: 'overwrite', - label: i18n._('Overwrite'), - type: 'checkbox', - ngShow: "source.value !== '' && source.value !== null", - awPopOver: "

" + i18n._("If checked, any hosts and groups that were previously present on the external source but are now removed will be removed from the Tower inventory. Hosts and groups that were not managed by the inventory source will be promoted to the next manually created group or if there is no manually created group to promote them into, they will be left in the \"all\" default group for the inventory.") + '

' + - i18n._("When not checked, local child hosts and groups not found on the external source will remain untouched by the inventory update process.") + "

", - dataTitle: i18n._('Overwrite'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: "(!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd))" - }, { - name: 'overwrite_vars', - label: i18n._('Overwrite Variables'), - type: 'checkbox', - ngShow: "source.value !== '' && source.value !== null", - awPopOver: "

" + i18n._("If checked, all variables for child groups and hosts will be removed and replaced by those found on the external source.") + '

' + - i18n._("When not checked, a merge will be performed, combining local variables with those found on the external source.") + "

", - dataTitle: i18n._('Overwrite Variables'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: "(!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd))" - }, { - name: 'update_on_launch', - label: i18n._('Update on Launch'), - type: 'checkbox', - ngShow: "source.value !== '' && source.value !== null", - awPopOver: "

" + i18n._("Each time a job runs using this inventory, " + - "refresh the inventory from the selected source before executing job tasks.") + "

", - dataTitle: i18n._('Update on Launch'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)' - }, { - name: 'update_on_project_update', - label: i18n._('Update on Project Update'), - type: 'checkbox', - ngShow: "source.value === 'scm'", - awPopOver: "

" + i18n._("After every project update where the SCM revision changes, " + - "refresh the inventory from the selected source before executing job tasks. " + - "This is intended for static content, like the Ansible inventory .ini file format.") + "

", - dataTitle: i18n._('Update on Project Update'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)' - }] - }, - update_cache_timeout: { - label: i18n._("Cache Timeout") + " " + i18n._("(seconds)") + "", - id: 'source-cache-timeout', - type: 'number', - ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)', - integer: true, - min: 0, - ngShow: "source && source.value !== '' && update_on_launch", - spinner: true, - "default": 0, - awPopOver: "

" + i18n._("Time in seconds to consider an inventory sync to be current. " + - "During job runs and callbacks the task system will evaluate the timestamp of the latest sync. " + - "If it is older than Cache Timeout, it is not considered current, and a new inventory sync will be performed.") + "

", - dataTitle: i18n._('Cache Timeout'), - dataPlacement: 'right', - dataContainer: "body", - subForm: 'sourceSubForm' - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - related: { - notifications: notifications_object, - schedules: { - title: i18n._('Schedules'), - skipGenerator: true, - ngClick: "$state.go('inventories.edit.inventory_sources.edit.schedules')" - } - } - - }; - -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.list.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.list.js deleted file mode 100644 index 4350de5823..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.list.js +++ /dev/null @@ -1,127 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['i18n', function(i18n) { - return { - name: 'inventory_sources', - iterator: 'inventory_source', - editTitle: '{{ inventory_source.name }}', - well: true, - wellOverride: true, - index: false, - hover: true, - trackBy: 'inventory_source.id', - basePath: 'api/v2/inventories/{{$stateParams.inventory_id}}/inventory_sources/', - layoutClass: 'List-staticColumnLayout--statusOrCheckbox', - staticColumns: [ - { - field: 'sync_status', - content: { - label: '', - nosort: true, - mode: 'all', - iconOnly: true, - ngClick: 'viewUpdateStatus(inventory_source.id)', - awToolTip: "{{ inventory_source.status_tooltip }}", - dataTipWatch: "inventory_source.status_tooltip", - icon: "{{ 'fa icon-cloud-' + inventory_source.status_class }}", - ngClass: "inventory_source.status_class", - dataPlacement: "top", - } - } - ], - - fields: { - name: { - label: i18n._('Sources'), - key: true, - uiSref: "inventories.edit.inventory_sources.edit({inventory_source_id:inventory_source.id})", - columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-4', - }, - source: { - label: i18n._('Type'), - ngBind: 'inventory_source.source_label', - columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-4' - } - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshGroups()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - sync_all: { - mode: 'all', - awToolTip: i18n._("Sync all inventory sources"), - ngClick: "syncAllSources()", - ngShow: "showSyncAll", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('SYNC ALL'), - dataPlacement: "top" - }, - create: { - mode: 'all', - ngClick: "createSource()", - awToolTip: i18n._("Create a new source"), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd', - dataPlacement: "top", - } - }, - - fieldActions: { - - columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-4 text-right', - - edit: { - mode: 'all', - ngClick: "editSource(inventory_source.id)", - awToolTip: i18n._('Edit source'), - dataPlacement: "top", - ngShow: "inventory_source.summary_fields.user_capabilities.edit" - }, - source_update: { - mode: 'all', - ngClick: 'updateSource(inventory_source)', - awToolTip: "{{ inventory_source.launch_tooltip }}", - dataTipWatch: "inventory_source.launch_tooltip", - ngShow: "(inventory_source.status !== 'running' && inventory_source.status " + - "!== 'pending' && inventory_source.status !== 'updating') && inventory_source.summary_fields.user_capabilities.start", - ngClass: "inventory_source.launch_class", - dataPlacement: "top", - }, - cancel: { - mode: 'all', - ngClick: "cancelUpdate(inventory_source.id)", - awToolTip: i18n._("Cancel sync process"), - 'class': 'red-txt', - ngShow: "(inventory_source.status == 'running' || inventory_source.status == 'pending' " + - "|| inventory_source.status == 'updating') && inventory_source.summary_fields.user_capabilities.start", - dataPlacement: "top", - iconClass: "fa fa-minus-circle" - }, - view: { - mode: 'all', - ngClick: "editSource(inventory_source.id)", - awToolTip: i18n._('View source'), - dataPlacement: "top", - ngShow: "!inventory_source.summary_fields.user_capabilities.edit" - }, - "delete": { - mode: 'all', - ngClick: "deleteSource(inventory_source)", - awToolTip: i18n._('Delete source'), - dataPlacement: "top", - ngShow: "inventory_source.summary_fields.user_capabilities.delete" - } - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.service.js b/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.service.js deleted file mode 100644 index a42ac51097..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/related/sources/sources.service.js +++ /dev/null @@ -1,136 +0,0 @@ -export default -['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', 'Wait', function($rootScope, Rest, GetBasePath, ProcessErrors, Wait){ - return { - stringifyParams: function(params){ - return _.reduce(params, (result, value, key) => { - return result + key + '=' + value + '&'; - }, ''); - }, - // cute abstractions via fn.bind() - url: function(){ - return ''; - }, - error: function(data) { - ProcessErrors($rootScope, data.data, data.status, null, { hdr: 'Error!', - msg: 'Call to ' + this.url + '. GET returned: ' + data.status }); - }, - success: function(data){ - return data; - }, - // HTTP methods - get: function(params){ - Wait('start'); - this.url = GetBasePath('inventory_sources') + '?' + this.stringifyParams(params); - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - post: function(inventory_source){ - Wait('start'); - this.url = GetBasePath('inventory_sources'); - Rest.setUrl(this.url); - return Rest.post(inventory_source) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - put: function(inventory_source){ - Wait('start'); - this.url = GetBasePath('inventory_sources') + inventory_source.id; - Rest.setUrl(this.url); - return Rest.put(inventory_source) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - delete: function(id){ - Wait('start'); - this.url = GetBasePath('inventory_sources') + id; - Rest.setUrl(this.url); - return Rest.destroy() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - options: function(){ - this.url = GetBasePath('inventory_sources'); - Rest.setUrl(this.url); - return Rest.options() - .then(this.success.bind(this)) - .catch(this.error.bind(this)); - }, - getCredential: function(id){ - Wait('start'); - this.url = GetBasePath('credentials') + id; - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - getInventorySource: function(params){ - Wait('start'); - this.url = GetBasePath('inventory_sources') + '?' + this.stringifyParams(params); - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - putInventorySource: function(params, url){ - Wait('start'); - this.url = url; - Rest.setUrl(this.url); - return Rest.put(params) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - // these relationship setters could be consolidated, but verbosity makes the operation feel more clear @ controller level - associateGroup: function(group, target){ - Wait('start'); - this.url = GetBasePath('groups') + target + '/children/'; - Rest.setUrl(this.url); - return Rest.post(group) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - disassociateGroup: function(group, parent){ - Wait('start'); - this.url = GetBasePath('groups') + parent + '/children/'; - Rest.setUrl(this.url); - return Rest.post({id: group, disassociate: 1}) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - promote: function(group, inventory){ - Wait('start'); - this.url = GetBasePath('inventory') + inventory + '/groups/'; - Rest.setUrl(this.url); - return Rest.post({id: group, disassociate: 1}) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - deleteHosts(id) { - this.url = GetBasePath('inventory_sources') + id + '/hosts/'; - Rest.setUrl(this.url); - return Rest.destroy() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(); - }, - deleteGroups(id) { - this.url = GetBasePath('inventory_sources') + id + '/groups/'; - Rest.setUrl(this.url); - return Rest.destroy() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(); - } - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/add/main.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/add/main.js deleted file mode 100644 index 911492557f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './smart-inventory-add.controller'; - -export default -angular.module('smartInventoryAdd', []) - .controller('SmartInventoryAddController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/add/smart-inventory-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/add/smart-inventory-add.controller.js deleted file mode 100644 index 1f21e3844f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/add/smart-inventory-add.controller.js +++ /dev/null @@ -1,102 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Inventories - * @description This controller's for the Inventory page - */ - -function SmartInventoryAdd($scope, $location, - GenerateForm, smartInventoryForm, rbacUiControlService, Rest, Alert, ProcessErrors, - GetBasePath, ParseTypeChange, Wait, ToJSON, - $state, canAdd, InstanceGroupsService) { - - $scope.canAdd = canAdd; - - // Inject dynamic view - var defaultUrl = GetBasePath('inventory'), - form = smartInventoryForm; - - init(); - - function init() { - $scope.canEditOrg = true; - form.formLabelSize = null; - form.formFieldSize = null; - - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - $scope.parseType = 'yaml'; - ParseTypeChange({ - scope: $scope, - variable: 'smartinventory_variables', - parse_variable: 'parseType', - field_id: 'smartinventory_smartinventory_variables' - }); - - $scope.smart_hosts = $state.params.hostfilter ? JSON.parse($state.params.hostfilter) : ''; - } - - // Save - $scope.formSave = function() { - Wait('start'); - try { - let fld, data = {}; - - for (fld in form.fields) { - data[fld] = $scope[fld]; - } - - data.variables = ToJSON($scope.parseType, $scope.smartinventory_variables, true); - - data.host_filter = decodeURIComponent($scope.smart_hosts.host_filter); - - data.kind = "smart"; - - Rest.setUrl(defaultUrl); - Rest.post(data) - .then(({data}) => { - const inventory_id = data.id, - instance_group_url = data.related.instance_groups; - - InstanceGroupsService.addInstanceGroups(instance_group_url, $scope.instance_groups) - .then(() => { - Wait('stop'); - $state.go('inventories.editSmartInventory', {smartinventory_id: inventory_id}, {reload: true}); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to post instance groups. POST returned ' + - 'status: ' + status - }); - }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to add new inventory. Post returned status: ' + status - }); - }); - } catch (err) { - Wait('stop'); - Alert("Error", "Error parsing inventory variables. Parser returned: " + err); - } - - }; - - $scope.formCancel = function() { - $state.go('inventories'); - }; -} - -export default ['$scope', '$location', - 'GenerateForm', 'smartInventoryForm', 'rbacUiControlService', 'Rest', 'Alert', - 'ProcessErrors', 'GetBasePath', 'ParseTypeChange', - 'Wait', 'ToJSON', '$state', 'canAdd', 'InstanceGroupsService', SmartInventoryAdd -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/edit/main.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/edit/main.js deleted file mode 100644 index b5c59c9e6d..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/edit/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './smart-inventory-edit.controller'; - -export default -angular.module('smartInventoryEdit', []) - .controller('SmartInventoryEditController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/edit/smart-inventory-edit.controller.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/edit/smart-inventory-edit.controller.js deleted file mode 100644 index 42f7f27223..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/edit/smart-inventory-edit.controller.js +++ /dev/null @@ -1,110 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -function SmartInventoryEdit($scope, $location, - $stateParams, InventoryForm, Rest, ProcessErrors, - GetBasePath, ParseTypeChange, Wait, ToJSON, - ParseVariableString, $state, OrgAdminLookup, resourceData, - $rootScope, InstanceGroupsService, InstanceGroupsData) { - - // Inject dynamic view - var defaultUrl = GetBasePath('inventory'), - form = InventoryForm, - inventory_id = $stateParams.smartinventory_id, - inventoryData = resourceData.data, - instance_group_url = inventoryData.related.instance_groups; - init(); - - function init() { - form.formLabelSize = null; - form.formFieldSize = null; - $scope.inventory_id = inventory_id; - - $scope = angular.extend($scope, inventoryData); - - $scope.smartinventory_variables = inventoryData.variables === null || inventoryData.variables === '' ? '---' : ParseVariableString(inventoryData.variables); - $scope.organization_name = inventoryData.summary_fields.organization.name; - $scope.instance_groups = InstanceGroupsData; - - $scope.$watch('inventory_obj.summary_fields.user_capabilities.edit', function(val) { - if (val === false) { - $scope.canAdd = false; - } - }); - - $scope.parseType = 'yaml'; - - $scope.inventory_obj = inventoryData; - $rootScope.breadcrumb.inventory_name = inventoryData.name; - - ParseTypeChange({ - scope: $scope, - variable: 'smartinventory_variables', - parse_variable: 'parseType', - field_id: 'smartinventory_smartinventory_variables', - readOnly: !$scope.inventory_obj.summary_fields.user_capabilities.edit - }); - - OrgAdminLookup.checkForAdminAccess({organization: inventoryData.organization}) - .then(function(canEditOrg){ - $scope.canEditOrg = canEditOrg; - }); - - $scope.smart_hosts = { - host_filter: encodeURIComponent($scope.host_filter) - }; - } - - // Save - $scope.formSave = function() { - Wait('start'); - - let fld, data = {}; - - for (fld in form.fields) { - data[fld] = $scope[fld]; - } - - data.variables = ToJSON($scope.parseType, $scope.smartinventory_variables, true); - data.host_filter = decodeURIComponent($scope.smart_hosts.host_filter); - data.kind = "smart"; - - Rest.setUrl(defaultUrl + inventory_id + '/'); - Rest.put(data) - .then(() => { - InstanceGroupsService.editInstanceGroups(instance_group_url, $scope.instance_groups) - .then(() => { - Wait('stop'); - $state.go($state.current, {}, { reload: true }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to update instance groups. POST returned status: ' + status - }); - }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to update inventory. PUT returned status: ' + status - }); - }); - }; - - $scope.formCancel = function() { - $state.go('inventories'); - }; - -} - -export default [ '$scope', '$location', - '$stateParams', 'InventoryForm', 'Rest', - 'ProcessErrors', 'GetBasePath', 'ParseTypeChange', 'Wait', - 'ToJSON', 'ParseVariableString', - '$state', 'OrgAdminLookup', 'resourceData', - '$rootScope', 'InstanceGroupsService', 'InstanceGroupsData', SmartInventoryEdit -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/main.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/main.js deleted file mode 100644 index 0f8a57560f..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/main.js +++ /dev/null @@ -1,20 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import smartInventoryAdd from './add/main'; -import smartInventoryEdit from './edit/main'; -import smartInventoryForm from './smart-inventory.form'; -import smartInventoryHostFilter from './smart-inventory-host-filter/smart-inventory-host-filter.directive'; -import hostFilterModal from './smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive'; - -export default -angular.module('smartInventory', [ - smartInventoryAdd.name, - smartInventoryEdit.name - ]) - .factory('smartInventoryForm', smartInventoryForm) - .directive('smartInventoryHostFilter', smartInventoryHostFilter) - .directive('hostFilterModal', hostFilterModal); diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js deleted file mode 100644 index beaf2ae8c9..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js +++ /dev/null @@ -1,96 +0,0 @@ -export default ['templateUrl', function(templateUrl) { - return { - restrict: 'E', - scope: { - hostFilter: '=', - organization: '=' - }, - templateUrl: templateUrl('inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal'), - link: function(scope, element) { - - $('#host-filter-modal').on('hidden.bs.modal', function () { - $('#host-filter-modal').off('hidden.bs.modal'); - $(element).remove(); - }); - - scope.showModal = function() { - $('#host-filter-modal').modal('show'); - }; - - scope.destroyModal = function() { - $('#host-filter-modal').modal('hide'); - }; - - }, - controller: ['$scope', 'QuerySet', 'GetBasePath', 'HostsList', '$compile', 'generateList', 'i18n', '$rootScope', function($scope, qs, GetBasePath, HostsList, $compile, GenerateList, i18n, $rootScope) { - - function init() { - - $scope.appStrings = $rootScope.appStrings; - - $scope.host_default_params = { - order_by: 'name', - page_size: 5, - inventory__organization: $scope.organization - }; - - $scope.host_queryset = _.merge({ - order_by: 'name', - page_size: 5, - inventory__organization: $scope.organization - }, $scope.hostFilter ? $scope.hostFilter : {}); - - // Fire off the initial search - qs.search(GetBasePath('hosts'), $scope.host_queryset) - .then(res => { - $scope.host_dataset = res.data; - $scope.hosts = $scope.host_dataset.results; - - let hostList = _.cloneDeep(HostsList); - delete hostList.staticColumns; - delete hostList.fields.toggleHost; - delete hostList.fields.active_failures; - delete hostList.fields.name.ngClick; - hostList.fields.name.columnClass = 'col-sm-6'; - hostList.fields.name.noLink = true; - hostList.well = false; - delete hostList.fields.inventory.ngClick; - hostList.fields.inventory.columnClass = 'col-sm-6'; - hostList.fields.inventory.ngBind = 'host.summary_fields.inventory.name'; - hostList.emptyListText = i18n._('Perform a search above to define a host filter'); - hostList.layoutClass = 'List-defaultLayout'; - hostList.alwaysShowSearch = true; - hostList.emptyListClass = 'List-noItems List-emptyHostFilter'; - let html = GenerateList.build({ - list: hostList, - input_type: 'host-filter-modal-body', - hideViewPerPage: true - }); - - $scope.list = hostList; - - $('#host-filter-modal-body').append($compile(html)($scope)); - - $scope.showModal(); - }); - } - - init(); - - $scope.cancelForm = function() { - $scope.destroyModal(); - }; - - $scope.saveForm = function() { - // Strip defaults out of the state params copy - angular.forEach(Object.keys($scope.host_default_params), function(value) { - delete $scope.host_queryset[value]; - }); - - $scope.hostFilter = angular.copy($scope.host_queryset); - - $scope.destroyModal(); - }; - }] - }; -}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html deleted file mode 100644 index 5c8f36e40e..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html +++ /dev/null @@ -1,21 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.controller.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.controller.js deleted file mode 100644 index d83105f61c..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.controller.js +++ /dev/null @@ -1,39 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', 'QuerySet', 'InventoryHostsStrings', - function($scope, qs, InventoryHostsStrings) { - $scope.hostFilterTags = []; - $scope.strings = InventoryHostsStrings; - - $scope.$watch('organization', function(){ - if($scope.hasEditPermissions) { - $scope.filterTooltip = $scope.organization ? InventoryHostsStrings.get('smartinventories.hostfilter.INSTRUCTIONS') : InventoryHostsStrings.get('smartinventories.hostfilter.MISSING_ORG'); - } - else { - $scope.filterTooltip = InventoryHostsStrings.get('smartinventories.hostfilter.MISSING_PERMISSIONS'); - } - }); - - $scope.$watch('hostFilter', function(){ - $scope.hostFilterTags = []; - - if($scope.hostFilter && $scope.hostFilter !== '') { - let hostFilterCopy = angular.copy($scope.hostFilter); - - let searchParam = hostFilterCopy.host_filter.split('%20and%20'); - delete hostFilterCopy.host_filter; - - $.each(searchParam, function(index, param) { - let paramParts = decodeURIComponent(param).split(/=(.+)/); - $scope.hostFilterTags.push(qs.decodeParam(paramParts[1], paramParts[0])); - }); - - $scope.hostFilterTags = $scope.hostFilterTags.concat(qs.stripDefaultParams(hostFilterCopy)); - } - }); - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.directive.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.directive.js deleted file mode 100644 index dd60d0e736..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.directive.js +++ /dev/null @@ -1,27 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import smartInventoryHostFilterController from './smart-inventory-host-filter.controller'; - -export default ['templateUrl', '$compile', - function(templateUrl, $compile) { - return { - scope: { - hostFilter: '=', - hasEditPermissions: '=', - organization: '=' - }, - restrict: 'E', - templateUrl: templateUrl('inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter'), - controller: smartInventoryHostFilterController, - link: function(scope) { - scope.openHostFilterModal = function() { - $('#content-container').append($compile('')(scope)); - }; - } - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.partial.html b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.partial.html deleted file mode 100644 index e662415f8c..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/smart-inventory-host-filter.partial.html +++ /dev/null @@ -1,13 +0,0 @@ -
- - - - - - {{tag}} - - -
- diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js deleted file mode 100644 index aac38ff707..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js +++ /dev/null @@ -1,70 +0,0 @@ -import { N_ } from '../../../i18n'; - -export default { - name: "inventories.editSmartInventory.hosts", - url: "/hosts?{host_search:queryset}", - params: { - host_search: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash:"" - } - }, - ncyBreadcrumb: { - label: N_("HOSTS") - }, - views: { - 'related': { - templateProvider: function(ListDefinition, generateList) { - let list = _.cloneDeep(ListDefinition); - let html = generateList.build({ - list: list, - mode: 'edit' - }); - return html; - }, - controller: 'RelatedHostListController' - } - }, - resolve: { - ListDefinition: ['RelatedHostsListDefinition', '$stateParams', 'GetBasePath', (RelatedHostsListDefinition, $stateParams, GetBasePath) => { - let list = _.cloneDeep(RelatedHostsListDefinition); - list.basePath = GetBasePath('inventory') + $stateParams.smartinventory_id + '/hosts'; - delete list.actions.create; - delete list.fields.groups; - delete list.fieldActions.delete; - delete list.fieldActions.edit; - delete list.fieldActions.view.ngShow; - let toggleHost = list.staticColumns.find((el) => { return el.field === 'toggleHost'; }); - toggleHost.content.ngDisabled = true; - list.fields.name.columnClass = 'col-lg-8 col-md-11 col-sm-8 col-xs-7'; - return list; - }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - hostsUrl: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.rootHostsUrl($stateParams.smartinventory_id); - }], - hostsDataset: ['ListDefinition', 'QuerySet', '$stateParams', 'hostsUrl', (list, qs, $stateParams, hostsUrl) => { - let path = hostsUrl; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - }], - inventoryData: ['InventoriesService', '$stateParams', function(InventoriesService, $stateParams) { - return InventoriesService.getInventory($stateParams.smartinventory_id).then(res => res.data); - }] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js b/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js deleted file mode 100644 index dd4702379a..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js +++ /dev/null @@ -1,162 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - - addTitle: i18n._('NEW SMART INVENTORY'), - editTitle: '{{ name }}', - name: 'smartinventory', - basePath: 'inventory', - breadcrumbName: i18n._('SMART INVENTORY'), - stateTree: 'inventories', - activeEditState: 'inventories.editSmartInventory', - detailsClick: "$state.go('inventories.editSmartInventory')", - - fields: { - name: { - label: i18n._('Name'), - type: 'text', - required: true, - capitalize: false, - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - basePath: 'organizations', - list: 'OrganizationList', - sourceModel: 'organization', - sourceField: 'name', - required: true, - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd) || !canEditOrg', - awLookupWhen: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd) && canEditOrg' - }, - smart_hosts: { - label: i18n._('Smart Host Filter'), - type: 'custom', - control: '', - awPopOver: "

" + i18n._("Populate the hosts for this inventory by using a search filter.") + "

" + i18n._("Example: ansible_facts.ansible_distribution:\"RedHat\"") + "

" + i18n._("Refer to the Ansible Tower documentation for further syntax and examples.") + "

", - dataTitle: i18n._('Smart Host Filter'), - dataPlacement: 'right', - dataContainer: 'body', - required: true - }, - instance_groups: { - label: i18n._('Instance Groups'), - type: 'custom', - awPopOver: "

" + i18n._("Select the Instance Groups for this Inventory to run on.") + "

", - dataTitle: i18n._('Instance Groups'), - dataPlacement: 'right', - dataContainer: 'body', - control: '', - }, - smartinventory_variables: { - label: i18n._('Variables'), - type: 'textarea', - class: 'Form-formGroup--fullWidth', - rows: 6, - "default": "---", - awPopOver: "

" + i18n._("Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + - "JSON:
\n" + - "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + - "YAML:
\n" + - "
---
somevar: somevalue
password: magic
\n" + - '

' + i18n.sprintf(i18n._('View JSON examples at %s'), 'www.json.org') + '

' + - '

' + i18n.sprintf(i18n._('View YAML examples at %s'), 'docs.ansible.com') + '

', - dataTitle: i18n._('Inventory Variables'), - dataPlacement: 'right', - dataContainer: 'body', - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' // TODO: get working - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - related: { - permissions: { - name: 'permissions', - awToolTip: i18n._('Please save before assigning permissions.'), - dataPlacement: 'top', - basePath: 'api/v2/inventories/{{$stateParams.smartinventory_id}}/access_list/', - type: 'collection', - title: i18n._('Permissions'), - iterator: 'permission', - index: false, - open: false, - search: { - order_by: 'username' - }, - actions: { - add: { - label: i18n._('Add'), - ngClick: "$state.go('.add')", - awToolTip: i18n._('Add a permission'), - actionClass: 'at-Button--add', - actionId: 'button-add--permission', - ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - - } - }, - fields: { - username: { - key: true, - label: i18n._('User'), - linkBase: 'users', - columnClass: 'col-sm-3 col-xs-4' - }, - role: { - label: i18n._('Role'), - type: 'role', - nosort: true, - columnClass: 'col-sm-4 col-xs-4' - }, - team_roles: { - label: i18n._('Team Roles'), - type: 'team_roles', - nosort: true, - columnClass: 'col-sm-5 col-xs-4' - } - }, - ngClick: "$state.go('inventories.editSmartInventory.permissions');" - }, - hosts: { - name: 'hosts', - awToolTip: i18n._('Please save before viewing hosts.'), - dataPlacement: 'top', - include: "RelatedHostsListDefinition", - title: i18n._('Hosts'), - iterator: 'host', - ngClick: "$state.go('inventories.editSmartInventory.hosts');", - skipGenerator: true - }, - completed_jobs: { - title: i18n._('Completed Jobs'), - skipGenerator: true, - ngClick: "$state.go('inventories.editSmartInventory.completed_jobs')" - } - } - - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/add/inventory-add.controller.js b/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/add/inventory-add.controller.js deleted file mode 100644 index 469a976dc2..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/add/inventory-add.controller.js +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Inventories - * @description This controller's for the Inventory page - */ - -function InventoriesAdd($scope, $location, - GenerateForm, InventoryForm, rbacUiControlService, Rest, Alert, ProcessErrors, - GetBasePath, ParseTypeChange, Wait, ToJSON, - $state, canAdd, CreateSelect2, InstanceGroupsService) { - - $scope.canAdd = canAdd; - - // Inject dynamic view - var defaultUrl = GetBasePath('inventory'), - form = InventoryForm; - - init(); - - function init() { - $scope.canEditOrg = true; - form.formLabelSize = null; - form.formFieldSize = null; - - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - } - - // Save - $scope.formSave = function() { - Wait('start'); - try { - var fld, data; - - data = {}; - for (fld in form.fields) { - if (form.fields[fld].realName) { - data[form.fields[fld].realName] = $scope[fld]; - } else { - data[fld] = $scope[fld]; - } - } - - Rest.setUrl(defaultUrl); - Rest.post(data) - .then(({data}) => { - const inventory_id = data.id, - instance_group_url = data.related.instance_groups; - - InstanceGroupsService.addInstanceGroups(instance_group_url, $scope.instance_groups) - .then(() => { - Wait('stop'); - $state.go('inventories.edit', {inventory_id: inventory_id}, {reload: true}); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to post instance groups. POST returned ' + - 'status: ' + status - }); - }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to add new inventory. Post returned status: ' + status - }); - }); - } catch (err) { - Wait('stop'); - Alert("Error", "Error parsing inventory variables. Parser returned: " + err); - } - - }; - - $scope.formCancel = function() { - $state.go('inventories'); - }; -} - -export default ['$scope', '$location', - 'GenerateForm', 'InventoryForm', 'rbacUiControlService', 'Rest', 'Alert', - 'ProcessErrors', 'GetBasePath', 'ParseTypeChange', - 'Wait', 'ToJSON', '$state','canAdd', 'CreateSelect2', 'InstanceGroupsService', InventoriesAdd -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/add/main.js b/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/add/main.js deleted file mode 100644 index 2e477aa96c..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './inventory-add.controller'; - -export default -angular.module('InventoryAdd', []) - .controller('InventoryAddController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/edit/inventory-edit.controller.js b/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/edit/inventory-edit.controller.js deleted file mode 100644 index ce2d8e7ea7..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/edit/inventory-edit.controller.js +++ /dev/null @@ -1,112 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Inventories - * @description This controller's for the Inventory page - */ - -function InventoriesEdit($scope, $location, - $stateParams, InventoryForm, Rest, ProcessErrors, - GetBasePath, ParseTypeChange, Wait, ToJSON, - ParseVariableString, $state, OrgAdminLookup, $rootScope, resourceData, - CreateSelect2, InstanceGroupsService, InstanceGroupsData, CanRemediate) { - - // Inject dynamic view - let defaultUrl = GetBasePath('inventory'), - form = InventoryForm, - fld, data, - inventoryData = resourceData.data, - instance_group_url = inventoryData.related.instance_groups; - - init(); - - function init() { - form.formLabelSize = null; - form.formFieldSize = null; - - $scope = angular.extend($scope, inventoryData); - - $scope.insights_credential_name = (inventoryData.summary_fields.insights_credential && inventoryData.summary_fields.insights_credential.name) ? inventoryData.summary_fields.insights_credential.name : null; - $scope.insights_credential = (inventoryData.summary_fields.insights_credential && inventoryData.summary_fields.insights_credential.id) ? inventoryData.summary_fields.insights_credential.id : null; - $scope.is_insights = (inventoryData.summary_fields.insights_credential && inventoryData.summary_fields.insights_credential.id) ? true : false; - $scope.organization_name = inventoryData.summary_fields.organization.name; - $scope.inventory_variables = inventoryData.variables === null || inventoryData.variables === '' ? '---' : ParseVariableString(inventoryData.variables); - $scope.parseType = 'yaml'; - $scope.instance_groups = InstanceGroupsData; - $scope.canRemediate = CanRemediate; - - OrgAdminLookup.checkForRoleLevelAdminAccess(inventoryData.organization, 'inventory_admin_role') - .then(function(canEditOrg){ - $scope.canEditOrg = canEditOrg; - }); - - $scope.inventory_obj = inventoryData; - $scope.inventory_name = inventoryData.name; - $rootScope.breadcrumb.inventory_name = inventoryData.name; - - $scope.$watch('inventory_obj.summary_fields.user_capabilities.edit', function(val) { - if (val === false) { - $scope.canAdd = false; - } - }); - } - - // Save - $scope.formSave = function() { - Wait('start'); - - data = {}; - for (fld in form.fields) { - if (form.fields[fld].realName) { - data[form.fields[fld].realName] = $scope[fld]; - } else { - data[fld] = $scope[fld]; - } - } - - Rest.setUrl(defaultUrl + $stateParams.inventory_id + '/'); - Rest.put(data) - .then(() => { - InstanceGroupsService.editInstanceGroups(instance_group_url, $scope.instance_groups) - .then(() => { - Wait('stop'); - $state.go($state.current, {}, { reload: true }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to update instance groups. POST returned status: ' + status - }); - }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to update inventory. PUT returned status: ' + status - }); - }); - }; - - $scope.formCancel = function() { - $state.go('inventories'); - }; - - $scope.remediateInventory = function(inv_id, insights_credential){ - $state.go('templates.addJobTemplate', {inventory_id: inv_id, credential_id: insights_credential}); - }; - -} - -export default ['$scope', '$location', - '$stateParams', 'InventoryForm', 'Rest', - 'ProcessErrors', 'GetBasePath', 'ParseTypeChange', 'Wait', - 'ToJSON', 'ParseVariableString', - '$state', 'OrgAdminLookup', '$rootScope', 'resourceData', 'CreateSelect2', - 'InstanceGroupsService', 'InstanceGroupsData', 'CanRemediate', - InventoriesEdit, -]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/edit/main.js b/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/edit/main.js deleted file mode 100644 index 130a5e8b4b..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/edit/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './inventory-edit.controller'; - -export default - angular.module('InventoryEdit', []) - .controller('InventoryEditController', controller); diff --git a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js b/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js deleted file mode 100644 index f093a525f0..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name forms.function:Inventories - * @description This form is for adding/editing an inventory - */ - -export default ['i18n', -function(i18n) { - return { - - addTitle: i18n._('NEW INVENTORY'), - editTitle: '{{ inventory_name }}', - name: 'inventory', - basePath: 'inventory', - // the top-most node of this generated state tree - stateTree: 'inventories', - tabs: true, - - fields: { - name: { - realName: 'name', - label: i18n._('Name'), - type: 'text', - required: true, - capitalize: false, - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - description: { - realName: 'description', - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - basePath: 'organizations', - list: 'OrganizationList', - sourceModel: 'organization', - sourceField: 'name', - required: true, - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd) || !canEditOrg', - awLookupWhen: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd) && canEditOrg' - }, - insights_credential: { - label: i18n._('Insights Credential'), - type: 'lookup', - list: 'CredentialList', - basePath: 'credentials', - sourceModel: 'insights_credential', - sourceField: 'name', - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd) || !canEditOrg', - }, - instance_groups: { - label: i18n._('Instance Groups'), - type: 'custom', - awPopOver: i18n._('Select the Instance Groups for this Inventory to run on. Refer to the Ansible Tower documentation for more detail.'), - dataTitle: i18n._('Instance Groups'), - dataPlacement: 'right', - dataContainer: 'body', - control: '', - }, - variables: { - label: i18n._('Variables'), - type: 'code_mirror', - class: 'Form-formGroup--fullWidth', - variables: 'variables', - awPopOver: i18n._('Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax.'), - ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' // TODO: get working - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - related: { - permissions: { - name: 'permissions', - awToolTip: i18n._('Please save before assigning permissions.'), - dataPlacement: 'top', - basePath: 'api/v2/inventories/{{$stateParams.inventory_id}}/access_list/', - type: 'collection', - title: i18n._('Permissions'), - iterator: 'permission', - index: false, - open: false, - search: { - order_by: 'username' - }, - actions: { - add: { - label: i18n._('Add'), - ngClick: "$state.go('.add')", - awToolTip: i18n._('Add a permission'), - actionClass: 'at-Button--add', - actionId: 'button-add--permission', - ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' - - } - }, - fields: { - username: { - key: true, - label: i18n._('User'), - linkBase: 'users', - columnClass: 'col-sm-3 col-xs-4' - }, - role: { - label: i18n._('Role'), - type: 'role', - nosort: true, - columnClass: 'col-sm-4 col-xs-4' - }, - team_roles: { - label: i18n._('Team Roles'), - type: 'team_roles', - nosort: true, - columnClass: 'col-sm-5 col-xs-4' - } - } - }, - groups: { - name: 'groups', - awToolTip: i18n._('Please save before creating groups.'), - dataPlacement: 'top', - include: "GroupList", - title: i18n._('Groups'), - iterator: 'group', - tabSelected: `$state.includes('inventories.edit.groups') || $state.includes('inventories.edit.rootGroups')`, - skipGenerator: true - }, - hosts: { - name: 'hosts', - awToolTip: i18n._('Please save before creating hosts.'), - dataPlacement: 'top', - include: "RelatedHostsListDefinition", - title: i18n._('Hosts'), - iterator: 'host', - skipGenerator: true - }, - inventory_sources: { - name: 'inventory_sources', - awToolTip: i18n._('Please save before defining inventory sources.'), - dataPlacement: 'top', - title: i18n._('Sources'), - iterator: 'inventory_source', - skipGenerator: true - }, - completed_jobs: { - title: i18n._('Completed Jobs'), - skipGenerator: true - } - }, - relatedButtons: { - remediate_inventory: { - ngClick: 'remediateInventory(id, insights_credential)', - ngShow: "is_insights && mode !== 'add' && canRemediate && ($state.is('inventories.edit') || $state.is('inventories.edit.hosts'))", - label: i18n._('Remediate Inventory'), - class: 'Form-primaryButton' - } - } - - };}]; diff --git a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/main.js b/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/main.js deleted file mode 100644 index 1b2f8d8be5..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventories/standard-inventory/main.js +++ /dev/null @@ -1,16 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - import inventoryAdd from './add/main'; - import inventoryEdit from './edit/main'; - import InventoryForm from './inventory.form'; - -export default -angular.module('standardInventory', [ - inventoryAdd.name, - inventoryEdit.name - ]) - .factory('InventoryForm', InventoryForm); diff --git a/awx/ui/client/src/inventories-hosts/inventory-hosts.block.less b/awx/ui/client/src/inventories-hosts/inventory-hosts.block.less deleted file mode 100644 index e4663663fb..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventory-hosts.block.less +++ /dev/null @@ -1,10 +0,0 @@ -#hosts-panel { - .List-noItems { - margin-top: 0px; - } - .groupsList { - .List-noItems { - margin-top: 52px; - } - } -} \ No newline at end of file diff --git a/awx/ui/client/src/inventories-hosts/inventory-hosts.strings.js b/awx/ui/client/src/inventories-hosts/inventory-hosts.strings.js deleted file mode 100644 index 1868698a91..0000000000 --- a/awx/ui/client/src/inventories-hosts/inventory-hosts.strings.js +++ /dev/null @@ -1,58 +0,0 @@ -function InventoryHostsStrings (BaseString) { - BaseString.call(this, 'inventory-hosts'); - - let t = this.t; - let ns = this['inventory-hosts']; - - ns.deletegroup = { - GROUP: count => t.p(count, 'group', 'groups'), - HOST: count => t.p(count, 'host', 'hosts'), - PROMOTE_GROUPS_AND_HOSTS: data => t.s('Promote {{ group }} and {{ host }}', { - group: this.get('deletegroup.GROUP', data.groups), - host: this.get('deletegroup.HOST', data.hosts) - }), - DELETE_GROUPS_AND_HOSTS: data => t.s('Delete {{ group }} and {{ host }}', { - group: this.get('deletegroup.GROUP', data.groups), - host: this.get('deletegroup.HOST', data.hosts) - }), - PROMOTE_GROUP: count => t.p(count, 'Promote group', 'Promote groups'), - DELETE_GROUP: count => t.p(count, 'Delete group', 'Delete groups'), - PROMOTE_HOST: count => t.p(count, 'Promote host', 'Promote hosts'), - DELETE_HOST: count => t.p(count, 'Delete host', 'Delete hosts'), - }; - - ns.inventory = { - EDIT_HOST: t.s('Edit host'), - VIEW_HOST: t.s('View host'), - VIEW_INSIGHTS: t.s('View Insights Data') - }; - - ns.hostList = { - DISABLED_TOGGLE_TOOLTIP: () => t.s('{{ str1 }}

{{ str2 }}

', { - str1: t.s('Indicates if a host is available and should be included in running jobs.'), - str2: t.s('For hosts that are part of an external inventory, this may be reset by the inventory sync process.') - }) - }; - - ns.smartinventories = { - hostfilter: { - MISSING_ORG: t.s('Please select an organization before editing the host filter.'), - INSTRUCTIONS: t.s('Please click the icon to edit the host filter.'), - MISSING_PERMISSIONS: t.s('You do not have sufficient permissions to edit the host filter.'), - OPEN: t.s('Open host filter') - } - }; - - ns.smartinventorybutton = { - DISABLED_INSTRUCTIONS: t.s("Please enter at least one search term to create a new Smart Inventory."), - ENABLED_INSTRUCTIONS: t.s("Create a new Smart Inventory from search results.

Note: changing the organization of the Smart Inventory could change the hosts included in the Smart Inventory.") - }; - - ns.insights = { - VIEW: t.s("View Insights") - }; -} - -InventoryHostsStrings.$inject = ['BaseStringService']; - -export default InventoryHostsStrings; diff --git a/awx/ui/client/src/inventories-hosts/main.js b/awx/ui/client/src/inventories-hosts/main.js deleted file mode 100644 index de837d2049..0000000000 --- a/awx/ui/client/src/inventories-hosts/main.js +++ /dev/null @@ -1,18 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - import hosts from './hosts/main'; - import inventories from './inventories/main'; - import shared from './shared/main'; - import InventoryHostsStrings from './inventory-hosts.strings'; - -export default -angular.module('inventories-hosts', [ - hosts.name, - inventories.name, - shared.name - ]) - .service('InventoryHostsStrings', InventoryHostsStrings); diff --git a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.controller.js b/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.controller.js deleted file mode 100644 index a4ab5f1024..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.controller.js +++ /dev/null @@ -1,20 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -function AnsibleFacts($scope, Facts) { - - function init() { - $scope.facts = Facts; - let rows = (_.isEmpty(Facts)) ? 6 : 20; - $("#host_facts").attr("rows", rows); - $scope.parseType = 'yaml'; - } - - init(); - -} - -export default ['$scope', 'Facts', AnsibleFacts]; diff --git a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.partial.html b/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.partial.html deleted file mode 100644 index 7976a5cb5d..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.partial.html +++ /dev/null @@ -1,12 +0,0 @@ - -
- -
- diff --git a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js b/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js deleted file mode 100644 index 045fe535dd..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js +++ /dev/null @@ -1,27 +0,0 @@ -import {templateUrl} from '../../../shared/template-url/template-url.factory'; -import { N_ } from '../../../i18n'; - -export default { - url: '/ansible_facts', - ncyBreadcrumb: { - label: N_("FACTS") - }, - views: { - 'related': { - controller: 'AnsibleFactsController', - templateUrl: templateUrl('inventories-hosts/shared/ansible-facts/ansible-facts') - } - }, - resolve: { - Facts: ['$stateParams', 'GetBasePath', 'Rest', - function($stateParams, GetBasePath, Rest) { - let ansibleFactsUrl = GetBasePath('hosts') + $stateParams.host_id + '/ansible_facts'; - Rest.setUrl(ansibleFactsUrl); - return Rest.get() - .then(({data}) => { - return data; - }); - } - ] - } -}; diff --git a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/main.js b/awx/ui/client/src/inventories-hosts/shared/ansible-facts/main.js deleted file mode 100644 index 506652953f..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/ansible-facts/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './ansible-facts.controller'; - -export default -angular.module('AnsibleFacts', []) - .controller('AnsibleFactsController', controller); diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.block.less b/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.block.less deleted file mode 100644 index 6aa733a6e2..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.block.less +++ /dev/null @@ -1,12 +0,0 @@ -.AssociateGroups-modalBody { - padding-top: 0px; -} -.AssociateGroups-backDrop { - width: 100vw; - height: 100vh; - position: fixed; - top: 0; - left: 0; - opacity: 0; - transition: 0.5s opacity; -} diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js b/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js deleted file mode 100644 index 19c78431d1..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js +++ /dev/null @@ -1,114 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['$scope', '$rootScope', 'ProcessErrors', 'GetBasePath', 'generateList', - '$state', 'Rest', '$q', 'Wait', '$window', 'QuerySet', 'GroupList', 'i18n', - function($scope, $rootScope, ProcessErrors, GetBasePath, generateList, - $state, Rest, $q, Wait, $window, qs, GroupList, i18n) { - $scope.$on("linkLists", function() { - - init(); - - function init(){ - $scope.appStrings = $rootScope.appStrings; - $scope.associate_group_default_params = { - order_by: 'name', - page_size: 5 - }; - - $scope.associate_group_queryset = { - order_by: 'name', - page_size: 5 - }; - - if ($state.params.group_id) { - $scope.associate_group_default_params.not__id = $state.params.group_id; - $scope.associate_group_queryset.not__id = $state.params.group_id; - $scope.associate_group_default_params.not__parents = $state.params.group_id; - $scope.associate_group_queryset.not__parents = $state.params.group_id; - } else if ($state.params.host_id) { - $scope.associate_group_default_params.not__hosts = $state.params.host_id; - $scope.associate_group_queryset.not__hosts = $state.params.host_id; - } - - let list = _.cloneDeep(GroupList); - list.basePath = GetBasePath('inventory') + $state.params.inventory_id + '/groups'; - list.iterator = 'associate_group'; - list.name = 'associate_groups'; - list.multiSelect = true; - list.fields.name.ngClick = 'linkoutGroup(associate_group)'; - list.trackBy = 'associate_group.id'; - list.multiSelectPreview = { - selectedRows: 'selectedItems', - availableRows: 'associate_groups' - }; - list.emptyListText = i18n._('No groups to add'); - delete list.actions; - delete list.fieldActions; - delete list.fields.failed_hosts; - list.well = false; - $scope.list = list; - - // Fire off the initial search - qs.search(list.basePath, $scope.associate_group_default_params) - .then(function(res) { - $scope.associate_group_dataset = res.data; - $scope.associate_groups = $scope.associate_group_dataset.results; - - let html = generateList.build({ - list: list, - mode: 'edit', - title: false, - hideViewPerPage: true - }); - - $scope.compileList(html); - - $scope.$watchCollection('associate_groups', function () { - if($scope.selectedItems) { - $scope.associate_groups.forEach(function(row, i) { - if ($scope.selectedItems.filter(function(e) { return e.id === row.id; }).length > 0) { - $scope.associate_groups[i].isSelected = true; - } - }); - } - }); - - }); - - $scope.selectedItems = []; - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - $scope.selectedItems.push(item); - } - else { - // _.remove() Returns the new array of removed elements. - // This will pull all the values out of the array that don't - // match the deselected item effectively removing it - $scope.selectedItems = _.remove($scope.selectedItems, function(selectedItem) { - return selectedItem.id !== item.id; - }); - } - }); - } - - $scope.linkGroups = function() { - $scope.saveFunction({selectedItems: $scope.selectedItems}) - .then(() =>{ - $scope.closeModal(); - }).catch(() => { - $scope.closeModal(); - }); - - }; - - $scope.linkoutGroup = function(group) { - $window.open('/#/inventories/inventory/' + group.inventory + '/groups/edit/' + group.id,'_blank'); - }; - }); - }]; diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.directive.js b/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.directive.js deleted file mode 100644 index 7b0595352c..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.directive.js +++ /dev/null @@ -1,60 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ -import controller from './associate-groups.controller'; - -/* jshint unused: vars */ -export default ['templateUrl', 'Wait', '$compile', '$state', - function(templateUrl, Wait, $compile, $state) { - return { - restrict: 'E', - transclude: true, - scope: { - saveFunction: '&' - }, - controller: controller, - templateUrl: templateUrl('inventories-hosts/shared/associate-groups/associate-groups'), - link: function(scope, element, attrs, controller, transcludefn) { - - $("body").addClass("is-modalOpen"); - - //$("body").append(element); - - Wait('start'); - - scope.$broadcast("linkLists"); - - setTimeout(function() { - $('#associate-groups-modal').modal("show"); - }, 200); - - $('.modal[aria-hidden=false]').each(function () { - if ($(this).attr('id') !== 'associate-groups-modal') { - $(this).modal('hide'); - } - }); - - scope.closeModal = function() { - $("body").removeClass("is-modalOpen"); - $('#associate-groups-modal').on('hidden.bs.modal', - function () { - $('.AddUsers').remove(); - }); - $('#associate-groups-modal').modal('hide'); - - $state.go('^', null, {reload: true}); - }; - - scope.compileList = function(html) { - $('#associate-groups-list').append($compile(html)(scope)); - }; - - Wait('stop'); - - window.scrollTo(0,0); - } - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html b/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html deleted file mode 100644 index 10717c648d..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html +++ /dev/null @@ -1,21 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.block.less b/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.block.less deleted file mode 100644 index 68ea703369..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.block.less +++ /dev/null @@ -1,12 +0,0 @@ -.AssociateHosts-modalBody { - padding-top: 0px; -} -.AssociateHosts-backDrop { - width: 100vw; - height: 100vh; - position: fixed; - top: 0; - left: 0; - opacity: 0; - transition: 0.5s opacity; -} diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js b/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js deleted file mode 100644 index c2fa4ee523..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js +++ /dev/null @@ -1,113 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['$scope', '$rootScope', 'ProcessErrors', 'GetBasePath', 'generateList', - '$state', 'Rest', '$q', 'Wait', '$window', 'QuerySet', 'RelatedHostsListDefinition', 'i18n', - function($scope, $rootScope, ProcessErrors, GetBasePath, generateList, - $state, Rest, $q, Wait, $window, qs, RelatedHostsListDefinition, i18n) { - $scope.$on("linkLists", function() { - - init(); - - function init(){ - $scope.appStrings = $rootScope.appStrings; - $scope.associate_host_default_params = { - order_by: 'name', - page_size: 5 - }; - - $scope.associate_host_queryset = { - order_by: 'name', - page_size: 5 - }; - - if ($state.params.group_id) { - $scope.associate_host_default_params.not__groups = $state.params.group_id; - $scope.associate_host_queryset.not__groups = $state.params.group_id; - } - - let list = _.cloneDeep(RelatedHostsListDefinition); - list.basePath = GetBasePath('inventory') + $state.params.inventory_id + '/hosts'; - list.iterator = 'associate_host'; - list.name = 'associate_hosts'; - list.multiSelect = true; - list.fields.name.ngClick = 'linkoutHost(associate_host)'; - list.fields.name.ngClass = "{ 'host-disabled-label': !associate_host.enabled }"; - list.fields.name.dataHostId = "{{ associate_host.id }}"; - list.trackBy = 'associate_host.id'; - list.multiSelectPreview = { - selectedRows: 'selectedItems', - availableRows: 'associate_hosts' - }; - list.emptyListText = i18n._('No hosts to add'); - delete list.fields.toggleHost; - delete list.fields.active_failures; - delete list.fields.groups; - delete list.actions; - delete list.fieldActions; - list.well = false; - $scope.list = list; - - // Fire off the initial search - qs.search(list.basePath, $scope.associate_host_default_params) - .then(function(res) { - $scope.associate_host_dataset = res.data; - $scope.associate_hosts = $scope.associate_host_dataset.results; - - let html = generateList.build({ - list: list, - mode: 'edit', - title: false, - hideViewPerPage: true - }); - - $scope.compileList(html); - - $scope.$watchCollection('associate_hosts', function () { - if($scope.selectedItems) { - $scope.associate_hosts.forEach(function(row, i) { - if ($scope.selectedItems.filter(function(e) { return e.id === row.id; }).length > 0) { - $scope.associate_hosts[i].isSelected = true; - } - }); - } - }); - - }); - - $scope.selectedItems = []; - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - $scope.selectedItems.push(item); - } - else { - // _.remove() Returns the new array of removed elements. - // This will pull all the values out of the array that don't - // match the deselected item effectively removing it - $scope.selectedItems = _.remove($scope.selectedItems, function(selectedItem) { - return selectedItem.id !== item.id; - }); - } - }); - } - - $scope.linkhosts = function() { - $scope.saveFunction({selectedItems: $scope.selectedItems}) - .then(() =>{ - $scope.closeModal(); - }).catch(() => { - $scope.closeModal(); - }); - - }; - - $scope.linkoutHost = function(host) { - $window.open('/#/inventories/inventory/' + host.inventory + '/hosts/edit/' + host.id,'_blank'); - }; - }); - }]; diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.directive.js b/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.directive.js deleted file mode 100644 index 8cfbdb1094..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.directive.js +++ /dev/null @@ -1,60 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ -import controller from './associate-hosts.controller'; - -/* jshint unused: vars */ -export default ['templateUrl', 'Wait', '$compile', '$state', - function(templateUrl, Wait, $compile, $state) { - return { - restrict: 'E', - transclude: true, - scope: { - saveFunction: '&' - }, - controller: controller, - templateUrl: templateUrl('inventories-hosts/shared/associate-hosts/associate-hosts'), - link: function(scope, element, attrs, controller, transcludefn) { - - $("body").addClass("is-modalOpen"); - - //$("body").append(element); - - Wait('start'); - - scope.$broadcast("linkLists"); - - setTimeout(function() { - $('#associate-hosts-modal').modal("show"); - }, 200); - - $('.modal[aria-hidden=false]').each(function () { - if ($(this).attr('id') !== 'associate-hosts-modal') { - $(this).modal('hide'); - } - }); - - scope.closeModal = function() { - $("body").removeClass("is-modalOpen"); - $('#associate-hosts-modal').on('hidden.bs.modal', - function () { - $('.AddUsers').remove(); - }); - $('#associate-hosts-modal').modal('hide'); - - $state.go('^', null, {reload: true}); - }; - - scope.compileList = function(html) { - $('#associate-hosts-list').append($compile(html)(scope)); - }; - - Wait('stop'); - - window.scrollTo(0,0); - } - }; - } -]; diff --git a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html b/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html deleted file mode 100644 index 2eaeff4035..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html +++ /dev/null @@ -1,21 +0,0 @@ - diff --git a/awx/ui/client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js b/awx/ui/client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js deleted file mode 100644 index a31b8f73fa..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js +++ /dev/null @@ -1,16 +0,0 @@ -export default - function SetEnabledMsg(i18n) { - return function(host) { - if (host.has_inventory_sources) { - // Inventory sync managed, so not clickable - host.enabledToolTip = (host.enabled) ? i18n._('Host is available') : i18n._('Host is not available'); - } - else { - // Clickable - host.enabledToolTip = (host.enabled) ? i18n._('Host is available. Click to toggle.') : i18n._('Host is not available. Click to toggle.'); - } - }; - } - -SetEnabledMsg.$inject = - [ 'i18n', ]; diff --git a/awx/ui/client/src/inventories-hosts/shared/factories/set-status.factory.js b/awx/ui/client/src/inventories-hosts/shared/factories/set-status.factory.js deleted file mode 100644 index 7551b3ee74..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/factories/set-status.factory.js +++ /dev/null @@ -1,103 +0,0 @@ -export default - function SetStatus($filter, SetEnabledMsg, Empty, i18n) { - return function(params) { - var scope = params.scope, - host = params.host, - i, html, title; - - function ellipsis(a) { - if (a.length > 25) { - return a.substr(0,25) + '...'; - } - return a; - } - - function noRecentJobs() { - title = i18n._('No job data'); - html = "

" + i18n._("No recent job data available for this host.") + "

\n"; - } - - function setMsg(host) { - var j, job, jobs; - - if (host.has_active_failures === true || (host.has_active_failures === false && host.last_job !== null)) { - if (host.has_active_failures === true) { - host.badgeToolTip = i18n._('Most recent job failed. Click to view jobs.'); - host.active_failures = 'error'; - } - else { - host.badgeToolTip = i18n._("Most recent job successful. Click to view jobs."); - host.active_failures = 'successful'; - } - if (host.summary_fields.recent_jobs.length > 0) { - // build html table of job status info - jobs = host.summary_fields.recent_jobs.sort( - function(a,b) { - // reverse numerical order - return -1 * (a - b); - }); - title = "Recent Jobs"; - html = "\n"; - html += "\n"; - html += "\n"; - html += "\n"; - html += "\n"; - html += "\n"; - html += "\n"; - html += "\n"; - html += "\n"; - for (j=0; j < jobs.length; j++) { - job = jobs[j]; - html += "\n"; - - // SmartStatus-tooltips are named --success whereas icon-job uses successful - var iconStatus = (job.status === 'successful') ? 'success' : 'failed'; - - html += "\n"; - - html += "\n"; - - html += "\n"; - - html += "\n"; - } - html += "\n"; - html += "
" + i18n._("Status") + "" + i18n._("Finished") + "" + i18n._("Name") + "
" + ($filter('longDate')(job.finished)).replace(/ /,'
') + "
" + $filter('sanitize')(ellipsis(job.name)) + "
\n"; - } - else { - noRecentJobs(); - } - } - else if (host.has_active_failures === false && host.last_job === null) { - host.badgeToolTip = i18n._("No job data available."); - host.active_failures = 'none'; - noRecentJobs(); - } - host.job_status_html = html; - host.job_status_title = title; - } - - if (!Empty(host)) { - // update single host - setMsg(host); - SetEnabledMsg(host); - } - else { - // update all hosts - for (i=0; i < scope.hosts.length; i++) { - setMsg(scope.hosts[i]); - SetEnabledMsg(scope.hosts[i]); - } - } - }; - } - -SetStatus.$inject = - [ '$filter', - 'SetEnabledMsg', - 'Empty', - 'i18n' - ]; diff --git a/awx/ui/client/src/inventories-hosts/shared/groups.service.js b/awx/ui/client/src/inventories-hosts/shared/groups.service.js deleted file mode 100644 index 0c6e1f8bef..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/groups.service.js +++ /dev/null @@ -1,131 +0,0 @@ -export default - ['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', 'Wait', function($rootScope, Rest, GetBasePath, ProcessErrors, Wait){ - return { - stringifyParams: function(params){ - return _.reduce(params, (result, value, key) => { - return result + key + '=' + value + '&'; - }, ''); - }, - // cute abstractions via fn.bind() - url: function(){ - return ''; - }, - error: function(data) { - ProcessErrors($rootScope, data.data, data.status, null, { hdr: 'Error!', - msg: 'Call to ' + this.url + '. GET returned: ' + data.status }); - }, - success: function(data){ - return data; - }, - // HTTP methods - get: function(params){ - Wait('start'); - this.url = GetBasePath('groups') + '?' + this.stringifyParams(params); - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - post: function(group){ - Wait('start'); - this.url = GetBasePath('groups'); - Rest.setUrl(this.url); - return Rest.post(group) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - put: function(group){ - Wait('start'); - this.url = GetBasePath('groups') + group.id; - Rest.setUrl(this.url); - return Rest.put(group) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - delete: function(id){ - Wait('start'); - this.url = GetBasePath('groups') + id; - Rest.setUrl(this.url); - return Rest.destroy() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - getCredential: function(id){ - Wait('start'); - this.url = GetBasePath('credentials') + id; - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - getInventorySource: function(params){ - Wait('start'); - this.url = GetBasePath('inventory_sources') + '?' + this.stringifyParams(params); - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - putInventorySource: function(params, url){ - Wait('start'); - this.url = url; - Rest.setUrl(this.url); - return Rest.put(params) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - // these relationship setters could be consolidated, but verbosity makes the operation feel more clear @ controller level - associateGroup: function(group, target){ - Wait('start'); - this.url = GetBasePath('groups') + target + '/children/'; - Rest.setUrl(this.url); - return Rest.post(group) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - disassociateGroup: function(group, parent){ - Wait('start'); - this.url = GetBasePath('groups') + parent + '/children/'; - Rest.setUrl(this.url); - return Rest.post({id: group, disassociate: 1}) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - associateHost: function(host, target){ - Wait('start'); - this.url = GetBasePath('groups') + target + '/hosts/'; - Rest.setUrl(this.url); - return Rest.post(host) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - disassociateHost: function(host, group){ - Wait('start'); - this.url = GetBasePath('groups') + group + '/hosts/'; - Rest.setUrl(this.url); - return Rest.post({id: host, disassociate: 1}) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - promote: function(group, inventory){ - Wait('start'); - this.url = GetBasePath('inventory') + inventory + '/groups/'; - Rest.setUrl(this.url); - return Rest.post({id: group, disassociate: 1}) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - } - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/shared/hosts.service.js b/awx/ui/client/src/inventories-hosts/shared/hosts.service.js deleted file mode 100644 index fc4af5acc8..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/hosts.service.js +++ /dev/null @@ -1,74 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default - ['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', 'Wait', - function($rootScope, Rest, GetBasePath, ProcessErrors, Wait){ - return { - stringifyParams: function(params){ - return _.reduce(params, (result, value, key) => { - return result + key + '=' + value + '&'; - }, ''); - }, - // cute abstractions via fn.bind() - url: function(){ - return ''; - }, - error: function(data) { - ProcessErrors($rootScope, data.data, data.status, null, { hdr: 'Error!', - msg: 'Call to ' + this.url + '. GET returned: ' + data.status }); - }, - success: function(data){ - return data; - }, - // HTTP methods - get: function(params){ - Wait('start'); - this.url = GetBasePath('hosts') + '?' + this.stringifyParams(params); - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - patch: function(id, data){ - Wait('start'); - this.url = GetBasePath('hosts') + id; - Rest.setUrl(this.url); - return Rest.patch(data) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - post: function(host){ - Wait('start'); - this.url = GetBasePath('hosts'); - Rest.setUrl(this.url); - return Rest.post(host) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - put: function(host){ - Wait('start'); - this.url = GetBasePath('hosts') + host.id; - Rest.setUrl(this.url); - return Rest.put(host) - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - delete: function(id){ - Wait('start'); - this.url = GetBasePath('hosts') + id; - Rest.setUrl(this.url); - return Rest.destroy() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - } - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/shared/inventories.service.js b/awx/ui/client/src/inventories-hosts/shared/inventories.service.js deleted file mode 100644 index b6dab8728a..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/inventories.service.js +++ /dev/null @@ -1,81 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default - ['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', 'Wait', - function($rootScope, Rest, GetBasePath, ProcessErrors, Wait){ - return { - // cute abstractions via fn.bind() - url: function(){ - return ''; - }, - error: function(data, status) { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + this.url + '. GET returned: ' + status }); - }, - success: function(data){ - return data; - }, - // data getters - getInventory: function(id){ - Wait('start'); - this.url = GetBasePath('inventory') + id; - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - getBreadcrumbs: function(groups){ - Wait('start'); - this.url = GetBasePath('groups') + '?' + _.map(groups, function(item){ - return '&or__id=' + item; - }).join(''); - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)) - .finally(Wait('stop')); - }, - rootHostsUrl: function(id){ - var url = GetBasePath('inventory') + id + '/hosts'; - return url; - }, - childHostsUrl: function(id){ - var url = GetBasePath('groups') + id + '/all_hosts'; - return url; - }, - childGroupsUrl: function(id){ - var url = GetBasePath('groups') + id + '/children'; - return url; - }, - groupsUrl: function(id){ - var url = GetBasePath('inventory') + id+ '/groups'; - return url; - }, - inventorySourcesOptions: function(inventoryId) { - this.url = GetBasePath('inventory') + inventoryId + '/inventory_sources'; - Rest.setUrl(this.url); - return Rest.options() - .then(this.success.bind(this)) - .catch(this.error.bind(this)); - }, - updateInventorySourcesGet: function(inventoryId) { - this.url = GetBasePath('inventory') + inventoryId + '/update_inventory_sources'; - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)); - }, - getHost: function(inventoryId, hostId) { - this.url = GetBasePath('inventory') + inventoryId + '/hosts?id=' + hostId; - Rest.setUrl(this.url); - return Rest.get() - .then(this.success.bind(this)) - .catch(this.error.bind(this)); - } - }; - }]; diff --git a/awx/ui/client/src/inventories-hosts/shared/main.js b/awx/ui/client/src/inventories-hosts/shared/main.js deleted file mode 100644 index 37075ddc52..0000000000 --- a/awx/ui/client/src/inventories-hosts/shared/main.js +++ /dev/null @@ -1,26 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import SetStatus from './factories/set-status.factory'; -import SetEnabledMsg from './factories/set-enabled-msg.factory'; -import ansibleFacts from './ansible-facts/main'; -import InventoriesService from './inventories.service'; -import GroupsService from './groups.service'; -import HostsService from './hosts.service'; -import associateGroups from './associate-groups/associate-groups.directive'; -import associateHosts from './associate-hosts/associate-hosts.directive'; - -export default -angular.module('inventoriesHostsFactories', [ - ansibleFacts.name -]) - .factory('SetStatus', SetStatus) - .factory('SetEnabledMsg', SetEnabledMsg) - .service('HostsService', HostsService) - .service('InventoriesService', InventoriesService) - .service('GroupsService', GroupsService) - .directive('associateGroups', associateGroups) - .directive('associateHosts', associateHosts); diff --git a/awx/ui/client/src/inventory-scripts/add/add.controller.js b/awx/ui/client/src/inventory-scripts/add/add.controller.js deleted file mode 100644 index 60c6714d70..0000000000 --- a/awx/ui/client/src/inventory-scripts/add/add.controller.js +++ /dev/null @@ -1,62 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['Rest', 'Wait', - 'InventoryScriptsForm', 'ProcessErrors', 'GetBasePath', - 'GenerateForm', '$scope', '$state', 'Alert', - function(Rest, Wait, - InventoryScriptsForm, ProcessErrors, GetBasePath, - GenerateForm, $scope, $state, Alert - ) { - var form = InventoryScriptsForm, - url = GetBasePath('inventory_scripts'); - - init(); - - function init() { - Rest.setUrl(url); - Rest.options() - .then(({data}) => { - if (!data.actions.POST) { - $state.go("^"); - Alert('Permission Error', 'You do not have permission to add an inventory script.', 'alert-info'); - } - }); - - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - // @issue @jmitchell - this setting probably collides with new RBAC can* implementation? - $scope.canEdit = true; - } - - // Save - $scope.formSave = function() { - Wait('start'); - Rest.setUrl(url); - Rest.post({ - name: $scope.name, - description: $scope.description, - organization: $scope.organization, - script: $scope.script - }) - .then(() => { - $state.go('inventoryScripts', null, { reload: true }); - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to add new inventory script. POST returned status: ' + status - }); - }); - }; - - $scope.formCancel = function() { - $state.go('^'); - }; - } -]; diff --git a/awx/ui/client/src/inventory-scripts/add/main.js b/awx/ui/client/src/inventory-scripts/add/main.js deleted file mode 100644 index 11d9659f64..0000000000 --- a/awx/ui/client/src/inventory-scripts/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './add.controller'; - -export default - angular.module('inventoryScriptsAdd', []) - .controller('InventoryScriptsAddController', controller); diff --git a/awx/ui/client/src/inventory-scripts/edit/edit.controller.js b/awx/ui/client/src/inventory-scripts/edit/edit.controller.js deleted file mode 100644 index 863737a8c4..0000000000 --- a/awx/ui/client/src/inventory-scripts/edit/edit.controller.js +++ /dev/null @@ -1,79 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['Rest', 'Wait', - 'InventoryScriptsForm', 'ProcessErrors', 'GetBasePath', - 'GenerateForm', 'inventory_scriptData', - '$scope', '$state', - function( - Rest, Wait, InventoryScriptsForm, ProcessErrors, GetBasePath, - GenerateForm, inventory_scriptData, - $scope, $state - ) { - var generator = GenerateForm, - data = inventory_scriptData, - id = inventory_scriptData.id, - form = InventoryScriptsForm, - main = {}, - url = GetBasePath('inventory_scripts'); - - init(); - - function init() { - $scope.inventory_script = inventory_scriptData; - - $scope.$watch('inventory_script_obj.summary_fields.user_capabilities.edit', function(val) { - if (val === false) { - $scope.canAdd = false; - } - }); - - var fld; - for (fld in form.fields) { - if (data[fld]) { - $scope[fld] = data[fld]; - main[fld] = data[fld]; - } - - if (form.fields[fld].sourceModel && data.summary_fields && - data.summary_fields[form.fields[fld].sourceModel]) { - $scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; - main[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; - } - } - - } - - $scope.formSave = function() { - generator.clearApiErrors($scope); - Wait('start'); - Rest.setUrl(url + id + '/'); - Rest.put({ - name: $scope.name, - description: $scope.description, - organization: $scope.organization, - script: $scope.script - }) - .then(() => { - $state.go('inventoryScripts', null, { reload: true }); - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to add new inventory script. PUT returned status: ' + status - }); - }); - }; - - $scope.formCancel = function() { - $state.go('inventoryScripts'); - }; - - } -]; diff --git a/awx/ui/client/src/inventory-scripts/edit/main.js b/awx/ui/client/src/inventory-scripts/edit/main.js deleted file mode 100644 index b51e421206..0000000000 --- a/awx/ui/client/src/inventory-scripts/edit/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './edit.controller'; - -export default - angular.module('inventoryScriptsEdit', []) - .controller('InventoryScriptsEditController', controller); diff --git a/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js b/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js deleted file mode 100644 index 0dbf97a0ba..0000000000 --- a/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js +++ /dev/null @@ -1,82 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:CustomInventory - * @description This form is for adding/editing an organization -*/ - -export default ['i18n', function(i18n) { - return { - - addTitle: i18n._('NEW CUSTOM INVENTORY'), - editTitle: '{{ name }}', - name: 'inventory_script', - basePath: 'inventory_scripts', - stateTree: 'inventoryScripts', - // I18N for "CREATE INVENTORY_SCRIPT" - // on /#/inventory_scripts/add - breadcrumbName: i18n._('INVENTORY SCRIPT'), - showActions: true, - - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - capitalize: false - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - list: 'OrganizationList', - basePath: 'organizations', - required: true, - sourceModel: 'organization', - sourceField: 'name', - ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - script: { - label: i18n._('Custom Script'), - type: 'textarea', - class: 'Form-formGroup--fullWidth', - elementClass: 'Form-monospace', - required: true, - awDropFile: true, - ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)', - ngTrim: false, - rows: 10, - awPopOver: i18n._('Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. Refer to the Ansible Tower documentation for example syntax.'), - dataTitle: i18n._('Custom Script'), - dataPlacement: 'right', - dataContainer: "body" - }, - }, - - buttons: { //for now always generates
\n"; - - // Add the related confirm field - if (field.associated) { - fld = field.associated; - field = form.fields[field.associated]; - scope[fld] = ''; - html += "
\n"; - html += "\n"; - html += '*'; - html += "Please confirm the password.\n"; - html += (field.awPassMatch) ? "This value does not match the password you entered previously. Please confirm that password.
\n" : ""; - html += "
\n"; - html += "
\n"; - } - }); - - scope.$emit(callback, html, url); - - // Password change - scope.clearPWConfirm = function (fld) { - // If password value changes, make sure password_confirm must be re-entered - scope[fld] = ''; - scope.job_launch_form[fld].$setValidity('awpassmatch', false); - scope.checkStatus(); - }; - - scope.checkStatus = function() { - if (!scope.job_launch_form.$invalid) { - $('#password-accept-button').removeAttr('disabled'); - } - else { - $('#password-accept-button').attr({ "disabled": "disabled" }); - } - }; - }; - } - -PromptForPasswords.$inject = - [ 'CredentialForm' ]; diff --git a/awx/ui/client/src/job-submission/main.js b/awx/ui/client/src/job-submission/main.js deleted file mode 100644 index 052173de5e..0000000000 --- a/awx/ui/client/src/job-submission/main.js +++ /dev/null @@ -1,27 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import LaunchJob from './job-submission-factories/launchjob.factory'; -import AdhocRun from './job-submission-factories/adhoc-run.factory.js'; -import CheckPasswords from './job-submission-factories/check-passwords.factory'; -import CreateLaunchDialog from './job-submission-factories/create-launch-dialog.factory'; -import InventoryUpdate from './job-submission-factories/inventory-update.factory'; -import ProjectUpdate from './job-submission-factories/project-update.factory'; -import PromptForPasswords from './job-submission-factories/prompt-for-passwords.factory'; -import awPasswordMin from './job-submission-directives/aw-password-min.directive'; -import awPasswordMax from './job-submission-directives/aw-password-max.directive'; - -export default - angular.module('jobSubmission', []) - .factory('LaunchJob', LaunchJob) - .factory('AdhocRun', AdhocRun) - .factory('CheckPasswords', CheckPasswords) - .factory('CreateLaunchDialog', CreateLaunchDialog) - .factory('InventoryUpdate', InventoryUpdate) - .factory('ProjectUpdate', ProjectUpdate) - .factory('PromptForPasswords', PromptForPasswords) - .directive('awPasswordMin', awPasswordMin) - .directive('awPasswordMax', awPasswordMax); diff --git a/awx/ui/client/src/license/checkLicense.factory.js b/awx/ui/client/src/license/checkLicense.factory.js deleted file mode 100644 index 73fdc5e15e..0000000000 --- a/awx/ui/client/src/license/checkLicense.factory.js +++ /dev/null @@ -1,81 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - ['$state', '$rootScope', 'Rest', 'GetBasePath', - 'ConfigService', '$q', - function($state, $rootScope, Rest, GetBasePath, - ConfigService, $q){ - return { - get: function() { - var config = ConfigService.get(); - return config.license_info; - }, - - post: function(payload, eula, attach){ - var defaultUrl = GetBasePath('config') + (attach ? 'attach/' : ''); - Rest.setUrl(defaultUrl); - var data = payload; - - if (!attach) { - data.eula_accepted = eula; - } - - return Rest.post(JSON.stringify(data)) - .then((response) =>{ - if (attach) { - var configPayload = {}; - configPayload.eula_accepted = eula; - Rest.setUrl(GetBasePath('config')); - return Rest.post(configPayload) - .then((configResponse) => { - return configResponse.data; - }); - } - return response.data; - }) - .catch(({data}) => { - return $q.reject(data); - }); - }, - - valid: function(license) { - if (!license.valid_key){ - return false; - } - return true; - }, - - test: function(event){ - var license = this.get(); - if(license === null || !$rootScope.license_tested){ - if(this.valid(license) === false) { - $rootScope.licenseMissing = true; - $state.go('license'); - if(event){ - event.preventDefault(); - } - } - else { - $rootScope.licenseMissing = false; - } - } - else if(this.valid(license) === false) { - $rootScope.licenseMissing = true; - $state.go('license'); - if(event){ - event.preventDefault(); - } - } - else { - $rootScope.licenseMissing = false; - } - return; - } - - }; - } - ]; diff --git a/awx/ui/client/src/license/fileOnChange.directive.js b/awx/ui/client/src/license/fileOnChange.directive.js deleted file mode 100644 index 2e04441308..0000000000 --- a/awx/ui/client/src/license/fileOnChange.directive.js +++ /dev/null @@ -1,16 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - [function(){ - return { - restrict: 'A', - link: function(scope, el, attrs){ - var onChange = scope.$eval(attrs.fileOnChange); - el.bind('change', onChange); - } - }; - }]; diff --git a/awx/ui/client/src/license/license.block.less b/awx/ui/client/src/license/license.block.less deleted file mode 100644 index f86d323ab8..0000000000 --- a/awx/ui/client/src/license/license.block.less +++ /dev/null @@ -1,290 +0,0 @@ -/* -* Style conventions -* .ModuleName-component-subComponent -* Naming describes components of the view -*/ -.License-container{ - .OnePlusTwo-container; -} - -.License-container--missing { - max-width: 800px; - margin: 0 auto; - padding: 0 20px; -} - -.License-field--label{ - .OnePlusTwo-left--detailsLabel; -} -.License-fileName{ - padding-left: 20px; -} -.License-management .CodeMirror-scroll{ - min-height: 140px; -} -.License-file textarea{ - display: block; - width: 100%; -} -.License-file--left { - display: flex; - flex:1; - overflow: hidden; -} -.License-file--middle { - display: flex; - flex: 0 0 auto; - padding: 0px 20px; - flex-direction: column; -} -.License-file--right { - display: flex; - flex:1; -} -.License-submit--success.ng-hide-add, .License-submit--success.ng-hide-remove { - transition: all ease-in-out 0.5s; -} -.License-submit--success{ - opacity: 1; - transition: all ease-in-out 0.5s; -} -.License-submit--success.ng-hide{ - opacity: 0; -} - -.License-eulaNotice{ - font-size: 12px; - width: 100%; - max-height: 129px; - padding: 15px; - padding-top: 10px; - margin-bottom: 10px; - border-radius: 4px; - border: 1px solid @login-notice-border; - background-color: @login-notice-bg; - color: @login-notice-text; - overflow-y: scroll; - overflow-x: visible; - white-space: pre-line; -} - -.License-field label{ - width: 155px; -} -.License-field--content{ - .OnePlusTwo-left--detailsContent; - text-transform: capitalize; -} -.License-field--key { - text-transform: none; -} -.License-field{ - .OnePlusTwo-left--detailsRow; -} -.License-field + .License-field { - margin-top: 20px; -} -.License-greenText{ - color: @submit-button-bg; - padding-right: 10px; -} -.License-redText{ - color: @default-err; - padding-right: 10px; -} -.License-fields{ - .OnePlusTwo-left--details; -} - -.License-titleText { - .OnePlusTwo-panelHeader; -} -.License-management{ - display: flex; -} -.License-management--missingLicense{ - height: auto; -} -.License-downloadLicenseButton{ - margin-bottom: 10px; - color:@default-bg; -} -.License-downloadLicenseButton:hover{ - background-color: @default-link-hov !important; - color:@default-bg !important; -} -.License-downloadLicenseButton:focus{ - background-color: @default-link-hov !important; - color:@default-bg !important; -} - -@media (min-width: 900px) { - .License-details { - margin-right: 20px; - } -} - -.License-submit--success, .License-submit--failure { - margin: 0; -} -.License-file--container { - display: flex; - input[type=file] { - display: none; - } -} -.License-upgradeText { - margin: 20px 0px; -} -.License-body { - margin-top: 25px; -} -.License-subTitleText { - text-transform: uppercase; - margin: 20px 0px 15px 0px; - color: @default-interface-txt; -} -.License-helperText { - color: @default-interface-txt; -} -.License-input--fake{ - border-top-right-radius: 4px !important; - border-bottom-right-radius: 4px !important; -} - -.License-detailsGroup { - margin-bottom: 20px; -} - -.License-analyticsCheckbox { - padding-top: 5px; -} - -.License-analyticsCheckboxGroup { - padding: 10px 0; - font-weight: bold; -} - -.License-separator { - display: flex; - flex: 1; - background: linear-gradient(#d7d7d7, #d7d7d7) no-repeat center/2px 100%; -} - -.License-licenseStepHelp { - font-size: 12px; - font-style: italic; - margin-bottom: 10px; -} - -.License-filePicker { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.License-rhCredField { - margin-bottom: 10px; -} - -.License-label { - color: @field-label; - font-weight: 400; -} - -.License-action { - display: flex; - flex-direction: row; - align-content:flex-end; -} - -.License-actionError { - flex: 1; -} - -.License-subSelectorModal { - height: 100%; - width: 100%; - position: fixed; - top: 0; - left: 0; - background: rgba(0, 0, 0, 0.3); - z-index: 1040; - display: flex; - align-items: center; - justify-content: center; -} - -.License-modal { - width: 750px; -} - -.License-modalBody { - border: 1px solid @b7grey; - max-height: 550px; - overflow: scroll; - border-radius: 4px; -} - -.License-modalRow { - display: flex; - padding: 10px; -} - -.License-modalRow:not(:last-of-type) { - border-bottom: 1px solid @b7grey; -} - -.License-modalRowRadio { - flex: 0 0 40px; - display: flex; - align-items: center; -} - -.License-trialTag { - font-weight: 100; - background-color: #ebebeb; - border-radius: 5px; - color: #606060; - font-size: 10px; - margin-right: 10px; - padding: 3px 9px; - line-height: 14px; - word-break: keep-all; - display: inline-flex; -} - -.License-introText { - margin-bottom: 10px; -} - -.License-getLicensesButton { - display: flex; - justify-content: flex-end; - margin-bottom: 20px; -} - -.License-checkboxLabel { - margin-left: 5px; - font-weight: normal; -} - -.License-modalRowDetails { - flex: 1; -} - -.License-modalRowDetailsLabel { - font-weight: normal; - width: 100%; -} - -.License-modalRowDetailsRow { - margin-bottom: 10px; -} - -.License-modalRowDetails--50 { - display: flex; - flex-basis: 50%; - align-items: center; - line-height: 21px; -} diff --git a/awx/ui/client/src/license/license.controller.js b/awx/ui/client/src/license/license.controller.js deleted file mode 100644 index 2cae41e363..0000000000 --- a/awx/ui/client/src/license/license.controller.js +++ /dev/null @@ -1,232 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import {N_} from "../i18n"; - -export default - ['Wait', '$state', '$scope', '$rootScope', 'ProcessErrors', 'CheckLicense', 'moment', '$timeout', 'Rest', 'LicenseStrings', - '$window', 'ConfigService', 'pendoService', 'insightsEnablementService', 'i18n', 'config', 'subscriptionCreds', 'GetBasePath', - function(Wait, $state, $scope, $rootScope, ProcessErrors, CheckLicense, moment, $timeout, Rest, LicenseStrings, - $window, ConfigService, pendoService, insightsEnablementService, i18n, config, subscriptionCreds, GetBasePath) { - - $scope.strings = LicenseStrings; - - const calcDaysRemaining = function(seconds) { - // calculate the number of days remaining on the license - let duration = moment.duration(seconds, 'seconds').asDays(); - - duration = Math.floor(duration); - if(duration < 0){ - duration = 0; - } - - duration = (duration!==1) ? `${duration} Days` : `${duration} Day`; - - return duration; - }; - - const calcExpiresOn = function(seconds) { - // calculate the expiration date of the license - return moment.unix(seconds).calendar(); - }; - - const reset = function() { - $scope.newLicense.eula = undefined; - $scope.subscriptionCreds = {}; - $scope.selectedLicense = {}; - }; - - const initVars = (config) => { - // license/license.partial.html compares fileName - $scope.fileName = N_("No file selected."); - - if ($rootScope.licenseMissing) { - $scope.title = $rootScope.BRAND_NAME + i18n._(" Subscription"); - } else { - $scope.title = i18n._("Subscription Management"); - } - - $scope.license = config; - $scope.license.version = config.version.split('-')[0]; - $scope.time = {}; - $scope.time.remaining = calcDaysRemaining($scope.license.license_info.time_remaining); - $scope.time.expiresOn = calcExpiresOn($scope.license.license_info.license_date); - $scope.valid = CheckLicense.valid($scope.license.license_info); - $scope.compliant = $scope.license.license_info.compliant; - $scope.selectedLicense = {}; - $scope.newLicense = { - pendo: true, - insights: true - }; - - $scope.subscriptionCreds = {}; - - if (subscriptionCreds.SUBSCRIPTIONS_USERNAME && subscriptionCreds.SUBSCRIPTIONS_USERNAME !== "") { - $scope.subscriptionCreds.username = subscriptionCreds.SUBSCRIPTIONS_USERNAME; - } - - if (subscriptionCreds.SUBSCRIPTIONS_PASSWORD && subscriptionCreds.SUBSCRIPTIONS_PASSWORD !== "") { - $scope.subscriptionCreds.password = subscriptionCreds.SUBSCRIPTIONS_PASSWORD; - $scope.showPlaceholderPassword = true; - } - }; - - const updateSubscriptionCreds = (config) => { - Rest.setUrl(`${GetBasePath('settings')}system/`); - Rest.get() - .then(({data}) => { - initVars(config); - - if (data.SUBSCRIPTIONS_USERNAME && data.SUBSCRIPTIONS_USERNAME !== "") { - $scope.subscriptionCreds.username = data.SUBSCRIPTIONS_USERNAME; - } - - if (data.SUBSCRIPTIONS_PASSWORD && data.SUBSCRIPTIONS_PASSWORD !== "") { - $scope.subscriptionCreds.password = data.SUBSCRIPTIONS_PASSWORD; - $scope.showPlaceholderPassword = true; - } - }).catch(() => { - initVars(config); - }); - }; - - initVars(config); - - $scope.getKey = function(event) { - // Mimic HTML5 spec, show filename - $scope.fileName = event.target.files[0].name; - // Grab the key from the raw license file - const raw = new FileReader(); - - raw.onload = function() { - $scope.newLicense.manifest = btoa(raw.result); - }; - - try { - raw.readAsBinaryString(event.target.files[0]); - } catch(err) { - ProcessErrors($rootScope, null, null, null, - {msg: i18n._('Invalid file format. Please upload a valid Red Hat Subscription Manifest.')}); - } - }; - - // HTML5 spec doesn't provide a way to customize file input css - // So we hide the default input, show our own, and simulate clicks to the hidden input - $scope.fakeClick = function() { - if($scope.user_is_superuser && (!$scope.subscriptionCreds.username || $scope.subscriptionCreds.username === '') && (!$scope.subscriptionCreds.password || $scope.subscriptionCreds.password === '')) { - $('#License-file').click(); - } - }; - - $scope.downloadLicense = function() { - $window.open('https://www.ansible.com/license', '_blank'); - }; - - $scope.replacePassword = () => { - if ($scope.user_is_superuser && !$scope.newLicense.manifest) { - $scope.showPlaceholderPassword = false; - $scope.subscriptionCreds.password = ""; - $timeout(() => { - $('.tooltip').remove(); - $('#rh-password').focus(); - }); - } - }; - - $scope.lookupLicenses = () => { - if ($scope.subscriptionCreds.username && $scope.subscriptionCreds.password) { - Wait('start'); - ConfigService.getSubscriptions($scope.subscriptionCreds.username, $scope.subscriptionCreds.password) - .then(({data}) => { - Wait('stop'); - if (data && data.length > 0) { - $scope.rhLicenses = data; - if ($scope.selectedLicense.fullLicense) { - $scope.selectedLicense.modalKey = $scope.selectedLicense.fullLicense.license_key; - } - $scope.showLicenseModal = true; - } else { - ProcessErrors($scope, data, status, null, { - hdr: i18n._('No Licenses Found'), - msg: i18n._('We were unable to locate licenses associated with this account') - }); - } - }) - .catch(({data, status}) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: i18n._('Error Fetching Licenses') - }); - }); - } - }; - - $scope.confirmLicenseSelection = () => { - $scope.showLicenseModal = false; - $scope.selectedLicense.fullLicense = $scope.rhLicenses.find((license) => { - return license.pool_id === $scope.selectedLicense.modalPoolId; - }); - $scope.selectedLicense.modalPoolId = undefined; - }; - - $scope.cancelLicenseLookup = () => { - $scope.showLicenseModal = false; - $scope.selectedLicense.modalPoolId = undefined; - }; - - $scope.submit = function() { - Wait('start'); - let payload = {}; - let attach = false; - if ($scope.newLicense.manifest) { - payload.manifest = $scope.newLicense.manifest; - } else if ($scope.selectedLicense.fullLicense) { - payload.pool_id = $scope.selectedLicense.fullLicense.pool_id; - attach = true; - } - - CheckLicense.post(payload, $scope.newLicense.eula, attach) - .finally((licenseInfo) => { - reset(); - ConfigService.delete(); - ConfigService.getConfig(licenseInfo) - .then(function(config) { - - if ($rootScope.licenseMissing === true) { - if ($scope.newLicense.pendo) { - pendoService.updatePendoTrackingState('detailed'); - pendoService.issuePendoIdentity(); - } else { - pendoService.updatePendoTrackingState('off'); - } - - if ($scope.newLicense.insights) { - insightsEnablementService.updateInsightsTrackingState(true); - } else { - insightsEnablementService.updateInsightsTrackingState(false); - } - - $state.go('dashboard', { - licenseMissing: false - }); - } else { - updateSubscriptionCreds(config); - $scope.success = true; - $rootScope.licenseMissing = false; - // for animation purposes - const successTimeout = setTimeout(function() { - $scope.success = false; - clearTimeout(successTimeout); - }, 4000); - } - }); - }).catch((err) => { - ProcessErrors($scope, err, null, null, { - hdr: i18n._('Error Applying License') - }); - }); - }; -}]; diff --git a/awx/ui/client/src/license/license.partial.html b/awx/ui/client/src/license/license.partial.html deleted file mode 100644 index d65a829c18..0000000000 --- a/awx/ui/client/src/license/license.partial.html +++ /dev/null @@ -1,286 +0,0 @@ -
-
-
-
Details
-
-
-
Subscription
-
- Compliant - Out of Compliance -
-
-
-
Version
-
- {{license.version}} -
-
-
-
Subscription Type
-
- {{license.license_info.license_type}} -
-
-
-
Subscription
-
- {{license.license_info.subscription_name}} -
-
-
-
Expires On
-
- {{time.expiresOn}} -
-
-
-
Time Remaining
-
- {{time.remaining}} -
-
-
-
Hosts Available
-
- {{license.license_info.available_instances}} -
-
-
-
Hosts Available
-
Unlimited
-
-
-
Hosts Used
-
- {{license.license_info.current_instances}} -
-
-
-
Hosts Remaining
-
- {{license.license_info.free_instances}} -
-
-
-
Hosts Remaining
-
- {{license.license_info.free_instances}} -
-
-
-
If you are ready to upgrade or renew, please contact us by clicking the button below.
- -
-
-
-
-
{{title}}
-
-
Welcome to Red Hat Ansible Automation Platform! Please complete the steps below to activate your subscription.
-
- - 1 - - - If you do not have a subscription, you can visit Red Hat to obtain a trial subscription. - -
- -
-
- - 2 - - - Select your Ansible Automation Platform subscription to use. - -
-
-
-
-
-
- - Upload a Red Hat Subscription Manifest containing your subscription. To generate your subscription manifest, go to subscription allocations on the Red Hat Customer Portal. - -
-
- * - Red Hat Subscription Manifest - - - -
-
- Browse - {{fileName|translate}} - -
-
-
-
-
-
OR
-
-
-
-
-
- - Provide your Red Hat or Red Hat Satellite credentials below and you can choose from a list of your available subscriptions. The credentials you use will be stored for future use in retrieving renewal or expanded subscriptions. - -
-
- - -
-
- -
- - - - -
-
- -
-
-
- GET SUBSCRIPTIONS -
-
-
- Selected -
- {{selectedLicense.fullLicense.subscription_name}} -
-
-
-
-
- - 3 - - - Agree to the End User License Agreement, and click submit. - -
-
- * - End User License Agreement -
-
{{ license.eula }}
-
-
- -
-
-
- Tracking and Analytics -
-
- - - By default, Tower collects and transmits analytics data on Tower usage to Red Hat. There are two categories of data collected by Tower. For more information, see this Tower documentation page. Uncheck the following boxes to disable this feature. - -
-
- -
-
- -
-
-
-
-
- Save successful! -
-
- -
-
-
-
-
-
-
- -
diff --git a/awx/ui/client/src/license/license.route.js b/awx/ui/client/src/license/license.route.js deleted file mode 100644 index 2ea594c12a..0000000000 --- a/awx/ui/client/src/license/license.route.js +++ /dev/null @@ -1,65 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import {templateUrl} from '../shared/template-url/template-url.factory'; -import { N_ } from '../i18n'; -import _ from 'lodash'; - -export default { - name: 'license', - route: '/license', - templateUrl: templateUrl('license/license'), - controller: 'licenseController', - data: {}, - ncyBreadcrumb: { - label: N_('SUBSCRIPTION') - }, - onEnter: ['$state', 'ConfigService', (state, configService) => { - return configService.getConfig() - .then(config => { - if (_.get(config, 'license_info.license_type') === 'open') { - return state.go('setup'); - } - }); - }], - resolve: { - features: ['CheckLicense', '$rootScope', - function(CheckLicense, $rootScope) { - if($rootScope.licenseMissing === undefined){ - return CheckLicense.notify(); - } - } - ], - config: ['ConfigService', 'CheckLicense', '$rootScope', - function(ConfigService, CheckLicense, $rootScope) { - ConfigService.delete(); - return ConfigService.getConfig() - .then(function(config){ - $rootScope.licenseMissing = (CheckLicense.valid(config.license_info) === false) ? true : false; - return config; - }); - } - ], - subscriptionCreds: ['Rest', 'GetBasePath', function(Rest, GetBasePath) { - Rest.setUrl(`${GetBasePath('settings')}system/`); - return Rest.get() - .then(({data}) => { - const subscriptionCreds = {}; - if (data.SUBSCRIPTIONS_USERNAME && data.SUBSCRIPTIONS_USERNAME !== "") { - subscriptionCreds.SUBSCRIPTIONS_USERNAME = data.SUBSCRIPTIONS_USERNAME; - } - - if (data.SUBSCRIPTIONS_PASSWORD && data.SUBSCRIPTIONS_PASSWORD !== "") { - subscriptionCreds.SUBSCRIPTIONS_PASSWORD = data.SUBSCRIPTIONS_PASSWORD; - } - - return subscriptionCreds; - }).catch(() => { - return {}; - }); - }] - }, -}; diff --git a/awx/ui/client/src/license/license.strings.js b/awx/ui/client/src/license/license.strings.js deleted file mode 100644 index 4417f5a553..0000000000 --- a/awx/ui/client/src/license/license.strings.js +++ /dev/null @@ -1,13 +0,0 @@ -function LicenseStrings (BaseString) { - BaseString.call(this, 'license'); - - let t = this.t; - let ns = this.license; - - ns.REPLACE_PASSWORD = t.s('Replace password'); - ns.CANCEL_LOOKUP = t.s('Cancel license lookup'); -} - -LicenseStrings.$inject = ['BaseStringService']; - -export default LicenseStrings; diff --git a/awx/ui/client/src/license/main.js b/awx/ui/client/src/license/main.js deleted file mode 100644 index 78efc73bb8..0000000000 --- a/awx/ui/client/src/license/main.js +++ /dev/null @@ -1,21 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import route from './license.route'; -import controller from './license.controller'; -import CheckLicense from './checkLicense.factory'; -import fileOnChange from './fileOnChange.directive'; -import LicenseStrings from './license.strings'; - -export default - angular.module('license', []) - .controller('licenseController', controller) - .directive('fileOnChange', fileOnChange) - .factory('CheckLicense', CheckLicense) - .service('LicenseStrings', LicenseStrings) - .run(['$stateExtender', function($stateExtender) { - $stateExtender.addState(route); - }]); diff --git a/awx/ui/client/src/login/authenticationServices/authentication.service.js b/awx/ui/client/src/login/authenticationServices/authentication.service.js deleted file mode 100644 index e57ffa18f6..0000000000 --- a/awx/ui/client/src/login/authenticationServices/authentication.service.js +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - - /** - * @ngdoc function - * @name shared.function:AuthService - * @description AuthService.js - * - * User authentication functions - * - */ - -export default - ['$http', '$rootScope', '$cookies', 'GetBasePath', 'Store', '$q', - '$injector', '$location', - function ($http, $rootScope, $cookies, GetBasePath, Store, $q, - $injector, $location) { - return { - setToken: function (token, expires) { - $cookies.remove('token_expires'); - $cookies.remove('userLoggedIn'); - - $cookies.put('token_expires', expires); - $cookies.put('userLoggedIn', true); - $cookies.put('sessionExpired', false); - - $rootScope.userLoggedIn = true; - $rootScope.userLoggedOut = false; - $rootScope.token_expires = expires; - $rootScope.sessionExpired = false; - }, - - isUserLoggedIn: function () { - if ($rootScope.userLoggedIn === undefined) { - // Browser refresh may have occurred - $rootScope.userLoggedIn = ($cookies.get('userLoggedIn') === 'true'); - $rootScope.sessionExpired = ($cookies.get('sessionExpired') === 'true'); - } - return $rootScope.userLoggedIn; - }, - retrieveToken: function (username, password) { - return $http({ - method: 'POST', - url: `/api/login/`, - data: `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}&next=%2fapi%2f`, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - } - }); - }, - deleteToken: function () { - return $http({ - method: 'GET', - url: '/api/logout/' - }); - }, - - logout: function () { - // the following puts our primary scope up for garbage collection, which - // should prevent content flash from the prior user. - - var x, - deferred = $q.defer(), - ConfigService = $injector.get('ConfigService'), - SocketService = $injector.get('SocketService'), - scope = angular.element(document.getElementById('main-view')).scope(); - - this.deleteToken().then(() => { - if(scope){ - scope.$destroy(); - } - - if($cookies.get('lastPath')==='/portal'){ - $cookies.put( 'lastPath', '/portal'); - $rootScope.lastPath = '/portal'; - } - else if ($cookies.get('lastPath') !== '/home' || $cookies.get('lastPath') !== '/' || $cookies.get('lastPath') !== '/login' || $cookies.get('lastPath') !== '/logout'){ - // do nothing - $rootScope.lastPath = $cookies.get('lastPath'); - } - else { - // your last path was home - $cookies.remove('lastPath'); - $rootScope.lastPath = '/home'; - } - x = Store('sessionTime'); - if ($rootScope.current_user && x && x[$rootScope.current_user.id]) { - x[$rootScope.current_user.id].loggedIn = false; - } - Store('sessionTime', x); - - if ($cookies.getObject('current_user')) { - $rootScope.lastUser = $cookies.getObject('current_user').id; - } - ConfigService.delete(); - SocketService.disconnect(); - $cookies.remove('token_expires'); - $cookies.remove('current_user'); - $cookies.put('userLoggedIn', false); - $cookies.put('sessionExpired', false); - $cookies.putObject('current_user', {}); - $rootScope.current_user = {}; - $rootScope.license_tested = undefined; - $rootScope.userLoggedIn = false; - $rootScope.sessionExpired = false; - $rootScope.licenseMissing = true; - $rootScope.token_expires = null; - $rootScope.login_username = null; - $rootScope.login_password = null; - $rootScope.userLoggedOut = true; - $rootScope.pendingApprovalCount = 0; - if ($rootScope.sessionTimer) { - $rootScope.sessionTimer.clearTimers(); - } - deferred.resolve(); - }); - - return deferred.promise; - - }, - - licenseTested: function () { - var license, result; - if ($rootScope.license_tested !== undefined) { - result = $rootScope.license_tested; - } else { - // User may have hit browser refresh - license = Store('license'); - $rootScope.version = license.version; - if (license && license.tested !== undefined) { - result = license.tested; - } else { - result = false; - } - } - return result; - }, - - getUser: function () { - return $http({ - method: 'GET', - url: GetBasePath('me') - }); - }, - - setUserInfo: function (response) { - // store the response values in $rootScope so we can get to them later - $rootScope.current_user = response.results[0]; - if ($location.protocol() === 'https') { - $cookies.putObject('current_user', response.results[0], {secure: true}); //keep in session cookie in the event of browser refresh - } else { - $cookies.putObject('current_user', response.results[0], {secure: false}); - } - }, - - restoreUserInfo: function () { - $rootScope.current_user = $cookies.getObject('current_user'); - }, - - getUserInfo: function (key) { - // Access values returned from the Me API call - var cu; - if ($rootScope.current_user) { - return $rootScope.current_user[key]; - } - this.restoreUserInfo(); - cu = $cookies.getObject('current_user'); - return cu[key]; - } - }; - } -]; diff --git a/awx/ui/client/src/login/authenticationServices/insightsEnablement.service.js b/awx/ui/client/src/login/authenticationServices/insightsEnablement.service.js deleted file mode 100644 index b76d378f2b..0000000000 --- a/awx/ui/client/src/login/authenticationServices/insightsEnablement.service.js +++ /dev/null @@ -1,27 +0,0 @@ -/************************************************* -* Copyright (c) 2015 Ansible, Inc. -* -* All Rights Reserved -*************************************************/ - - -export default ['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', - function ($rootScope, Rest, GetBasePath, ProcessErrors) { - return { - updateInsightsTrackingState: function(tracking_type) { - if (tracking_type === true || tracking_type === false) { - Rest.setUrl(`${GetBasePath('settings')}system`); - Rest.patch({ INSIGHTS_TRACKING_STATE: tracking_type }) - .catch(function ({data, status}) { - ProcessErrors($rootScope, data, status, null, { - hdr: 'Error!', - msg: 'Failed to patch INSIGHTS_TRACKING_STATE in settings: ' + - status }); - }); - } else { - throw new Error(`Can't update insights data enabled in settings to - "${tracking_type}"`); - } - } - }; - }]; diff --git a/awx/ui/client/src/login/authenticationServices/isAdmin.factory.js b/awx/ui/client/src/login/authenticationServices/isAdmin.factory.js deleted file mode 100644 index 41b1b29447..0000000000 --- a/awx/ui/client/src/login/authenticationServices/isAdmin.factory.js +++ /dev/null @@ -1,18 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name - * @description - * - * - */ - - export default - ['$rootScope', function($rootScope) { - return function() { return ($rootScope.current_user && $rootScope.current_user.is_superuser); }; - }]; diff --git a/awx/ui/client/src/login/authenticationServices/main.js b/awx/ui/client/src/login/authenticationServices/main.js deleted file mode 100644 index 373ecdbd07..0000000000 --- a/awx/ui/client/src/login/authenticationServices/main.js +++ /dev/null @@ -1,19 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import authenticationService from './authentication.service'; -import isAdmin from './isAdmin.factory'; -import timer from './timer.factory'; -import pendoService from './pendo.service'; -import insightsEnablementService from './insightsEnablement.service'; - -export default - angular.module('authentication', []) - .factory('Authorization', authenticationService) - .factory('IsAdmin', isAdmin) - .factory('Timer', timer) - .service('pendoService', pendoService) - .service('insightsEnablementService', insightsEnablementService); diff --git a/awx/ui/client/src/login/authenticationServices/pendo.service.js b/awx/ui/client/src/login/authenticationServices/pendo.service.js deleted file mode 100644 index cab17baea3..0000000000 --- a/awx/ui/client/src/login/authenticationServices/pendo.service.js +++ /dev/null @@ -1,128 +0,0 @@ -/************************************************* -* Copyright (c) 2015 Ansible, Inc. -* -* All Rights Reserved -*************************************************/ - - -export default ['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', '$q', 'ConfigService', '$log', - 'AppStrings', - function ($rootScope, Rest, GetBasePath, ProcessErrors, $q, ConfigService, $log, AppStrings) { - return { - setPendoOptions: function (config) { - const tower_version = config.version.split('-')[0]; - const trial = (config.trial) ? config.trial : false; - let options = { - apiKey: AppStrings.get('PENDO_API_KEY'), - visitor: { - id: null, - role: null, - }, - account: { - id: null, - planLevel: config.license_type, - planPrice: config.instance_count, - creationDate: config.license_date, - trial: trial, - tower_version: tower_version, - ansible_version: config.ansible_version - } - }; - - options.visitor.id = 0; - options.account.id = "tower.ansible.com"; - - return options; - }, - - setRole: function(options) { - const deferred = $q.defer(); - - if ($rootScope.current_user.is_superuser === true) { - options.visitor.role = 'admin'; - deferred.resolve(options); - } else { - Rest.setUrl(GetBasePath('users') + $rootScope.current_user.id + - '/admin_of_organizations/'); - Rest.get() - .then(function (response) { - if (response.data.count > 0) { - options.visitor.role = "orgadmin"; - deferred.resolve(options); - } else { - options.visitor.role = "user"; - deferred.resolve(options); - } - }) - .catch(function (response) { - ProcessErrors($rootScope, response.data, response.status, null, { - hdr: 'Error!', - msg: 'Failed to get admin of org user list. GET returned status: ' + - response.status }); - deferred.reject('Could not resolve pendo role.'); - }); - } - - return deferred.promise; - }, - - bootstrap: function(){ - /* jshint ignore:start */ - (function(p,e,n,d,o){var v,w,x,y,z;o=p[d]=p[d]||{};o._q=[]; - v=['initialize','identify','updateOptions','pageLoad'];for(w=0,x=v.length;w - - diff --git a/awx/ui/client/src/login/loginModal/loginModal.block.less b/awx/ui/client/src/login/loginModal/loginModal.block.less deleted file mode 100644 index 5765b359f4..0000000000 --- a/awx/ui/client/src/login/loginModal/loginModal.block.less +++ /dev/null @@ -1,158 +0,0 @@ -/** @define LoginModal */ -.LoginModal-backDrop { - width: 100vw; - height: 100vh; - position: fixed; - top: 0; - left: 0; - z-index: 1041; - opacity: 0; - transition: 0.5s opacity; - background: @login-backdrop; -} - -.LoginModal-backDrop.is-loggedOut { - opacity: 0.2; -} - -.LoginModal-dialog { - margin: 30px auto; - margin-top: 95px; -} - -.LoginModal-content { - max-width: 550px; - margin-left: auto; - margin-right: auto; - border: 0; - box-shadow: none; - background-color: @login-bg; - border-radius: 4px; - opacity: 0; - transition: opacity 0.5s; - z-index: 1042; - position: relative; -} - -.LoginModal-content.is-loggedOut { - opacity: 1; - transition: opacity 0.5s; -} - -.LoginModal-header { - text-align: left; - background-color: @login-header-bg; - border-bottom: 0; - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} - -.LoginModal-body { - padding-top: 15px; - padding-bottom: 0px; - padding-left: 20px; - padding-right: 20px; -} - -.LoginModal-logoImage { - max-width: 112px; - margin: 20px 20px 10px 20px; -} - -.LoginModal-logoImage--notCustom { - max-width: @login-max-width; - margin: @login-margin; -} - -.LoginModal-alert { - margin-bottom: 20px; - font-size: 16px; - font-weight: normal; - color: @login-alert; - transition: opacity 0.2s; -} - -.LoginModal-alert--error { - color: @login-alert-error; - padding-bottom: 4px; -} - -.LoginModal-alert { - opacity: 1; - display: flex; -} - -.LoginModal-alert.ng-hide { - display: none; - opacity: 0; -} - -.LoginModal-alert.ng-hide-add { - display: none; - opacity: 0; -} - -.LoginModal-alert.ng-hide-remove { - display: block; -} - -.LoginModal-alertIcon { - display: flex; - align-items: center; - line-height: 19px; -} - -.LoginModal-alertIcon:before { - margin-right: 10px; -} - -.LoginModal-formGroup { - margin-bottom: 20px; -} - -.LoginModal-label { - color: @field-label; - font-weight: 400; -} - -.LoginModal-field { - color: @field-input-text; - background-color: @field-bg; - border: 1px solid @field-border; -} - -.LoginModal-footer { - display: flex; - flex-wrap: wrap-reverse; - align-items: center; - padding: 20px; - padding-top: 5px; - padding-bottom: 0px; - margin-top: 20px; -} - -.LoginModal-footerBlock { - flex: 1 0 auto; - margin-bottom: 20px; - display: flex; - max-width: 100%; -} - -.LoginModal-footerBlock--submit { - flex: initial; - margin-left: auto; - padding-left: 20px; -} - -.LoginModal-signInButton { - transition: background-color 0.2s; - background-color: @submit-button-bg; - color: @submit-button-text; - font-size: 0.875rem; -} - -.LoginModal-signInButton:hover, -.LoginModal-signInButton:focus { - color: @submit-button-text; - background-color: @submit-button-bg-hov; -} diff --git a/awx/ui/client/src/login/loginModal/loginModal.controller.js b/awx/ui/client/src/login/loginModal/loginModal.controller.js deleted file mode 100644 index 657cb55553..0000000000 --- a/awx/ui/client/src/login/loginModal/loginModal.controller.js +++ /dev/null @@ -1,188 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Authentication - * @description - * Controller for handling /#/login and /#/logout routes. - * - * (app.js) verifies the user is authenticated and that the user session is not expired. If either condition is not true, - * the user is redirected to /#/login and the Authentication controller. - * - * Methods for checking the session state are found in [js/shared/AuthService.js](/static/docs/api/shared.function:AuthService), which is referenced here as Authorization. - * - * #Login Modal Dialog - * - * The modal dialog prompting for username and password is found in templates/ui/index.html. - *``` - * - * - *``` - * HTML for the login form is generated, compiled and injected into
by the controller. This is done to associate the form with the controller's scope. Because - *
is outside of the ng-view container, it gets associated with $rootScope by default. In the controller we create a new scope using $rootScope.$new() and associate - * that with the login form. Doing this each time the controller is instantiated insures the form is clean and not pre-populated with a prior user's username and password. - * - * Just before the release of 2.0 a bug was discovered where clicking logout and then immediately clicking login without providing a username and password would successfully log - * the user back into the app. Implementing the above approach fixed this, forcing a new username/password to be entered each time the login dialog appears. - * - * - * @Usage - * This is usage information. - */ - -export default ['$log', '$cookies', '$rootScope', 'ProcessErrors', - '$location', 'Authorization', 'Alert', 'Wait', 'Timer', - 'Empty', '$scope', 'pendoService', 'ConfigService', - 'CheckLicense', 'SocketService', 'Rest', 'GetBasePath', 'i18n', - function ($log, $cookies, $rootScope, ProcessErrors, - $location, Authorization, Alert, Wait, Timer, - Empty, scope, pendoService, ConfigService, - CheckLicense, SocketService, Rest, GetBasePath, i18n) { - var lastPath, lastUser, sessionExpired, loginAgain, preAuthUrl; - - loginAgain = function() { - setTimeout(function() { - $location.path('/logout'); - }, 1000); - }; - - scope.sessionExpired = (Empty($rootScope.sessionExpired)) ? $cookies.get('sessionExpired') : $rootScope.sessionExpired; - scope.login_username = ''; - scope.login_password = ''; - - - lastPath = function () { - return (Empty($rootScope.lastPath)) ? $cookies.get('lastPath') : $rootScope.lastPath; - }; - - lastUser = function(){ - if(!Empty($rootScope.lastUser) && $rootScope.lastUser === $rootScope.current_user.id){ - return true; - } - else { - return false; - } - }; - - preAuthUrl = $rootScope.preAuthUrl; - - $log.debug('User session expired: ' + sessionExpired); - $log.debug('Last URL: ' + lastPath()); - - $rootScope.loginConfig.promise.then(function () { - if ($AnsibleConfig.custom_logo) { - scope.customLogo = $rootScope.custom_logo; - scope.customLogoPresent = true; - } else { - scope.customLogo = "logo-login.svg"; - scope.customLogoPresent = false; - } - scope.customLoginInfo = $AnsibleConfig.custom_login_info; - scope.customLoginInfoPresent = (scope.customLoginInfo) ? true : false; - scope.customLoginInfoIsHTML = /<\/?[a-z][\s\S]*>/i.test(scope.customLoginInfo); - }); - - if (scope.removeAuthorizationGetLicense) { - scope.removeAuthorizationGetLicense(); - } - scope.removeAuthorizationGetLicense = scope.$on('AuthorizationGetLicense', function() { - ConfigService.getConfig().then(function(){ - CheckLicense.test(); - pendoService.issuePendoIdentity(); - Wait("stop"); - if(!Empty(preAuthUrl)){ - $location.path(preAuthUrl); - delete $rootScope.preAuthUrl; - } - else { - if (lastPath() && lastUser()) { - // Go back to most recent navigation path - $location.path(lastPath()); - } else { - $location.url('/home'); - } - } - }) - .catch(function () { - Wait('stop'); - Alert('Error', 'Failed to access license information. GET returned status: ' + status, 'alert-danger', loginAgain); - }); - }); - - if (scope.removeAuthorizationGetUser) { - scope.removeAuthorizationGetUser(); - } - scope.removeAuthorizationGetUser = scope.$on('AuthorizationGetUser', function() { - // Get all the profile/access info regarding the logged in user - Authorization.getUser() - .then(({data}) => { - Authorization.setUserInfo(data); - Timer.init().then(function(timer){ - $rootScope.sessionTimer = timer; - SocketService.init(); - $rootScope.user_is_superuser = data.results[0].is_superuser; - $rootScope.user_is_system_auditor = data.results[0].is_system_auditor; - scope.$emit('AuthorizationGetLicense'); - }); - - Rest.setUrl(`${GetBasePath('workflow_approvals')}?status=pending&page_size=1`); - Rest.get() - .then(({data}) => { - $rootScope.pendingApprovalCount = data.count; - }) - .catch(({data, status}) => { - ProcessErrors({}, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get workflow jobs pending approval. GET returned status: ') + status - }); - }); - }) - .catch(({data, status}) => { - Authorization.logout().then( () => { - Wait('stop'); - Alert('Error', 'Failed to access user information. GET returned status: ' + status, 'alert-danger', loginAgain); - }); - }); - }); - - // Call the API to get an auth token - scope.systemLogin = function (username, password) { - $('.api-error').empty(); - if (Empty(username) || Empty(password)) { - scope.reset(); - scope.attemptFailed = true; - $('#login-username').focus(); - } else { - Wait('start'); - Authorization.retrieveToken(username, password) - .then(function (data) { - $('#login-modal').modal('hide'); - Authorization.setToken(data.data.expires); - scope.$emit('AuthorizationGetUser'); - }, - function (data) { - var key; - Wait('stop'); - if (data && data.data && data.data.non_field_errors && data.data.non_field_errors.length === 0) { - // show field specific errors returned by the API - for (key in data.data) { - scope[key + 'Error'] = data.data[key][0]; - } - } else { - scope.reset(); - scope.attemptFailed = true; - $('#login-username').focus(); - } - }); - } - }; -}]; diff --git a/awx/ui/client/src/login/loginModal/loginModal.directive.js b/awx/ui/client/src/login/loginModal/loginModal.directive.js deleted file mode 100644 index f9b3f8866b..0000000000 --- a/awx/ui/client/src/login/loginModal/loginModal.directive.js +++ /dev/null @@ -1,58 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ -import authenticationController from './loginModal.controller'; - -/* jshint unused: vars */ -export default - [ 'templateUrl', - 'Wait', - function(templateUrl, Wait) { - return { - restrict: 'E', - scope: true, - controller: authenticationController, - templateUrl: templateUrl('login/loginModal/loginModal'), - link: function(scope, element, attrs) { - var setLoginFocus = function () { - // Need to clear out any open dialog windows that might be open when this modal opens. - $('#login-username').focus(); - }; - - setLoginFocus(); - - // Hide any lingering modal dialogs - $('.modal[aria-hidden=false]').each(function () { - if ($(this).attr('id') !== 'login-modal') { - $(this).modal('hide'); - } - }); - - // Just in case, make sure the wait widget is not active - // and scroll the window to the top - Wait('stop'); - window.scrollTo(0,0); - - // Set focus to username field - $('#login-modal').on('shown.bs.modal', function () { - setLoginFocus(); - }); - - $('#login-password').bind('keypress', function (e) { - var code = (e.keyCode ? e.keyCode : e.which); - if (code === 13) { - $('#login-button').click(); - } - }); - - scope.reset = function () { - $('#login-form input').each(function () { - $(this).val(''); - }); - }; - } - }; - } - ]; diff --git a/awx/ui/client/src/login/loginModal/loginModal.partial.html b/awx/ui/client/src/login/loginModal/loginModal.partial.html deleted file mode 100644 index d9fa2c0219..0000000000 --- a/awx/ui/client/src/login/loginModal/loginModal.partial.html +++ /dev/null @@ -1,123 +0,0 @@ -
-
-
-
-
- - -
-
-
- Welcome to Ansible {{BRAND_NAME}}!  Please sign in. -
-
- -
- Your session timed out due to inactivity. Please sign in. -
-
-
- -
- You have been logged out. Please sign in. -
-
-
- -
- Maximum per-user sessions reached. Please sign in. -
-
-
- -
- Invalid username and/or password. Please try again. -
-
-
- -
- {{ thirdPartyAttemptFailed }} -
-
-
-
- -
- -
- Please enter a username. -
-
-
-
-
- -
- -
- Please enter a password. -
-
-
-
-
-
-
NOTICE
- - -
-
- -
-
-
diff --git a/awx/ui/client/src/login/loginModal/loginModalNotice.block.less b/awx/ui/client/src/login/loginModal/loginModalNotice.block.less deleted file mode 100644 index d5e6d4b517..0000000000 --- a/awx/ui/client/src/login/loginModal/loginModalNotice.block.less +++ /dev/null @@ -1,22 +0,0 @@ -/** @define LoginModalNotice */ -.LoginModalNotice { - font-size: 12px; - width: 100%; - max-height: 129px; - padding: 15px; - padding-top: 10px; - margin-bottom: 15px; - border-radius: 4px; - border: 1px solid @login-notice-border; - background-color: @login-notice-bg; - color: @login-notice-text; - overflow-y: scroll; - overflow-x: visible; -} - -.LoginModalNotice-title { - color: @login-notice-title; - font-weight: bold; - padding-bottom: 4px; - font-size: 14px; -} diff --git a/awx/ui/client/src/login/loginModal/main.js b/awx/ui/client/src/login/loginModal/main.js deleted file mode 100644 index 3d063d4e1c..0000000000 --- a/awx/ui/client/src/login/loginModal/main.js +++ /dev/null @@ -1,13 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import thirdPartySignOn from './thirdPartySignOn/main'; - -import loginModalDirective from './loginModal.directive'; - -export default - angular.module('loginModal', [thirdPartySignOn.name]) - .directive('loginModal', loginModalDirective); diff --git a/awx/ui/client/src/login/loginModal/thirdPartySignOn/main.js b/awx/ui/client/src/login/loginModal/thirdPartySignOn/main.js deleted file mode 100644 index e6f5f08b64..0000000000 --- a/awx/ui/client/src/login/loginModal/thirdPartySignOn/main.js +++ /dev/null @@ -1,13 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import thirdPartySignOnDirective from './thirdPartySignOn.directive'; -import thirdPartySignOnService from './thirdPartySignOn.service'; - -export default - angular.module('thirdPartySignOn', []) - .directive('thirdPartySignOn', thirdPartySignOnDirective) - .factory('thirdPartySignOnService', thirdPartySignOnService); diff --git a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.block.less b/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.block.less deleted file mode 100644 index d61006bf50..0000000000 --- a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.block.less +++ /dev/null @@ -1,51 +0,0 @@ -/** @define ThirdPartySignOn */ - -.ThirdPartySignOn { - display: flex; - align-items: center; -} - -.ThirdPartySignOn-label { - flex: initial; - color: @third-party-label; -} - -.ThirdPartySignOn-item { - margin-left: 15px; -} - -.ThirdPartySignOn-button { - transition: color 0.2s; - flex: 1 0 auto; - height: 30px; - width: 30px; - border-radius: 50%; - color: @third-party-btn-text; - background-color: @third-party-btn-bg; - border: 0; - padding: 0; -} - -.ThirdPartySignOn-button--error { - color: @third-party-error; -} - -.ThirdPartySignOn-button:hover { - color: @third-party-btn-hov; -} - -.ThirdPartySignOn-button--error:hover { - color: @third-party-error-hov; -} - -.ThirdPartySignOn-icon { - font-size: 35px; -} - -.ThirdPartySignOn-icon--gitHub { - margin-top: -3px; -} - -.ThirdPartySignOn-icon--fontCustom { - font-size: 30px; -} diff --git a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.controller.js b/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.controller.js deleted file mode 100644 index 4593344ad3..0000000000 --- a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.controller.js +++ /dev/null @@ -1,44 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:thirdPartySignOn - * @description - * Controller for handling third party supported login options. - */ - -export default ['$window', '$scope', 'thirdPartySignOnService', '$cookies', 'Authorization', - function ($window, $scope, thirdPartySignOnService, $cookies, Authorization) { - - thirdPartySignOnService( - {scope: $scope, url: "api/v2/auth/"}).then(function (data) { - if (data && data.options && data.options.length > 0) { - $scope.thirdPartyLoginSupported = true; - $scope.loginItems = data.options; - } else { - $scope.thirdPartyLoginSupported = false; - } - - if (data && data.error) { - $scope.$parent.thirdPartyAttemptFailed = data.error; - } - }); - - $scope.goTo = function(link) { - // clear out any prior auth state that might exist (e.g: from other - // tabs, etc.) before redirecting to the auth service - Authorization.logout().then(() => { - angular.forEach($cookies.getAll(), (val, name) => { - $cookies.remove(name); - }); - $window.location.reload(); - // this is used because $location only lets you navigate inside - // the "/#/" path, and these are API urls. - $window.location.href = link; - }); - }; - }]; diff --git a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.directive.js b/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.directive.js deleted file mode 100644 index 91c6a085c2..0000000000 --- a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.directive.js +++ /dev/null @@ -1,23 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/* jshint unused: vars */ - -import thirdPartySignOnController from './thirdPartySignOn.controller'; - -export default - [ 'templateUrl', - function(templateUrl) { - return { - restrict: 'E', - scope: true, - controller: thirdPartySignOnController, - templateUrl: templateUrl('login/loginModal/thirdPartySignOn/thirdPartySignOn'), - link: function(scope, element, attrs) { - } - }; - } - ]; diff --git a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html b/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html deleted file mode 100644 index c1868d51a1..0000000000 --- a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
- SIGN IN WITH -
-
- -
-
diff --git a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js b/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js deleted file mode 100644 index afc2c97a17..0000000000 --- a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js +++ /dev/null @@ -1,121 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name helpers.function:Permissions - * @description - * Gets the configured auth types based on the configurations set in the server - * - */ - - export default - ['$http', '$log', 'i18n', function($http, $log, i18n) { - return function (params) { - var url = params.url; - - return $http({ - method: 'GET', - url: url, - }).then(function (data) { - var options = [], - error = ""; - - function parseAzure(option) { - var newOption = {}; - - newOption.type = "azure"; - newOption.icon = "ThirdPartySignOn-icon--fontCustom icon-microsoft"; - newOption.link = option.login_url; - newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s"), "Azure AD"); - - return newOption; - } - - function parseGoogle(option) { - var newOption = {}; - - newOption.type = "google"; - newOption.icon = "ThirdPartySignOn-icon--fontCustom icon-google"; - newOption.link = option.login_url; - newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s"), "Google"); - - return newOption; - } - - function parseGithub(option, key) { - var newOption = {}; - - newOption.type = "github"; - newOption.icon = "fa-github ThirdPartySignOn-icon--gitHub"; - newOption.link = option.login_url; - newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s"), "GitHub"); - - // if this is a GitHub team or org, add that to - // the tooltip - if (key.split("-")[1]){ - if (key.split("-")[1] === "team") { - newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s Teams"), "GitHub"); - } else if (key.split("-")[1] === "org") { - newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s Organizations"), "GitHub"); - } - } - - return newOption; - } - - function parseSaml(option, key) { - var newOption = {}; - - newOption.type = "saml"; - newOption.icon = "ThirdPartySignOn-icon--fontCustom icon-saml-02"; - newOption.link = option.login_url; - newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s"), "SAML"); - - // add the idp of the saml type to the tooltip - if (key.split(":")[1]){ - newOption.tooltip += " (" + key.split(":")[1] + ")"; - } - - return newOption; - } - - function parseLoginOption(option, key) { - var finalOption; - - // set up the particular tooltip, icon, etc. - // needed by the login type - if (key.split("-")[0] === "azuread") { - finalOption = parseAzure(option, key); - } else if (key.split("-")[0] === "google") { - finalOption = parseGoogle(option, key); - } else if (key.split("-")[0] === "github") { - finalOption = parseGithub(option, key); - } else if (key.split(":")[0] === "saml") { - finalOption = parseSaml(option, key); - } - - // set the button to error red and set the error message to be passed to the login modal. - if (option.error) { - finalOption.button = "ThirdPartySignOn-button--error"; - error = option.error; - } - - options.push(finalOption); - } - - // iterate over each login option passed from the API - _.forEach(data.data, parseLoginOption); - - // return the options and the error to be utilized - // by the loginModal - return {"options": options, "error": error}; - }) - .catch(function (data) { - $log.error('Failed to get third-party login types. Returned status: ' + data.status ); - }); - }; - }]; diff --git a/awx/ui/client/src/login/logout.route.js b/awx/ui/client/src/login/logout.route.js deleted file mode 100644 index 47da767ec5..0000000000 --- a/awx/ui/client/src/login/logout.route.js +++ /dev/null @@ -1,22 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -// import {templateUrl} from '../../shared/template-url/template-url.factory'; - -export default { - name: 'signOut', - route: '/logout', - controller: ['Authorization', '$state', function(Authorization, $state) { - Authorization.logout().then( () =>{ - $state.go('signIn'); - }); - - }], - ncyBreadcrumb: { - skip: true - }, - templateUrl: '/static/partials/blank.html' -}; diff --git a/awx/ui/client/src/login/main.js b/awx/ui/client/src/login/main.js deleted file mode 100644 index 4835feebd3..0000000000 --- a/awx/ui/client/src/login/main.js +++ /dev/null @@ -1,18 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import authentication from './authenticationServices/main'; -import loginModal from './loginModal/main'; - -import loginRoute from './login.route'; -import logoutRoute from './logout.route'; - -export default - angular.module('login', [authentication.name, loginModal.name]) - .run(['$stateExtender', function($stateExtender) { - $stateExtender.addState(loginRoute); - $stateExtender.addState(logoutRoute); - }]); diff --git a/awx/ui/client/src/management-jobs/card/card.controller.js b/awx/ui/client/src/management-jobs/card/card.controller.js deleted file mode 100644 index d266900ea5..0000000000 --- a/awx/ui/client/src/management-jobs/card/card.controller.js +++ /dev/null @@ -1,168 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default - [ 'Wait', 'CreateDialog', 'GetBasePath' , - 'Rest' , - 'ProcessErrors', '$rootScope', '$state', - '$scope', 'CreateSelect2', 'i18n', '$transitions', - function( Wait, CreateDialog, GetBasePath, - Rest, ProcessErrors, - $rootScope, $state, $scope, - CreateSelect2, i18n, $transitions) { - - var defaultUrl = GetBasePath('system_job_templates') + "?order_by=name"; - - var getManagementJobs = function(){ - Rest.setUrl(defaultUrl); - Rest.get() - .then(({data}) => { - $scope.mgmtCards = data.results; - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, {hdr: i18n._('Error!'), - msg: i18n.sprintf(i18n._('Call to %s failed. Return status: %d'), (defaultUrl === undefined) ? "undefined" : defaultUrl, status )}); - }); - }; - getManagementJobs(); - - // This handles the case where the user refreshes the management job notifications page. - if($state.current.name === 'managementJobsList.notifications') { - $scope.activeCard = parseInt($state.params.management_id); - $scope.cardAction = "notifications"; - } - - $scope.goToNotifications = function(card){ - $state.transitionTo('managementJobsList.notifications',{ - card: card, - management_id: card.id - }); - }; - - var launchManagementJob = function (defaultUrl){ - var data = {}; - Rest.setUrl(defaultUrl); - Rest.post(data) - .then(({data}) => { - Wait('stop'); - $state.go('output', { id: data.system_job, type: 'system' }, { reload: true }); - }) - .catch(({data, status}) => { - let template_id = $scope.job_template_id; - template_id = (template_id === undefined) ? "undefined" : i18n.sprintf("%d", template_id); - ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), - msg: i18n.sprintf(i18n._('Failed updating job %s with variables. POST returned: %d'), template_id, status) }); - }); - }; - - $scope.submitJob = function (id, name) { - Wait('start'); - defaultUrl = GetBasePath('system_job_templates')+id+'/launch/'; - var noModalJobs = ['Cleanup Expired Sessions', 'Cleanup Expired OAuth 2 Tokens']; - if (noModalJobs.includes(name)) { - launchManagementJob(defaultUrl, name); - } else { - - CreateDialog({ - id: 'prompt-for-days', - title: name, - scope: $scope, - width: 500, - height: 300, - minWidth: 200, - callback: 'PromptForDays', - resizable: false, - onOpen: function(){ - $scope.$watch('prompt_for_days_form.$invalid', function(invalid) { - if (invalid === true) { - $('#prompt-for-days-launch').prop("disabled", true); - } else { - $('#prompt-for-days-launch').prop("disabled", false); - } - }); - - let fieldScope = $scope.$parent; - fieldScope.days_to_keep = 30; - $scope.prompt_for_days_form.$setPristine(); - $scope.prompt_for_days_form.$invalid = false; - }, - buttons: [ - { - "label": "Cancel", - "onClick": function() { - $(this).dialog('close'); - - }, - "class": "btn btn-default", - "id": "prompt-for-days-cancel" - }, - { - "label": "Launch", - "onClick": function() { - const extra_vars = {"days": $scope.days_to_keep }, - data = {}; - data.extra_vars = JSON.stringify(extra_vars); - - Rest.setUrl(defaultUrl); - Rest.post(data) - .then(({data}) => { - Wait('stop'); - $("#prompt-for-days").dialog("close"); - // $("#configure-dialog").dialog('close'); - $state.go('output', { id: data.system_job, type: 'system' }, { reload: true }); - }) - .catch(({data, status}) => { - let template_id = $scope.job_template_id; - template_id = (template_id === undefined) ? "undefined" : i18n.sprintf("%d", template_id); - ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), - msg: i18n.sprintf(i18n._('Failed updating job %s with variables. POST returned: %d'), template_id, status) }); - }); - }, - "class": "btn btn-primary", - "id": "prompt-for-days-launch" - } - ] - }); - } - - if ($scope.removePromptForDays) { - $scope.removePromptForDays(); - } - $scope.removePromptForDays = $scope.$on('PromptForDays', function() { - // $('#configure-dialog').dialog('close'); - $('#prompt-for-days').show(); - $('#prompt-for-days').dialog('open'); - Wait('stop'); - }); - }; - - $scope.configureSchedule = function(id) { - $state.transitionTo('managementJobsList.schedule', { - id: id - }); - }; - - var cleanUpStateChangeListener = $transitions.onSuccess({}, function(trans) { - if(trans.to().name === "managementJobsList") { - // We are on the management job list view - nothing needs to be highlighted - delete $scope.activeCard; - delete $scope.cardAction; - } - else if(trans.to().name === "managementJobsList.notifications") { - // We are on the notifications view - update the active card and the action - $scope.activeCard = parseInt(trans.params('to').management_id); - $scope.cardAction = "notifications"; - } - }); - - // Remove the listener when the scope is destroyed to avoid a memory leak - $scope.$on('$destroy', function() { - cleanUpStateChangeListener(); - }); - } - ]; diff --git a/awx/ui/client/src/management-jobs/card/card.partial.html b/awx/ui/client/src/management-jobs/card/card.partial.html deleted file mode 100644 index f53b7a796e..0000000000 --- a/awx/ui/client/src/management-jobs/card/card.partial.html +++ /dev/null @@ -1,48 +0,0 @@ -
- -
-
-
-
- MANAGEMENT JOBS -
- - {{ mgmtCards.length }} - -
-
-
- -
-

{{ card.name }}

-
- - - -
-
- - -

{{card.description || "Place organization description here"}}

- -
-
-
diff --git a/awx/ui/client/src/management-jobs/card/card.route.js b/awx/ui/client/src/management-jobs/card/card.route.js deleted file mode 100644 index c5292813f1..0000000000 --- a/awx/ui/client/src/management-jobs/card/card.route.js +++ /dev/null @@ -1,21 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import {templateUrl} from '../../shared/template-url/template-url.factory'; -import {N_} from "../../i18n"; - -export default { - name: 'managementJobsList', - route: '/management_jobs', - templateUrl: templateUrl('management-jobs/card/card'), - controller: 'managementJobsCardController', - data: { - activityStream: false, - }, - ncyBreadcrumb: { - label: N_('MANAGEMENT JOBS') - }, -}; diff --git a/awx/ui/client/src/management-jobs/card/main.js b/awx/ui/client/src/management-jobs/card/main.js deleted file mode 100644 index e21f7f7e73..0000000000 --- a/awx/ui/client/src/management-jobs/card/main.js +++ /dev/null @@ -1,15 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import route from './card.route'; -import controller from './card.controller'; - -export default - angular.module('managementJobsCard', []) - .controller('managementJobsCardController', controller) - .run(['$stateExtender', function($stateExtender) { - $stateExtender.addState(route); - }]); diff --git a/awx/ui/client/src/management-jobs/card/mgmtcards.block.less b/awx/ui/client/src/management-jobs/card/mgmtcards.block.less deleted file mode 100644 index c79a2dc42a..0000000000 --- a/awx/ui/client/src/management-jobs/card/mgmtcards.block.less +++ /dev/null @@ -1,116 +0,0 @@ -.MgmtCards { - display: flex; - flex-flow: row wrap; -} - -.MgmtCards-card { - background-color: @default-bg; - padding: 20px; - border-radius: 5px; - border: 1px solid @b7grey; - align-items: baseline; - margin-top: 20px; - margin-right: 20px; - width: ~"calc(33.3% - 14px)"; -} - -.MgmtCards-card:nth-child(3n) { - margin-right: 0px; -} - -.MgmtCards-card--selected { - padding-left: 16px; - border-left: 5px solid @default-link; -} - -.MgmtCards-card--promptElements{ - padding-top: 10px; -} - -.MgmtCards-promptText{ - color:@default-interface-txt; -} - -.MgmtCards-header { - display: flex; - flex-wrap: nowrap; - align-items: baseline; - width: 100%; -} - -.MgmtCards-label { - margin-top: 0px; - font-size: 14px; - font-weight: bold; - color: @default-interface-txt; - margin-bottom: 25px; - overflow: hidden; - text-overflow: ellipsis; -} - -.MgmtCards-actionItems { - margin-left: auto; - display: flex; - flex-wrap: nowrap; -} - -.MgmtCards-actionItem { - margin-left: 15px; -} - -.MgmtCards-description { - margin-bottom: 20px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.MgmtCards-links { - width: 100%; - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} - -.MgmtCards-link { - flex: initial; - width: ~"calc(50% - 20px)"; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - margin-bottom: 20px; -} - -.MgmtCards-linkBadge { - margin-right: 10px; -} - -@media (max-width: 840px) { - .MgmtCards-card { - width: 100%; - margin-right: 0px; - } -} - -@media (min-width: 840px) and (max-width: 1240px) { - .MgmtCards-card { - width: ~"calc(50% - 10px)"; - } - - .MgmtCards-card:nth-child(2n) { - margin-right: 0px; - } - - .MgmtCards-card:nth-child(3n) { - margin-right: 20px; - } - } - -#prompt-for-days-facts, #prompt-for-days { - overflow-x: hidden; - font-family: "Open Sans"; - .label-text { - text-transform: uppercase; - font-weight: normal; - } -} diff --git a/awx/ui/client/src/management-jobs/main.js b/awx/ui/client/src/management-jobs/main.js deleted file mode 100644 index ef291e1ee5..0000000000 --- a/awx/ui/client/src/management-jobs/main.js +++ /dev/null @@ -1,16 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import managementJobsCard from './card/main'; -import managementJobsScheduler from './scheduler/main'; -import managementJobsNotifications from './notifications/main'; - -export default - angular.module('managementJobs', [ - managementJobsCard.name, - managementJobsScheduler.name, - managementJobsNotifications.name - ]); diff --git a/awx/ui/client/src/management-jobs/notifications/main.js b/awx/ui/client/src/management-jobs/notifications/main.js deleted file mode 100644 index 91b92b5373..0000000000 --- a/awx/ui/client/src/management-jobs/notifications/main.js +++ /dev/null @@ -1,15 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import route from './notification.route'; -import controller from './notification.controller'; - -export default - angular.module('managementJobsNotifications', []) - .controller('managementJobsNotificationsController', controller) - .run(['$stateExtender', function($stateExtender) { - $stateExtender.addState(route); - }]); diff --git a/awx/ui/client/src/management-jobs/notifications/notification.controller.js b/awx/ui/client/src/management-jobs/notifications/notification.controller.js deleted file mode 100644 index cc3b0b74be..0000000000 --- a/awx/ui/client/src/management-jobs/notifications/notification.controller.js +++ /dev/null @@ -1,56 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - [ 'NotificationsList', 'GetBasePath', 'ToggleNotification', 'NotificationsListInit', - '$stateParams', 'Dataset', '$scope', 'isAdmin', - function( - NotificationsList, GetBasePath, ToggleNotification, NotificationsListInit, - $stateParams, Dataset, $scope, isAdmin) { - var defaultUrl = GetBasePath('system_job_templates'), - list = NotificationsList, - id = $stateParams.management_id; - - function init() { - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $scope.sufficientRoleForNotifToggle = isAdmin; - - NotificationsListInit({ - scope: $scope, - url: defaultUrl, - id: id - }); - - $scope.$watch(`${list.iterator}_dataset`, function() { - // The list data has changed and we need to update which notifications are on/off - $scope.$emit('relatednotifications'); - }); - } - - $scope.toggleNotification = function(event, notifier_id, column) { - var notifier = this.notification; - try { - $(event.target).tooltip('hide'); - } - catch(e) { - // ignore - } - ToggleNotification({ - scope: $scope, - url: defaultUrl + id, - notifier: notifier, - column: column, - callback: 'NotificationRefresh' - }); - }; - - init(); - - } - ]; diff --git a/awx/ui/client/src/management-jobs/notifications/notification.route.js b/awx/ui/client/src/management-jobs/notifications/notification.route.js deleted file mode 100644 index 7b6bf64585..0000000000 --- a/awx/ui/client/src/management-jobs/notifications/notification.route.js +++ /dev/null @@ -1,61 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - import { N_ } from '../../i18n'; - -export default { - name: 'managementJobsList.notifications', - route: '/:management_id/notifications', - params: { - notification_search: {} - }, - searchPrefix: 'notification', - views: { - '@managementJobsList': { - controller: 'managementJobsNotificationsController', - templateProvider: function(NotificationsList, generateList, ParentObject, $filter) { - // include name of parent resource in listTitle - NotificationsList.listTitle = `${$filter('sanitize')(ParentObject.name)}
` + N_('Notifications'); - let html = generateList.build({ - list: NotificationsList, - mode: 'edit' - }); - html = generateList.wrapPanel(html); - return generateList.insertFormView() + html; - } - } - }, - resolve: { - Dataset: ['NotificationsList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = `${GetBasePath('notification_templates')}`; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ParentObject: ['$stateParams', 'Rest', 'GetBasePath', function($stateParams, Rest, GetBasePath) { - let path = `${GetBasePath('system_job_templates')}${$stateParams.management_id}`; - Rest.setUrl(path); - return Rest.get(path).then((res) => res.data); - }], - isAdmin: ['Rest', 'GetBasePath', function(Rest, GetBasePath) { - Rest.setUrl(GetBasePath('me')); - return Rest.get() - .then((res) => { - if (res.data && res.data.results && res.data.count && res.data.results[0] && res.data.results[0].is_superuser) { - return true; - } - return false; - }) - .catch(() => { - return false; - }); - }] - }, - ncyBreadcrumb: { - parent: 'managementJobsList', - label: N_('NOTIFICATIONS') - } -}; diff --git a/awx/ui/client/src/management-jobs/notifications/notifications.partial.html b/awx/ui/client/src/management-jobs/notifications/notifications.partial.html deleted file mode 100644 index edde1a7f30..0000000000 --- a/awx/ui/client/src/management-jobs/notifications/notifications.partial.html +++ /dev/null @@ -1,4 +0,0 @@ -
-
-
-
diff --git a/awx/ui/client/src/management-jobs/scheduler/main.js b/awx/ui/client/src/management-jobs/scheduler/main.js deleted file mode 100644 index 0fff48415f..0000000000 --- a/awx/ui/client/src/management-jobs/scheduler/main.js +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -import { templateUrl } from '../../shared/template-url/template-url.factory'; -import controller from '../../scheduler/schedulerList.controller'; -import addController from '../../scheduler/schedulerAdd.controller'; -import editController from '../../scheduler/schedulerEdit.controller'; -import { N_ } from '../../i18n'; -import editScheduleResolve from '../../scheduler/editSchedule.resolve'; - - -export default -angular.module('managementJobScheduler', []) - .controller('managementJobController', controller) - .controller('managementJobAddController', addController) - .controller('managementJobEditController', editController) - .run(['$stateExtender', function($stateExtender) { - $stateExtender.addState({ - searchPrefix: 'schedule', - name: 'managementJobsList.schedule', - route: '/management_jobs/:id/schedules', - ncyBreadcrumb: { - parent: 'managementJobsList', - label: N_('SCHEDULES') - }, - views: { - '@managementJobsList': { - templateProvider: function(ScheduleList, generateList, ParentObject, $filter) { - // include name of parent resource in listTitle - ScheduleList.listTitle = `${$filter('sanitize')(ParentObject.name)}
` + N_('SCHEDULES'); - let html = generateList.build({ - list: ScheduleList, - mode: 'edit' - }); - html = generateList.wrapPanel(html); - return generateList.insertFormView() + html; - }, - controller: 'managementJobController', - } - }, - resolve: { - Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = `${GetBasePath('system_job_templates')}${$stateParams.id}/schedules`; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ParentObject: ['$stateParams', 'Rest', 'GetBasePath', function($stateParams, Rest, GetBasePath) { - let path = `${GetBasePath('system_job_templates')}${$stateParams.id}`; - Rest.setUrl(path); - return Rest.get(path).then((res) => res.data); - }], - UnifiedJobsOptions: ['Rest', 'GetBasePath', '$stateParams', '$q', - function(Rest, GetBasePath, $stateParams, $q) { - Rest.setUrl(GetBasePath('unified_jobs')); - var val = $q.defer(); - Rest.options() - .then(function(data) { - val.resolve(data.data); - }, function(data) { - val.reject(data); - }); - return val.promise; - }], - ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams', - (SchedulesList, GetBasePath, $stateParams) => { - let list = _.cloneDeep(SchedulesList); - list.basePath = GetBasePath('system_job_templates') + $stateParams.id + '/schedules'; - return list; - } - ] - } - }); - $stateExtender.addState({ - name: 'managementJobsList.schedule.add', - route: '/add', - ncyBreadcrumb: { - parent: 'managementJobsList.schedule', - label: N_('CREATE SCHEDULED JOB') - }, - views: { - 'form': { - templateUrl: templateUrl('management-jobs/scheduler/schedulerForm'), - controller: 'managementJobAddController', - } - } - }); - $stateExtender.addState({ - name: 'managementJobsList.schedule.edit', - route: '/edit/:schedule_id', - ncyBreadcrumb: { - parent: 'managementJobsList.schedule', - label: N_('EDIT SCHEDULED JOB') - }, - views: { - 'form': { - templateUrl: templateUrl('management-jobs/scheduler/schedulerForm'), - controller: 'managementJobEditController' - } - }, - resolve: editScheduleResolve() - }); - }]); diff --git a/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html b/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html deleted file mode 100644 index 258ce6cc4a..0000000000 --- a/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html +++ /dev/null @@ -1,639 +0,0 @@ -
-
-
{{ schedulerName || "ADD SCHEDULE"}}
-
{{ schedulerName || "EDIT SCHEDULE"}}
-
-
- -
-
-
-
- -
- - -
- A schedule name is required. -
-
-
- - - -
-
-
-
- -
- - - : - - - - : - - - -
-
- The time must be in HH24:MM:SS format. -
-
-
- - -
-
- - -
-
-
-
- - -
A value is required.
-
This is not a valid number.
-
Please input a number greater than 1.
-
-
- Frequency Details -
-
-
- - - -
- Please provide a value between 1 and 999. -
-
-
-
- -
- -
- The day must be between 1 and 31. -
-
-
-
- -
-
- - -
-
-
-
- * - -
-
- - -
-
- The day must be between 1 and 31. -
-
-
-
- -
-
- - - -
-
-
- -
-
- - - - - - - -
-
-
- Please select one or more days. -
-
-
- -
- -
-
-
- - -
- Please provide a value between 1 and 999. -
-
-
- - - -
- Please provide a valid date. -
-
-
-
-
-
-
-

- The scheduler options are invalid or incomplete. -

-
-
- -
- {{ rrule_nlp_description }} -
-
- -
- - - -
-
-
    -
  • - {{ occurrence.utc }} -
  • -
-
    -
  • - {{ occurrence.local }} -
  • -
-
- -
- - - -
-
-
\ No newline at end of file diff --git a/awx/ui/client/src/ng-console.js b/awx/ui/client/src/ng-console.js deleted file mode 100644 index 98c186ffec..0000000000 --- a/awx/ui/client/src/ng-console.js +++ /dev/null @@ -1,52 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -// THIS FILE ONLY INCLUDED IN DEBUG BUILDS -// -// To use: -// -// Open a console in Chrome DevTools and load this -// script with: -// -// require('tower/ng-console'); -// -// Then go to the Elements tab and drill down to any -// element within the angular app. Go back to the console -// and you can access the scope for the selected element -// using the variable $scope. -// -var ngAppElem = angular.element(document.querySelector('[ng-app]') || document); - -window.injector = ngAppElem.injector(); -window.inject = window.injector.invoke; -window.$rootScope = ngAppElem.scope(); - -// getService('auth') will create a variable `auth` assigned to the service `auth`. -// -window.getService = function getService(serviceName) { - window.inject([serviceName, function (s) {window[serviceName] = s;}]); -}; - -Object.defineProperty(window, '$scope', { - get: function () { - var elem = angular.element(window.__commandLineAPI.$0); - return elem.isolateScope() || elem.scope(); - }, -}); - -/** - * USAGE - * - * First copy the script and paste it in Chrome DevTools in Sources -> left pane -> Snippets. - * Then, after loading an Angular page, right click on the snippet and choose "run". - * Afterwards, you have the following available in the console: - * - * 1) $rootScope - * 2) inject(function ($q, $compile) { ...use $q and $compile here... }); - * 3) click on an element in DevTools; now $scope in the console points at the element scope (isolate if one exists). - * - * Enjoy! - */ diff --git a/awx/ui/client/src/notifications/add/add.controller.js b/awx/ui/client/src/notifications/add/add.controller.js deleted file mode 100644 index bc2240a5dd..0000000000 --- a/awx/ui/client/src/notifications/add/add.controller.js +++ /dev/null @@ -1,306 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['Rest', 'Wait', 'NotificationsFormObject', - 'ProcessErrors', 'GetBasePath', 'Alert', - 'GenerateForm', '$scope', '$state', 'CreateSelect2', 'GetChoices', - 'NotificationsTypeChange', 'ParseTypeChange', 'i18n', 'MessageUtils', '$filter', - function( - Rest, Wait, NotificationsFormObject, - ProcessErrors, GetBasePath, Alert, - GenerateForm, $scope, $state, CreateSelect2, GetChoices, - NotificationsTypeChange, ParseTypeChange, i18n, - MessageUtils, $filter - ) { - - var generator = GenerateForm, - form = NotificationsFormObject, - url = GetBasePath('notification_templates'), - defaultMessages = {}; - - init(); - - function init() { - $scope.customize_messages = false; - Rest.setUrl(GetBasePath('notification_templates')); - Rest.options() - .then(({data}) => { - if (!data.actions.POST) { - $state.go("^"); - Alert('Permission Error', 'You do not have permission to add a notification template.', 'alert-info'); - } - defaultMessages = data.actions.GET.messages; - MessageUtils.setMessagesOnScope($scope, null, defaultMessages); - }); - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - GetChoices({ - scope: $scope, - url: url, - field: 'notification_type', - variable: 'notification_type_options', - callback: 'choicesReady' - }); - } - - if ($state.params && $state.params.organization_id) { - let id = $state.params.organization_id, - url = GetBasePath('organizations') + id + '/'; - - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - $scope.organization_name = data.name; - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: `Failed to retrieve organization. GET status: ${status}` - }); - }); - } - - if ($scope.removeChoicesReady) { - $scope.removeChoicesReady(); - } - $scope.removeChoicesReady = $scope.$on('choicesReady', function() { - var i; - for (i = 0; i < $scope.notification_type_options.length; i++) { - if ($scope.notification_type_options[i].value === '') { - $scope.notification_type_options[i].value = "manual"; - break; - } - } - CreateSelect2({ - element: '#notification_template_notification_type', - multiple: false - }); - - $scope.hipchatColors = [ - {'id': 'gray', 'name': i18n._('Gray')}, - {'id': 'green', 'name': i18n._('Green')}, - {'id': 'purple', 'name': i18n._('Purple')}, - {'id': 'red', 'name': i18n._('Red')}, - {'id': 'yellow', 'name': i18n._('Yellow')}, - {'id': 'random', 'name': i18n._('Random')} - ]; - CreateSelect2({ - element: '#notification_template_color', - multiple: false - }); - - $scope.emailOptions = [ - {'id': 'use_tls', 'name': i18n._('Use TLS')}, - {'id': 'use_ssl', 'name': i18n._('Use SSL')}, - ]; - CreateSelect2({ - element: '#notification_template_email_options', - multiple: false - }); - - $scope.httpMethodChoices = [ - {'id': 'POST', 'name': i18n._('POST')}, - {'id': 'PUT', 'name': i18n._('PUT')}, - ]; - CreateSelect2({ - element: '#notification_template_http_method', - multiple: false, - }); - }); - - $scope.$watch('headers', function validate_headers(str) { - try { - const headers = typeof str === 'string' ? JSON.parse(str) : str; - if (_.isObject(headers) && !_.isArray(headers)) { - let valid = true; - for (let k in headers) { - if (_.isObject(headers[k])) { - valid = false; - } - if (headers[k] === null) { - valid = false; - } - } - $scope.notification_template_form.headers.$setValidity('json', valid); - return; - } - } catch (err) {} - - $scope.notification_template_form.headers.$setValidity('json', false); - }); - - $scope.typeChange = function() { - for (var fld in form.fields) { - if (form.fields[fld] && form.fields[fld].subForm) { - if (form.fields[fld].type === 'checkbox_group' && form.fields[fld].fields) { - // Need to loop across the groups fields to null them out - for (var i = 0; i < form.fields[fld].fields.length; i++) { - // Pull the name out of the object (array of objects) - var subFldName = form.fields[fld].fields[i].name; - $scope[subFldName] = null; - $scope.notification_template_form[subFldName].$setPristine(); - } - } else { - $scope.notification_template_form[fld].$setPristine(); - } - } - } - - NotificationsTypeChange.getDetailFields($scope.notification_type.value).forEach(function(field) { - $scope[field[0]] = field[1]; - }); - - - $scope.parse_type = 'json'; - if (!$scope.headers) { - $scope.headers = "{\n}"; - } - ParseTypeChange({ - scope: $scope, - parse_variable: 'parse_type', - variable: 'headers', - field_id: 'notification_template_headers' - }); - }; - - $scope.$watch('customize_messages', (value) => { - if (value) { - $scope.$broadcast('reset-code-mirror', { - customize_messages: $scope.customize_messages, - }); - } - }); - $scope.toggleForm = function(key) { - $scope[key] = !$scope[key]; - }; - $scope.$watch('notification_type', (newValue, oldValue = {}) => { - if (newValue) { - MessageUtils.updateDefaultsOnScope( - $scope, - defaultMessages[oldValue.value], - defaultMessages[newValue.value] - ); - $scope.$broadcast('reset-code-mirror', { - customize_messages: $scope.customize_messages, - }); - } - }); - - $scope.typeChange = function() { - for (var fld in form.fields) { - if (form.fields[fld] && form.fields[fld].subForm) { - if (form.fields[fld].type === 'checkbox_group' && form.fields[fld].fields) { - // Need to loop across the groups fields to null them out - for (var i = 0; i < form.fields[fld].fields.length; i++) { - // Pull the name out of the object (array of objects) - var subFldName = form.fields[fld].fields[i].name; - $scope[subFldName] = null; - $scope.notification_template_form[subFldName].$setPristine(); - } - } else { - $scope.notification_template_form[fld].$setPristine(); - } - } - } - - NotificationsTypeChange.getDetailFields($scope.notification_type.value).forEach(function(field) { - $scope[field[0]] = field[1]; - }); - - - $scope.parse_type = 'json'; - if (!$scope.headers) { - $scope.headers = "{\n}"; - } - ParseTypeChange({ - scope: $scope, - parse_variable: 'parse_type', - variable: 'headers', - field_id: 'notification_template_headers' - }); - }; - - // Save - $scope.formSave = function() { - var params, - v = $scope.notification_type.value; - - generator.clearApiErrors($scope); - params = { - "name": $scope.name, - "description": $scope.description, - "organization": $scope.organization, - "messages": MessageUtils.getMessagesObj($scope, defaultMessages), - "notification_type": v, - "notification_configuration": {} - }; - - function processValue(value, i, field) { - if (field.type === 'textarea') { - if (field.name === 'headers') { - if (typeof $scope[i] === 'string') { - $scope[i] = JSON.parse($scope[i]); - } - } - else if (field.name === 'annotation_tags' && $scope.notification_type.value === "grafana" && value === null) { - $scope[i] = null; - } - else { - $scope[i] = $scope[i] ? $scope[i].toString().split('\n') : ""; - } - } - if (field.type === 'checkbox') { - $scope[i] = Boolean($scope[i]); - } - if (field.type === 'number') { - $scope[i] = Number($scope[i]); - } - if (i === "username" && $scope.notification_type.value === "email" && (value === null || !value - )) { - $scope[i] = ""; - } - if (field.type === 'sensitive' && (value === null || !value - )) { - $scope[i] = ""; - } - return $scope[i]; - } - - params.notification_configuration = _.fromPairs(Object.keys(form.fields) - .filter(i => (form.fields[i].ngShow && form.fields[i].ngShow.indexOf(v) > -1)) - .map(i => [i, processValue($scope[i], i, form.fields[i])])); - - delete params.notification_configuration.email_options; - - params.notification_configuration.use_ssl = $scope.email_options === 'use_ssl'; - params.notification_configuration.use_tls = $scope.email_options === 'use_tls'; - - Wait('start'); - Rest.setUrl(url); - Rest.post(params) - .then(() => { - $state.go('notifications', {}, { reload: true }); - Wait('stop'); - }) - .catch(({ data, status }) => { - let description = 'POST returned status: ' + status; - if (data && data.messages && data.messages.length > 0) { - description = _.uniq(data.messages).join(', '); - } - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: $filter('sanitize')('Failed to add new notifier. ' + description + '.') - }); - }); - }; - - $scope.formCancel = function() { - $state.go('notifications'); - }; - - } -]; diff --git a/awx/ui/client/src/notifications/add/main.js b/awx/ui/client/src/notifications/add/main.js deleted file mode 100644 index 104849060b..0000000000 --- a/awx/ui/client/src/notifications/add/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './add.controller'; - -export default - angular.module('notificationsAdd', []) - .controller('notificationsAddController', controller); diff --git a/awx/ui/client/src/notifications/edit/edit.controller.js b/awx/ui/client/src/notifications/edit/edit.controller.js deleted file mode 100644 index eb98ad83da..0000000000 --- a/awx/ui/client/src/notifications/edit/edit.controller.js +++ /dev/null @@ -1,363 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['Rest', 'Wait', - 'NotificationsFormObject', 'ProcessErrors', 'GetBasePath', - 'GenerateForm', - 'notification_template', - '$scope', '$state', 'GetChoices', 'CreateSelect2', 'Empty', - 'NotificationsTypeChange', 'ParseTypeChange', 'i18n', - 'MessageUtils', '$filter', - function( - Rest, Wait, - NotificationsFormObject, ProcessErrors, GetBasePath, - GenerateForm, - notification_template, - $scope, $state, GetChoices, CreateSelect2, Empty, - NotificationsTypeChange, ParseTypeChange, i18n, - MessageUtils, $filter - ) { - var generator = GenerateForm, - id = notification_template.id, - form = NotificationsFormObject, - main = {}, - url = GetBasePath('notification_templates'), - defaultMessages = {}; - - init(); - - function init() { - $scope.notification_template = notification_template; - - $scope.$watch('notification_template.summary_fields.user_capabilities.edit', function(val) { - if (val === false) { - $scope.canAdd = false; - } - }); - - Rest.setUrl(GetBasePath('notification_templates')); - Rest.options() - .then(({data}) => { - defaultMessages = data.actions.GET.messages; - }); - - GetChoices({ - scope: $scope, - url: url, - field: 'notification_type', - variable: 'notification_type_options', - callback: 'choicesReady' - }); - } - - if ($scope.removeChoicesReady) { - $scope.removeChoicesReady(); - } - $scope.removeChoicesReady = $scope.$on('choicesReady', function() { - var i; - for (i = 0; i < $scope.notification_type_options.length; i++) { - if ($scope.notification_type_options[i].value === '') { - $scope.notification_type_options[i].value = "manual"; - break; - } - } - - Wait('start'); - Rest.setUrl(url + id + '/'); - Rest.get() - .then(({data}) => { - var fld; - for (fld in form.fields) { - if (data[fld]) { - $scope[fld] = data[fld]; - main[fld] = data[fld]; - } - - if(data.notification_configuration.use_ssl === true){ - $scope.email_options = "use_ssl"; - main.email_options = "use_ssl"; - $scope.use_ssl = true; - main.use_ssl = true; - $scope.use_tls = false; - main.use_tls = false; - } - - if(data.notification_configuration.use_tls === true){ - $scope.email_options = "use_tls"; - main.email_options = "use_tls"; - $scope.use_ssl = false; - main.use_ssl = false; - $scope.use_tls = true; - main.use_tls = true; - } - - if (data.notification_configuration.timeout === null || - !data.notification_configuration.timeout){ - $scope.timeout = 30; - } - - if (data.notification_configuration[fld]) { - $scope[fld] = data.notification_configuration[fld]; - main[fld] = data.notification_configuration[fld]; - - if (form.fields[fld].type === 'textarea') { - if (form.fields[fld].name === 'headers') { - $scope[fld] = JSON.stringify($scope[fld], null, 2); - } else { - $scope[fld] = $scope[fld].join('\n'); - } - } - } - - if (form.fields[fld].sourceModel && data.summary_fields && - data.summary_fields[form.fields[fld].sourceModel]) { - $scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; - main[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; - } - } - data.notification_type = (Empty(data.notification_type)) ? '' : data.notification_type; - for (var i = 0; i < $scope.notification_type_options.length; i++) { - if ($scope.notification_type_options[i].value === data.notification_type) { - $scope.notification_type = $scope.notification_type_options[i]; - break; - } - } - - main.notification_type = $scope.notification_type; - CreateSelect2({ - element: '#notification_template_notification_type', - multiple: false - }); - - $scope.emailOptions = [ - {'id': 'use_tls', 'name': i18n._('Use TLS')}, - {'id': 'use_ssl', 'name': i18n._('Use SSL')}, - ]; - CreateSelect2({ - element: '#notification_template_email_options', - multiple: false - }); - - $scope.hipchatColors = [ - {'id': 'gray', 'name': i18n._('Gray')}, - {'id': 'green', 'name': i18n._('Green')}, - {'id': 'purple', 'name': i18n._('Purple')}, - {'id': 'red', 'name': i18n._('Red')}, - {'id': 'yellow', 'name': i18n._('Yellow')}, - {'id': 'random', 'name': i18n._('Random')} - ]; - CreateSelect2({ - element: '#notification_template_color', - multiple: false - }); - - $scope.httpMethodChoices = [ - {'id': 'POST', 'name': i18n._('POST')}, - {'id': 'PUT', 'name': i18n._('PUT')}, - ]; - CreateSelect2({ - element: '#notification_template_http_method', - multiple: false, - }); - - NotificationsTypeChange.getDetailFields($scope.notification_type.value).forEach(function(field) { - $scope[field[0]] = field[1]; - }); - $scope.notification_obj = data; - - $scope.parse_type = 'json'; - if (!$scope.headers) { - $scope.headers = "{\n}"; - } - - ParseTypeChange({ - scope: $scope, - parse_variable: 'parse_type', - variable: 'headers', - field_id: 'notification_template_headers', - readOnly: !$scope.notification_template.summary_fields.user_capabilities.edit - }); - - MessageUtils.setMessagesOnScope($scope, data.messages, defaultMessages); - - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to retrieve notification: ' + id + '. GET status: ' + status - }); - }); - }); - - $scope.$watch('headers', function validate_headers(str) { - try { - const headers = typeof str === 'string' ? JSON.parse(str) : str; - if (_.isObject(headers) && !_.isArray(headers)) { - let valid = true; - for (let k in headers) { - if (_.isObject(headers[k])) { - valid = false; - } - if (headers[k] === null) { - valid = false; - } - } - $scope.notification_template_form.headers.$setValidity('json', valid); - return; - } - } catch (err) {} - - $scope.notification_template_form.headers.$setValidity('json', false); - }); - - $scope.typeChange = function() { - for (var fld in form.fields) { - if (form.fields[fld] && form.fields[fld].subForm) { - if (form.fields[fld].type === 'checkbox_group' && form.fields[fld].fields) { - // Need to loop across the groups fields to null them out - for (var i = 0; i < form.fields[fld].fields.length; i++) { - // Pull the name out of the object (array of objects) - var subFldName = form.fields[fld].fields[i].name; - $scope[subFldName] = null; - $scope.notification_template_form[subFldName].$setPristine(); - } - } - if ($scope.timeout === null || !$scope.timeout) { - $scope.timeout = 30; - } - else { - $scope[fld] = null; - $scope.notification_template_form[fld].$setPristine(); - } - } - } - - NotificationsTypeChange.getDetailFields($scope.notification_type.value).forEach(function(field) { - $scope[field[0]] = field[1]; - }); - - $scope.parse_type = 'json'; - if (!$scope.headers) { - $scope.headers = "{\n}"; - } - ParseTypeChange({ - scope: $scope, - parse_variable: 'parse_type', - variable: 'headers', - field_id: 'notification_template_headers', - readOnly: !$scope.notification_template.summary_fields.user_capabilities.edit - }); - }; - - $scope.$watch('customize_messages', (value) => { - if (value) { - $scope.$broadcast('reset-code-mirror', { - customize_messages: $scope.customize_messages, - }); - } - }); - $scope.toggleForm = function(key) { - $scope[key] = !$scope[key]; - }; - $scope.$watch('notification_type', (newValue, oldValue = {}) => { - if (newValue) { - MessageUtils.updateDefaultsOnScope( - $scope, - defaultMessages[oldValue.value], - defaultMessages[newValue.value] - ); - $scope.$broadcast('reset-code-mirror', { - customize_messages: $scope.customize_messages, - }); - } - }); - - $scope.formSave = function() { - var params, - v = $scope.notification_type.value; - - generator.clearApiErrors($scope); - params = { - "name": $scope.name, - "description": $scope.description, - "organization": $scope.organization, - "messages": MessageUtils.getMessagesObj($scope, defaultMessages), - "notification_type": v, - "notification_configuration": {} - }; - - function processValue(value, i, field) { - if (field.type === 'textarea') { - if (field.name === 'headers') { - if (typeof $scope[i] === 'string') { - $scope[i] = JSON.parse($scope[i]); - } - } - else if (field.name === 'annotation_tags' && $scope.notification_type.value === "grafana" && value === null) { - $scope[i] = null; - } - else { - $scope[i] = $scope[i].toString().split('\n'); - } - } - if (field.type === 'checkbox') { - $scope[i] = Boolean($scope[i]); - } - if (field.type === 'number') { - $scope[i] = Number($scope[i]); - } - const isUsernameIncluded = ( - $scope.notification_type.value === 'email' || - $scope.notification_type.value === 'webhook' - ); - if (i === "username" && isUsernameIncluded && - (value === null || value === undefined)) { - $scope[i] = ""; - } - if (field.type === 'sensitive' && (value === null || value === undefined)) { - $scope[i] = ""; - } - return $scope[i]; - } - - params.notification_configuration = _.fromPairs(Object.keys(form.fields) - .filter(i => (form.fields[i].ngShow && form.fields[i].ngShow.indexOf(v) > -1)) - .map(i => [i, processValue($scope[i], i, form.fields[i])])); - - delete params.notification_configuration.email_options; - - params.notification_configuration.use_ssl = $scope.email_options === 'use_ssl'; - params.notification_configuration.use_tls = $scope.email_options === 'use_tls'; - - Wait('start'); - Rest.setUrl(url + id + '/'); - Rest.put(params) - .then(() => { - $state.go('notifications', {}, { reload: true }); - Wait('stop'); - }) - .catch(({ data, status }) => { - let description = 'PUT returned status: ' + status; - if (data && data.messages && data.messages.length > 0) { - description = _.uniq(data.messages).join(', '); - } - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: $filter('sanitize')('Failed to update notifier. ' + description + '.') - }); - }); - }; - - - $scope.formCancel = function() { - $state.go('notifications'); - }; - - } -]; diff --git a/awx/ui/client/src/notifications/edit/main.js b/awx/ui/client/src/notifications/edit/main.js deleted file mode 100644 index 55865ede89..0000000000 --- a/awx/ui/client/src/notifications/edit/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './edit.controller'; - -export default - angular.module('notificationsEdit', []) - .controller('notificationsEditController', controller); diff --git a/awx/ui/client/src/notifications/main.js b/awx/ui/client/src/notifications/main.js deleted file mode 100644 index 9eb6ad0e70..0000000000 --- a/awx/ui/client/src/notifications/main.js +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -import notificationTemplatesList from './notification-templates-list/main'; -import notificationsAdd from './add/main'; -import notificationsEdit from './edit/main'; - -import list from './notificationTemplates.list'; -import form from './notificationTemplates.form'; -import notificationsList from './notifications.list'; -import toggleNotification from './shared/toggle-notification.factory'; -import notificationsListInit from './shared/notification-list-init.factory'; -import typeChange from './shared/type-change.service'; -import messageUtils from './shared/message-utils.service'; -import { N_ } from '../i18n'; - -export default -angular.module('notifications', [ - notificationTemplatesList.name, - notificationsAdd.name, - notificationsEdit.name - ]) - .factory('NotificationTemplatesList', list) - .factory('NotificationsFormObject', form) - .factory('NotificationsList', notificationsList) - .factory('ToggleNotification', toggleNotification) - .factory('NotificationsListInit', notificationsListInit) - .service('NotificationsTypeChange', typeChange) - .service('MessageUtils', messageUtils) - .config(['$stateProvider', 'stateDefinitionsProvider', - function($stateProvider, stateDefinitionsProvider) { - let stateDefinitions = stateDefinitionsProvider.$get(); - - // lazily generate a tree of substates which will replace this node in ui-router's stateRegistry - // see: stateDefinition.factory for usage documentation - $stateProvider.state({ - name: 'notifications.**', - url: '/notification_templates', - ncyBreadcrumb: { - label: N_("NOTIFICATIONS") - }, - lazyLoad: () => stateDefinitions.generateTree({ - parent: 'notifications', // top-most node in the generated tree - modes: ['add', 'edit'], // form nodes to generate - list: 'NotificationTemplatesList', - form: 'NotificationsFormObject', - controllers: { - list: 'notificationTemplatesListController', - add: 'notificationsAddController', - edit: 'notificationsEditController' - }, - urls: { - add: '/add?organization_id' - }, - resolve: { - edit: { - notification_template: ['$state', '$stateParams', '$q', - 'Rest', 'GetBasePath', 'ProcessErrors', - function($state, $stateParams, $q, rest, getBasePath, ProcessErrors) { - if ($stateParams.notification_template) { - return $q.when($stateParams.notification_template); - } - - var notificationTemplateId = $stateParams.notification_template_id; - - var url = getBasePath('notification_templates') + notificationTemplateId + '/'; - rest.setUrl(url); - return rest.get() - .then(function(res) { - if (_.get(res, ['data', 'notification_type'] === 'webhook') && - _.get(res, ['data', 'notification_configuration', 'http_method'])) { - res.data.notification_configuration.http_method = res.data.notification_configuration.http_method.toUpperCase(); - } - return res.data; - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: 'Error!', - msg: 'Failed to get inventory script info. GET returned status: ' + - response.status - }); - }); - } - ] - } - }, - data: { - activityStream: true, - activityStreamTarget: 'notification_template' - }, - ncyBreadcrumb: { - label: N_('NOTIFICATIONS') - } - }) - }); - } - ]); diff --git a/awx/ui/client/src/notifications/notification-templates-list/add-notifications-action.partial.html b/awx/ui/client/src/notifications/notification-templates-list/add-notifications-action.partial.html deleted file mode 100644 index e6c2484fe1..0000000000 --- a/awx/ui/client/src/notifications/notification-templates-list/add-notifications-action.partial.html +++ /dev/null @@ -1,4 +0,0 @@ -
-
GO TO NOTIFICATIONS TO
-
ADD A NEW TEMPLATE
-
diff --git a/awx/ui/client/src/notifications/notification-templates-list/list.controller.js b/awx/ui/client/src/notifications/notification-templates-list/list.controller.js deleted file mode 100644 index 8cf2a635d8..0000000000 --- a/awx/ui/client/src/notifications/notification-templates-list/list.controller.js +++ /dev/null @@ -1,239 +0,0 @@ - /************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['$scope', 'Wait', 'NotificationTemplatesList', - 'GetBasePath', 'Rest', 'ProcessErrors', 'Prompt', '$state', - 'ngToast', '$filter', 'Dataset', 'rbacUiControlService', - 'i18n', 'NotificationTemplate', 'AppStrings', - function( - $scope, Wait, NotificationTemplatesList, - GetBasePath, Rest, ProcessErrors, Prompt, $state, - ngToast, $filter, Dataset, rbacUiControlService, - i18n, NotificationTemplate, AppStrings) { - - var defaultUrl = GetBasePath('notification_templates'), - list = NotificationTemplatesList; - - init(); - - function init() { - $scope.canAdd = false; - - rbacUiControlService.canAdd("notification_templates") - .then(function(params) { - $scope.canAdd = params.canAdd; - }); - - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - } - - $scope.$on(`notification_template_options`, function(event, data){ - $scope.options = data.data.actions.GET; - optionsRequestDataProcessing(); - }); - - $scope.$watchCollection("notification_templates", function() { - optionsRequestDataProcessing(); - } - ); - // iterate over the list and add fields like type label, after the - // OPTIONS request returns, or the list is sorted/paginated/searched. - function optionsRequestDataProcessing(){ - $scope[list.name].forEach(function(item, item_idx) { - var itm = $scope[list.name][item_idx]; - // Set the item type label - if (list.fields.notification_type && $scope.options && - $scope.options.hasOwnProperty('notification_type')) { - $scope.options.notification_type.choices.forEach(function(choice) { - if (choice[0] === item.notification_type) { - itm.type_label = choice[1]; - var recent_notifications = itm.summary_fields.recent_notifications; - itm.status = recent_notifications && recent_notifications.length > 0 ? recent_notifications[0].status : "none"; - } - }); - } - setStatus(itm); - }); - } - - function setStatus(notification_template) { - var html, recent_notifications = notification_template.summary_fields.recent_notifications; - if (recent_notifications.length > 0) { - html = "\n"; - html += "\n"; - html += ""; - html += ""; - html += ""; - html += "\n"; - html += "\n"; - html += "\n"; - - recent_notifications.forEach(function(row) { - html += "\n"; - html += ``; - html += "\n"; - html += "\n"; - }); - html += "\n"; - html += "
" + i18n._("Status") + "" + i18n._("Time") + "
" + ($filter('longDate')(row.created)).replace(/ /, '
') + "
\n"; - } else { - html = "

" + i18n._("No recent notifications.") + "

\n"; - } - notification_template.template_status_html = html; - } - - $scope.copyNotification = notificationTemplate => { - Wait('start'); - new NotificationTemplate('get', notificationTemplate.id) - .then(model => model.copy()) - .then((copiedNotification) => { - ngToast.success({ - content: ` -
-
- -
-
- ${AppStrings.get('SUCCESSFUL_CREATION', copiedNotification.name)} -
-
`, - dismissButton: false, - dismissOnTimeout: true - }); - $state.go('.', null, { reload: true }); - }) - .catch(({ data, status }) => { - const params = { hdr: 'Error!', msg: `Call to copy failed. Return status: ${status}` }; - ProcessErrors($scope, data, status, null, params); - }) - .finally(() => Wait('stop')); - }; - - $scope.testNotification = function() { - var name = $filter('sanitize')(this.notification_template.name), - pending_retries = 25; - - Rest.setUrl(defaultUrl + this.notification_template.id + '/test/'); - Rest.post({}) - .then(function(data) { - if (data && data.data && data.data.notification) { - Wait('start'); - // Using a setTimeout here to wait for the - // notification to be processed and for a status - // to be returned from the API. - retrieveStatus(data.data.notification); - } else { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to notification templates failed. Notification returned status: ' + status - }); - } - }) - .catch(function() { - ngToast.danger({ - content: ` ${name}: ` + i18n._('Notification Failed.'), - }); - }); - - function retrieveStatus(id) { - setTimeout(function() { - let url = GetBasePath('notifications') + id; - Rest.setUrl(url); - Rest.get() - .then(function(res) { - if (res && res.data && res.data.status && res.data.status === "successful") { - ngToast.success({ - content: ` ${name}: Notification sent.` - }); - $state.reload(); - } else if (res && res.data && res.data.status && res.data.status === "failed" && res.data.error === "timed out") { - ngToast.danger({ - content: `
${name}: ${i18n._("Notification timed out.")}
` - }); - $state.reload(); - } else if (res && res.data && res.data.status && res.data.status === "failed") { - ngToast.danger({ - content: `
${name}: Notification failed.
${$filter('sanitize')(res.data.error)}
` - }); - $state.reload(); - } else if (res && res.data && res.data.status && res.data.status === "pending" && pending_retries > 0) { - pending_retries--; - retrieveStatus(id); - } else { - Wait('stop'); - ProcessErrors($scope, null, status, null, { - hdr: 'Error!', - msg: 'Call to test notifications failed.' - }); - } - - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get ' + url + '. GET status: ' + status - }); - }); - }, 5000); - } - }; - - - $scope.addNotification = function() { - $state.go('notifications.add'); - }; - - $scope.editNotification = function() { - $state.go('notifications.edit', { - notification_template_id: this.notification_template.id, - notification_template: this.notification_templates - }); - }; - - $scope.deleteNotification = function(id, name) { - var action = function() { - $('#prompt-modal').modal('hide'); - Wait('start'); - var url = defaultUrl + id + '/'; - Rest.setUrl(url); - Rest.destroy() - .then(() => { - - let reloadListStateParams = null; - - if($scope.notification_templates.length === 1 && $state.params.notification_template_search && _.has($state, 'params.notification_template_search.page') && $state.params.notification_template_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.notification_template_search.page = (parseInt(reloadListStateParams.notification_template_search.page)-1).toString(); - } - - if (parseInt($state.params.notification_template_id) === id) { - $state.go("^", reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, {reload: true}); - } - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - Prompt({ - hdr: i18n._('Delete'), - resourceName: $filter('sanitize')(name), - body: '
' + i18n._('Are you sure you want to delete this notification template?') + '
', - action: action, - actionText: i18n._('DELETE') - }); - }; - } - ]; diff --git a/awx/ui/client/src/notifications/notification-templates-list/main.js b/awx/ui/client/src/notifications/notification-templates-list/main.js deleted file mode 100644 index 47adeea176..0000000000 --- a/awx/ui/client/src/notifications/notification-templates-list/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './list.controller'; - -export default - angular.module('notificationTemplatesList', []) - .controller('notificationTemplatesListController', controller); diff --git a/awx/ui/client/src/notifications/notificationTemplates.form.js b/awx/ui/client/src/notifications/notificationTemplates.form.js deleted file mode 100644 index e2c298a4cb..0000000000 --- a/awx/ui/client/src/notifications/notificationTemplates.form.js +++ /dev/null @@ -1,747 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:CustomInventory - * @description This form is for adding/editing an organization -*/ - -export default ['i18n', function(i18n) { - return { - - addTitle: i18n._('NEW NOTIFICATION TEMPLATE'), - editTitle: '{{ name }}', - name: 'notification_template', - // I18N for "CREATE NOTIFICATION_TEMPLATE" - // on /#/notification_templates/add - breadcrumbName: i18n._('NOTIFICATION TEMPLATE'), - stateTree: 'notifications', - basePath: 'notification_templates', - showActions: true, - subFormTitles: { - typeSubForm: i18n._('Type Details'), - }, - - - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - required: true, - capitalize: false - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - list: 'OrganizationList', - basePath: 'organizations', - sourceModel: 'organization', - sourceField: 'name', - required: true, - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - notification_type: { - label: i18n._('Type'), - type: 'select', - required: true, - class: 'NotificationsForm-typeSelect', - ngOptions: 'type.label for type in notification_type_options track by type.value', - ngChange: 'typeChange()', - hasSubForm: true, - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - username: { - label: i18n._('Username'), - type: 'text', - ngShow: "notification_type.value == 'email' || notification_type.value == 'webhook' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - password: { - labelBind: 'passwordLabel', - type: 'sensitive', - hasShowInputButton: true, - awRequiredWhen: { - reqExpression: "password_required" , - init: "false" - }, - ngShow: "notification_type.value == 'email' || notification_type.value == 'irc' || notification_type.value == 'webhook' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - host: { - label: i18n._('Host'), - type: 'text', - awRequiredWhen: { - reqExpression: "email_required", - init: "false" - }, - ngShow: "notification_type.value == 'email' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - recipients: { - label: i18n._('Recipient List'), - type: 'textarea', - rows: 3, - awPopOver: i18n._('Enter one email address per line to create a recipient list for this type of notification.'), - dataTitle: i18n._('Recipient List'), - dataPlacement: 'right', - dataContainer: "body", - awRequiredWhen: { - reqExpression: "email_required", - init: "false" - }, - ngShow: "notification_type.value == 'email' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - sender: { - label: i18n._('Sender Email'), - type: 'text', - awRequiredWhen: { - reqExpression: "email_required", - init: "false" - }, - ngShow: "notification_type.value == 'email' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - port: { - labelBind: 'portLabel', - type: 'number', - integer: true, - spinner: true, - 'class': "input-small", - min: 0, - awRequiredWhen: { - reqExpression: "port_required", - init: "false" - }, - ngShow: "notification_type.value == 'email' || notification_type.value == 'irc'", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - timeout: { - label: i18n._('Timeout'), - type: 'number', - integer: true, - default: 30, - min: 1, - max: 120, - spinner: true, - dataTitle: i18n._('Timeout'), - dataPlacement: 'right', - dataContainer: 'body', - awRequiredWhen: { - reqExpression: "email_required", - init: "false" - }, - awPopOver: "

" + i18n._("The amount of time (in seconds) before the email notification stops trying to reach the host and times out. Ranges from 1 to 120 seconds.") + "

", - ngShow: "notification_type.value == 'email' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - channels: { - label: i18n._('Destination Channels'), - type: 'textarea', - rows: 3, - awPopOver: i18n._('Enter one Slack channel per line. The pound symbol (#) is required for channels.'), - dataTitle: i18n._('Destination Channels'), - dataPlacement: 'right', - dataContainer: "body", - awRequiredWhen: { - reqExpression: "channel_required", - init: "false" - }, - ngShow: "notification_type.value == 'slack'", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - token: { - labelBind: 'tokenLabel', - type: 'sensitive', - hasShowInputButton: true, - awRequiredWhen: { - reqExpression: "token_required", - init: "false" - }, - ngShow: "notification_type.value == 'slack' || notification_type.value == 'pagerduty' || notification_type.value == 'hipchat'", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - account_token: { - label: i18n._('Account Token'), - type: 'sensitive', - hasShowInputButton: true, - awRequiredWhen: { - reqExpression: "twilio_required", - init: "false" - }, - ngShow: "notification_type.value == 'twilio' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - from_number: { - label: i18n._('Source Phone Number'), - dataTitle: i18n._('Source Phone Number'), - type: 'text', - awPopOver: i18n._('Enter the number associated with the "Messaging Service" in Twilio in the format +18005550199.'), - awRequiredWhen: { - reqExpression: "twilio_required", - init: "false" - }, - ngShow: "notification_type.value == 'twilio' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - to_numbers: { - label: i18n._('Destination SMS Number'), - dataTitle: i18n._('Destination SMS Number'), - type: 'textarea', - rows: 3, - awPopOver: i18n._('Enter one phone number per line to specify where to route SMS messages.'), - dataPlacement: 'right', - dataContainer: "body", - awRequiredWhen: { - reqExpression: "twilio_required", - init: "false" - }, - ngShow: "notification_type.value == 'twilio' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - account_sid: { - label: i18n._('Account SID'), - type: 'text', - awRequiredWhen: { - reqExpression: "twilio_required", - init: "false" - }, - ngShow: "notification_type.value == 'twilio' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - subdomain: { - label: i18n._('Pagerduty subdomain'), - type: 'text', - awRequiredWhen: { - reqExpression: "pagerduty_required", - init: "false" - }, - ngShow: "notification_type.value == 'pagerduty' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - service_key: { - label: i18n._('API Service/Integration Key'), - type: 'text', - awRequiredWhen: { - reqExpression: "pagerduty_required", - init: "false" - }, - ngShow: "notification_type.value == 'pagerduty' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - client_name: { - label: i18n._('Client Identifier'), - type: 'text', - awRequiredWhen: { - reqExpression: "pagerduty_required", - init: "false" - }, - ngShow: "notification_type.value == 'pagerduty' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - grafana_url: { - label: i18n._('Grafana URL'), - type: 'text', - awPopOver: i18n._('The base URL of the Grafana server - the /api/annotations endpoint will be added automatically to the base Grafana URL.'), - placeholder: 'https://grafana.com', - dataPlacement: 'right', - dataContainer: "body", - awRequiredWhen: { - reqExpression: "grafana_required", - init: "false" - }, - ngShow: "notification_type.value == 'grafana' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - grafana_key: { - label: i18n._('Grafana API Key'), - type: 'sensitive', - hasShowInputButton: true, - name: 'grafana_key', - awRequiredWhen: { - reqExpression: "grafana_required", - init: "false" - }, - ngShow: "notification_type.value == 'grafana' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - dashboardId: { - label: i18n._('ID of the Dashboard (optional)'), - type: 'number', - integer: true, - ngShow: "notification_type.value == 'grafana' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - panelId: { - label: i18n._('ID of the Panel (optional)'), - type: 'number', - integer: true, - ngShow: "notification_type.value == 'grafana' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - annotation_tags: { - label: i18n._('Tags for the Annotation (optional)'), - dataTitle: i18n._('Tags for the Annotation'), - type: 'textarea', - name: 'annotation_tags', - rows: 3, - placeholder: 'ansible', - awPopOver: i18n._('Enter one Annotation Tag per line, without commas.'), - ngShow: "notification_type.value == 'grafana' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - grafana_no_verify_ssl: { - label: i18n._('Disable SSL Verification'), - type: 'checkbox', - ngShow: "notification_type.value == 'grafana' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - message_from: { - label: i18n._('Notification Label'), - type: 'text', - awRequiredWhen: { - reqExpression: "hipchat_required", - init: "false" - }, - ngShow: "notification_type.value == 'hipchat' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - color: { - label: i18n._('Notification Color'), - dataTitle: i18n._('Notification Color'), - type: 'select', - ngOptions: 'color.id as color.name for color in hipchatColors', - awPopOver: i18n._('Specify a notification color. Acceptable colors are: yellow, green, red purple, gray or random.'), - awRequiredWhen: { - reqExpression: "hipchat_required", - init: "false" - }, - ngShow: "notification_type.value == 'hipchat' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - notify: { - label: i18n._('Notify Channel'), - type: 'checkbox', - ngShow: "notification_type.value == 'hipchat' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - url: { - label: i18n._('Target URL'), - type: 'text', - awRequiredWhen: { - reqExpression: "webhook_required", - init: "false" - }, - ngShow: "notification_type.value == 'webhook' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - disable_ssl_verification: { - label: i18n._('Disable SSL Verification'), - type: 'checkbox', - ngShow: "notification_type.value == 'webhook' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - headers: { - label: i18n._('HTTP Headers'), - dataTitle: i18n._('HTTP Headers'), - type: 'textarea', - name: 'headers', - rows: 5, - 'class': 'Form-formGroup--fullWidth', - awRequiredWhen: { - reqExpression: "webhook_required", - init: "false" - }, - awPopOver: i18n._('Specify HTTP Headers in JSON format. Refer to the Ansible Tower documentation for example syntax.'), - dataPlacement: 'right', - ngShow: "notification_type.value == 'webhook' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - http_method: { - label: i18n._('HTTP Method'), - dataTitle: i18n._('HTTP Method'), - type: 'select', - ngOptions: 'choice.id as choice.name for choice in httpMethodChoices', - default: 'POST', - awPopOver: i18n._('Specify an HTTP method for the webhook. Acceptable choices are: POST or PUT'), - awRequiredWhen: { - reqExpression: "webhook_required", - init: "false" - }, - ngShow: "notification_type.value == 'webhook' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - mattermost_url: { - label: i18n._('Target URL'), - type: 'text', - awRequiredWhen: { - reqExpression: "mattermost_required", - init: "false" - }, - ngShow: "notification_type.value == 'mattermost' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - mattermost_username: { - label: i18n._('Username'), - type: 'text', - ngShow: "notification_type.value == 'mattermost' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - mattermost_channel: { - label: i18n._('Channel'), - type: 'text', - ngShow: "notification_type.value == 'mattermost' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - mattermost_icon_url: { - label: i18n._('Icon URL'), - type: 'text', - ngShow: "notification_type.value == 'mattermost' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - mattermost_no_verify_ssl: { - label: i18n._('Disable SSL Verification'), - type: 'checkbox', - ngShow: "notification_type.value == 'mattermost' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - rocketchat_url: { - label: i18n._('Target URL'), - type: 'text', - awRequiredWhen: { - reqExpression: "rocketchat_required", - init: "false" - }, - ngShow: "notification_type.value == 'rocketchat' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - rocketchat_username: { - label: i18n._('Username'), - type: 'text', - ngShow: "notification_type.value == 'rocketchat' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - rocketchat_icon_url: { - label: i18n._('Icon URL'), - type: 'text', - ngShow: "notification_type.value == 'rocketchat' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - rocketchat_no_verify_ssl: { - label: i18n._('Disable SSL Verification'), - type: 'checkbox', - ngShow: "notification_type.value == 'rocketchat' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - server: { - label: i18n._('IRC Server Address'), - type: 'text', - awRequiredWhen: { - reqExpression: "irc_required", - init: "false" - }, - ngShow: "notification_type.value == 'irc' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - nickname: { - label: i18n._('IRC Nick'), - type: 'text', - awRequiredWhen: { - reqExpression: "irc_required", - init: "false" - }, - ngShow: "notification_type.value == 'irc' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - targets: { - label: i18n._('Destination Channels or Users'), - type: 'textarea', - rows: 3, - awPopOver: i18n._('Enter one IRC channel or username per line. The pound symbol (#) for channels, and the at (@) symbol for users, are not required.'), - dataTitle: i18n._('Destination Channels or Users'), - dataPlacement: 'right', - dataContainer: "body", - awRequiredWhen: { - reqExpression: "irc_required", - init: "false" - }, - ngShow: "notification_type.value == 'irc' ", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - use_ssl: { - label: i18n._('SSL Connection'), - type: 'checkbox', - ngShow: "notification_type.value == 'irc'", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - email_options: { - label: i18n._('Email Options'), - dataTitle: i18n._('Email Options'), - defaultText: i18n._('Choose an email option'), - type: 'select', - ngOptions: 'type.id as type.name for type in emailOptions', - ngShow: "notification_type.value == 'email'", - subForm: 'typeSubForm', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)' - }, - hex_color: { - label: i18n._('Notification Color'), - dataTitle: i18n._('Notification Color'), - type: 'text', - subForm: 'typeSubForm', - ngShow: "notification_type.value == 'slack' ", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - awPopOver: i18n._('Specify a notification color. Acceptable colors are hex color code (example: #3af or #789abc) .') - }, - customize_messages: { - label: i18n._('Customize messages…'), - type: 'toggleSwitch', - toggleSource: 'customize_messages', - class: 'Form-formGroup--fullWidth', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - custom_message_description: { - type: 'alertblock', - ngShow: "customize_messages", - alertTxt: i18n._('Use custom messages to change the content of notifications ' + - 'sent when a job starts, succeeds, or fails. Use curly braces to access ' + - 'information about the job: {{ job_friendly_name }}, ' + - '{{ url }}, or attributes of the job such as ' + - '{{ job.status }}. You may apply a number of possible ' + - 'variables in the message. Refer to the ' + - 'Ansible Tower documentation for more details.'), - closeable: false - }, - started_message: { - label: i18n._('Start Message'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && notification_type.value != 'webhook'", - rows: 2, - oneLine: 'true', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - started_body: { - label: i18n._('Start Message Body'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && " + - "(notification_type.value == 'email' " + - "|| notification_type.value == 'pagerduty' " + - "|| notification_type.value == 'webhook')", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - success_message: { - label: i18n._('Success Message'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && notification_type.value != 'webhook'", - rows: 2, - oneLine: 'true', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - success_body: { - label: i18n._('Success Message Body'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && " + - "(notification_type.value == 'email' " + - "|| notification_type.value == 'pagerduty' " + - "|| notification_type.value == 'webhook')", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - error_message: { - label: i18n._('Error Message'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && notification_type.value != 'webhook'", - rows: 2, - oneLine: 'true', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - error_body: { - label: i18n._('Error Message Body'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && " + - "(notification_type.value == 'email' " + - "|| notification_type.value == 'pagerduty' " + - "|| notification_type.value == 'webhook')", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - approved_message: { - label: i18n._('Workflow Approved Message'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && notification_type.value != 'webhook'", - rows: 2, - oneLine: 'true', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - approved_body: { - label: i18n._('Workflow Approved Message Body'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && " + - "(notification_type.value == 'email' " + - "|| notification_type.value == 'pagerduty' " + - "|| notification_type.value == 'webhook')", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - denied_message: { - label: i18n._('Workflow Denied Message'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && notification_type.value != 'webhook'", - rows: 2, - oneLine: 'true', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - denied_body: { - label: i18n._('Workflow Denied Message Body'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && " + - "(notification_type.value == 'email' " + - "|| notification_type.value == 'pagerduty' " + - "|| notification_type.value == 'webhook')", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - running_message: { - label: i18n._('Workflow Pending Approval Message'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && notification_type.value != 'webhook'", - rows: 2, - oneLine: 'true', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - running_body: { - label: i18n._('Workflow Pending Approval Message Body'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && " + - "(notification_type.value == 'email' " + - "|| notification_type.value == 'pagerduty' " + - "|| notification_type.value == 'webhook')", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - timed_out_message: { - label: i18n._('Workflow Timed Out Message'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && notification_type.value != 'webhook'", - rows: 2, - oneLine: 'true', - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - timed_out_body: { - label: i18n._('Workflow Timed Out Message Body'), - class: 'Form-formGroup--fullWidth', - type: 'syntax_highlight', - mode: 'jinja2', - default: '', - ngShow: "customize_messages && " + - "(notification_type.value == 'email' " + - "|| notification_type.value == 'pagerduty' " + - "|| notification_type.value == 'webhook')", - ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)', - }, - }, - - buttons: { //for now always generates -
- - - - - - diff --git a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-multiselect.controller.js b/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-multiselect.controller.js deleted file mode 100644 index 548f528798..0000000000 --- a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-multiselect.controller.js +++ /dev/null @@ -1,14 +0,0 @@ -export default ['$scope', - function($scope) { - - $scope.galaxyCredentialsTags = []; - - $scope.$watch('galaxyCredentials', function() { - $scope.galaxyCredentialsTags = $scope.galaxyCredentials; - }, true); - - $scope.deleteTag = function(tag){ - _.remove($scope.galaxyCredentials, {id: tag.id}); - }; - } -]; \ No newline at end of file diff --git a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.block.less b/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.block.less deleted file mode 100644 index bbfef9de99..0000000000 --- a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.block.less +++ /dev/null @@ -1,15 +0,0 @@ -#instance-groups-panel { - table { - overflow: hidden; - } - .List-header { - margin-bottom: 20px; - } - .isActive { - border-left: 10px solid @list-row-select-bord; - } - .instances-list, - .instance-jobs-list { - margin-top: 20px; - } -} diff --git a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.directive.js b/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.directive.js deleted file mode 100644 index d966c5e519..0000000000 --- a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.directive.js +++ /dev/null @@ -1,19 +0,0 @@ -import galaxyCredentialsMultiselectController from './galaxy-credentials-multiselect.controller'; -export default ['templateUrl', '$compile', - function(templateUrl, $compile) { - return { - scope: { - galaxyCredentials: '=', - fieldIsDisabled: '=' - }, - restrict: 'E', - templateUrl: templateUrl('organizations/galaxy-credentials-multiselect/galaxy-credentials'), - controller: galaxyCredentialsMultiselectController, - link: function(scope) { - scope.openInstanceGroupsModal = function() { - $('#content-container').append($compile('')(scope)); - }; - } - }; - } -]; diff --git a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.partial.html b/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.partial.html deleted file mode 100644 index 09202327b4..0000000000 --- a/awx/ui/client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.partial.html +++ /dev/null @@ -1,18 +0,0 @@ -
- - - - -
- -
-
- {{tag.name | sanitize}} -
-
-
diff --git a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.block.less b/awx/ui/client/src/organizations/linkout/addUsers/addUsers.block.less deleted file mode 100644 index ca509b190f..0000000000 --- a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.block.less +++ /dev/null @@ -1,213 +0,0 @@ -/** @define AddUsers */ - -.AddUsers-backDrop { - width: 100vw; - height: 100vh; - position: fixed; - top: 0; - left: 0; - z-index: 1041; - opacity: 0.2; - transition: 0.5s opacity; - background: @login-backdrop; -} - -.AddUsers-dialog { - margin: 30px auto; - margin-top: 95px; -} - -.AddUsers-content { - max-width: 750px; - margin: 0 auto; - border: 0; - box-shadow: none; - background-color: @login-bg; - border-radius: 4px; - transition: opacity 0.5s; - z-index: 1042; - position: relative; - opacity: 1; -} - -.AddUsers-header { - padding: 15px 20px 0 20px -} - -.AddUsers-body { - padding: 0px 20px; -} - -.AddUsers-footer { - display: flex; - flex-wrap: wrap-reverse; - align-items: center; - padding: 20px; - padding-bottom: 0px; - padding-top: 20px; -} - -.AddUsers-list .List-searchRow { - height: 0px; -} - -.AddUsers-list .List-searchWidget { - height: 66px; -} - -.AddUsers-list .List-tableHeader:last-child { - border-top-right-radius: 5px; -} - -.AddUsers-list select-all { - display: none; -} - -.AddUsers-title { - margin-top: 5px; - margin-bottom: 20px; -} - -.AddUsers-buttons { - margin-left: auto; - margin-bottom: 20px; -} - -.AddUsers-directions { - margin-top: 10px; - margin-bottom: 20px; - color: @default-interface-txt; - display: flex; - align-items: center; -} - -.AddUsers-directionNumber { - font-size: 14px; - font-weight: bold; - border-radius: 50%; - background-color: @default-list-header-bg; - padding: 1px 8px; - margin-right: 10px; - width: 23px; - height: 23px; -} - -.AddUsers-separator { - margin-top: 20px 0px; - width: 100%; - border-bottom: 1px solid @d7grey; -} - -.AddUsers-roleRow { - display: flex; - margin-bottom: 10px; - align-items: center; -} - -.AddUsers-roleName { - width: 30%; - padding-right: 10px; - display: flex; - align-items: center; -} - -.AddUsers-roleNameVal { - font-size: 14px; - max-width: ~"calc(100% - 46px)"; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.AddUsers-roleType { - padding: 0px 6px; - font-size: 10px; - color: @default-interface-txt; - text-transform: uppercase; - background-color: @default-bg; - margin-left: 6px; -} - -.AddUsers-roleSelect { - width: ~"calc(70% - 40px)"; - margin-right: 20px; -} - -.AddUsers-roleSelect .Form-dropDown { - height: inherit !important; -} - -.AddUsers-roleRemove { - border-radius: 50%; - padding: 1px 0; - line-height: 11px; - color: @default-icon; - background-color: @default-tertiary-bg; - border: 0; - height: 23px; - width: 23px; -} - -.AddUsers-roleRemove:hover { - background-color: @default-err; - color: @default-bg; -} - -.AddUsers-selectHide { - display: none; -} - -.AddUsers .select2-search__field { - text-transform: uppercase; -} - -.AddUsers-keyToggle { - margin-left: auto; - text-transform: uppercase; - padding: 3px 9px; - font-size: 12px; - background-color: @default-bg; - border-radius: 5px; - color: @default-interface-txt; - border: 1px solid @d7grey; - cursor: pointer; -} - -.AddUsers-keyToggle:hover { - background-color: @default-tertiary-bg; -} - -.AddUsers-keyToggle.is-active { - background-color: @default-link; - border-color: @default-link; - color: @default-bg; -} - -.AddUsers-keyPane { - margin: 20px 0; - font-size: 12px; - width: 100%; - padding: 20px; - margin-bottom: 15px; - border-radius: 4px; - border: 1px solid @login-notice-border; - background-color: @login-notice-bg; - color: @login-notice-text; -} - -.AddUsers-keyRow { - display: flex; - flex-direction: column; - margin-bottom: 15px; -} - -.AddUsers-keyName { - flex: 1 0 auto; - text-transform: uppercase; - font-weight: bold; - padding-bottom: 3px; -} - -.AddUsers-keyDescription { - flex: 1 0 auto; -} diff --git a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.controller.js b/awx/ui/client/src/organizations/linkout/addUsers/addUsers.controller.js deleted file mode 100644 index ebd3906186..0000000000 --- a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.controller.js +++ /dev/null @@ -1,152 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Access - * @description - * Controller for handling permissions adding - */ - -export default ['$scope', '$rootScope', 'ProcessErrors', 'GetBasePath', 'generateList', -'$state', 'Rest', '$q', 'Wait', '$window', 'QuerySet', 'UserList', 'i18n', -function($scope, $rootScope, ProcessErrors, GetBasePath, generateList, - $state, Rest, $q, Wait, $window, qs, UserList, i18n) { - $scope.$on("linkLists", function() { - - if ($state.current.name.split(".")[1] === "users") { - $scope.addType = "Users"; - } else { - $scope.addType = "Administrators"; - } - - let notAdminAlreadyParams = {}; - - if ($scope.addType === 'Administrators') { - Rest.setUrl(GetBasePath('organizations') + `${$state.params.organization_id}`); - Rest.get().then(({data}) => { - notAdminAlreadyParams.not__roles = data.summary_fields.object_roles.admin_role.id; - init(); - }); - } else { - init(); - } - - function init(){ - $scope.add_user_default_params = Object.assign({ - order_by: 'username', - page_size: 5 - }, notAdminAlreadyParams); - - $scope.add_user_queryset = Object.assign({ - order_by: 'username', - page_size: 5 - }, notAdminAlreadyParams); - - let list = _.cloneDeep(UserList); - list.basePath = 'users'; - list.iterator = 'add_user'; - list.name = 'add_users'; - list.multiSelect = true; - list.fields.username.ngClick = 'linkoutUser(add_user.id)'; - list.fields.username.columnClass = 'col-sm-4'; - list.fields.first_name.columnClass = 'col-sm-4'; - list.fields.last_name.columnClass = 'col-sm-4'; - list.layoutClass = 'List-staticColumnLayout--statusOrCheckbox'; - if ($scope.addType === 'Administrators') { - list.emptyListText = i18n._('No users available to add as adminstrators'); - } - delete list.actions; - delete list.fieldActions; - - // Fire off the initial search - qs.search(GetBasePath('users'), $scope.add_user_default_params) - .then(function(res) { - $scope.add_user_dataset = res.data; - $scope.add_users = $scope.add_user_dataset.results; - - let html = generateList.build({ - list: list, - mode: 'edit', - title: false, - hideViewPerPage: true - }); - - $scope.list = list; - - $scope.compileList(html); - - $scope.$watchCollection('add_users', function () { - if($scope.selectedItems) { - // Loop across the users and see if any of them should be "checked" - $scope.add_users.forEach(function(row, i) { - if (_.includes($scope.selectedItems, row.id)) { - $scope.add_users[i].isSelected = true; - } - }); - } - }); - - }); - - $scope.selectedItems = []; - $scope.$on('selectedOrDeselected', function(e, value) { - let item = value.value; - - if (value.isSelected) { - $scope.selectedItems.push(item.id); - } - else { - // _.remove() Returns the new array of removed elements. - // This will pull all the values out of the array that don't - // match the deselected item effectively removing it - $scope.selectedItems = _.remove($scope.selectedItems, function(selectedItem) { - return selectedItem !== item.id; - }); - } - }); - } - - $scope.updateUsers = function() { - - var url, listToClose, - - payloads = $scope.selectedItems.map(function(val) { - return {id: val}; - }); - - url = $scope.$parent.orgRelatedUrls[$scope.addUsersType]; - - Wait('start'); - - var requests = payloads - .map(function(post) { - Rest.setUrl(url); - return Rest.post(post); - }); - - $q.all(requests) - .then(function () { - $scope.closeModal(); - $state.reload(); - }, function (error) { - Wait('stop'); - $rootScope.$broadcast("refreshList", listToClose); - ProcessErrors(null, error.data, error.status, null, { - hdr: 'Error!', - msg: 'Failed to post ' + $scope.addType + - ': POST returned status' + error.status - }); - }); - }; - - $scope.linkoutUser = function(userId) { - // Open the edit user form in a new tab so as not to navigate the user - // away from the modal - $window.open('/#/users/' + userId,'_blank'); - }; - }); -}]; diff --git a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.directive.js b/awx/ui/client/src/organizations/linkout/addUsers/addUsers.directive.js deleted file mode 100644 index 1ec2ad015e..0000000000 --- a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.directive.js +++ /dev/null @@ -1,61 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/* jshint unused: vars */ -import addUsers from './addUsers.controller'; -export default - ['Wait', 'templateUrl', '$compile', function(Wait, templateUrl, $compile) { - return { - restrict: 'E', - scope: { - addUsersType: '@' - }, - controller: addUsers, - templateUrl: templateUrl('organizations/linkout/addUsers/addUsers'), - link: function(scope, element, attrs, ctrl) { - - $("body").addClass("is-modalOpen"); - - $("body").append(element); - - Wait('start'); - - scope.$broadcast("linkLists"); - - setTimeout(function() { - $('#add-users-modal').modal("show"); - }, 200); - - $('.modal[aria-hidden=false]').each(function () { - if ($(this).attr('id') !== 'add-users-modal') { - $(this).modal('hide'); - } - }); - - scope.closeModal = function() { - $("body").removeClass("is-modalOpen"); - $('#add-users-modal').on('hidden.bs.modal', - function () { - $('.AddUsers').remove(); - }); - $('#add-users-modal').modal('hide'); - }; - - scope.$on('closeUsersModal', function() { - scope.closeModal(); - }); - - scope.compileList = function(html) { - $('#add-users-list').append($compile(html)(scope)); - }; - - Wait('stop'); - - window.scrollTo(0,0); - } - }; - } - ]; diff --git a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.partial.html b/awx/ui/client/src/organizations/linkout/addUsers/addUsers.partial.html deleted file mode 100644 index c8f53d8412..0000000000 --- a/awx/ui/client/src/organizations/linkout/addUsers/addUsers.partial.html +++ /dev/null @@ -1,35 +0,0 @@ - diff --git a/awx/ui/client/src/organizations/linkout/addUsers/main.js b/awx/ui/client/src/organizations/linkout/addUsers/main.js deleted file mode 100644 index 83604f2c77..0000000000 --- a/awx/ui/client/src/organizations/linkout/addUsers/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import addUsersDirective from './addUsers.directive'; - -export default - angular.module('AddUsers', []) - .directive('addUsers', addUsersDirective); diff --git a/awx/ui/client/src/organizations/linkout/controllers/organizations-admins.controller.js b/awx/ui/client/src/organizations/linkout/controllers/organizations-admins.controller.js deleted file mode 100644 index fe5cc6a06b..0000000000 --- a/awx/ui/client/src/organizations/linkout/controllers/organizations-admins.controller.js +++ /dev/null @@ -1,78 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$stateParams', '$scope', 'Rest', '$state', - '$compile', 'Wait', 'OrgAdminList', 'OrgAdminsDataset', 'i18n', - 'Prompt', 'ProcessErrors', 'GetBasePath', '$filter', - function($stateParams, $scope, Rest, $state, - $compile, Wait, OrgAdminList, OrgAdminsDataset, i18n, - Prompt, ProcessErrors, GetBasePath, $filter) { - - var orgBase = GetBasePath('organizations'); - - init(); - - function init() { - // search init - $scope.list = OrgAdminList; - $scope.user_dataset = OrgAdminsDataset.data; - $scope.users = $scope.user_dataset.results; - - Rest.setUrl(orgBase + $stateParams.organization_id); - Rest.get() - .then(({data}) => { - $scope.organization_name = data.name; - $scope.name = data.name; - $scope.org_id = data.id; - $scope.canAddAdmins = data.summary_fields.user_capabilities.edit; - - $scope.orgRelatedUrls = data.related; - - }); - } - - $scope.addUsers = function() { - $compile("")($scope); - }; - - $scope.editUser = function(id) { - $state.go('users.edit', { user_id: id }); - }; - - $scope.deleteUser = function(id, name) { - var action = function() { - $('#prompt-modal').modal('hide'); - Wait('start'); - var url = orgBase + $stateParams.organization_id + '/admins/'; - Rest.setUrl(url); - Rest.post({ - id: id, - disassociate: true - }).then(() => { - $state.go('.', null, { reload: true }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - Prompt({ - hdr: i18n._('Delete'), - body: `
${i18n._('Are you sure you want to remove the following administrator from this organization?')}
` + $filter('sanitize')(name) + '
', - action: action, - actionText: i18n._('DELETE') - }); - }; - - $scope.formCancel = function() { - $state.go('organizations'); - }; - - } -]; diff --git a/awx/ui/client/src/organizations/linkout/controllers/organizations-inventories.controller.js b/awx/ui/client/src/organizations/linkout/controllers/organizations-inventories.controller.js deleted file mode 100644 index 236e2b0146..0000000000 --- a/awx/ui/client/src/organizations/linkout/controllers/organizations-inventories.controller.js +++ /dev/null @@ -1,265 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$rootScope', '$location', - '$stateParams', '$compile', '$filter', 'Rest', 'InventoryList', - 'OrgInventoryDataset', 'OrgInventoryList', - 'ProcessErrors', 'GetBasePath', 'Wait', 'Find', 'Empty', '$state', 'i18n', - function($scope, $rootScope, $location, - $stateParams, $compile, $filter, Rest, InventoryList, - Dataset, OrgInventoryList, - ProcessErrors, GetBasePath, Wait, - Find, Empty, $state, i18n) { - - var list = OrgInventoryList, - orgBase = GetBasePath('organizations'); - - init(); - - function init() { - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $rootScope.flashMessage = null; - Rest.setUrl(orgBase + $stateParams.organization_id); - Rest.get() - .then(({data}) => { - - $scope.organization_name = data.name; - $scope.name = data.name; - $scope.org_id = data.id; - $scope.orgRelatedUrls = data.related; - - }); - - $scope.$watch('inventories', ()=>{ - _.forEach($scope.inventories, processInventoryRow); - }); - } - - function processInventoryRow(item) { - if (item.has_inventory_sources) { - if (item.inventory_sources_with_failures > 0) { - item.syncStatus = 'error'; - item.syncTip = item.inventory_sources_with_failures + i18n._(' groups with sync failures. Click for details'); - } else { - item.syncStatus = 'successful'; - item.syncTip = i18n._('No inventory sync failures. Click for details.'); - } - } else { - item.syncStatus = 'na'; - item.syncTip = i18n._('Not configured for inventory sync.'); - item.launch_class = "btn-disabled"; - } - if (item.has_active_failures) { - item.hostsStatus = 'eritemror'; - item.hostsTip = item.hosts_with_active_failures + i18n._(' hosts with failures. Click for details.'); - } else if (item.total_hosts) { - item.hostsStatus = 'successful'; - item.hostsTip = i18n._('No hosts with failures. Click for details.'); - } else { - item.hostsStatus = 'none'; - item.hostsTip = i18n._('Inventory contains 0 hosts.'); - } - - item.kind_label = item.kind === '' ? i18n._('Inventory') : (item.kind === 'smart' ? i18n._('Smart Inventory'): i18n._('Inventory')); - item.linkToDetails = (item.kind && item.kind === 'smart') ? `inventories.editSmartInventory({smartinventory_id:${item.id}})` : `inventories.edit({inventory_id:${item.id}})`; - - return item; - } - - function ellipsis(a) { - if (a.length > 20) { - return a.substr(0, 20) + '...'; - } - return a; - } - - function attachElem(event, html, title) { - var elem = $(event.target).parent(); - try { - elem.tooltip('hide'); - elem.popover('dispose'); - } catch (err) { - //ignore - } - $('.popover').each(function() { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - $(this).remove(); - }); - $('.tooltip').each(function() { - // close any lingering tool tipss - $(this).hide(); - }); - elem.attr({ - "aw-pop-over": html, - "data-popover-title": title, - "data-placement": "right" - }); - $compile(elem)($scope); - elem.on('shown.bs.popover', function() { - $('.popover').each(function() { - $compile($(this))($scope); //make nested directives work! - }); - $('.popover-content, .popover-title').click(function() { - elem.popover('hide'); - }); - }); - elem.popover('show'); - } - - if ($scope.removeHostSummaryReady) { - $scope.removeHostSummaryReady(); - } - $scope.removeHostSummaryReady = $scope.$on('HostSummaryReady', function(e, event, data) { - - var html, title = "Recent Jobs"; - Wait('stop'); - if (data.count > 0) { - html = "\n"; - html += "\n"; - html += ""; - html += ""; - html += ""; - html += ""; - html += "\n"; - html += "\n"; - html += "\n"; - - data.results.forEach(function(row) { - html += "\n"; - html += "\n"; - html += ""; - html += ""; - html += "\n"; - }); - html += "\n"; - html += "
StatusFinishedName
" + ($filter('longDate')(row.finished)).replace(/ /, '
') + "
" + ellipsis(row.name) + "
\n"; - } else { - html = "

No recent job data available for this inventory.

\n"; - } - attachElem(event, html, title); - }); - - if ($scope.removeGroupSummaryReady) { - $scope.removeGroupSummaryReady(); - } - $scope.removeGroupSummaryReady = $scope.$on('GroupSummaryReady', function(e, event, inventory, data) { - var html, title; - - Wait('stop'); - - // Build the html for our popover - html = "\n"; - html += "\n"; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += "\n"; - html += "\n"; - data.results.forEach(function(row) { - if (row.related.last_update) { - html += ""; - html += ""; - html += ""; - html += ""; - html += "\n"; - } else { - html += ""; - html += ""; - html += ""; - html += ""; - html += "\n"; - } - }); - html += "\n"; - html += "
StatusLast SyncGroup
" + ($filter('longDate')(row.last_updated)).replace(/ /, '
') + "
" + ellipsis(row.summary_fields.group.name) + "
NA" + ellipsis(row.summary_fields.group.name) + "
\n"; - title = i18n._("Sync Status"); - attachElem(event, html, title); - }); - - $scope.showGroupSummary = function(event, id) { - var inventory; - if (!Empty(id)) { - inventory = Find({ list: $scope.inventories, key: 'id', val: id }); - if (inventory.syncStatus !== 'na') { - Wait('start'); - Rest.setUrl(inventory.related.inventory_sources + '?or__source=ec2&or__source=rax&order_by=-last_job_run&page_size=5'); - Rest.get() - .then(({data}) => { - $scope.$emit('GroupSummaryReady', event, inventory, data); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + inventory.related.inventory_sources + ' failed. GET returned status: ' + status - }); - }); - } - } - }; - - $scope.showHostSummary = function(event, id) { - var url, inventory; - if (!Empty(id)) { - inventory = Find({ list: $scope.inventories, key: 'id', val: id }); - if (inventory.total_hosts > 0) { - Wait('start'); - url = GetBasePath('jobs') + "?type=job&inventory=" + id + "&failed="; - url += (inventory.has_active_failures) ? 'true' : "false"; - url += "&order_by=-finished&page_size=5"; - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - $scope.$emit('HostSummaryReady', event, data); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + url + ' failed. GET returned: ' + status - }); - }); - } - } - }; - - $scope.viewJob = function(url) { - // Pull the id out of the URL - var id = url.replace(/^\//, '').split('/')[3]; - $state.go('output', { id: id, type: 'inventory' }); - - }; - - $scope.editInventory = function (inventory) { - if(inventory.kind && inventory.kind === 'smart') { - $state.go('inventories.editSmartInventory', {smartinventory_id: inventory.id}); - } - else { - $state.go('inventories.edit', {inventory_id: inventory.id}); - } - }; - - // Failed jobs link. Go to the jobs tabs, find all jobs for the inventory and sort by status - $scope.viewJobs = function(id) { - $location.url('/jobs/?inventory__int=' + id); - }; - - $scope.viewFailedJobs = function(id) { - $location.url('/jobs/?inventory__int=' + id + '&status=failed'); - }; - - $scope.formCancel = function() { - $state.go('organizations'); - }; - - } -]; diff --git a/awx/ui/client/src/organizations/linkout/controllers/organizations-job-templates.controller.js b/awx/ui/client/src/organizations/linkout/controllers/organizations-job-templates.controller.js deleted file mode 100644 index 5d8cacb915..0000000000 --- a/awx/ui/client/src/organizations/linkout/controllers/organizations-job-templates.controller.js +++ /dev/null @@ -1,96 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$stateParams', 'Rest', 'GetBasePath', '$state', 'OrgJobTemplateList', 'OrgJobTemplateDataset', - function($scope, $stateParams, Rest, GetBasePath, $state, OrgJobTemplateList, Dataset) { - - var list = OrgJobTemplateList, - orgBase = GetBasePath('organizations'); - - $scope.$on(`ws-jobs`, function (e, msg) { - if (msg.unified_job_template_id && $scope[list.name]) { - const template = $scope[list.name].find((t) => t.id === msg.unified_job_template_id); - if (template) { - if (msg.status === 'pending') { - // This is a new job - add it to the front of the - // recent_jobs array - if (template.summary_fields.recent_jobs.length === 10) { - template.summary_fields.recent_jobs.pop(); - } - - template.summary_fields.recent_jobs.unshift({ - id: msg.unified_job_id, - status: msg.status, - type: msg.type - }); - } else { - // This is an update to an existing job. Check to see - // if we have it in our array of recent_jobs - for (let i=0; i { - $scope.organization_name = data.name; - $scope.name = data.name; - $scope.org_id = data.id; - - $scope.orgRelatedUrls = data.related; - }); - } - - $scope.$on(`${list.iterator}_options`, function(event, data){ - $scope.options = data.data.actions.GET; - optionsRequestDataProcessing(); - }); - - $scope.$watchCollection(`${$scope.list.name}`, function() { - optionsRequestDataProcessing(); - } - ); - // iterate over the list and add fields like type label, after the - // OPTIONS request returns, or the list is sorted/paginated/searched - function optionsRequestDataProcessing(){ - $scope[list.name].forEach(function(item, item_idx) { - var itm = $scope[list.name][item_idx]; - - // Set the item type label - if (list.fields.type && $scope.options && $scope.options.hasOwnProperty('type')) { - $scope.options.type.choices.forEach(function(choice) { - if (choice[0] === item.type) { - itm.type_label = choice[1]; - } - }); - } - }); - } - - $scope.editJobTemplate = function(id) { - $state.go('templates.editJobTemplate', { job_template_id: id }); - }; - } -]; diff --git a/awx/ui/client/src/organizations/linkout/controllers/organizations-projects.controller.js b/awx/ui/client/src/organizations/linkout/controllers/organizations-projects.controller.js deleted file mode 100644 index 5e444a0eed..0000000000 --- a/awx/ui/client/src/organizations/linkout/controllers/organizations-projects.controller.js +++ /dev/null @@ -1,309 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$rootScope', '$log', '$stateParams', 'Rest', 'Alert', - 'OrgProjectList', 'OrgProjectDataset', 'ProcessErrors', 'GetBasePath', - 'ProjectUpdate', 'Wait', 'GetChoices', 'Empty', 'Find', 'GetProjectIcon', - 'GetProjectToolTip', '$filter', '$state', 'i18n', - function($scope, $rootScope, $log, $stateParams, Rest, Alert, - OrgProjectList, Dataset, ProcessErrors, GetBasePath, ProjectUpdate, - Wait, GetChoices, Empty, Find, GetProjectIcon, GetProjectToolTip, $filter, - $state, i18n) { - - var list = OrgProjectList, - projUrl, - choiceCount = 0, - orgBase = GetBasePath('organizations'), - projBase = GetBasePath('projects'); - - - function updateStatus() { - if ($scope.projects) { - $scope.projects.forEach(function(project, i) { - $scope.projects[i].statusIcon = GetProjectIcon(project.status); - $scope.projects[i].statusTip = GetProjectToolTip(project.status); - $scope.projects[i].scm_update_tooltip = i18n._("Get latest SCM revision"); - $scope.projects[i].scm_type_class = ""; - - if (project.status === 'failed' && project.summary_fields.last_update && project.summary_fields.last_update.status === 'canceled') { - $scope.projects[i].statusTip = i18n._('Canceled. Click for details'); - } - - if (project.status === 'running' || project.status === 'updating') { - $scope.projects[i].scm_update_tooltip = i18n._("SCM update currently running"); - $scope.projects[i].scm_type_class = "btn-disabled"; - } - - if ($scope.project_scm_type_options) { - $scope.project_scm_type_options.forEach(function(type) { - if (type.value === project.scm_type) { - $scope.projects[i].scm_type = type.label; - if (type.label === 'Manual') { - $scope.projects[i].scm_update_tooltip = i18n._('Manual projects do not require an SCM update'); - $scope.projects[i].scm_type_class = 'btn-disabled'; - $scope.projects[i].statusTip = 'Not configured for SCM'; - $scope.projects[i].statusIcon = 'none'; - } - } - }); - } - }); - } - } - - init(); - - function init() { - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $rootScope.flashMessage = null; - - $scope.$on('choicesReadyProjectList', function() { - Wait('stop'); - updateStatus(); - }); - } - - $scope.$on(`${list.iterator}_options`, function(event, data){ - $scope.options = data.data.actions.GET; - optionsRequestDataProcessing(); - }); - - $scope.$watchCollection(`${$scope.list.name}`, function() { - optionsRequestDataProcessing(); - updateStatus(); - }); - - // iterate over the list and add fields like type label, after the - // OPTIONS request returns, or the list is sorted/paginated/searched - function optionsRequestDataProcessing(){ - $scope[list.name].forEach(function(item, item_idx) { - var itm = $scope[list.name][item_idx]; - - // Set the item type label - if (list.fields.scm_type && $scope.options && - $scope.options.hasOwnProperty('scm_type')) { - $scope.options.scm_type.choices.forEach(function(choice) { - if (choice[0] === item.scm_type) { - itm.type_label = choice[1]; - } - }); - } - - // buildTooltips(itm); - - }); - } - - // Go out and get the organization - Rest.setUrl(orgBase + $stateParams.organization_id); - Rest.get() - .then(({data}) => { - $scope.organization_name = data.name; - $scope.name = data.name; - $scope.org_id = data.id; - - $scope.orgRelatedUrls = data.related; - - - $scope.$on('ws-jobs', function(e, data) { - var project; - $log.debug(data); - if ($scope.projects) { - // Assuming we have a list of projects available - project = Find({ list: $scope.projects, key: 'id', val: data.project_id }); - if (project) { - // And we found the affected project - $log.debug('Received event for project: ' + project.name); - $log.debug('Status changed to: ' + data.status); - if (!(data.status === 'successful' || data.status === 'failed')) { - project.scm_update_tooltip = i18n._("SCM update currently running"); - project.scm_type_class = "btn-disabled"; - } - project.status = data.status; - project.statusIcon = GetProjectIcon(data.status); - project.statusTip = GetProjectToolTip(data.status); - } - } - }); - - if ($scope.removeChoicesHere) { - $scope.removeChoicesHere(); - } - $scope.removeChoicesHere = $scope.$on('choicesCompleteProjectList', function() { - - list.fields.scm_type.searchOptions = $scope.project_scm_type_options; - list.fields.status.searchOptions = $scope.project_status_options; - - if ($stateParams.scm_type && $stateParams.status) { - // Request coming from home page. User wants all errors for an scm_type - projUrl += '?status=' + $stateParams.status; - } - }); - - if ($scope.removeChoicesReadyList) { - $scope.removeChoicesReadyList(); - } - $scope.removeChoicesReadyList = $scope.$on('choicesReadyProjectList', function() { - choiceCount++; - if (choiceCount === 2) { - $scope.$emit('choicesCompleteProjectList'); - } - }); - - // Load options for status --used in search - GetChoices({ - scope: $scope, - url: projBase, - field: 'status', - variable: 'project_status_options', - callback: 'choicesReadyProjectList' - }); - - // Load the list of options for Kind - GetChoices({ - scope: $scope, - url: projBase, - field: 'scm_type', - variable: 'project_scm_type_options', - callback: 'choicesReadyProjectList' - }); - - }); - - $scope.editProject = function(id) { - $state.go('projects.edit', { project_id: id }); - }; - - if ($scope.removeGoTojobResults) { - $scope.removeGoTojobResults(); - } - $scope.removeGoTojobResults = $scope.$on('GoTojobResults', function(e, data) { - if (data.summary_fields.current_update || data.summary_fields.last_update) { - - Wait('start'); - - // Grab the id from summary_fields - var id = (data.summary_fields.current_update) ? data.summary_fields.current_update.id : data.summary_fields.last_update.id; - - $state.go('output', { id: id, type: 'project' }); - - } else { - Alert(i18n._('No Updates Available'), i18n._('There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project.'), 'alert-info'); - } - }); - - $scope.showSCMStatus = function(id) { - // Refresh the project list - var project = Find({ list: $scope.projects, key: 'id', val: id }); - if (Empty(project.scm_type) || project.scm_type === 'Manual') { - Alert(i18n._('No SCM Configuration'), i18n._('The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings and then run an update.'), 'alert-info'); - } else { - // Refresh what we have in memory to insure we're accessing the most recent status record - Rest.setUrl(project.url); - Rest.get() - .then(({data}) => { - $scope.$emit('GoTojobResults', data); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Project lookup failed. GET returned: ' + status - }); - }); - } - }; - - if ($scope.removeCancelUpdate) { - $scope.removeCancelUpdate(); - } - $scope.removeCancelUpdate = $scope.$on('Cancel_Update', function(e, url) { - // Cancel the project update process - Rest.setUrl(url); - Rest.post() - .then(() => { - Alert(i18n._('SCM Update Cancel'), i18n._('Your request to cancel the update was submitted to the task manager.'), 'alert-info'); - $scope.refresh(); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST status: ' + status }); - }); - }); - - if ($scope.removeCheckCancel) { - $scope.removeCheckCancel(); - } - $scope.removeCheckCancel = $scope.$on('Check_Cancel', function(e, data) { - // Check that we 'can' cancel the update - var url = data.related.cancel; - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - if (data.can_cancel) { - $scope.$emit('Cancel_Update', url); - } else { - Alert(i18n._('Cancel Not Allowed'), `
${i18n._('Either you do not have access or the SCM update process completed. Click the ')} - ${i18n._('Refresh')} ${i18n._('button to view the latest status.')}
`, 'alert-info', null, null, null, null, true); - } - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + ' failed. GET status: ' + status }); - }); - }); - - $scope.cancelUpdate = function(id, name) { - Rest.setUrl(GetBasePath("projects") + id); - Rest.get() - .then(({data}) => { - if (data.related.current_update) { - Rest.setUrl(data.related.current_update); - Rest.get() - .then(({data}) => { - $scope.$emit('Check_Cancel', data); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + data.related.current_update + ' failed. GET status: ' + status - }); - }); - } else { - Alert(i18n._('Update Not Found'), `
${i18n._('An SCM update does not appear to be running for project: ')} ${$filter('sanitize')(name)}. ${i18n._('Click the')} ${i18n._('Refresh')}${i18n._('button to view the latest status.')}
`, - 'alert-info', undefined, undefined, undefined, undefined, true); - } - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to get project failed. GET status: ' + status - }); - }); - }; - - $scope.SCMUpdate = function(project_id, event) { - try { - $(event.target).tooltip('hide'); - } catch (e) { - // ignore - } - $scope.projects.forEach(function(project) { - if (project.id === project_id) { - if (!((project.scm_type === "Manual" || Empty(project.scm_type)) || (project.status === 'updating' || project.status === 'running' || project.status === 'pending'))) { - ProjectUpdate({ scope: $scope, project_id: project.id }); - } - } - }); - }; - - $scope.formCancel = function() { - $state.go('organizations'); - }; - - } -]; diff --git a/awx/ui/client/src/organizations/linkout/controllers/organizations-teams.controller.js b/awx/ui/client/src/organizations/linkout/controllers/organizations-teams.controller.js deleted file mode 100644 index c4b9435d1d..0000000000 --- a/awx/ui/client/src/organizations/linkout/controllers/organizations-teams.controller.js +++ /dev/null @@ -1,51 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$stateParams', 'OrgTeamList', 'Rest', 'OrgTeamsDataset', - 'GetBasePath', '$state', - function($scope, $stateParams, OrgTeamList, Rest, Dataset, - GetBasePath, $state) { - - var list = OrgTeamList, - orgBase = GetBasePath('organizations'); - - init(); - - function init() { - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $scope.$watchCollection(list.name, function() { - function setOrganizationName(organization) { - organization.organization_name = organization.summary_fields.organization.name; - return organization; - } - _.forEach($scope.teams, (team) => setOrganizationName(team)); - }); - - Rest.setUrl(orgBase + $stateParams.organization_id); - Rest.get() - .then(({data}) => { - - $scope.organization_name = data.name; - $scope.name = data.name; - $scope.org_id = data.id; - - $scope.orgRelatedUrls = data.related; - }); - } - - $scope.editTeam = function(id) { - $state.go('teams.edit', { team_id: id }); - }; - - $scope.formCancel = function() { - $state.go('organizations'); - }; - } -]; diff --git a/awx/ui/client/src/organizations/linkout/controllers/organizations-users.controller.js b/awx/ui/client/src/organizations/linkout/controllers/organizations-users.controller.js deleted file mode 100644 index b5676fb782..0000000000 --- a/awx/ui/client/src/organizations/linkout/controllers/organizations-users.controller.js +++ /dev/null @@ -1,77 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$stateParams', '$scope', 'OrgUserList','Rest', '$state', - '$compile', 'Wait', 'OrgUsersDataset', - 'Prompt', 'ProcessErrors', 'GetBasePath', '$filter', 'i18n', - function($stateParams, $scope, OrgUserList, Rest, $state, - $compile, Wait, OrgUsersDataset, Prompt, ProcessErrors, - GetBasePath, $filter, i18n) { - - var orgBase = GetBasePath('organizations'); - - init(); - - function init() { - // search init - $scope.list = OrgUserList; - $scope.user_dataset = OrgUsersDataset.data; - $scope.users = $scope.user_dataset.results; - - Rest.setUrl(orgBase + $stateParams.organization_id); - Rest.get() - .then(({data}) => { - $scope.organization_name = data.name; - $scope.name = data.name; - $scope.org_id = data.id; - - $scope.orgRelatedUrls = data.related; - - }); - } - - $scope.addUsers = function() { - $compile("")($scope); - }; - - $scope.editUser = function(id) { - $state.go('users.edit', { user_id: id }); - }; - - $scope.deleteUser = function(id, name) { - var action = function() { - $('#prompt-modal').modal('hide'); - Wait('start'); - var url = orgBase + $stateParams.organization_id + '/users/'; - Rest.setUrl(url); - Rest.post({ - id: id, - disassociate: true - }).then(() => { - $state.go('.', null, { reload: true }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - Prompt({ - hdr: i18n._('Delete'), - body: `
${i18n._('Are you sure you want to remove the following user from this organization?')}
` + $filter('sanitize')(name) + '
', - action: action, - actionText: i18n._('DELETE') - }); - }; - - $scope.formCancel = function() { - $state.go('organizations'); - }; - - } -]; diff --git a/awx/ui/client/src/organizations/linkout/main.js b/awx/ui/client/src/organizations/linkout/main.js deleted file mode 100644 index e6d31a156c..0000000000 --- a/awx/ui/client/src/organizations/linkout/main.js +++ /dev/null @@ -1,3 +0,0 @@ -import AddUsers from './addUsers/main'; - -export default angular.module('organizationsLinkout', [AddUsers.name]); diff --git a/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js b/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js deleted file mode 100644 index 8074e96d06..0000000000 --- a/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js +++ /dev/null @@ -1,270 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import OrganizationsJobTemplatesRoute from '~features/templates/routes/organizationsTemplatesList.route'; - -import OrganizationsAdmins from './controllers/organizations-admins.controller'; -import OrganizationsInventories from './controllers/organizations-inventories.controller'; -import OrganizationsProjects from './controllers/organizations-projects.controller'; -import OrganizationsTeams from './controllers/organizations-teams.controller'; -import OrganizationsUsers from './controllers/organizations-users.controller'; -import { N_ } from '../../i18n'; - -let lists = [{ - name: 'organizations.users', - url: '/:organization_id/users', - searchPrefix: 'user', - views: { - 'form': { - controller: OrganizationsUsers, - templateProvider: function(OrgUserList, generateList) { - let html = generateList.build({ - list: OrgUserList, - mode: 'edit', - cancelButton: true - }); - return generateList.wrapPanel(html); - }, - } - }, - params: { - user_search: { - value: { - order_by: 'username' - }, - dynamic: true - } - }, - ncyBreadcrumb: { - parent: "organizations.edit", - label: N_("USERS") - }, - - data: { - activityStream: true, - activityStreamTarget: 'organization' - }, - resolve: { - OrgUsersDataset: ['OrgUserList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || list.basePath; - return qs.search(path, $stateParams.org_user_search); - } - ], - OrgUserList: ['UserList', 'GetBasePath', '$stateParams', 'i18n', function(UserList, GetBasePath, $stateParams, i18n) { - let list = _.cloneDeep(UserList); - delete list.actions.add; - list.basePath = `${GetBasePath('organizations')}${$stateParams.organization_id}/users`; - list.searchRowActions = { - add: { - awToolTip: i18n._('Add existing user to organization'), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngClick: 'addUsers()' - } - }; - return list; - }] - } -}, { - name: 'organizations.teams', - url: '/:organization_id/teams', - searchPrefix: 'team', - views: { - 'form': { - controller: OrganizationsTeams, - templateProvider: function(OrgTeamList, generateList) { - let html = generateList.build({ - list: OrgTeamList, - mode: 'edit', - cancelButton: true - }); - return generateList.wrapPanel(html); - }, - }, - }, - data: { - activityStream: true, - activityStreamTarget: 'organization' - }, - ncyBreadcrumb: { - parent: "organizations.edit", - label: N_("TEAMS") - }, - resolve: { - OrgTeamList: ['TeamList', 'GetBasePath', '$stateParams', 'i18n', function(TeamList, GetBasePath, $stateParams, i18n) { - let list = _.cloneDeep(TeamList); - delete list.actions.add; - // @issue Why is the delete action unavailable in this view? - delete list.fieldActions.delete; - list.listTitle = i18n._('Teams') + ` | {{ name }}`; - list.basePath = `${GetBasePath('organizations')}${$stateParams.organization_id}/teams`; - list.emptyListText = `${i18n._('This list is populated by teams added from the')} ${N_('Teams')} ${N_('section')}`; - return list; - }], - OrgTeamsDataset: ['OrgTeamList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || list.basePath; - return qs.search(path, $stateParams.team_search); - } - ] - } -}, { - name: 'organizations.inventories', - url: '/:organization_id/inventories', - searchPrefix: 'inventory', - views: { - 'form': { - controller: OrganizationsInventories, - templateProvider: function(OrgInventoryList, generateList) { - let html = generateList.build({ - list: OrgInventoryList, - mode: 'edit', - cancelButton: true - }); - return generateList.wrapPanel(html); - }, - }, - }, - data: { - activityStream: true, - activityStreamTarget: 'organization' - }, - ncyBreadcrumb: { - parent: "organizations.edit", - label: N_("INVENTORIES") - }, - resolve: { - OrgInventoryList: ['InventoryList', 'GetBasePath', '$stateParams', 'i18n', function(InventoryList, GetBasePath, $stateParams, i18n) { - let list = _.cloneDeep(InventoryList); - delete list.actions.add; - // @issue Why is the delete action unavailable in this view? - delete list.fieldActions.delete; - list.title = true; - list.listTitle = i18n._('Inventories') + ` | {{ name }}`; - list.basePath = `${GetBasePath('organizations')}${$stateParams.organization_id}/inventories`; - list.emptyListText = `${i18n._("This list is populated by inventories added from the")} ${N_("Inventories")} ${N_("section")}`; - return list; - }], - OrgInventoryDataset: ['OrgInventoryList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || list.basePath; - return qs.search(path, $stateParams.inventory_search); - } - ] - } -}, { - name: 'organizations.projects', - url: '/:organization_id/projects', - searchPrefix: 'project', - views: { - 'form': { - controller: OrganizationsProjects, - templateProvider: function(OrgProjectList, generateList) { - let html = generateList.build({ - list: OrgProjectList, - mode: 'edit', - cancelButton: true - }); - return generateList.wrapPanel(html); - }, - }, - }, - data: { - activityStream: true, - activityStreamTarget: 'organization' - }, - ncyBreadcrumb: { - parent: "organizations.edit", - label: N_("PROJECTS") - }, - resolve: { - OrgProjectList: ['ProjectList', 'GetBasePath', '$stateParams', 'i18n', function(ProjectList, GetBasePath, $stateParams, i18n) { - let list = _.cloneDeep(ProjectList); - delete list.actions; - // @issue Why is the delete action unavailable in this view? - delete list.fieldActions.delete; - list.listTitle = i18n._('Projects') + ` | {{ name }}`; - list.basePath = `${GetBasePath('organizations')}${$stateParams.organization_id}/projects`; - list.emptyListText = `${i18n._("This list is populated by projects added from the")} ${N_("Projects")} ${N_("section")}`; - return list; - }], - OrgProjectDataset: ['OrgProjectList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || list.basePath; - return qs.search(path, $stateParams.project_search); - } - ] - } -}, { - name: 'organizations.admins', - url: '/:organization_id/admins', - searchPrefix: 'user', - params: { - user_search: { - value: { - order_by: 'username' - }, - dynamic: true - }, - add_user_search: { - value: { - order_by: 'username', - page_size: '5', - }, - dynamic: true, - squash: true - } - }, - views: { - 'form': { - controller: OrganizationsAdmins, - templateProvider: function(OrgAdminList, generateList) { - let html = generateList.build({ - list: OrgAdminList, - mode: 'edit', - cancelButton: true - }); - return generateList.wrapPanel(html); - }, - } - }, - data: { - activityStream: true, - activityStreamTarget: 'organization' - }, - ncyBreadcrumb: { - parent: "organizations.edit", - label: N_("ADMINS") - }, - resolve: { - OrgAdminsDataset: ['OrgAdminList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || list.basePath; - return qs.search(path, $stateParams[`user_search`]); - } - ], - OrgAdminList: ['UserList', 'GetBasePath', '$stateParams', 'i18n', function(UserList, GetBasePath, $stateParams, i18n) { - let list = _.cloneDeep(UserList); - delete list.actions.add; - list.basePath = `${GetBasePath('organizations')}${$stateParams.organization_id}/admins`; - list.searchRowActions = { - add: { - awToolTip: i18n._('Add existing user to organization as administrator'), - actionClass: 'at-Button--add', - ngClick: 'addUsers()', - ngShow:'canAddAdmins' - } - }; - list.listTitle = i18n._('Admins') + ` | {{ name }}`; - return list; - }] - } -}]; - -lists.push(OrganizationsJobTemplatesRoute); - -export default lists; diff --git a/awx/ui/client/src/organizations/list/organizations-list.controller.js b/awx/ui/client/src/organizations/list/organizations-list.controller.js deleted file mode 100644 index edec123dde..0000000000 --- a/awx/ui/client/src/organizations/list/organizations-list.controller.js +++ /dev/null @@ -1,207 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default ['$stateParams', '$scope', '$rootScope', - 'Rest', 'OrganizationList', 'Prompt', 'OrganizationModel', - 'ProcessErrors', 'GetBasePath', 'Wait', '$state', - 'rbacUiControlService', '$filter', 'Dataset', 'i18n', - 'AppStrings', - function($stateParams, $scope, $rootScope, - Rest, OrganizationList, Prompt, Organization, - ProcessErrors, GetBasePath, Wait, $state, - rbacUiControlService, $filter, Dataset, i18n, - AppStrings - ) { - - var defaultUrl = GetBasePath('organizations'), - list = OrganizationList; - - $scope.canAdd = false; - - rbacUiControlService.canAdd("organizations") - .then(function(params) { - $scope.canAdd = params.canAdd; - }); - $scope.orgCount = Dataset.data.count; - - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $scope.orgCards = parseCardData($scope[list.name]); - $rootScope.flashMessage = null; - - // grab the pagination elements, move, destroy list generator elements - $('#organization-pagination').appendTo('#OrgCards'); - $('#organizations tag-search').appendTo('.OrgCards-search'); - $('#organizations-list').remove(); - - function parseCardData(cards) { - return cards.map(function(card) { - var val = {}; - val.user_capabilities = card.summary_fields.user_capabilities; - val.name = card.name; - val.id = card.id; - val.description = card.description || undefined; - val.links = []; - val.links.push({ - sref: `organizations.edit.users({organization_id: ${card.id}})`, - srefOpts: { inherit: false }, - name: i18n._("USERS"), - count: card.summary_fields.related_field_counts.users, - activeMode: 'users' - }); - val.links.push({ - sref: `organizations.teams({organization_id: ${card.id}})`, - srefOpts: { inherit: false }, - name: i18n._("TEAMS"), - count: card.summary_fields.related_field_counts.teams, - activeMode: 'teams' - }); - val.links.push({ - sref: `organizations.inventories({organization_id: ${card.id}})`, - srefOpts: { inherit: false }, - name: i18n._("INVENTORIES"), - count: card.summary_fields.related_field_counts.inventories, - activeMode: 'inventories' - }); - val.links.push({ - sref: `organizations.projects({organization_id: ${card.id}})`, - srefOpts: { inherit: false }, - name: i18n._("PROJECTS"), - count: card.summary_fields.related_field_counts.projects, - activeMode: 'projects' - }); - val.links.push({ - sref: `organizations.job_templates({organization_id: ${card.id}, or__jobtemplate__project__organization: ${card.id}, or__jobtemplate__inventory__organization: ${card.id}})`, - srefOpts: { inherit: false }, - name: i18n._("JOB TEMPLATES"), - count: card.summary_fields.related_field_counts.job_templates, - activeMode: 'job_templates' - }); - val.links.push({ - sref: `organizations.admins({organization_id: ${card.id}})`, - srefOpts: { inherit: false }, - name: i18n._("ADMINS"), - count: card.summary_fields.related_field_counts.admins, - activeMode: 'admins' - }); - return val; - }); - } - - $scope.$on("ReloadOrgListView", function() { - Rest.setUrl($scope.current_url); - Rest.get() - .then(({data}) => $scope.organizations = data.results) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + defaultUrl + ' failed. DELETE returned status: ' + status - }); - }); - }); - - - $scope.$watchCollection('organizations', function(value){ - $scope.orgCards = parseCardData(value); - }); - - if ($scope.removePostRefresh) { - $scope.removePostRefresh(); - } - - $scope.$watchCollection(`${list.iterator}_dataset`, function(data) { - $scope[list.name] = data.results; - $scope.orgCards = parseCardData($scope[list.name]); - $scope.orgCount = data.count; - }); - - $scope.addOrganization = function() { - $state.transitionTo('organizations.add'); - }; - - $scope.editOrganization = function(id) { - $state.transitionTo('organizations.edit', { - organization_id: id - }); - }; - - function isDeletedOrganizationBeingEdited(deleted_organization_id, editing_organization_id) { - if (editing_organization_id === undefined) { - return false; - } - if (deleted_organization_id === editing_organization_id) { - return true; - } - return false; - } - - $scope.deleteOrganization = function(id, name) { - - var action = function() { - $('#prompt-modal').modal('hide'); - Wait('start'); - var url = defaultUrl + id + '/'; - Rest.setUrl(url); - Rest.destroy() - .then(() => { - Wait('stop'); - - let reloadListStateParams = null; - - if($scope.organizations.length === 1 && $state.params.organization_search && _.has($state, 'params.organization_search.page') && parseInt($state.params.organization_search.page).toString() !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.organization_search.page = (parseInt(reloadListStateParams.organization_search.page)-1).toString(); - } - - if (isDeletedOrganizationBeingEdited(id, parseInt($stateParams.organization_id)) === true) { - $state.go('^', reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, { reload: true }); - } - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - const organization = new Organization(); - - organization.getDependentResourceCounts(id) - .then((counts) => { - const invalidateRelatedLines = []; - let deleteModalBody = `
${AppStrings.get('deleteResource.CONFIRM', 'organization')}
`; - - counts.forEach(countObj => { - if(countObj.count && countObj.count > 0) { - invalidateRelatedLines.push(`
${countObj.label}${countObj.count}
`); - } - }); - - if (invalidateRelatedLines && invalidateRelatedLines.length > 0) { - deleteModalBody = `
${AppStrings.get('deleteResource.UNAVAILABLE', 'organization')} ${AppStrings.get('deleteResource.CONFIRM', 'organization')}
`; - invalidateRelatedLines.forEach(invalidateRelatedLine => { - deleteModalBody += invalidateRelatedLine; - }); - } - - Prompt({ - hdr: i18n._('Delete'), - resourceName: $filter('sanitize')(name), - body: deleteModalBody, - action: action, - actionText: i18n._('DELETE') - }); - }); - }; - } -]; diff --git a/awx/ui/client/src/organizations/list/organizations-list.partial.html b/awx/ui/client/src/organizations/list/organizations-list.partial.html deleted file mode 100644 index f12fcc5024..0000000000 --- a/awx/ui/client/src/organizations/list/organizations-list.partial.html +++ /dev/null @@ -1,106 +0,0 @@ -
-
-
-
-
-
- ORGANIZATIONS -
- - {{ orgCount }} - -
- -
- -
-
-
- -
-
- - - -
PLEASE ADD ITEMS TO THIS LIST
- -
-
-
-

- - {{ card.name }} - -

-
- - - -
-
- -
-
- - -
-
-
diff --git a/awx/ui/client/src/organizations/main.js b/awx/ui/client/src/organizations/main.js deleted file mode 100644 index 365f4e6e67..0000000000 --- a/awx/ui/client/src/organizations/main.js +++ /dev/null @@ -1,201 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import { templateUrl } from '../shared/template-url/template-url.factory'; -import OrganizationsList from './list/organizations-list.controller'; -import OrganizationsAdd from './add/organizations-add.controller'; -import OrganizationsEdit from './edit/organizations-edit.controller'; -import organizationsLinkout from './linkout/main'; -import OrganizationsLinkoutStates from './linkout/organizations-linkout.route'; -import OrganizationForm from './organizations.form'; -import OrganizationList from './organizations.list'; -import galaxyCredentialsMultiselect from './galaxy-credentials-multiselect/galaxy-credentials.directive'; -import galaxyCredentialsModal from './galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.directive'; - -import { N_ } from '../i18n'; - -export default -angular.module('Organizations', [ - organizationsLinkout.name - ]) - .controller('OrganizationsList', OrganizationsList) - .controller('OrganizationsAdd', OrganizationsAdd) - .controller('OrganizationsEdit', OrganizationsEdit) - .factory('OrganizationForm', OrganizationForm) - .factory('OrganizationList', OrganizationList) - .directive('galaxyCredentialsMultiselect', galaxyCredentialsMultiselect) - .directive('galaxyCredentialsModal', galaxyCredentialsModal) - .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', - function($stateProvider, stateDefinitionsProvider, $stateExtenderProvider) { - let stateExtender = $stateExtenderProvider.$get(), - stateDefinitions = stateDefinitionsProvider.$get(); - - // lazily generate a tree of substates which will replace this node in ui-router's stateRegistry - // see: stateDefinition.factory for usage documentation - $stateProvider.state({ - name: 'organizations.**', - url: '/organizations', - lazyLoad: () => stateDefinitions.generateTree({ - parent: 'organizations', // top-most node in the generated tree - modes: ['add', 'edit'], // form nodes to generate - list: 'OrganizationList', - form: 'OrganizationForm', - controllers: { - list: 'OrganizationsList', - add: 'OrganizationsAdd', - edit: 'OrganizationsEdit' - }, - templates: { - list: templateUrl('organizations/list/organizations-list') - }, - ncyBreadcrumb: { - label: N_('ORGANIZATIONS') - }, - data: { - activityStream: true, - activityStreamTarget: 'organization' - }, - resolve: { - add: { - ConfigData: ['ConfigService', 'ProcessErrors', (ConfigService, ProcessErrors) => { - return ConfigService.getConfig() - .then(response => response) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get config. GET returned status: ' + - 'status: ' + status - }); - }); - - }], - defaultGalaxyCredential: ['Rest', 'GetBasePath', 'ProcessErrors', - function(Rest, GetBasePath, ProcessErrors){ - Rest.setUrl(GetBasePath('credentials')); - return Rest.get({ - params: { - credential_type__kind: 'galaxy', - managed_by_tower: true - } - }) - .then(({data}) => { - if (data.results.length > 0) { - return data.results; - } - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get default Galaxy credential. GET returned ' + - 'status: ' + status - }); - }); - }], - }, - edit: { - ConfigData: ['ConfigService', 'ProcessErrors', (ConfigService, ProcessErrors) => { - return ConfigService.getConfig() - .then(response => response) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get config. GET returned status: ' + - 'status: ' + status - }); - }); - }], - GalaxyCredentialsData: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', - function($stateParams, Rest, GetBasePath, ProcessErrors){ - let path = `${GetBasePath('organizations')}${$stateParams.organization_id}/galaxy_credentials/`; - Rest.setUrl(path); - return Rest.get() - .then(({data}) => { - if (data.results.length > 0) { - return data.results; - } - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get credentials. GET returned ' + - 'status: ' + status - }); - }); - }], - InstanceGroupsData: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', - function($stateParams, Rest, GetBasePath, ProcessErrors){ - let path = `${GetBasePath('organizations')}${$stateParams.organization_id}/instance_groups/`; - Rest.setUrl(path); - return Rest.get() - .then(({data}) => { - if (data.results.length > 0) { - return data.results; - } - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get instance groups. GET returned ' + - 'status: ' + status - }); - }); - }], - isOrgAuditor: ['Rest', 'ProcessErrors', 'GetBasePath', 'i18n', '$stateParams', - function(Rest, ProcessErrors, GetBasePath, i18n, $stateParams) { - Rest.setUrl(`${GetBasePath('organizations')}?role_level=auditor_role&id=${$stateParams.organization_id}`); - return Rest.get() - .then(({data}) => { - return data.count > 0; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed while checking to see if user is a notification administrator of this organization. GET returned ') + status - }); - }); - }], - isOrgAdmin: ['ProcessErrors', 'i18n', '$stateParams', 'OrgAdminLookup', - function(ProcessErrors, i18n, $stateParams, OrgAdminLookup) { - return OrgAdminLookup.checkForAdminAccess({organization: $stateParams.organization_id}) - .then(function(isOrgAdmin){ - return isOrgAdmin; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed while checking to see if user is an administrator of this organization. GET returned ') + status - }); - }); - - }], - isNotificationAdmin: ['Rest', 'ProcessErrors', 'GetBasePath', 'i18n', - function(Rest, ProcessErrors, GetBasePath, i18n) { - Rest.setUrl(`${GetBasePath('organizations')}?role_level=notification_admin_role&page_size=1`); - return Rest.get() - .then(({data}) => { - return data.count > 0; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get organizations for which this user is a notification admin. GET returned ') + status - }); - }); - }], - } - } - // concat manually-defined state definitions with generated defintions - }).then((generated) => { - let linkoutDefinitions = _.map(OrganizationsLinkoutStates, (state) => stateExtender.buildDefinition(state)); - return { - states: _(generated.states) - .concat(linkoutDefinitions) - .value() - }; - }) - }); - } - ]); diff --git a/awx/ui/client/src/organizations/organizations.block.less b/awx/ui/client/src/organizations/organizations.block.less deleted file mode 100644 index 9075f485ca..0000000000 --- a/awx/ui/client/src/organizations/organizations.block.less +++ /dev/null @@ -1,5 +0,0 @@ -#organizations { - .List-noItems { - margin-top: 20px; - } -} \ No newline at end of file diff --git a/awx/ui/client/src/organizations/organizations.form.js b/awx/ui/client/src/organizations/organizations.form.js deleted file mode 100644 index 48446d4599..0000000000 --- a/awx/ui/client/src/organizations/organizations.form.js +++ /dev/null @@ -1,204 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Organizations - * @description This form is for adding/editing an organization -*/ - -export default ['NotificationsList', 'i18n', - function(NotificationsList, i18n) { - return function() { - var OrganizationFormObject = { - - addTitle: i18n._('NEW ORGANIZATION'), //Title in add mode - editTitle: '{{ name }}', //Title in edit mode - name: 'organization', //entity or model name in singular form - stateTree: 'organizations', - tabs: true, - - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(organization_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - capitalize: false - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(organization_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - instance_groups: { - label: i18n._('Instance Groups'), - type: 'custom', - awPopOver: "

" + i18n._("Select the Instance Groups for this Organization to run on.") + "

", - dataTitle: i18n._('Instance Groups'), - dataContainer: 'body', - dataPlacement: 'right', - control: '', - }, - custom_virtualenv: { - label: i18n._('Ansible Environment'), - defaultText: i18n._('Use Default Environment'), - type: 'select', - ngOptions: 'venv for venv in custom_virtualenvs_options track by venv', - awPopOver: "

" + i18n._("Select the custom Python virtual environment for this organization to run on.") + "

", - dataTitle: i18n._('Ansible Environment'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(organization_obj.summary_fields.user_capabilities.edit || canAdd)', - ngShow: 'custom_virtualenvs_visible' - }, - credential: { - label: i18n._('Galaxy Credentials'), - type: 'custom', - awPopOver: "

" + i18n._("Select Galaxy credentials. The selection order sets the order in which Tower will download roles/collections using `ansible-galaxy`.") + "

", - dataTitle: i18n._('Galaxy Credentials'), - dataContainer: 'body', - dataPlacement: 'right', - control: '', - }, - max_hosts: { - label: i18n._('Max Hosts'), - type: 'number', - integer: true, - min: 0, - max: 2147483647, - default: 0, - spinner: true, - dataTitle: i18n._('Max Hosts'), - dataPlacement: 'right', - dataContainer: 'body', - awPopOver: "

" + i18n._("The maximum number of hosts allowed to be managed by this organization. Value defaults to 0 which means no limit. Refer to the Ansible documentation for more details.") + "

", - ngDisabled: '!current_user.is_superuser', - ngShow: 'BRAND_NAME === "Tower"' - }, - }, - - buttons: { //for now always generates -
- - - - - -
-
-
{{name || "New Job Template"}}
SURVEY
- -
-
- -
-
-
-
-
-
-
-
-
-
-
-
PREVIEW
-
-
PLEASE ADD A SURVEY PROMPT.
-
    -
  • - -
    - -
    - -
    - {{question.question_description}} -
    -
    - - -   - - - -
    - - -
    - -
    -
  • -
  • - Drop question here to reorder -
  • -
-
-
-
- - - - -
-
-
- -
-
- diff --git a/awx/ui/client/src/projects/add/projects-add.controller.js b/awx/ui/client/src/projects/add/projects-add.controller.js deleted file mode 100644 index 952cb07974..0000000000 --- a/awx/ui/client/src/projects/add/projects-add.controller.js +++ /dev/null @@ -1,216 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$location', '$stateParams', 'GenerateForm', - 'ProjectsForm', 'Rest', 'Alert', 'ProcessErrors', 'GetBasePath', - 'GetProjectPath', 'GetChoices', 'Wait', '$state', 'CreateSelect2', 'i18n', - 'ConfigData', 'resolvedModels', 'scmCredentialType', 'insightsCredentialType', - function($scope, $location, $stateParams, GenerateForm, ProjectsForm, Rest, - Alert, ProcessErrors, GetBasePath, GetProjectPath, GetChoices, Wait, $state, - CreateSelect2, i18n, ConfigData, resolvedModels, scmCredentialType, insightsCredentialType) { - - let form = ProjectsForm(), - base = $location.path().replace(/^\//, '').split('/')[0], - defaultUrl = GetBasePath('projects'), - main = {}; - - init(); - - function init() { - $scope.canEditOrg = true; - const virtualEnvs = ConfigData.custom_virtualenvs || []; - $scope.custom_virtualenvs_options = virtualEnvs; - - const [ProjectModel] = resolvedModels; - $scope.canAdd = ProjectModel.options('actions.POST'); - - Rest.setUrl(GetBasePath('projects')); - Rest.options() - .then(({data}) => { - if (!data.actions.POST) { - $state.go("^"); - Alert(i18n._('Permission Error'), i18n._('You do not have permission to add a project.'), 'alert-info'); - } - }); - - CreateSelect2({ - element: '#project_custom_virtualenv', - multiple: false, - opts: $scope.custom_virtualenvs_options - }); - - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - } - - GetProjectPath({ scope: $scope, main: main }); - - if ($scope.removeChoicesReady) { - $scope.removeChoicesReady(); - } - $scope.removeChoicesReady = $scope.$on('choicesReady', function() { - var i; - for (i = 0; i < $scope.scm_type_options.length; i++) { - if ($scope.scm_type_options[i].value === '') { - $scope.scm_type_options[i].value = "manual"; - //$scope.scm_type = $scope.scm_type_options[i]; - break; - } - } - - CreateSelect2({ - element: '#project_scm_type', - multiple: false - }); - - $scope.scmRequired = false; - main.scm_type = $scope.scm_type; - }); - - // Load the list of options for Kind - GetChoices({ - scope: $scope, - url: defaultUrl, - field: 'scm_type', - variable: 'scm_type_options', - callback: 'choicesReady' - }); - CreateSelect2({ - element: '#local-path-select', - multiple: false - }); - - // Save - $scope.formSave = function() { - var i, fld, url, data = {}; - data = {}; - for (fld in form.fields) { - if (form.fields[fld].type === 'checkbox_group') { - for (i = 0; i < form.fields[fld].fields.length; i++) { - data[form.fields[fld].fields[i].name] = $scope[form.fields[fld].fields[i].name]; - } - } else { - if (form.fields[fld].type !== 'alertblock') { - data[fld] = $scope[fld]; - } - } - } - - if ($scope.scm_type.value === "manual") { - data.scm_type = ""; - data.local_path = $scope.local_path.value; - } else { - data.scm_type = $scope.scm_type.value; - delete data.local_path; - } - - url = (base === 'teams') ? GetBasePath('teams') + $stateParams.team_id + '/projects/' : defaultUrl; - Wait('start'); - Rest.setUrl(url); - Rest.post(data) - .then(({data}) => { - $scope.addedItem = data.id; - $state.go('projects.edit', { project_id: data.id }, { reload: true }); - }) - .catch(({data, status}) => { - Wait('stop'); - ProcessErrors($scope, data, status, form, { hdr: i18n._('Error!'), - msg: i18n._('Failed to create new project. POST returned status: ') + status }); - }); - }; - - $scope.scmChange = function() { - // When an scm_type is set, path is not required - if ($scope.scm_type) { - $scope.pathRequired = ($scope.scm_type.value === 'manual') ? true : false; - $scope.scmRequired = ($scope.scm_type.value !== 'manual') ? true : false; - $scope.scmBranchLabel = i18n._('SCM Branch'); - $scope.scmRefspecLabel = i18n._('SCM Refspec'); - // Dynamically update popover values - if ($scope.scm_type.value) { - if(($scope.lookupType === 'insights_credential' && $scope.scm_type.value !== 'insights') || ($scope.lookupType === 'scm_credential' && $scope.scm_type.value === 'insights')) { - $scope.credential = null; - $scope.credential_name = ''; - } - switch ($scope.scm_type.value) { - case 'git': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + - i18n._('Example URLs for GIT SCM include:') + - '

' + - '

' + i18n.sprintf(i18n._('%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, ' + - 'do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using ' + - 'SSH. GIT read only protocol (git://) does not use username or password information.'), '', ''); - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - $scope.scmBranchLabel = i18n._('SCM Branch/Tag/Commit'); - break; - case 'svn': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('Example URLs for Subversion SCM include:') + '

' + - ''; - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - $scope.scmBranchLabel = i18n._('Revision #'); - break; - case 'hg': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('Example URLs for Mercurial SCM include:') + '

' + - '' + - '

' + i18n.sprintf(i18n._('%sNote:%s Mercurial does not support password authentication for SSH. ' + - 'Do not put the username and key in the URL. ' + - 'If using Bitbucket and SSH, do not supply your Bitbucket username.'), '', ''); - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - $scope.scmBranchLabel = i18n._('SCM Branch/Tag/Revision'); - break; - case 'archive': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('Example URLs for Remote Archive SCM include:') + '

' + - ''; - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - break; - case 'insights': - $scope.pathRequired = false; - $scope.scmRequired = false; - $scope.credRequired = true; - $scope.credentialLabel = "Credential"; - $scope.lookupType = 'insights_credential'; - break; - default: - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('URL popover text') + '

'; - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - } - } - } - }; - $scope.formCancel = function() { - $state.go('projects'); - }; - $scope.lookupCredential = function(){ - // Perform a lookup on the credential_type. Git, Mercurial, and Subversion - // all use SCM as their credential type. - let lookupCredentialType = scmCredentialType; - if ($scope.scm_type.value === 'insights') { - lookupCredentialType = insightsCredentialType; - } - $state.go('.credential', { - credential_search: { - credential_type: lookupCredentialType, - page_size: '5', - page: '1' - } - }); - }; - } -]; diff --git a/awx/ui/client/src/projects/edit/projects-edit.controller.js b/awx/ui/client/src/projects/edit/projects-edit.controller.js deleted file mode 100644 index 8215bbab47..0000000000 --- a/awx/ui/client/src/projects/edit/projects-edit.controller.js +++ /dev/null @@ -1,349 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$rootScope', '$stateParams', 'ProjectsForm', 'Rest', - 'Alert', 'ProcessErrors', 'GenerateForm', 'Prompt', 'isNotificationAdmin', - 'GetBasePath', 'GetProjectPath', 'Authorization', 'GetChoices', 'Empty', - 'Wait', 'ProjectUpdate', '$state', 'CreateSelect2', 'ToggleNotification', - 'i18n', 'OrgAdminLookup', 'ConfigData', 'scmCredentialType', 'insightsCredentialType', - function($scope, $rootScope, $stateParams, ProjectsForm, Rest, Alert, - ProcessErrors, GenerateForm, Prompt, isNotificationAdmin, GetBasePath, - GetProjectPath, Authorization, GetChoices, Empty, Wait, ProjectUpdate, - $state, CreateSelect2, ToggleNotification, i18n, OrgAdminLookup, - ConfigData, scmCredentialType, insightsCredentialType) { - - let form = ProjectsForm(), - defaultUrl = GetBasePath('projects') + $stateParams.project_id + '/', - main = {}, - id = $stateParams.project_id; - - $scope.project_local_paths = []; - $scope.base_dir = ''; - const virtualEnvs = ConfigData.custom_virtualenvs || []; - $scope.custom_virtualenvs_options = virtualEnvs; - - $scope.$watch('project_obj.summary_fields.user_capabilities.edit', function(val) { - if (val === false) { - $scope.canAdd = false; - } - }); - - if ($scope.pathsReadyRemove) { - $scope.pathsReadyRemove(); - } - $scope.pathsReadyRemove = $scope.$on('pathsReady', function () { - CreateSelect2({ - element: '#local-path-select', - multiple: false - }); - }); - - // After the project is loaded, retrieve each related set - if ($scope.projectLoadedRemove) { - $scope.projectLoadedRemove(); - } - $scope.projectLoadedRemove = $scope.$on('projectLoaded', function() { - GetProjectPath({ scope: $scope, main: main }); - - $scope.pathRequired = ($scope.scm_type.value === 'manual') ? true : false; - $scope.scmRequired = ($scope.scm_type.value !== 'manual') ? true : false; - $scope.scmBranchLabel = ($scope.scm_type.value === 'svn') ? 'Revision #' : 'SCM Branch'; - Wait('stop'); - - $scope.scmChange(); - }); - - if ($scope.removeChoicesReady) { - $scope.removeChoicesReady(); - } - $scope.removeChoicesReady = $scope.$on('choicesReady', function() { - let i; - for (i = 0; i < $scope.scm_type_options.length; i++) { - if ($scope.scm_type_options[i].value === '') { - $scope.scm_type_options[i].value = "manual"; - break; - } - } - // Retrieve detail record and prepopulate the form - Rest.setUrl(defaultUrl); - Rest.get({ params: { id: id } }) - .then(({data}) => { - var fld, i; - for (fld in form.fields) { - if (form.fields[fld].type === 'checkbox_group') { - for (i = 0; i < form.fields[fld].fields.length; i++) { - $scope[form.fields[fld].fields[i].name] = data[form.fields[fld].fields[i].name]; - main[form.fields[fld].fields[i].name] = data[form.fields[fld].fields[i].name]; - } - } else { - if (data[fld] !== undefined) { - $scope[fld] = data[fld]; - main[fld] = data[fld]; - } - } - if (form.fields[fld].sourceModel && data.summary_fields && - data.summary_fields[form.fields[fld].sourceModel]) { - $scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; - main[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; - } - } - - data.scm_type = (Empty(data.scm_type)) ? 'manual' : data.scm_type; - for (i = 0; i < $scope.scm_type_options.length; i++) { - if ($scope.scm_type_options[i].value === data.scm_type) { - $scope.scm_type = $scope.scm_type_options[i]; - break; - } - } - - if ($scope.scm_type.value !== 'manual') { - $scope.pathRequired = false; - $scope.scmRequired = true; - } else { - $scope.pathRequired = true; - $scope.scmRequired = false; - } - - main.scm_type = $scope.scm_type; - CreateSelect2({ - element: '#project_scm_type', - multiple: false - }); - - $scope.scmBranchLabel = ($scope.scm_type.value === 'svn') ? 'Revision #' : 'SCM Branch'; - $scope.scm_update_tooltip = i18n._("Get latest SCM revision"); - $scope.scm_type_class = ""; - if (data.status === 'running' || data.status === 'updating') { - $scope.scm_update_tooltip = i18n._("SCM update currently running"); - $scope.scm_type_class = "btn-disabled"; - } - if (Empty(data.scm_type)) { - $scope.scm_update_tooltip = i18n._('Manual projects do not require an SCM update'); - $scope.scm_type_class = "btn-disabled"; - } - - OrgAdminLookup.checkForRoleLevelAdminAccess(data.organization, 'project_admin_role') - .then(function(canEditOrg){ - $scope.canEditOrg = canEditOrg; - }); - - CreateSelect2({ - element: '#project_custom_virtualenv', - multiple: false, - opts: $scope.custom_virtualenvs_options - }); - - $scope.project_obj = data; - // To toggle notifications a user needs to have an admin role on the project - // _and_ have at least a notification template admin role on an org. - // Only users with admin role on the project can edit it which is why we - // look at that user_capability - $scope.sufficientRoleForNotifToggle = isNotificationAdmin && data.summary_fields.user_capabilities.edit; - $scope.sufficientRoleForNotif = isNotificationAdmin || $scope.user_is_system_auditor; - $scope.name = data.name; - $scope.breadcrumb.project_name = data.name; - $scope.$emit('projectLoaded'); - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { hdr: i18n._('Error!'), - msg: i18n.sprintf(i18n._('Failed to retrieve project: %s. GET status: '), id) + status - }); - }); - }); - - // Load the list of options for Kind - Wait('start'); - GetChoices({ - url: GetBasePath('projects'), - scope: $scope, - field: 'scm_type', - variable: 'scm_type_options', - callback: 'choicesReady' - }); - - $scope.toggleNotification = function(event, id, column) { - var notifier = this.notification; - try { - $(event.target).tooltip('hide'); - } catch (e) { - // ignore - } - ToggleNotification({ - scope: $scope, - url: $scope.project_obj.url, - notifier: notifier, - column: column, - callback: 'NotificationRefresh' - }); - }; - - // Save changes to the parent - $scope.formSave = function() { - var fld, i, params; - GenerateForm.clearApiErrors($scope); - Wait('start'); - $rootScope.flashMessage = null; - params = {}; - for (fld in form.fields) { - if (form.fields[fld].type === 'checkbox_group') { - for (i = 0; i < form.fields[fld].fields.length; i++) { - params[form.fields[fld].fields[i].name] = $scope[form.fields[fld].fields[i].name]; - } - } else { - if (form.fields[fld].type !== 'alertblock') { - params[fld] = $scope[fld]; - } - } - } - - if ($scope.scm_type.value === "manual") { - params.scm_type = ""; - params.local_path = $scope.local_path.value; - } else { - params.scm_type = $scope.scm_type.value; - delete params.local_path; - } - - Rest.setUrl(defaultUrl); - Rest.put(params) - .then(() => { - Wait('stop'); - $state.go($state.current, {}, { reload: true }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { hdr: i18n._('Error!'), msg: i18n.sprintf(i18n._('Failed to update project: %s. PUT status: '), id) + status }); - }); - }; - - // Related set: Delete button - $scope['delete'] = function(set, itm_id, name, title) { - var action = function() { - var url = GetBasePath('projects') + id + '/' + set + '/'; - $rootScope.flashMessage = null; - Rest.setUrl(url); - Rest.post({ id: itm_id, disassociate: 1 }) - .then(() => { - $('#prompt-modal').modal('hide'); - }) - .catch(({data, status}) => { - $('#prompt-modal').modal('hide'); - ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), msg: i18n.sprintf(i18n._('Call to %s failed. POST returned status: '), url) + status }); - }); - }; - - Prompt({ - hdr: i18n._('Delete'), - body: '
' + i18n.sprintf(i18n._('Are you sure you want to remove the %s below from %s?'), title, $scope.name) + '
' + '
' + name + '
', - action: action, - actionText: i18n._('DELETE') - }); - }; - - $scope.scmChange = function() { - if ($scope.scm_type) { - $scope.pathRequired = ($scope.scm_type.value === 'manual') ? true : false; - $scope.scmRequired = ($scope.scm_type.value !== 'manual') ? true : false; - $scope.scmBranchLabel = i18n._('SCM Branch'); - $scope.scmRefspecLabel = i18n._('SCM Refspec'); - - // Dynamically update popover values - if ($scope.scm_type.value) { - if(($scope.lookupType === 'insights_credential' && $scope.scm_type.value !== 'insights') || ($scope.lookupType === 'scm_credential' && $scope.scm_type.value === 'insights')) { - $scope.credential = null; - $scope.credential_name = ''; - } - switch ($scope.scm_type.value) { - case 'git': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('Example URLs for GIT SCM include:') + '

' + - '

' + i18n.sprintf(i18n._('%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, ' + - 'do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using ' + - 'SSH. GIT read only protocol (git://) does not use username or password information.'), '', ''); - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - $scope.scmBranchLabel = i18n._('SCM Branch/Tag/Commit'); - break; - case 'svn': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('Example URLs for Subversion SCM include:') + '

' + - ''; - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - $scope.scmBranchLabel = i18n._('Revision #'); - break; - case 'hg': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('Example URLs for Mercurial SCM include:') + '

' + - '' + - '

' + i18n.sprintf(i18n._('%sNote:%s Mercurial does not support password authentication for SSH. ' + - 'Do not put the username and key in the URL. ' + - 'If using Bitbucket and SSH, do not supply your Bitbucket username.'), '', ''); - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - $scope.scmBranchLabel = i18n._('SCM Branch/Tag/Revision'); - break; - case 'archive': - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('Example URLs for Remote Archive SCM include:') + '

' + - ''; - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - break; - case 'insights': - $scope.pathRequired = false; - $scope.scmRequired = false; - $scope.credRequired = true; - $scope.credentialLabel = "Credential"; - $scope.lookupType = 'insights_credential'; - break; - default: - $scope.credentialLabel = "SCM " + i18n._("Credential"); - $scope.urlPopover = '

' + i18n._('URL popover text'); - $scope.credRequired = false; - $scope.lookupType = 'scm_credential'; - } - } - } - }; - - $scope.lookupCredential = function(){ - // Perform a lookup on the credential_type. Git, Mercurial, and Subversion - // all use SCM as their credential type. - let lookupCredentialType = scmCredentialType; - if ($scope.scm_type.value === 'insights') { - lookupCredentialType = insightsCredentialType; - } - $state.go('.credential', { - credential_search: { - credential_type: lookupCredentialType, - page_size: '5', - page: '1' - } - }); - }; - - $scope.SCMUpdate = function() { - if ($scope.project_obj.scm_type === "Manual" || Empty($scope.project_obj.scm_type)) { - // ignore - } else if ($scope.project_obj.status === 'updating' || $scope.project_obj.status === 'running' || $scope.project_obj.status === 'pending') { - Alert(i18n._('Update in Progress'), i18n._('The SCM update process is running.'), 'alert-info'); - } else { - ProjectUpdate({ scope: $scope, project_id: $scope.project_obj.id }); - } - }; - - $scope.formCancel = function() { - $state.transitionTo('projects'); - }; - } -]; diff --git a/awx/ui/client/src/projects/factories/get-project-icon.factory.js b/awx/ui/client/src/projects/factories/get-project-icon.factory.js deleted file mode 100644 index 5234041e38..0000000000 --- a/awx/ui/client/src/projects/factories/get-project-icon.factory.js +++ /dev/null @@ -1,30 +0,0 @@ -export default - function GetProjectIcon() { - return function(status) { - var result = ''; - switch (status) { - case 'n/a': - case 'ok': - case 'never updated': - result = 'none'; - break; - case 'pending': - case 'waiting': - case 'new': - result = 'none'; - break; - case 'updating': - case 'running': - result = 'running'; - break; - case 'successful': - result = 'success'; - break; - case 'failed': - case 'missing': - case 'canceled': - result = 'error'; - } - return result; - }; - } diff --git a/awx/ui/client/src/projects/factories/get-project-path.factory.js b/awx/ui/client/src/projects/factories/get-project-path.factory.js deleted file mode 100644 index f6423bb23b..0000000000 --- a/awx/ui/client/src/projects/factories/get-project-path.factory.js +++ /dev/null @@ -1,78 +0,0 @@ -export default - function GetProjectPath(i18n, Rest, GetBasePath, ProcessErrors) { - return function(params) { - var scope = params.scope, - main = params.main; - - function arraySort(data) { - //Sort nodes by name - var i, j, names = [], - newData = []; - for (i = 0; i < data.length; i++) { - names.push(data[i].value); - } - names.sort(); - for (j = 0; j < names.length; j++) { - for (i = 0; i < data.length; i++) { - if (data[i].value === names[j]) { - newData.push(data[i]); - } - } - } - return newData; - } - - scope.showMissingPlaybooksAlert = false; - - Rest.setUrl(GetBasePath('config')); - Rest.get() - .then(({data}) => { - var opts = [], i; - if (data.project_local_paths) { - for (i = 0; i < data.project_local_paths.length; i++) { - opts.push({ - label: data.project_local_paths[i], - value: data.project_local_paths[i] - }); - } - } - if (scope.local_path) { - // List only includes paths not assigned to projects, so add the - // path assigned to the current project. - opts.push({ - label: scope.local_path, - value: scope.local_path - }); - } - scope.project_local_paths = arraySort(opts); - if (scope.local_path) { - for (i = 0; scope.project_local_paths.length; i++) { - if (scope.project_local_paths[i].value === scope.local_path) { - scope.local_path = scope.project_local_paths[i]; - break; - } - } - } - scope.base_dir = data.project_base_dir || i18n._('You do not have access to view this property'); - main.local_path = scope.local_path; - main.base_dir = scope.base_dir; // Keep in main object so that it doesn't get - // wiped out on form reset. - if (opts.length === 0) { - // trigger display of alert block when scm_type == manual - scope.showMissingPlaybooksAlert = true; - } - scope.$emit('pathsReady'); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: i18n._('Failed to access API config. GET status: ') + status }); - }); - }; - } - -GetProjectPath.$inject = - [ 'i18n', - 'Rest', - 'GetBasePath', - 'ProcessErrors' - ]; diff --git a/awx/ui/client/src/projects/factories/get-project-tool-tip.factory.js b/awx/ui/client/src/projects/factories/get-project-tool-tip.factory.js deleted file mode 100644 index 834a6c9d99..0000000000 --- a/awx/ui/client/src/projects/factories/get-project-tool-tip.factory.js +++ /dev/null @@ -1,38 +0,0 @@ -export default - function GetProjectToolTip(i18n) { - return function(status) { - var result = ''; - switch (status) { - case 'n/a': - case 'ok': - case 'never updated': - result = i18n._('No SCM updates have run for this project'); - break; - case 'pending': - case 'waiting': - case 'new': - result = i18n._('Update queued. Click for details'); - break; - case 'updating': - case 'running': - result = i18n._('Update running. Click for details'); - break; - case 'successful': - result = i18n._('Update succeeded. Click for details'); - break; - case 'failed': - result = i18n._('Update failed. Click for details'); - break; - case 'missing': - result = i18n._('Update missing. Click for details'); - break; - case 'canceled': - result = i18n._('Update canceled. Click for details'); - break; - } - return result; - }; - } - -GetProjectToolTip.$inject = - [ 'i18n' ]; diff --git a/awx/ui/client/src/projects/main.js b/awx/ui/client/src/projects/main.js deleted file mode 100644 index 2f45552b45..0000000000 --- a/awx/ui/client/src/projects/main.js +++ /dev/null @@ -1,162 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import ProjectsAdd from './add/projects-add.controller'; -import ProjectsEdit from './edit/projects-edit.controller'; -import ProjectsForm from './projects.form'; -import ProjectList from './projects.list'; -import GetProjectPath from './factories/get-project-path.factory'; -import GetProjectIcon from './factories/get-project-icon.factory'; -import GetProjectToolTip from './factories/get-project-tool-tip.factory'; -import { - projectsSchedulesListRoute, - projectsSchedulesAddRoute, - projectsSchedulesEditRoute -} from '../scheduler/schedules.route'; - -import ProjectsTemplatesRoute from '~features/templates/routes/projectsTemplatesList.route'; -import projectsListRoute from '~features/projects/routes/projectsList.route.js'; - - -function ResolveScmCredentialType (GetBasePath, Rest, ProcessErrors) { - Rest.setUrl(GetBasePath('credential_types') + '?kind=scm'); - - return Rest.get() - .then(({ data }) => { - return data.results[0].id; - }) - .catch(({ data, status }) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get credential type data: ' + status - }); - }); -} - -function ResolveInsightsCredentialType (GetBasePath, Rest, ProcessErrors) { - Rest.setUrl(GetBasePath('credential_types') + '?name=Insights'); - - return Rest.get() - .then(({ data }) => { - return data.results[0].id; - }) - .catch(({ data, status }) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get credential type data: ' + status - }); - }); -} - -ResolveScmCredentialType.$inject = ['GetBasePath', 'Rest', 'ProcessErrors']; -ResolveInsightsCredentialType.$inject = ['GetBasePath', 'Rest', 'ProcessErrors']; - - -export default -angular.module('Projects', []) - .controller('ProjectsAdd', ProjectsAdd) - .controller('ProjectsEdit', ProjectsEdit) - .factory('GetProjectPath', GetProjectPath) - .factory('GetProjectIcon', GetProjectIcon) - .factory('GetProjectToolTip', GetProjectToolTip) - .factory('ProjectsForm', ProjectsForm) - .factory('ProjectList', ProjectList) - .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', - function($stateProvider, stateDefinitionsProvider,$stateExtenderProvider) { - let stateDefinitions = stateDefinitionsProvider.$get(); - let stateExtender = $stateExtenderProvider.$get(); - - const projectsAddName = 'projects.add'; - const projectsEditName = 'projects.edit'; - - function generateStateTree() { - let projectAdd = stateDefinitions.generateTree({ - name: projectsAddName, - url: '/add', - modes: ['add'], - form: 'ProjectsForm', - controllers: { - add: 'ProjectsAdd', - }, - }) - .then(res => { - const stateIndex = res.states.findIndex(s => s.name === projectsAddName); - - res.states[stateIndex].resolve.scmCredentialType = ResolveScmCredentialType; - res.states[stateIndex].resolve.insightsCredentialType = ResolveInsightsCredentialType; - - return res; - }); - - let projectEdit = stateDefinitions.generateTree({ - name: projectsEditName, - url: '/:project_id', - modes: ['edit'], - form: 'ProjectsForm', - controllers: { - edit: 'ProjectsEdit', - }, - data: { - activityStream: true, - activityStreamTarget: 'project', - activityStreamId: 'project_id' - }, - breadcrumbs: { - edit: '{{breadcrumb.project_name}}' - }, - resolve: { - edit: { - isNotificationAdmin: ['Rest', 'ProcessErrors', 'GetBasePath', 'i18n', - function(Rest, ProcessErrors, GetBasePath, i18n) { - Rest.setUrl(`${GetBasePath('organizations')}?role_level=notification_admin_role&page_size=1`); - return Rest.get() - .then(({data}) => { - return data.count > 0; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get organizations for which this user is a notification administrator. GET returned ') + status - }); - }); - }] - } - } - }) - .then(res => { - const stateIndex = res.states.findIndex(s => s.name === projectsEditName); - - res.states[stateIndex].resolve.scmCredentialType = ResolveScmCredentialType; - res.states[stateIndex].resolve.insightsCredentialType = ResolveInsightsCredentialType; - - return res; - }); - - return Promise.all([ - projectAdd, - projectEdit, - ]).then((generated) => { - return { - states: _.reduce(generated, (result, definition) => { - return result.concat(definition.states); - }, [ - stateExtender.buildDefinition(projectsListRoute), - stateExtender.buildDefinition(ProjectsTemplatesRoute), - stateExtender.buildDefinition(projectsSchedulesListRoute), - stateExtender.buildDefinition(projectsSchedulesAddRoute), - stateExtender.buildDefinition(projectsSchedulesEditRoute) - ]) - }; - }); - } - let stateTree = { - name: 'projects.**', - url: '/projects', - lazyLoad: () => generateStateTree() - }; - $stateProvider.state(stateTree); - } - ]); diff --git a/awx/ui/client/src/projects/projects.form.js b/awx/ui/client/src/projects/projects.form.js deleted file mode 100644 index dac0118c03..0000000000 --- a/awx/ui/client/src/projects/projects.form.js +++ /dev/null @@ -1,343 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Projects - * @description This form is for adding/editing projects -*/ - -export default ['i18n', 'NotificationsList', 'TemplateList', - function(i18n, NotificationsList, TemplateList) { - return function() { - var projectsFormObj = { - addTitle: i18n._('NEW PROJECT'), - editTitle: '{{ name }}', - name: 'project', - basePath: 'projects', - // the top-most node of generated state tree - stateTree: 'projects', - forceListeners: true, - tabs: true, - subFormTitles: { - sourceSubForm: i18n._('Source Details'), - }, - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - capitalize: false - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - list: 'OrganizationList', - sourceModel: 'organization', - basePath: 'organizations', - sourceField: 'name', - dataTitle: i18n._('Organization'), - required: true, - awPopOver: '

' + i18n._('When this project is used by a Job Template, Organization cannot be changed.') + '

', - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd) || !canEditOrg', - awLookupWhen: '(project_obj.summary_fields.user_capabilities.edit || canAdd) && canEditOrg' - }, - scm_type: { - label: i18n._('SCM Type'), - type: 'select', - class: 'Form-dropDown--scmType', - defaultText: i18n._('Choose an SCM Type'), - ngOptions: 'type.label for type in scm_type_options track by type.value', - ngChange: 'scmChange()', - required: true, - hasSubForm: true, - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - missing_path_alert: { - type: 'alertblock', - ngShow: "showMissingPlaybooksAlert && scm_type.value == 'manual'", - alertTxt: '

WARNING: There are no available playbook directories in {{ base_dir }}. ' + - 'Either that directory is empty, or all of the contents are already assigned to other projects. ' + - 'Create a new directory there and make sure the playbook files can be read by the "awx" system user, ' + - 'or have {{BRAND_NAME}} directly retrieve your playbooks from source control using the SCM Type option above.

', - closeable: false - }, - base_dir: { - label: i18n._('Project Base Path'), - type: 'text', - class: 'Form-textUneditable', - showonly: true, - ngShow: "scm_type.value == 'manual' " , - awPopOver: '

' + i18n._('Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. ' + - 'Together the base path and selected playbook directory provide the full path used to locate playbooks.') + '

' + - '

' + i18n.sprintf(i18n._('Change %s when deploying {{BRAND_NAME}} to change this location.'), 'PROJECTS_ROOT') + '

', - dataTitle: i18n._('Project Base Path'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - local_path: { - label: i18n._('Playbook Directory'), - type: 'select', - id: 'local-path-select', - ngOptions: 'path.label for path in project_local_paths', - awRequiredWhen: { - reqExpression: "pathRequired", - init: false - }, - ngShow: "scm_type.value == 'manual' && !showMissingPlaybooksAlert", - awPopOver: '

' + i18n._('Select from the list of directories found in the Project Base Path. ' + - 'Together the base path and the playbook directory provide the full path used to locate playbooks.') + '

', - dataTitle: i18n._('Project Path'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - scm_url: { - label: i18n._('SCM URL'), - type: 'text', - ngShow: "scm_type && scm_type.value !== 'manual' && scm_type.value !== 'insights' ", - awRequiredWhen: { - reqExpression: "scmRequired", - init: false - }, - subForm: 'sourceSubForm', - hideSubForm: "scm_type.value === 'manual'", - awPopOverWatch: "urlPopover", - awPopOver: "set in controllers/projects", - dataTitle: i18n._('SCM URL'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - scm_branch: { - labelBind: "scmBranchLabel", - type: 'text', - ngShow: "scm_type && scm_type.value !== 'manual' && scm_type.value !== 'insights' && scm_type.value !== 'archive'", - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)', - awPopOver: '

' + i18n._("Branch to checkout. In addition to branches, you can input tags, commit hashes, and arbitrary refs. Some commit hashes and refs may not be availble unless you also provide a custom refspec.") + '

', - dataTitle: i18n._('SCM Branch'), - subForm: 'sourceSubForm', - }, - scm_refspec: { - labelBind: "scmRefspecLabel", - type: 'text', - ngShow: "scm_type && scm_type.value === 'git'", - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)', - awPopOver: '

' + i18n._('A refspec to fetch (passed to the Ansible git module). This parameter allows access to references via the branch field not otherwise available.') + '

' + - '

' + i18n._('NOTE: This field assumes the remote name is "origin".') + '

' + - '

' + i18n._('Examples include:') + '

' + - '

' + - '

' + i18n._('The first fetches all references. The second fetches the Github pull request number 62, in this example the branch needs to be `pull/62/head`.') + - '

' + - '

' + i18n._('For more information, refer to the') + ' ' + i18n._('Ansible Tower Documentation') + '.

', - dataTitle: i18n._('SCM Refspec'), - subForm: 'sourceSubForm', - }, - credential: { - labelBind: 'credentialLabel', - type: 'lookup', - basePath: 'credentials', - list: 'CredentialList', - search: { - credential_type: null - }, - ngClick: 'lookupCredential()', - awRequiredWhen: { - reqExpression: "credRequired", - init: false - }, - ngShow: "scm_type && scm_type.value !== 'manual'", - sourceModel: 'credential', - awLookupType: '{{lookupType}}', - sourceField: 'name', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)', - subForm: 'sourceSubForm' - }, - checkbox_group: { - label: i18n._('SCM Update Options'), - type: 'checkbox_group', - ngShow: "scm_type && scm_type.value !== 'manual'", - subForm: 'sourceSubForm', - fields: [{ - name: 'scm_clean', - label: i18n._('Clean'), - type: 'checkbox', - awPopOver: '

' + i18n._('Remove any local modifications prior to performing an update.') + '

', - dataTitle: i18n._('SCM Clean'), - dataContainer: 'body', - dataPlacement: 'right', - labelClass: 'checkbox-options stack-inline', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, { - name: 'scm_delete_on_update', - label: i18n._('Delete on Update'), - type: 'checkbox', - awPopOver: '

' + i18n._('Delete the local repository in its entirety prior to performing an update.') + '

' + i18n._('Depending on the size of the ' + - 'repository this may significantly increase the amount of time required to complete an update.') + '

', - dataTitle: i18n._('SCM Delete'), - dataContainer: 'body', - dataPlacement: 'right', - labelClass: 'checkbox-options stack-inline', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, { - name: 'scm_update_on_launch', - label: i18n._('Update Revision on Launch'), - type: 'checkbox', - awPopOver: '

' + i18n._('Each time a job runs using this project, update the revision of the project prior to starting the job.') + '

', - dataTitle: i18n._('SCM Update'), - dataContainer: 'body', - dataPlacement: 'right', - labelClass: 'checkbox-options stack-inline', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - { - name: 'allow_override', - label: i18n._('Allow branch override'), - type: 'checkbox', - awPopOver: '

' + i18n._('Allow changing the SCM branch or revision in a job template that uses this project.') + '

', - dataTitle: i18n._('Allow branch override'), - dataContainer: 'body', - dataPlacement: 'right', - labelClass: 'checkbox-options stack-inline', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)', - ngShow: "scm_type && scm_type.value !== 'insights'", - }] - }, - scm_update_cache_timeout: { - label: i18n.sprintf(i18n._('Cache Timeout%s (seconds)%s'), '', ''), - id: 'scm-cache-timeout', - type: 'number', - integer: true, - min: 0, - ngShow: "scm_update_on_launch && scm_type.value !== 'manual'", - spinner: true, - "default": '0', - awPopOver: '

' + i18n._('Time in seconds to consider a project to be current. During job runs and callbacks the task system will ' + - 'evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, ' + - 'and a new project update will be performed.') + '

', - dataTitle: i18n._('Cache Timeout'), - dataPlacement: 'right', - dataContainer: "body", - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)', - subForm: 'sourceSubForm' - }, - custom_virtualenv: { - label: i18n._('Ansible Environment'), - type: 'select', - defaultText: i18n._('Use Default Environment'), - ngOptions: 'venv for venv in custom_virtualenvs_options track by venv', - awPopOver: "

" + i18n._("Select the custom Python virtual environment for this project to run on.") + "

", - dataTitle: i18n._('Ansible Environment'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)', - ngShow: 'custom_virtualenvs_options.length > 1' - }, - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(project_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - related: { - permissions: { - name: 'permissions', - awToolTip: i18n._('Please save before assigning permissions.'), - djangoModel: 'access_list', - dataPlacement: 'top', - basePath: 'api/v2/projects/{{$stateParams.project_id}}/access_list/', - search: { - order_by: 'username' - }, - type: 'collection', - title: i18n._('Permissions'), - iterator: 'permission', - index: false, - open: false, - actions: { - add: { - ngClick: "$state.go('.add')", - label: i18n._('Add'), - awToolTip: i18n._('Add a permission'), - actionClass: 'at-Button--add', - actionId: 'button-add--permission', - ngShow: '(project_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - fields: { - username: { - key: true, - label: i18n._('User'), - linkBase: 'users', - columnClass: 'col-sm-3 col-xs-4' - }, - role: { - label: i18n._('Role'), - type: 'role', - nosort: true, - columnClass: 'col-sm-4 col-xs-4', - }, - team_roles: { - label: i18n._('Team Roles'), - type: 'team_roles', - nosort: true, - columnClass: 'col-sm-5 col-xs-4', - } - } - }, - notifications: { - include: "NotificationsList", - }, - templates: { - include: "TemplateList", - }, - schedules: { - title: i18n._('Schedules'), - skipGenerator: true, - ngClick: "$state.go('projects.edit.schedules')" - } - } - - }; - - var itm; - - for (itm in projectsFormObj.related) { - if (projectsFormObj.related[itm].include === "TemplateList") { - projectsFormObj.related[itm] = _.clone(TemplateList); - projectsFormObj.related[itm].title = i18n._('Job Templates'); - projectsFormObj.related[itm].skipGenerator = true; - } - if (projectsFormObj.related[itm].include === "NotificationsList") { - projectsFormObj.related[itm] = NotificationsList; - projectsFormObj.related[itm].generateList = true; // tell form generator to call list generator and inject a list - } - } - return projectsFormObj; -};}]; diff --git a/awx/ui/client/src/projects/projects.list.js b/awx/ui/client/src/projects/projects.list.js deleted file mode 100644 index 9efc89bd67..0000000000 --- a/awx/ui/client/src/projects/projects.list.js +++ /dev/null @@ -1,134 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - - name: 'projects', - iterator: 'project', - basePath: 'projects', - selectTitle: i18n._('Add Project'), - editTitle: i18n._('PROJECTS'), - listTitle: i18n._('PROJECTS'), - selectInstructions: '

Select existing projects by clicking each project or checking the related checkbox. When finished, click the blue ' + - 'Select button, located bottom right.

Create a new project by clicking the button.

', - index: false, - hover: true, - emptyListText: i18n._('No Projects Have Been Created'), - layoutClass: 'List-staticColumnLayout--statusOrCheckbox', - staticColumns: [ - { - field: 'status', - content: { - label: '', - iconOnly: true, - ngClick: 'showSCMStatus(project.id)', - awToolTip: '{{ project.statusTip }}', - dataTipWatch: 'project.statusTip', - dataPlacement: 'right', - icon: "icon-job-{{ project.statusIcon }}", - columnClass: "List-staticColumn--smallStatus", - nosort: true, - excludeModal: true - } - } - ], - - fields: { - name: { - key: true, - label: i18n._('Name'), - columnClass: "col-md-3 col-sm-6 List-staticColumnAdjacent", - modalColumnClass: 'col-md-8', - awToolTip: '{{project.description | sanitize}}', - dataPlacement: 'top' - }, - scm_type: { - label: i18n._('Type'), - ngBind: 'project.type_label', - excludeModal: true, - columnClass: 'col-md-2 col-sm-2' - }, - scm_revision: { - label: i18n._('Revision'), - excludeModal: true, - columnClass: 'd-none d-md-flex col-md-2', - type: 'revision' - }, - last_updated: { - label: i18n._('Last Updated'), - filter: "longDate", - columnClass: "d-none d-md-flex col-md-2", - excludeModal: true - } - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refresh()", - ngShow: "socketStatus === 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') - }, - add: { - mode: 'all', // One of: edit, select, all - ngClick: 'addProject()', - awToolTip: i18n._('Create a new project'), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: "canAdd" - } - }, - - fieldActions: { - - columnClass: 'col-md-3 col-sm-4', - edit: { - ngClick: "editProject(project.id)", - awToolTip: i18n._('Edit the project'), - dataPlacement: 'top', - ngShow: "project.summary_fields.user_capabilities.edit" - }, - scm_update: { - ngClick: 'SCMUpdate(project.id, $event)', - awToolTip: "{{ project.scm_update_tooltip }}", - dataTipWatch: "project.scm_update_tooltip", - ngClass: "project.scm_type_class", - dataPlacement: 'top', - ngShow: "project.summary_fields.user_capabilities.start" - }, - copy: { - label: i18n._('Copy'), - ngClick: 'copyProject(project)', - "class": 'btn-danger btn-xs', - awToolTip: i18n._('Copy project'), - dataPlacement: 'top', - ngShow: 'project.summary_fields.user_capabilities.copy' - }, - view: { - ngClick: "editProject(project.id)", - awToolTip: i18n._('View the project'), - dataPlacement: 'top', - ngShow: "!project.summary_fields.user_capabilities.edit", - icon: 'fa-eye', - }, - "delete": { - ngClick: "deleteProject(project.id, project.name)", - awToolTip: i18n._('Delete the project'), - ngShow: "(project.status !== 'updating' && project.status !== 'running' && project.status !== 'pending' && project.status !== 'waiting') && project.summary_fields.user_capabilities.delete", - dataPlacement: 'top' - }, - cancel: { - ngClick: "cancelUpdate(project)", - awToolTip: i18n._('Cancel the SCM update'), - ngShow: "(project.status == 'updating' || project.status == 'running' || project.status == 'pending' || project.status == 'waiting') && project.summary_fields.user_capabilities.start", - dataPlacement: 'top', - ngDisabled: "project.pending_cancellation || project.status == 'canceled'" - } - } - };}]; diff --git a/awx/ui/client/src/rest/get-choices.factory.js b/awx/ui/client/src/rest/get-choices.factory.js deleted file mode 100644 index e9f7e4398d..0000000000 --- a/awx/ui/client/src/rest/get-choices.factory.js +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name helpers.function:Permissions - * @description - * Gets permission type labels from the API and sets them as the permissions labels on the relevant radio buttons - * - */ - - export default - ['Rest', 'ProcessErrors', function(Rest, ProcessErrors) { - return function (params) { - var scope = params.scope, - url = params.url, - field = params.field, - options = params.options; - - if (!options) { - // Auto populate the field if there is only one result - Rest.setUrl(url); - return Rest.options() - .then(function (data) { - data = data.data; - var choices = data.actions.GET[field].choices; - - // manually add the adhoc label to the choices object if - // the permission_type field - if (field === "permission_type") { - choices.push(["adhoc", - data.actions.GET.run_ad_hoc_commands.help_text]); - } - - return choices; - }) - .catch(function (data, status) { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed to get ' + field + ' labels. Options requrest returned status: ' + status }); - }); - } else { - var choices = options.actions.GET[field].choices; - - // manually add the adhoc label to the choices object if - // the permission_type field - if (field === "permission_type") { - choices.push(["adhoc", - options.actions.GET.run_ad_hoc_commands.help_text]); - } - - return choices; - } - }; - }]; diff --git a/awx/ui/client/src/rest/get-labels.factory.js b/awx/ui/client/src/rest/get-labels.factory.js deleted file mode 100644 index 2b20ca70bb..0000000000 --- a/awx/ui/client/src/rest/get-labels.factory.js +++ /dev/null @@ -1,26 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name helpers.function:Permissions - * @description - * Gets permission type labels from the API and sets them as the permissions labels on the relevant radio buttons - * - */ - - export default - [function() { - return function (params) { - // convert the choices from the API from the format - // [["read", "Read Inventory"], ...] to - // {read: "Read Inventory", ...} - return params.choices.reduce(function(obj, kvp) { - obj[kvp[0]] = kvp[1]; - return obj; - }, {}); - }; - }]; diff --git a/awx/ui/client/src/rest/interceptors.service.js b/awx/ui/client/src/rest/interceptors.service.js deleted file mode 100644 index 4fdb1f0279..0000000000 --- a/awx/ui/client/src/rest/interceptors.service.js +++ /dev/null @@ -1,42 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default - [ '$rootScope', '$q', '$injector', '$cookies', - function ($rootScope, $q, $injector, $cookies) { - return { - request: function (config) { - config.headers['X-Requested-With'] = 'XMLHttpRequest'; - if (['GET', 'HEAD', 'OPTIONS'].indexOf(config.method)===-1) { - config.headers['X-CSRFToken'] = $cookies.get('csrftoken'); - } - return config; - }, - response: function(config) { - if(config.headers('Session-Timeout') !== null){ - $rootScope.loginConfig.promise.then(function () { - $AnsibleConfig.session_timeout = Number(config.headers('Session-Timeout')); - }); - } - return config; - }, - responseError: function(rejection){ - if(rejection && rejection.data && rejection.data.detail && rejection.data.detail === "Maximum per-user sessions reached"){ - $rootScope.sessionTimer.expireSession('session_limit'); - var state = $injector.get('$state'); - state.go('signOut'); - return $q.reject(rejection); - } - return $q.reject(rejection); - } - }; - }]; diff --git a/awx/ui/client/src/rest/main.js b/awx/ui/client/src/rest/main.js deleted file mode 100644 index 5466355a12..0000000000 --- a/awx/ui/client/src/rest/main.js +++ /dev/null @@ -1,20 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import restServicesFactory from './restServices.factory'; -import interceptors from './interceptors.service'; -import fieldChoices from './get-choices.factory'; -import fieldLabels from './get-labels.factory'; - -export default - angular.module('RestServices', []) - .config(['$httpProvider', function($httpProvider) { - $httpProvider.interceptors.push('RestInterceptor'); - }]) - .factory('Rest', restServicesFactory) - .service('RestInterceptor', interceptors) - .factory('fieldChoices', fieldChoices) - .factory('fieldLabels', fieldLabels); diff --git a/awx/ui/client/src/rest/restServices.factory.js b/awx/ui/client/src/rest/restServices.factory.js deleted file mode 100644 index b65a9a1c96..0000000000 --- a/awx/ui/client/src/rest/restServices.factory.js +++ /dev/null @@ -1,210 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name shared.function:RestServices - * @description - * - * A wrapper for angular's $http service. Post user authentication API requests should go through Rest rather than directly using $http. The goal is to decouple - * the application from $http, allowing Rest or anything that provides the same methods to handle setting authentication headers and performing tasks such as checking - * for an expired authentication token. Having this buffer between the application and $http will prove useful should the authentication scheme change. - * - * #.setUrl() - * - * Before calling an action methods (i.e. get, put, post, destroy, options) to send the request, call setUrl. Pass a string containing the URL endpoint and any parameters. - * Note that $http will automaticall encode the URL, replacing spaces and special characters with appropriate %hex codes. Example URL values might include: - * - * ``` - * /api/v2/inventories/9/ - * /api/v2/credentials/?name=SSH Key&credential_type__namespace=ssh - * ``` - * - * When constructing the URL be sure to use the GetBasePath() method found in js/shared/Utilities.js. GetBasePath uses the response objects from /api and - * /api//to construct the base portion of the path. This way the API version number and base endpoints are not hard-coded within the application. - * - * #Action methods: .get(), put(), .post(), .destroy(), options() - * - * Use the method matching the REST action to be performed. In the case of put, post and destroy a JSON object can be passed as a parameter. If included, - * it will be sent as part of the request. - * - * In every case a call to an action method returns a promise object, allowing the caller to pass reponse functions to the promise methods. The functions can inspect - * the respoinse details and initiate action. For example: - * - * ``` - * var url = GetBasePath('inventories') + $stateParams.id + '/'; - * Rest.setUrl(url); - * Rest.get() - * .then(({data}) => { - * // review the data object and take action - * }) - * .error(function(status, data) { - * // handle the error - typically a call to ProcessErrors() found in js/shared/Utitlties.js - * }); - * ``` - * - * ##Options Reqeusts - * - * options() requests are used by the GetChoices() method found in js/shared/Utilities.js. Sending an Options request to an API endpoint returns an object that includes - * possible values for fields that are typically presented in the UI as dropdowns or <select> elements. GetChoices will inspect the response object for the request - * field and return an array of { label: 'Choice Label', value: 'choice 1' } objects. - * - */ - -export default - ['$http', '$rootScope', '$q', - function ($http, $rootScope, $q) { - return { - - headers: {}, - - setUrl: function (url) { - // Ensure that a trailing slash is present at the end of the url (before query params, etc) - this.url = url.replace(/\/?(\?|#|$)/, '/$1'); - }, - checkExpired: function () { - return ($rootScope.sessionTimer) ? $rootScope.sessionTimer.isExpired() : false; - }, - pReplace: function () { - //in our url, replace :xx params with a value, assuming - //we can find it in user supplied params. - var key, rgx; - for (key in this.params) { - rgx = new RegExp("\\:" + key, 'gm'); - if (rgx.test(this.url)) { - this.url = this.url.replace(rgx, this.params[key]); - delete this.params[key]; - } - } - }, - createResponse: function (data, status) { - // Simulate an http response when a token error occurs - // http://stackoverflow.com/questions/18243286/angularjs-promises-simulate-http-promises - - var promise = $q.reject({ - data: data, - status: status - }); - promise.success = function (fn) { - promise.then(function (response) { - fn(response.data, response.status); - }, null); - return promise; - }; - promise.error = function (fn) { - promise.then(null, function (response) { - fn(response.data, response.status); - }); - return promise; - }; - return promise; - }, - - setHeader: function (hdr) { - // Pass in { key: value } pairs to be added to the header - for (var h in hdr) { - this.headers[h] = hdr[h]; - } - }, - get: function (args) { - args = (args) ? args : {}; - this.params = (args.params) ? args.params : null; - this.pReplace(); - var expired = this.checkExpired(); - if (expired) { - return this.createResponse({ - detail: 'Session is expired' - }, 401); - } else { - return $http({ - method: 'GET', - url: this.url, - headers: this.headers, - params: this.params - }); - } - }, - post: function (data) { - var expired = this.checkExpired(); - if (expired) { - return this.createResponse({ - detail: 'Session is expired' - }, 401); - } else { - return $http({ - method: 'POST', - url: this.url, - headers: this.headers, - data: data - }); - } - }, - put: function (data) { - var expired = this.checkExpired(); - if (expired) { - return this.createResponse({ - detail: 'Session is expired' - }, 401); - } else { - return $http({ - method: 'PUT', - url: this.url, - headers: this.headers, - data: data - }); - } - }, - patch: function (data) { - var expired = this.checkExpired(); - if (expired) { - return this.createResponse({ - detail: 'Session is expired' - }, 401); - } else { - return $http({ - method: 'PATCH', - url: this.url, - headers: this.headers, - data: data - }); - } - }, - destroy: function (data) { - var expired = this.checkExpired(); - if (expired) { - return this.createResponse({ - detail: 'Session is expired' - }, 401); - } else { - return $http({ - method: 'DELETE', - url: this.url, - headers: this.headers, - data: data - }); - } - }, - options: function (cache) { - var params, - expired = this.checkExpired(); - if (expired) { - return this.createResponse({ - detail: 'Session is expired' - }, 401); - } else { - params = { - method: 'OPTIONS', - url: this.url, - headers: this.headers, - data: '', - cache: (cache ? true : false) - }; - return $http(params); - } - } - }; - } - ]; diff --git a/awx/ui/client/src/scheduler/editSchedule.resolve.js b/awx/ui/client/src/scheduler/editSchedule.resolve.js deleted file mode 100644 index f65dc17b9c..0000000000 --- a/awx/ui/client/src/scheduler/editSchedule.resolve.js +++ /dev/null @@ -1,38 +0,0 @@ -function editScheduleResolve () { - const resolve = { - scheduleResolve: ['Rest', '$stateParams', 'GetBasePath', 'ProcessErrors', - (Rest, $stateParams, GetBasePath, ProcessErrors) => { - var path = `${GetBasePath('schedules')}${parseInt($stateParams.schedule_id)}/`; - Rest.setUrl(path); - return Rest.get() - .then(function(data) { - return (data.data); - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: 'Error!', - msg: 'Failed to get schedule info. GET returned status: ' + - response.status - }); - }); - } - ], - timezonesResolve: ['Rest', '$stateParams', 'GetBasePath', 'ProcessErrors', - (Rest, $stateParams, GetBasePath, ProcessErrors) => { - var path = `${GetBasePath('schedules')}zoneinfo`; - Rest.setUrl(path); - return Rest.get() - .then(function(data) { - return (data.data); - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: 'Error!', - msg: 'Failed to get zoneinfo. GET returned status: ' + - response.status - }); - }); - } - ] - }; - return resolve; -} -export default editScheduleResolve; diff --git a/awx/ui/client/src/scheduler/factories/delete-schedule.factory.js b/awx/ui/client/src/scheduler/factories/delete-schedule.factory.js deleted file mode 100644 index f766fe083c..0000000000 --- a/awx/ui/client/src/scheduler/factories/delete-schedule.factory.js +++ /dev/null @@ -1,70 +0,0 @@ -export default - function DeleteSchedule(GetBasePath, Rest, Wait, $state, - ProcessErrors, Prompt, Find, $location, $filter, i18n) { - return function(params) { - var scope = params.scope, - id = params.id, - callback = params.callback, - action, schedule, list, url, hdr; - - if (scope.schedules) { - list = scope.schedules; - } - else if (scope.scheduled_jobs) { - list = scope.scheduled_jobs; - } - - url = GetBasePath('schedules') + id + '/'; - schedule = Find({list: list, key: 'id', val: id }); - hdr = 'Delete Schedule'; - - action = function () { - Wait('start'); - Rest.setUrl(url); - Rest.destroy() - .then(() => { - $('#prompt-modal').modal('hide'); - scope.$emit(callback, id); - - let reloadListStateParams = null; - - if(scope.schedules.length === 1 && $state.params.schedule_search && _.has($state, 'params.schedule_search.page') && $state.params.schedule_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.schedule_search.page = (parseInt(reloadListStateParams.schedule_search.page)-1).toString(); - } - - if (parseInt($state.params.schedule_id) === id) { - $state.go('^', reloadListStateParams, {reload: true}); - } - else{ - $state.go('.', reloadListStateParams, {reload: true}); - } - }) - .catch(({data, status}) => { - try { - $('#prompt-modal').modal('hide'); - } - catch(e) { - // ignore - } - ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + - ' failed. DELETE returned: ' + status }); - }); - }; - - Prompt({ - hdr: hdr, - resourceName: $filter('sanitize')(schedule.name), - body: `
${i18n._('Are you sure you want to delete this schedule?')}
`, - action: action, - actionText: i18n._('DELETE'), - backdrop: false - }); - }; - } - -DeleteSchedule.$inject = - [ 'GetBasePath','Rest', 'Wait', '$state', - 'ProcessErrors', 'Prompt', 'Find', '$location', - '$filter', 'i18n' - ]; diff --git a/awx/ui/client/src/scheduler/factories/r-rule-to-api.factory.js b/awx/ui/client/src/scheduler/factories/r-rule-to-api.factory.js deleted file mode 100644 index 9c86205559..0000000000 --- a/awx/ui/client/src/scheduler/factories/r-rule-to-api.factory.js +++ /dev/null @@ -1,30 +0,0 @@ -export default - function RRuleToAPI() { - - // This function removes the 'Z' from the UNTIL portion of the - // rrule. The API will default to using the timezone that is - // specified in the TZID as the locale for the UNTIL. - function parseOutZ (rrule) { - let until = rrule.split('UNTIL='); - if(_.has(until, '1')){ - rrule = until[0]; - until = until[1].replace('Z', ''); - return `${rrule}UNTIL=${until}`; - } else { - return rrule; - } - } - - - return function(rrule, scope) { - let localTime = scope.schedulerLocalTime; - let timeZone = scope.schedulerTimeZone.name; - - let response = rrule.replace(/(^.*(?=DTSTART))(DTSTART.*?)(=.*?;)(.*$)/, (str, p1, p2, p3, p4) => { - return p2 + ';TZID=' + timeZone + ':' + localTime + ' ' + 'RRULE:' + p4; - }); - - response = parseOutZ(response); - return response; - }; - } diff --git a/awx/ui/client/src/scheduler/factories/schedule-post.factory.js b/awx/ui/client/src/scheduler/factories/schedule-post.factory.js deleted file mode 100644 index b4338ab63f..0000000000 --- a/awx/ui/client/src/scheduler/factories/schedule-post.factory.js +++ /dev/null @@ -1,164 +0,0 @@ -export default - function SchedulePost(Rest, ProcessErrors, RRuleToAPI, Wait, $q, Schedule, PromptService) { - return function(params) { - var scope = params.scope, - url = params.url, - scheduler = params.scheduler, - mode = params.mode, - scheduleData = (params.schedule) ? params.schedule : {}, - promptData = params.promptData, - priorCredentials = params.priorCredentials ? params.priorCredentials : [], - newSchedule, rrule, extra_vars; - const deferred = $q.defer(); - if (scheduler.isValid()) { - Wait('start'); - newSchedule = scheduler.getValue(); - rrule = scheduler.getRRule(); - scheduleData.name = newSchedule.name; - scheduleData.rrule = RRuleToAPI(rrule.toString(), scope); - scheduleData.description = (/error/.test(rrule.toText())) ? '' : rrule.toText(); - - if (scope.askDaysToKeep) { - extra_vars = { - "days" : scope.scheduler_form.schedulerPurgeDays.$viewValue - }; - scheduleData.extra_data = JSON.stringify(extra_vars); - } - else if(scope.extraVars){ - scheduleData.extra_data = scope.parseType === 'yaml' ? - (scope.extraVars === '---' ? "" : jsyaml.safeLoad(scope.extraVars)) : scope.extraVars; - } - - if(promptData) { - scheduleData = PromptService.bundlePromptDataForSaving({ - promptData: promptData, - dataToSave: scheduleData - }); - } - - Rest.setUrl(url); - if (mode === 'add') { - Rest.post(scheduleData) - .then(({data}) => { - if(_.get(promptData, 'launchConf.ask_credential_on_launch')){ - // This finds the credentials that were selected in the prompt but don't occur - // in the template defaults - const credentialsToPost = promptData.prompts.credentials.value.filter(function(credFromPrompt) { - const defaultCreds = promptData.launchConf.defaults.credentials ? promptData.launchConf.defaults.credentials : []; - return !defaultCreds.some(function(defaultCred) { - return credFromPrompt.id === defaultCred.id; - }); - }); - - const promises = []; - const schedule = new Schedule(); - - credentialsToPost.forEach((credentialToPost) => { - promises.push(schedule.postCredential({ - id: data.id, - data: { - id: credentialToPost.id - } - })); - }); - - $q.all(promises) - .then(() => { - Wait('stop'); - deferred.resolve(); - }); - } else { - Wait('stop'); - deferred.resolve(); - } - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'POST to ' + url + ' returned: ' + status }); - - deferred.reject(); - }); - } - else { - Rest.put(scheduleData) - .then(({data}) => { - if(_.get(promptData, 'launchConf.ask_credential_on_launch')){ - const credentialsNotInPriorCredentials = promptData.prompts.credentials.value.filter(function(credFromPrompt) { - const defaultCreds = promptData.launchConf.defaults.credentials ? promptData.launchConf.defaults.credentials : []; - return !defaultCreds.some(function(defaultCred) { - return credFromPrompt.id === defaultCred.id; - }); - }); - - const credentialsToAdd = credentialsNotInPriorCredentials.filter(function(credNotInPrior) { - return !priorCredentials.some(function(priorCred) { - return credNotInPrior.id === priorCred.id; - }); - }); - - const credentialsToRemove = priorCredentials.filter(function(priorCred) { - return !credentialsNotInPriorCredentials.some(function(credNotInPrior) { - return priorCred.id === credNotInPrior.id; - }); - }); - - const promises = []; - const schedule = new Schedule(); - - credentialsToAdd.forEach((credentialToAdd) => { - promises.push(schedule.postCredential({ - id: data.id, - data: { - id: credentialToAdd.id - } - })); - }); - - credentialsToRemove.forEach((credentialToRemove) => { - promises.push(schedule.postCredential({ - id: data.id, - data: { - id: credentialToRemove.id, - disassociate: true - } - })); - }); - - $q.all(promises) - .then(() => { - Wait('stop'); - deferred.resolve(); - }); - } else { - Wait('stop'); - deferred.resolve(); - } - - Wait('stop'); - deferred.resolve(scheduleData); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'POST to ' + url + ' returned: ' + status }); - - deferred.reject(); - }); - } - } - else { - deferred.reject(); - } - - return deferred.promise; - }; - } - -SchedulePost.$inject = - [ 'Rest', - 'ProcessErrors', - 'RRuleToAPI', - 'Wait', - '$q', - 'ScheduleModel', - 'PromptService' - ]; diff --git a/awx/ui/client/src/scheduler/factories/toggle-schedule.factory.js b/awx/ui/client/src/scheduler/factories/toggle-schedule.factory.js deleted file mode 100644 index 5c2b04e395..0000000000 --- a/awx/ui/client/src/scheduler/factories/toggle-schedule.factory.js +++ /dev/null @@ -1,46 +0,0 @@ -export default - function ToggleSchedule(Wait, GetBasePath, ProcessErrors, Rest, $state) { - return function(params) { - var scope = params.scope, - id = params.id, - url = GetBasePath('schedules') + id +'/'; - - // Perform the update - if (scope.removeScheduleFound) { - scope.removeScheduleFound(); - } - scope.removeScheduleFound = scope.$on('ScheduleFound', function(e, data) { - data.enabled = (data.enabled) ? false : true; - Rest.put(data) - .then(() => { - Wait('stop'); - $state.go('.', null, {reload: true}); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed to update schedule ' + id + ' PUT returned: ' + status }); - }); - }); - - Wait('start'); - - // Get the schedule - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - scope.$emit('ScheduleFound', data); - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed to retrieve schedule ' + id + ' GET returned: ' + status }); - }); - }; - } - -ToggleSchedule.$inject = - [ 'Wait', - 'GetBasePath', - 'ProcessErrors', - 'Rest', - '$state' - ]; diff --git a/awx/ui/client/src/scheduler/main.js b/awx/ui/client/src/scheduler/main.js deleted file mode 100644 index 80592b2e59..0000000000 --- a/awx/ui/client/src/scheduler/main.js +++ /dev/null @@ -1,31 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import listController from './schedulerList.controller'; -import addController from './schedulerAdd.controller'; -import editController from './schedulerEdit.controller'; -import schedulerDatePicker from './schedulerDatePicker.directive'; -import DeleteSchedule from './factories/delete-schedule.factory'; -import RRuleToAPI from './factories/r-rule-to-api.factory'; -import SchedulePost from './factories/schedule-post.factory'; -import ToggleSchedule from './factories/toggle-schedule.factory'; -import SchedulesList from './schedules.list'; -import ScheduledJobsList from './scheduled-jobs.list'; -import SchedulerStrings from './scheduler.strings'; - -export default - angular.module('scheduler', []) - .controller('schedulerListController', listController) - .controller('schedulerAddController', addController) - .controller('schedulerEditController', editController) - .factory('DeleteSchedule', DeleteSchedule) - .factory('RRuleToAPI', RRuleToAPI) - .factory('SchedulePost', SchedulePost) - .factory('ToggleSchedule', ToggleSchedule) - .factory('SchedulesList', SchedulesList) - .factory('ScheduledJobsList', ScheduledJobsList) - .directive('schedulerDatePicker', schedulerDatePicker) - .service('SchedulerStrings', SchedulerStrings); diff --git a/awx/ui/client/src/scheduler/repeatFrequencyOptions.block.less b/awx/ui/client/src/scheduler/repeatFrequencyOptions.block.less deleted file mode 100644 index ae9dafb772..0000000000 --- a/awx/ui/client/src/scheduler/repeatFrequencyOptions.block.less +++ /dev/null @@ -1,176 +0,0 @@ -/** @define RepeatFrequencyOptions */ - -.RepeatFrequencyOptions { - width: ~"calc(100% + 21px)"; - padding: 20px; - border-left: 5px solid @default-border; - margin-left: -20px; - padding-left: 17px; - padding-right: 0px; - padding-top: 0px; - padding-bottom: 0px; - align-items: flex-start; -} - -.RepeatFrequencyOptions-formGroup { - padding-right: 0px; -} - -@media (min-width: 901px) { - .RepeatFrequencyOptions-formGroup { - flex: 0 0 auto; - margin-bottom: 25px; - width: ~"calc(33% - 32px)"; - margin-right: 50px; - } - - .RepeatFrequencyOptions-formGroup:nth-child(3n+3) { - flex: 0 0 auto; - margin-bottom: 25px; - margin-right: 0px; - } -} - -@media (min-width: 651px) and (max-width: 900px) { - .RepeatFrequencyOptions-formGroup { - flex: 0 0 auto; - margin-bottom: 25px; - width: ~"calc(50% - 25px)"; - margin-right: 50px; - } - - .RepeatFrequencyOptions-formGroup:nth-child(2n+2) { - flex: 0 0 auto; - margin-bottom: 25px; - margin-right: 0px; - } -} - -@media (max-width: 650px) { - .RepeatFrequencyOptions-formGroup { - flex: 0 0 auto; - margin-bottom: 25px; - width: 100%; - margin-right: 0px; - } -} - -.RepeatFrequencyOptions-label { - width: 100%; - margin-top: -2px; - text-transform: uppercase; - font-weight: bold; - color: @default-interface-txt; - font-size: 13px; - margin-left: -20px; - border-left: 5px solid @default-border; - padding-left: 15px; - padding-bottom: 15px; -} - -.RepeatFrequencyOptions-weekButtonContainer { - width: 100%; -} - -.RepeatFrequencyOptions-weekButtonGroup { - height: 27px; - width: 100%; - display: flex; -} - -.RepeatFrequencyOptions-weekButton { - height: 27px; - padding-top: 2px; - padding-right: 4px; - padding-left: 4px; - flex: 1; -} - -.RepeatFrequencyOptions-weekButton.active { - background-color: @default-list-header-bg !important; - border-color: @d7grey !important; -} - -.RepeatFrequencyOptions-everyGroup { - display: flex; - flex-wrap: wrap; - align-items: baseline; -} - -.RepeatFrequencyOptions-inlineLabel { - font-weight: normal; - color: @default-interface-txt; - text-transform: uppercase; - flex: initial; - width: 54px; - margin-left: 10px; - font-size: 13px; -} - -.RepeatFrequencyOptions-occurencesGroup { - width: 100%; -} - -.RepeatFrequencyOptions-radioLabel { - margin-top: 0px; - margin-bottom: 5px; -} - -.RepeatFrequencyOptions-everyLabel { - margin-top: 2px; -} - -.RepeatFrequencyOptions-spacedSelect, -.RepeatFrequencyOptions-spacedSelect ~ .select2 { - margin-bottom: 10px; -} - -.RepeatFrequencyOptions-subFormBorderFixer { - height: 25px; - width: 5px; - background: @default-bg; - margin-left: -20px; - margin-top: -25px; - margin-right: 50px; -} - -.RepeatFrequencyOptions-monthlyOccurence, -.RepeatFrequencyOptions-yearlyOccurence { - text-transform: capitalize; -} - -.RepeatFrequencyOptions-error { - flex: initial; - width: 100%; -} - -.RepeatFrequencyOptions-nameBorderErrorFix { - border-color: @default-err !important; -} - -.RepeatFrequencyOptions-inputGroup { - display: flex; - justify-content: space-between; -} - -.RepeatFrequencyOptions-inputGroup--thirds > .select2 { - width: ~"calc(33% - 3px)" !important; -} - -.RepeatFrequencyOptions-inputGroup--halves > .select2 { - width: ~"calc(50% - 3px)" !important; -} - -.RepeatFrequencyOptions-inputGroup--halvesWithNumber > .select2 { - width: ~"calc(50% - 3px)" !important; - margin-right: 7px; -} - -.RepeatFrequencyOptions-inputGroup--halvesWithSelect > .select2 { - width: ~"calc(50% - 3px)" !important; - margin-left: 7px; -} - -.RepeatFrequencyOptions-inputGroup--halvesWithSelect > .RepeatFrequencyOptions-number { - width: ~"calc(50% - 3px)" !important; -} diff --git a/awx/ui/client/src/scheduler/scheduled-jobs.list.js b/awx/ui/client/src/scheduler/scheduled-jobs.list.js deleted file mode 100644 index 10df571fc8..0000000000 --- a/awx/ui/client/src/scheduler/scheduled-jobs.list.js +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default ['i18n', function(i18n) { - return { - - name: 'schedules', - iterator: 'schedule', - editTitle: i18n._('SCHEDULED JOBS'), - listTitle: i18n._('SCHEDULED JOBS'), - hover: true, - emptyListText: i18n._('No schedules exist'), - layoutClass: 'List-staticColumnLayout--toggleOnOff', - staticColumns: [ - { - field: 'enabled', - content: { - label: '', - type: 'toggle', - ngClick: "toggleSchedule($event, schedule.id)", - nosort: true, - awToolTip: "{{ schedule.play_tip }}", - ngDisabled: "!schedule.summary_fields.user_capabilities.edit", - dataTipWatch: "schedule.play_tip", - dataPlacement: 'top' - } - } - ], - - fields: { - name: { - label: i18n._('Name'), - columnClass: 'col-xl-4 col-lg-5 col-md-5 col-sm-7 List-staticColumnAdjacent', - sourceModel: 'unified_job_template', - sourceField: 'name', - // ngBind: 'schedule.summary_fields.unified_job_template.name', - uiSref: "{{schedule.linkToDetails}}", - awToolTip: "{{ schedule.nameTip | sanitize}}", - dataTipWatch: 'schedule.nameTip', - dataPlacement: "top", - }, - type: { - label: i18n._('Type'), - noLink: true, - columnClass: "d-none d-md-flex col-md-2", - sourceModel: 'unified_job_template', - sourceField: 'unified_job_type', - ngBind: 'schedule.type_label', - searchField: 'unified_job_template__polymorphic_ctype__model' - }, - next_run: { - label: i18n._('Next Run'), - noLink: true, - columnClass: "d-none d-md-flex col-xl-3 col-lg-2 col-md-3", - filter: "longDate", - key: true - } - }, - - actions: { }, - - fieldActions: { - - columnClass: 'col-xl-3 col-lg-3 col-md-2 col-sm-5', - "edit": { - mode: "all", - ngClick: "editSchedule(schedule)", - awToolTip: i18n._("Edit the schedule"), - dataPlacement: "top", - ngShow: 'schedule.summary_fields.user_capabilities.edit' - }, - "view": { - mode: "all", - ngClick: "editSchedule(schedule)", - awToolTip: i18n._("View the schedule"), - dataPlacement: "top", - ngShow: '!schedule.summary_fields.user_capabilities.edit' - }, - "delete": { - mode: 'all', - ngClick: 'deleteSchedule(schedule.id)', - awToolTip: i18n._('Delete the schedule'), - dataPlacement: 'top', - ngShow: 'schedule.summary_fields.user_capabilities.delete' - } - } - };}]; diff --git a/awx/ui/client/src/scheduler/scheduler.partial.html b/awx/ui/client/src/scheduler/scheduler.partial.html deleted file mode 100644 index 4e42081123..0000000000 --- a/awx/ui/client/src/scheduler/scheduler.partial.html +++ /dev/null @@ -1,4 +0,0 @@ -
-
-
-
diff --git a/awx/ui/client/src/scheduler/scheduler.strings.js b/awx/ui/client/src/scheduler/scheduler.strings.js deleted file mode 100644 index b32b4289b9..0000000000 --- a/awx/ui/client/src/scheduler/scheduler.strings.js +++ /dev/null @@ -1,74 +0,0 @@ -function SchedulerStrings (BaseString) { - BaseString.call(this, 'scheduler'); - - const { t } = this; - const ns = this.scheduler; - - ns.state = { - CREATE_SCHEDULE: t.s('CREATE SCHEDULE'), - EDIT_SCHEDULE: t.s('EDIT SCHEDULE') - }; - - ns.list = { - CLICK_TO_EDIT: t.s('Click to edit schedule.'), - SCHEDULE_IS_ACTIVE: t.s('Schedule is active.'), - SCHEDULE_IS_ACTIVE_CLICK_TO_STOP: t.s('Schedule is active. Click to stop.'), - SCHEDULE_IS_STOPPED: t.s('Schedule is stopped.'), - SCHEDULE_IS_STOPPED_CLICK_TO_STOP: t.s('Schedule is stopped. Click to activate.') - }; - - ns.form = { - NAME: t.s('Name'), - NAME_REQUIRED_MESSAGE: t.s('A schedule name is required.'), - START_DATE: t.s('Start Date'), - START_TIME: t.s('Start Time'), - START_TIME_ERROR_MESSAGE: t.s('The time must be in HH24:MM:SS format.'), - LOCAL_TIME_ZONE: t.s('Local Time Zone'), - REPEAT_FREQUENCY: t.s('Repeat frequency'), - FREQUENCY_DETAILS: t.s('Frequency Details'), - EVERY: t.s('Every'), - REPEAT_FREQUENCY_ERROR_MESSAGE: t.s('Please provide a value between 1 and 999.'), - ON_DAY: t.s('on day'), - MONTH_DAY_ERROR_MESSAGE: t.s('The day must be between 1 and 31.'), - ON_THE: t.s('on the'), - ON: t.s('on'), - ON_DAYS: t.s('on days'), - SUN: t.s('Sun'), - MON: t.s('Mon'), - TUE: t.s('Tue'), - WED: t.s('Wed'), - THU: t.s('Thu'), - FRI: t.s('Fri'), - SAT: t.s('Sat'), - WEEK_DAY_ERROR_MESSAGE: t.s('Please select one or more days.'), - END: t.s('End'), - OCCURENCES: t.s('Occurrences'), - END_DATE: t.s('End Date'), - PROVIDE_VALID_DATE: t.s('Please provide a valid date.'), - END_TIME: t.s('End Time'), - SCHEDULER_OPTIONS_ARE_INVALID: t.s('The scheduler options are invalid, incomplete, or a date is in the past.'), - SCHEDULE_DESCRIPTION: t.s('Schedule Description'), - LIMITED_TO_FIRST_TEN: t.s('Limited to first 10'), - DATE_FORMAT: t.s('Date format'), - EXTRA_VARIABLES: t.s('Extra Variables'), - PROMPT: t.s('Prompt'), - CLOSE: t.s('Close'), - CANCEL: t.s('Cancel'), - SAVE: t.s('Save'), - WARNING: t.s('Warning'), - CREDENTIAL_REQUIRES_PASSWORD_WARNING: t.s('This Job Template has a default credential that requires a password before launch. Adding or editing schedules is prohibited while this credential is selected. To add or edit a schedule, credentials that require a password must be removed from the Job Template.'), - SCHEDULE_NAME: t.s('Schedule name'), - HH24: t.s('HH24'), - MM: t.s('MM'), - SS: t.s('SS'), - DAYS_DATA: t.s('Days of data to keep') - }; - - ns.prompt = { - CONFIRM: t.s('CONFIRM') - }; -} - -SchedulerStrings.$inject = ['BaseStringService']; - -export default SchedulerStrings; diff --git a/awx/ui/client/src/scheduler/schedulerAdd.controller.js b/awx/ui/client/src/scheduler/schedulerAdd.controller.js deleted file mode 100644 index 803a4c473e..0000000000 --- a/awx/ui/client/src/scheduler/schedulerAdd.controller.js +++ /dev/null @@ -1,475 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$filter', '$state', '$stateParams', '$http', 'Wait', - '$scope', '$rootScope', 'CreateSelect2', 'ParseTypeChange', 'GetBasePath', - 'Rest', 'ParentObject', 'JobTemplateModel', '$q', 'Empty', 'SchedulePost', - 'ProcessErrors', 'SchedulerInit', '$location', 'PromptService', 'RRuleToAPI', 'moment', - 'WorkflowJobTemplateModel', 'SchedulerStrings', 'rbacUiControlService', 'Alert', - function($filter, $state, $stateParams, $http, Wait, - $scope, $rootScope, CreateSelect2, ParseTypeChange, GetBasePath, - Rest, ParentObject, JobTemplate, $q, Empty, SchedulePost, - ProcessErrors, SchedulerInit, $location, PromptService, RRuleToAPI, moment, - WorkflowJobTemplate, SchedulerStrings, rbacUiControlService, Alert - ) { - - var base = $scope.base || $location.path().replace(/^\//, '').split('/')[0], - scheduler, - job_type; - - /* - * Normally if "ask_*" checkboxes are checked in a job template settings, - * shouldShowPromptButton() returns True to show the "PROMPT" button. - * However, extra_vars("ask_variables_on_launch") does not use this and - * displays a separate text area within the add/edit page for input. - * We exclude "ask_variables_on_launch" from shouldShowPromptButton() here. - */ - const shouldShowPromptButton = (launchConf) => launchConf.survey_enabled || - launchConf.ask_inventory_on_launch || - launchConf.ask_credential_on_launch || - launchConf.ask_verbosity_on_launch || - launchConf.ask_job_type_on_launch || - launchConf.ask_limit_on_launch || - launchConf.ask_tags_on_launch || - launchConf.ask_skip_tags_on_launch || - launchConf.ask_diff_mode_on_launch || - launchConf.credential_needed_to_start || - launchConf.ask_scm_branch_on_launch || - launchConf.variables_needed_to_start.length !== 0; - - var schedule_url = ParentObject.related.schedules || `${ParentObject.related.inventory_source}schedules`; - if (ParentObject){ - $scope.parentObject = ParentObject; - let scheduleEndpoint = ParentObject.endpoint|| ParentObject.related.schedules || `${ParentObject.related.inventory_source}schedules`; - $scope.canAdd = false; - rbacUiControlService.canAdd(scheduleEndpoint) - .then(function(params) { - $scope.canAdd = params.canAdd; - }); - } - - /* - * Keep processSchedulerEndDt method on the $scope - * because angular-scheduler references it - */ - $scope.processSchedulerEndDt = function(){ - // set the schedulerEndDt to be equal to schedulerStartDt + 1 day @ midnight - var dt = new Date($scope.schedulerUTCTime); - // increment date by 1 day - dt.setDate(dt.getDate() + 1); - var month = $filter('schZeroPad')(dt.getMonth() + 1, 2), - day = $filter('schZeroPad')(dt.getDate(), 2); - $scope.$parent.schedulerEndDt = month + '/' + day + '/' + dt.getFullYear(); - }; - - $scope.preventCredsWithPasswords = true; - $scope.strings = SchedulerStrings; - - /* - * This is a workaround for the angular-scheduler library inserting `ll` into fields after an - * invalid entry and never unsetting them. Presumably null is being truncated down to 2 chars - * in that case. - * - * Because this same problem exists in the edit mode and because there's no inheritence, this - * block of code is duplicated in both add/edit controllers pending a much needed broader - * refactoring effort. - */ - $scope.timeChange = () => { - if (!Number($scope.schedulerStartHour)) { - $scope.schedulerStartHour = '00'; - } - - if (!Number($scope.schedulerStartMinute)) { - $scope.schedulerStartMinute = '00'; - } - - if (!Number($scope.schedulerStartSecond)) { - $scope.schedulerStartSecond = '00'; - } - - $scope.scheduleTimeChange(); - }; - - $scope.saveSchedule = function() { - SchedulePost({ - scope: $scope, - url: schedule_url, - scheduler: scheduler, - promptData: $scope.promptData, - mode: 'add' - }).then(() => { - Wait('stop'); - $state.go("^", null, {reload: true}); - }); - }; - - $scope.prompt = () => { - $scope.promptData.triggerModalOpen = true; - }; - - $scope.formCancel = function() { - $state.go("^"); - }; - - // initial end @ midnight values - $scope.schedulerEndHour = "00"; - $scope.schedulerEndMinute = "00"; - $scope.schedulerEndSecond = "00"; - $scope.parentObject = ParentObject; - - $scope.hideForm = true; - - // extra_data field is not manifested in the UI when scheduling a Management Job - if ($state.current.name === 'templates.editJobTemplate.schedules.add'){ - $scope.parseType = 'yaml'; - - let jobTemplate = new JobTemplate(); - - $q.all([jobTemplate.optionsLaunch(ParentObject.id), jobTemplate.getLaunch(ParentObject.id)]) - .then((responses) => { - let launchConf = responses[1].data; - - if (launchConf.passwords_needed_to_start && - launchConf.passwords_needed_to_start.length > 0 && - !launchConf.ask_credential_on_launch - ) { - Alert(SchedulerStrings.get('form.WARNING'), SchedulerStrings.get('form.CREDENTIAL_REQUIRES_PASSWORD_WARNING'), 'alert-info'); - $state.go('^', { reload: true }); - } - - let watchForPromptChanges = () => { - let promptValuesToWatch = [ - 'promptData.prompts.inventory.value', - 'promptData.prompts.jobType.value', - 'promptData.prompts.verbosity.value', - 'missingSurveyValue' - ]; - - $scope.$watchGroup(promptValuesToWatch, function() { - let missingPromptValue = false; - if ($scope.missingSurveyValue) { - missingPromptValue = true; - } else if (!$scope.promptData.prompts.inventory.value || !$scope.promptData.prompts.inventory.value.id) { - missingPromptValue = true; - } - $scope.promptModalMissingReqFields = missingPromptValue; - }); - }; - - if (launchConf.ask_variables_on_launch) { - $scope.extraVars = ParentObject.extra_vars === '' ? '---' : ParentObject.extra_vars; - - ParseTypeChange({ - scope: $scope, - variable: 'extraVars', - parse_variable: 'parseType', - field_id: 'SchedulerForm-extraVars' - }); - } else { - $scope.noVars = true; - } - - if (!shouldShowPromptButton(launchConf)) { - $scope.showPromptButton = false; - } else { - $scope.showPromptButton = true; - - // Ignore the fact that variables might be promptable on launch - // Promptable variables will happen in the schedule form - launchConf.ignore_ask_variables = true; - - if (launchConf.ask_inventory_on_launch && !_.has(launchConf, 'defaults.inventory')) { - $scope.promptModalMissingReqFields = true; - } - - if (launchConf.survey_enabled) { - // go out and get the survey questions - jobTemplate.getSurveyQuestions(ParentObject.id) - .then((surveyQuestionRes) => { - - let processed = PromptService.processSurveyQuestions({ - surveyQuestions: surveyQuestionRes.data.spec - }); - - $scope.missingSurveyValue = processed.missingSurveyValue; - - $scope.promptData = { - launchConf: responses[1].data, - launchOptions: responses[0].data, - surveyQuestions: processed.surveyQuestions, - template: ParentObject.id, - prompts: PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data - }), - }; - - $scope.$watch('promptData.surveyQuestions', () => { - let missingSurveyValue = false; - _.each($scope.promptData.surveyQuestions, (question) => { - if (question.required && (Empty(question.model) || question.model === [])) { - missingSurveyValue = true; - } - }); - $scope.missingSurveyValue = missingSurveyValue; - }, true); - - watchForPromptChanges(); - }); - } else { - $scope.promptData = { - launchConf: responses[1].data, - launchOptions: responses[0].data, - template: ParentObject.id, - prompts: PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data - }), - }; - - watchForPromptChanges(); - } - } - }); - } else if ($state.current.name === 'templates.editWorkflowJobTemplate.schedules.add'){ - $scope.parseType = 'yaml'; - let workflowJobTemplate = new WorkflowJobTemplate(); - - $q.all([workflowJobTemplate.optionsLaunch(ParentObject.id), workflowJobTemplate.getLaunch(ParentObject.id)]) - .then((responses) => { - let launchConf = responses[1].data; - - let watchForPromptChanges = () => { - $scope.$watch('missingSurveyValue', function() { - $scope.promptModalMissingReqFields = $scope.missingSurveyValue ? true : false; - }); - }; - - if (launchConf.ask_variables_on_launch) { - $scope.noVars = false; - $scope.extraVars = ParentObject.extra_vars === '' ? '---' : ParentObject.extra_vars; - - ParseTypeChange({ - scope: $scope, - variable: 'extraVars', - parse_variable: 'parseType', - field_id: 'SchedulerForm-extraVars' - }); - } else { - $scope.noVars = true; - } - - if (!shouldShowPromptButton(launchConf)) { - $scope.showPromptButton = false; - } else { - $scope.showPromptButton = true; - - if(launchConf.survey_enabled) { - // go out and get the survey questions - workflowJobTemplate.getSurveyQuestions(ParentObject.id) - .then((surveyQuestionRes) => { - - let processed = PromptService.processSurveyQuestions({ - surveyQuestions: surveyQuestionRes.data.spec - }); - - $scope.missingSurveyValue = processed.missingSurveyValue; - - $scope.promptData = { - launchConf: responses[1].data, - launchOptions: responses[0].data, - surveyQuestions: processed.surveyQuestions, - templateType: ParentObject.type, - template: ParentObject.id, - prompts: PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data - }), - }; - - $scope.$watch('promptData.surveyQuestions', () => { - let missingSurveyValue = false; - _.each($scope.promptData.surveyQuestions, (question) => { - if(question.required && (Empty(question.model) || question.model === [])) { - missingSurveyValue = true; - } - }); - $scope.missingSurveyValue = missingSurveyValue; - }, true); - - watchForPromptChanges(); - }); - } - else { - $scope.promptData = { - launchConf: responses[1].data, - launchOptions: responses[0].data, - templateType: ParentObject.type, - template: ParentObject.id, - prompts: PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data - }), - }; - - watchForPromptChanges(); - } - } - }); - } - - if ($state.current.name === 'templates.editWorkflowJobTemplate.schedules.add' || - $state.current.name === 'projects.edit.schedules.add' || - $state.current.name === 'inventories.edit.inventory_sources.edit.schedules.add' - ){ - $scope.noVars = true; - } - - job_type = $scope.parentObject.job_type; - if (!Empty($stateParams.id) && base !== 'system_job_templates' && base !== 'inventories' && !schedule_url) { - schedule_url = GetBasePath(base) + $stateParams.id + '/schedules/'; - } else if (base === "inventories"){ - if (!schedule_url){ - Rest.setUrl(GetBasePath('groups') + $stateParams.id + '/'); - Rest.get() - .then(function (data) { - schedule_url = data.data.related.inventory_source + 'schedules/'; - }).catch(function (response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: 'Error!', - msg: 'Failed to get inventory group info. GET returned status: ' + - response.status - }); - }); - } - } else if (base === 'system_job_templates') { - schedule_url = GetBasePath(base) + $stateParams.id + '/schedules/'; - let parentJobType = _.get($scope.parentObject, 'job_type'); - if (parentJobType !== 'cleanup_tokens' && parentJobType !== 'cleanup_sessions') { - $scope.askDaysToKeep = true; - } - } - - Wait('start'); - $('#form-container').empty(); - scheduler = SchedulerInit({ scope: $scope, requireFutureStartTime: false }); - let timeZonesAPI = () => { - return $http.get(`/api/v2/schedules/zoneinfo/`); - }; - // set API timezones to scheduler object - timeZonesAPI().then(({data}) => { - scheduler.scope.timeZones = data; - scheduler.scope.schedulerTimeZone = _.find(data, (zone) => { - return zone.name === scheduler.scope.current_timezone.name; - }); - $scope.scheduleTimeChange(); - }); - if ($scope.schedulerUTCTime) { - // The UTC time is already set - $scope.processSchedulerEndDt(); - } else { - // We need to wait for it to be set by angular-scheduler because the following function depends - // on it - var schedulerUTCTimeWatcher = $scope.$watch('schedulerUTCTime', function(newVal) { - if (newVal) { - // Remove the watcher - schedulerUTCTimeWatcher(); - $scope.processSchedulerEndDt(); - } - }); - } - - let previewList = _.debounce(function(req) { - $http.post('/api/v2/schedules/preview/', {'rrule': req}) - .then(({data}) => { - $scope.preview_list = data; - let parsePreviewList = (tz) => { - return data[tz].map(function(date) { - date = date.replace(/Z/, ''); - return moment.parseZone(date).format("MM-DD-YYYY HH:mm:ss"); - }); - }; - for (let tz in data) { - $scope.preview_list.isEmpty = data[tz].length === 0; - $scope.preview_list[tz] = parsePreviewList(tz); - } - }); - }, 300); - - $scope.$on("setPreviewPane", (event) => { - let rrule = event.currentScope.rrule.toString(); - let req = RRuleToAPI(rrule, $scope); - previewList(req); - }); - - scheduler.inject('form-container', false); - scheduler.injectDetail('occurrences', false); - scheduler.clear(); - $scope.$on("htmlDetailReady", function() { - $scope.hideForm = false; - scheduler.scope.schedulerStartDt = moment(new Date()).add(1,'days'); - - $scope.$watchGroup(["schedulerName", - "schedulerStartDt", - "schedulerStartHour", - "schedulerStartMinute", - "schedulerStartSecond", - "schedulerTimeZone", - "schedulerFrequency", - "schedulerInterval", - "monthlyRepeatOption", - "monthDay", - "monthlyOccurrence", - "monthlyWeekDay", - "yearlyRepeatOption", - "yearlyMonth", - "yearlyMonthDay", - "yearlyOccurrence", - "yearlyWeekDay", - "yearlyOtherMonth", - "schedulerEnd", - "schedulerOccurrenceCount", - "schedulerEndDt", - "schedulerEndHour", - "schedulerEndMinute", - "schedularEndSecond" - ], function() { - $rootScope.$broadcast("loadSchedulerDetailPane"); - }, true); - - $scope.$watch("weekDays", function() { - $rootScope.$broadcast("loadSchedulerDetailPane"); - }, true); - - Wait('stop'); - }); - $scope.showRRuleDetail = false; - - $('#scheduler-tabs li a').on('shown.bs.tab', function(e) { - if ($(e.target).text() === 'Details') { - if (!scheduler.isValid()) { - $('#scheduler-tabs a:first').tab('show'); - } - } - }); - - var callSelect2 = function() { - CreateSelect2({ - element: '.MakeSelect2', - multiple: false - }); - $("#schedulerTimeZone").select2({ - width:'100%', - containerCssClass: 'Form-dropDown', - placeholder: 'SEARCH' - }); - }; - - $scope.$on("updateSchedulerSelects", function() { - callSelect2(); - }); - callSelect2(); -}]; diff --git a/awx/ui/client/src/scheduler/schedulerDatePicker.block.less b/awx/ui/client/src/scheduler/schedulerDatePicker.block.less deleted file mode 100644 index 8e630e9f9d..0000000000 --- a/awx/ui/client/src/scheduler/schedulerDatePicker.block.less +++ /dev/null @@ -1,37 +0,0 @@ -.DatePicker { - flex: 1 0 auto; - display: flex; - - &-icon { - flex: initial; - padding: 6px 12px; - font-size: 14px; - border-radius: 4px 0 0 4px; - border: 1px solid @b7grey; - border-right: 0; - background-color: @default-bg; - } - - &-icon:hover { - background-color: @f6grey; - } - - &-icon:focus, - &-icon:active { - background-color: @f6grey; - } - - &-input { - flex: 1 0 auto; - border-radius: 0 4px 4px 0; - border: 1px solid @b7grey; - padding: 6px 12px; - background-color: @fcgrey; - } - - &-input:focus, - &-input:active { - outline-offset: 0; - outline: 0; - } -} \ No newline at end of file diff --git a/awx/ui/client/src/scheduler/schedulerDatePicker.directive.js b/awx/ui/client/src/scheduler/schedulerDatePicker.directive.js deleted file mode 100644 index 310a789091..0000000000 --- a/awx/ui/client/src/scheduler/schedulerDatePicker.directive.js +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/* jshint unused: vars */ - -export default - [ 'moment', - 'templateUrl', - function(moment, templateUrl) { - require('bootstrap-datepicker'); - return { - restrict: 'E', - scope: { - date: '=', - minDate: '=', - autoUpdate: '=?', - inputClass: '&', - disabled: '=?' - }, - templateUrl: templateUrl('scheduler/schedulerDatePicker'), - link: function(scope, element, attrs) { - var lang = window.navigator.languages ? - window.navigator.languages[0] : - (window.navigator.language || - window.navigator.userLanguage); - moment.locale(lang); - // We need to make sure this _never_ recurses, which sometimes happens - // with two-way binding. - var mustUpdateValue = true; - scope.autoUpdate = scope.autoUpdate === false ? false : true; - - // convert the passed current date into the correct moment locale - scope.$watch('date', function(newValue) { - if (newValue) { - mustUpdateValue = false; - scope.dateValueMoment = moment(newValue, ['MM/DD/YYYY'], moment.locale()); - scope.dateValue = scope.dateValueMoment.format('L'); - element.find(".DatePicker").datepicker('update', scope.dateValue); - } - }, true); - - // as the date picker value changes, convert back to - // the english date to pass back into the scheduler lib - scope.$watch('dateValue', function(newValue) { - scope.dateValueMoment = moment(newValue, ['L'], moment.locale()); - scope.date = scope.dateValueMoment.locale('en').format('L'); - mustUpdateValue = true; - }); - - var localeData = - moment.localeData(); - var dateFormat = momentFormatToDPFormat(localeData._longDateFormat.L); - var localeKey = momentLocaleToDPLocale(moment.locale()); - - element.find(".DatePicker").addClass("input-prepend date"); - element.find(".DatePicker").find(".DatePicker-icon").addClass("add-on"); - element.find(".DatePicker").datepicker({ - autoclose: true, - language: localeKey, - format: dateFormat - }); - - function momentLocaleToDPLocale(localeKey) { - var parts = localeKey.split('-'); - - if (parts.length === 2) { - var lastPart = parts[1].toUpperCase(); - return [parts[0], lastPart].join('-'); - } else { - return localeKey; - } - - } - - function momentFormatToDPFormat(momentFormat) { - var resultFormat = momentFormat; - - function lowerCase(str) { - return str.toLowerCase(); - } - - resultFormat = resultFormat.replace(/D{1,2}/, lowerCase); - - if (/MMM/.test(resultFormat)) { - resultFormat = resultFormat.replace('MMM', 'M'); - } else { - resultFormat = resultFormat.replace(/M{1,2}/, 'm'); - } - - resultFormat = resultFormat.replace(/Y{2,4}/, lowerCase); - - return resultFormat; - } - } - }; - } - ]; diff --git a/awx/ui/client/src/scheduler/schedulerDatePicker.partial.html b/awx/ui/client/src/scheduler/schedulerDatePicker.partial.html deleted file mode 100644 index bcb2fa01fd..0000000000 --- a/awx/ui/client/src/scheduler/schedulerDatePicker.partial.html +++ /dev/null @@ -1,10 +0,0 @@ -
- - -
diff --git a/awx/ui/client/src/scheduler/schedulerEdit.controller.js b/awx/ui/client/src/scheduler/schedulerEdit.controller.js deleted file mode 100644 index d0cd7e1090..0000000000 --- a/awx/ui/client/src/scheduler/schedulerEdit.controller.js +++ /dev/null @@ -1,507 +0,0 @@ -export default ['$filter', '$state', '$stateParams', 'Wait', '$scope', 'moment', -'$rootScope', '$http', 'CreateSelect2', 'ParseTypeChange', 'ParentObject', 'ProcessErrors', 'Rest', -'GetBasePath', 'SchedulerInit', 'SchedulePost', 'JobTemplateModel', '$q', 'Empty', 'PromptService', 'RRuleToAPI', -'WorkflowJobTemplateModel', 'SchedulerStrings', 'scheduleResolve', 'timezonesResolve', 'Alert', -function($filter, $state, $stateParams, Wait, $scope, moment, - $rootScope, $http, CreateSelect2, ParseTypeChange, ParentObject, ProcessErrors, Rest, - GetBasePath, SchedulerInit, SchedulePost, JobTemplate, $q, Empty, PromptService, RRuleToAPI, - WorkflowJobTemplate, SchedulerStrings, scheduleResolve, timezonesResolve, Alert -) { - - let schedule, scheduler, scheduleCredentials = []; - - /* - * Normally if "ask_*" checkboxes are checked in a job template settings, - * shouldShowPromptButton() returns True to show the "PROMPT" button. - * However, extra_vars("ask_variables_on_launch") does not use this and - * displays a separate text area within the add/edit page for input. - * We exclude "ask_variables_on_launch" from shouldShowPromptButton() here. - */ - const shouldShowPromptButton = (launchConf) => launchConf.survey_enabled || - launchConf.ask_inventory_on_launch || - launchConf.ask_credential_on_launch || - launchConf.ask_verbosity_on_launch || - launchConf.ask_job_type_on_launch || - launchConf.ask_limit_on_launch || - launchConf.ask_tags_on_launch || - launchConf.ask_skip_tags_on_launch || - launchConf.ask_diff_mode_on_launch || - launchConf.credential_needed_to_start || - launchConf.ask_scm_branch_on_launch || - launchConf.passwords_needed_to_start.length !== 0 || - launchConf.variables_needed_to_start.length !== 0; - - $scope.preventCredsWithPasswords = true; - - // initial end @ midnight values - $scope.schedulerEndHour = "00"; - $scope.schedulerEndMinute = "00"; - $scope.schedulerEndSecond = "00"; - $scope.parentObject = ParentObject; - $scope.isEdit = true; - $scope.hideForm = true; - $scope.parseType = 'yaml'; - - $scope.strings = SchedulerStrings; - - /* - * Keep processSchedulerEndDt method on the $scope - * because angular-scheduler references it - */ - $scope.processSchedulerEndDt = function(){ - // set the schedulerEndDt to be equal to schedulerStartDt + 1 day @ midnight - var dt = new Date($scope.schedulerUTCTime); - // increment date by 1 day - dt.setDate(dt.getDate() + 1); - var month = $filter('schZeroPad')(dt.getMonth() + 1, 2), - day = $filter('schZeroPad')(dt.getDate(), 2); - $scope.$parent.schedulerEndDt = month + '/' + day + '/' + dt.getFullYear(); - }; - - $scope.formCancel = function() { - $state.go("^"); - }; - - /* - * This is a workaround for the angular-scheduler library inserting `ll` into fields after an - * invalid entry and never unsetting them. Presumably null is being truncated down to 2 chars - * in that case. - * - * Because this same problem exists in the edit mode and because there's no inheritence, this - * block of code is duplicated in both add/edit controllers pending a much needed broader - * refactoring effort. - */ - $scope.timeChange = () => { - if (!Number($scope.schedulerStartHour)) { - $scope.schedulerStartHour = '00'; - } - - if (!Number($scope.schedulerStartMinute)) { - $scope.schedulerStartMinute = '00'; - } - - if (!Number($scope.schedulerStartSecond)) { - $scope.schedulerStartSecond = '00'; - } - - $scope.scheduleTimeChange(); - }; - - $scope.saveSchedule = function() { - schedule.extra_data = $scope.extraVars; - SchedulePost({ - scope: $scope, - url: GetBasePath('schedules') + parseInt($stateParams.schedule_id) + '/', - scheduler: scheduler, - mode: 'edit', - schedule: schedule, - promptData: $scope.promptData, - priorCredentials: scheduleCredentials - }).then(() => { - Wait('stop'); - $state.go("^", null, {reload: true}); - }); - }; - - $scope.prompt = () => { - $scope.promptData.triggerModalOpen = true; - }; - - var callSelect2 = function() { - CreateSelect2({ - element: '.MakeSelect2', - multiple: false - }); - $("#schedulerTimeZone").select2({ - width:'100%', - containerCssClass: 'Form-dropDown', - placeholder: 'SEARCH' - }); - }; - - $scope.$on("updateSchedulerSelects", function() { - callSelect2(); - }); - - let previewList = _.debounce(function(req) { - $http.post('/api/v2/schedules/preview/', {'rrule': req}) - .then(({data}) => { - $scope.preview_list = data; - let parsePreviewList = (tz) => { - return data[tz].map(function(date) { - date = date.replace(/Z/, ''); - return moment.parseZone(date).format("MM-DD-YYYY HH:mm:ss"); - }); - }; - for (let tz in data) { - $scope.preview_list.isEmpty = data[tz].length === 0; - $scope.preview_list[tz] = parsePreviewList(tz); - } - }); - }, 300); - - $scope.$on("setPreviewPane", (event) => { - let rrule = event.currentScope.rrule.toString(); - let req = RRuleToAPI(rrule, $scope); - previewList(req); - }); - - Wait('start'); - - //sets the timezone dropdown to the timezone specified by the API - function setTimezone () { - $scope.schedulerTimeZone = _.find($scope.timeZones, function(x) { - return x.name === scheduleResolve.timezone; - }); - } - - // sets the UNTIL portion of the schedule form after the angular-scheduler - // sets it, but this function reads the 'until' key/value pair directly - // from the schedule GET response. - function setUntil (scheduler) { - let { until } = scheduleResolve; - if(until !== ''){ - const date = moment(until); - const endDt = moment.parseZone(date).format("MM/DD/YYYY"); - const endHour = date.format('HH'); - const endMinute = date.format('mm'); - const endSecond = date.format('ss'); - scheduler.scope.schedulerEndDt = endDt; - scheduler.scope.schedulerEndHour = endHour; - scheduler.scope.schedulerEndMinute = endMinute; - scheduler.scope.schedulerEndSecond = endSecond; - } - } - - function init() { - schedule = scheduleResolve; - - try { - schedule.extra_data = JSON.parse(schedule.extra_data); - } catch(e) { - // do nothing - } - - $scope.extraVars = (scheduleResolve.extra_data === '' || _.isEmpty(scheduleResolve.extra_data)) ? '---' : '---\n' + jsyaml.safeDump(scheduleResolve.extra_data); - - if (_.has(schedule, 'summary_fields.unified_job_template.unified_job_type') && - schedule.summary_fields.unified_job_template.unified_job_type === 'system_job'){ - let scheduleJobType = _.get(schedule.summary_fields.unified_job_template, 'job_type'); - if (scheduleJobType !== 'cleanup_tokens' && scheduleJobType !== 'cleanup_sessions') { - $scope.askDaysToKeep = true; - } - } - - $scope.schedule_obj = scheduleResolve; - - $('#form-container').empty(); - scheduler = SchedulerInit({ scope: $scope, requireFutureStartTime: false }); - - scheduler.scope.timeZones = timezonesResolve; - setTimezone(); - - scheduler.inject('form-container', false); - scheduler.injectDetail('occurrences', false); - - if (!/DTSTART/.test(schedule.rrule)) { - schedule.rrule += ";DTSTART=" + schedule.dtstart.replace(/\.\d+Z$/,'Z'); - } - schedule.rrule = schedule.rrule.replace(/ RRULE:/,';'); - schedule.rrule = schedule.rrule.replace(/DTSTART:/,'DTSTART='); - $scope.$on("htmlDetailReady", function() { - scheduler.setRRule(schedule.rrule); - scheduler.setName(schedule.name); - setTimezone(); - setUntil(scheduler); - $scope.hideForm = false; - - $scope.$watchGroup(["schedulerName", - "schedulerStartDt", - "schedulerStartHour", - "schedulerStartMinute", - "schedulerStartSecond", - "schedulerTimeZone", - "schedulerFrequency", - "schedulerInterval", - "monthlyRepeatOption", - "monthDay", - "monthlyOccurrence", - "monthlyWeekDay", - "yearlyRepeatOption", - "yearlyMonth", - "yearlyMonthDay", - "yearlyOccurrence", - "yearlyWeekDay", - "yearlyOtherMonth", - "schedulerEnd", - "schedulerOccurrenceCount", - "schedulerEndDt", - "schedulerEndHour", - "schedulerEndMinute", - "schedulerEndSecond" - ], function() { - $rootScope.$broadcast("loadSchedulerDetailPane"); - }, true); - - $scope.$watch("weekDays", function() { - $rootScope.$broadcast("loadSchedulerDetailPane"); - }, true); - - $rootScope.$broadcast("loadSchedulerDetailPane"); - Wait('stop'); - }); - - $scope.showRRuleDetail = false; - scheduler.setRRule(schedule.rrule); - scheduler.setName(schedule.name); - $rootScope.breadcrumb.schedule_name = $scope.schedulerName; - $rootScope.breadcrumb[`${$scope.parentObject.type}_name`] = $scope.parentObject.name; - $scope.noVars = true; - scheduler.scope.timeZones = timezonesResolve; - scheduler.scope.schedulerTimeZone = scheduleResolve.timezone; - if ($scope.askDaysToKeep){ - $scope.schedulerPurgeDays = Number(schedule.extra_data.days); - } - - const codeMirrorExtraVars = () => { - ParseTypeChange({ - scope: $scope, - variable: 'extraVars', - parse_variable: 'parseType', - field_id: 'SchedulerForm-extraVars' - }); - }; - - if ($state.current.name === 'templates.editJobTemplate.schedules.edit' || $scope.parentObject.type === 'job_template'){ - - let jobTemplate = new JobTemplate(); - - Rest.setUrl(scheduleResolve.related.credentials); - $q.all([jobTemplate.optionsLaunch(ParentObject.id), jobTemplate.getLaunch(ParentObject.id), Rest.get()]) - .then((responses) => { - let launchOptions = responses[0].data, - launchConf = responses[1].data; - scheduleCredentials = responses[2].data.results; - - if (launchConf.passwords_needed_to_start && - launchConf.passwords_needed_to_start.length > 0 && - !launchConf.ask_credential_on_launch - ) { - Alert(SchedulerStrings.get('form.WARNING'), SchedulerStrings.get('form.CREDENTIAL_REQUIRES_PASSWORD_WARNING'), 'alert-info'); - $scope.credentialRequiresPassword = true; - } - - let watchForPromptChanges = () => { - let promptValuesToWatch = [ - 'promptData.prompts.inventory.value', - 'promptData.prompts.jobType.value', - 'promptData.prompts.verbosity.value', - 'missingSurveyValue' - ]; - - $scope.$watchGroup(promptValuesToWatch, function() { - let missingPromptValue = false; - if ($scope.missingSurveyValue) { - missingPromptValue = true; - } else if (!$scope.promptData.prompts.inventory.value || !$scope.promptData.prompts.inventory.value.id) { - missingPromptValue = true; - } - $scope.promptModalMissingReqFields = missingPromptValue; - }); - }; - - let prompts = PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data, - currentValues: scheduleResolve - }); - - let defaultCredsWithoutOverrides = []; - - const credentialHasScheduleOverride = (templateDefaultCred) => { - let credentialHasOverride = false; - scheduleCredentials.forEach((scheduleCred) => { - if (templateDefaultCred.credential_type === scheduleCred.credential_type) { - if ( - (!templateDefaultCred.vault_id && !scheduleCred.inputs.vault_id) || - (templateDefaultCred.vault_id && scheduleCred.inputs.vault_id && templateDefaultCred.vault_id === scheduleCred.inputs.vault_id) - ) { - credentialHasOverride = true; - } - } - }); - - return credentialHasOverride; - }; - - if (_.has(launchConf, 'defaults.credentials')) { - launchConf.defaults.credentials.forEach((defaultCred) => { - if (!credentialHasScheduleOverride(defaultCred)) { - defaultCredsWithoutOverrides.push(defaultCred); - } - }); - } - - prompts.credentials.value = defaultCredsWithoutOverrides.concat(scheduleCredentials); - - // the extra vars codemirror is ONLY shown if the - // ask_variables_on_launch = true - if (launchConf.ask_variables_on_launch) { - $scope.noVars = false; - } else { - $scope.noVars = true; - } - - if (!shouldShowPromptButton(launchConf)) { - $scope.showPromptButton = false; - - if (launchConf.ask_variables_on_launch) { - codeMirrorExtraVars(); - } - } else { - $scope.showPromptButton = true; - - // Ignore the fact that variables might be promptable on launch - // Promptable variables will happen in the schedule form - launchConf.ignore_ask_variables = true; - - if (launchConf.ask_inventory_on_launch && !_.has(launchConf, 'defaults.inventory') && !_.has(scheduleResolve, 'summary_fields.inventory')) { - $scope.promptModalMissingReqFields = true; - } - - if (responses[1].data.survey_enabled) { - // go out and get the survey questions - jobTemplate.getSurveyQuestions(ParentObject.id) - .then((surveyQuestionRes) => { - - let processed = PromptService.processSurveyQuestions({ - surveyQuestions: surveyQuestionRes.data.spec, - extra_data: _.cloneDeep(scheduleResolve.extra_data) - }); - - $scope.missingSurveyValue = processed.missingSurveyValue; - - $scope.extraVars = (processed.extra_data === '' || _.isEmpty(processed.extra_data)) ? '---' : '---\n' + jsyaml.safeDump(processed.extra_data); - - codeMirrorExtraVars(); - - $scope.promptData = { - launchConf: launchConf, - launchOptions: launchOptions, - prompts: prompts, - surveyQuestions: surveyQuestionRes.data.spec, - template: ParentObject.id - }; - - $scope.$watch('promptData.surveyQuestions', () => { - let missingSurveyValue = false; - _.each($scope.promptData.surveyQuestions, (question) => { - if (question.required && (Empty(question.model) || question.model === [])) { - missingSurveyValue = true; - } - }); - $scope.missingSurveyValue = missingSurveyValue; - }, true); - - watchForPromptChanges(); - }); - } else { - codeMirrorExtraVars(); - $scope.promptData = { - launchConf: launchConf, - launchOptions: launchOptions, - prompts: prompts, - template: ParentObject.id - }; - watchForPromptChanges(); - } - } - }); - } else if ($state.current.name === 'templates.editWorkflowJobTemplate.schedules.edit' || $scope.parentObject.type === 'workflow_job_template') { - let workflowJobTemplate = new WorkflowJobTemplate(); - - $q.all([workflowJobTemplate.optionsLaunch(ParentObject.id), workflowJobTemplate.getLaunch(ParentObject.id)]) - .then((responses) => { - let launchOptions = responses[0].data, - launchConf = responses[1].data; - - let watchForPromptChanges = () => { - $scope.$watch('missingSurveyValue', function() { - $scope.promptModalMissingReqFields = $scope.missingSurveyValue ? true : false; - }); - }; - - let prompts = PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data, - currentValues: scheduleResolve - }); - - // the extra vars codemirror is ONLY shown if the - // ask_variables_on_launch = true - if (launchConf.ask_variables_on_launch) { - $scope.noVars = false; - codeMirrorExtraVars(); - } else { - $scope.noVars = true; - } - - if (!shouldShowPromptButton(launchConf)) { - $scope.showPromptButton = false; - } else { - $scope.showPromptButton = true; - - if(responses[1].data.survey_enabled) { - // go out and get the survey questions - workflowJobTemplate.getSurveyQuestions(ParentObject.id) - .then((surveyQuestionRes) => { - - let processed = PromptService.processSurveyQuestions({ - surveyQuestions: surveyQuestionRes.data.spec, - extra_data: _.cloneDeep(scheduleResolve.extra_data) - }); - - $scope.missingSurveyValue = processed.missingSurveyValue; - - $scope.promptData = { - launchConf: launchConf, - launchOptions: launchOptions, - prompts: prompts, - surveyQuestions: surveyQuestionRes.data.spec, - templateType: ParentObject.type, - template: ParentObject.id - }; - - $scope.$watch('promptData.surveyQuestions', () => { - let missingSurveyValue = false; - _.each($scope.promptData.surveyQuestions, (question) => { - if(question.required && (Empty(question.model) || question.model === [])) { - missingSurveyValue = true; - } - }); - $scope.missingSurveyValue = missingSurveyValue; - }, true); - - watchForPromptChanges(); - }); - } - else { - $scope.promptData = { - launchConf: launchConf, - launchOptions: launchOptions, - prompts: prompts, - templateType: ParentObject.type, - template: ParentObject.id - }; - watchForPromptChanges(); - } - } - }); - - } - } - - init(); - - callSelect2(); -}]; diff --git a/awx/ui/client/src/scheduler/schedulerForm.block.less b/awx/ui/client/src/scheduler/schedulerForm.block.less deleted file mode 100644 index ea1244e120..0000000000 --- a/awx/ui/client/src/scheduler/schedulerForm.block.less +++ /dev/null @@ -1,72 +0,0 @@ -/** @define SchedulerForm */ - -.SchedulerForm-formGroup { - padding-right: 0px; -} - -.SchedulerForm-inputGroup--date { - width: 100%; -} - -#SchedulerFormTarget .DatePicker { - max-height: 31px; -} - -#SchedulerFormTarget .DatePicker-icon { - padding-top: 4px; -} - -input.DatePicker-input[disabled] { - background: @ebgrey; -} - -@media (min-width: 901px) { - .SchedulerForm-formGroup { - flex: 0 0 auto; - margin-bottom: 25px; - width: ~"calc(33% - 32px)"; - margin-right: 50px; - } - - .SchedulerForm-formGroup:nth-child(3n+3) { - flex: 0 0 auto; - margin-bottom: 25px; - margin-right: 0px; - } -} - -@media (min-width: 651px) and (max-width: 900px) { - .SchedulerForm-formGroup { - flex: 0 0 auto; - margin-bottom: 25px; - width: ~"calc(50% - 25px)"; - margin-right: 50px; - } - - .SchedulerForm-formGroup:nth-child(2n+2) { - flex: 0 0 auto; - margin-bottom: 25px; - margin-right: 0px; - } -} - -@media (max-width: 650px) { - .SchedulerForm-formGroup { - flex: 0 0 auto; - margin-bottom: 25px; - width: 100%; - margin-right: 0px; - } -} - -.SchedulerForm-promptSaveTooltip { - position: absolute; - height: 100%; - display: block; - margin-left: 20px; - width: ~"calc(100% - 20px)"; -} - -.SchedulerForm-promptSave { - position: relative; -} diff --git a/awx/ui/client/src/scheduler/schedulerForm.partial.html b/awx/ui/client/src/scheduler/schedulerForm.partial.html deleted file mode 100644 index 0daad2b3b1..0000000000 --- a/awx/ui/client/src/scheduler/schedulerForm.partial.html +++ /dev/null @@ -1,689 +0,0 @@ -
-
-
{{ schedulerName || strings.get('state.CREATE_SCHEDULE') }}
-
{{ schedulerName || strings.get('state.EDIT_SCHEDULE') }}
-
-
- -
-
-
-
- -
- - -
- {{ strings.get('form.NAME_REQUIRED_MESSAGE') }} -
-
-
- - - -
-
-
-
- -
- - - : - - - - : - - -
-
- {{ strings.get('form.START_TIME_ERROR_MESSAGE') }} -
-
-
- - - -
-
- - -
-
-
-
- {{ strings.get('form.FREQUENCY_DETAILS') }}
-
-
- - - -
- {{ strings.get('form.REPEAT_FREQUENCY_ERROR_MESSAGE') }} -
-
-
-
- -
- -
- {{ strings.get('form.MONTH_DAY_ERROR_MESSAGE') }} -
-
-
-
- -
-
- - -
-
-
-
- * - -
-
- - -
-
- {{ strings.get('form.MONTH_DAY_ERROR_MESSAGE') }} -
-
-
-
- -
-
- - - -
-
-
- -
-
- - - - - - - -
-
-
- {{ strings.get('form.WEEK_DAY_ERROR_MESSAGE') }} -
-
-
- -
- -
-
-
- - -
- {{ strings.get('form.REPEAT_FREQUENCY_ERROR_MESSAGE') }} -
-
-
- - - -
- {{ strings.get('form.PROVIDE_VALID_DATE') }} -
-
-
- -
- - - : - - - - : - - -
-
- {{ strings.get('form.START_TIME_ERROR_MESSAGE') }} -
-
-
-
-
-
-
-

- {{ strings.get('form.SCHEDULER_OPTIONS_ARE_INVALID') }} -

-
-
- -
- {{ rrule_nlp_description }} -
-
- -
- - - -
-
-
    -
  • - {{ occurrence }} UTC -
  • -
-
    -
  • - {{ occurrence }} -
  • -
- -
-
- -
- -
-
-
-
- - - -
- -
- -
-
- -
\ No newline at end of file diff --git a/awx/ui/client/src/scheduler/schedulerFormDetail.block.less b/awx/ui/client/src/scheduler/schedulerFormDetail.block.less deleted file mode 100644 index bb1d0b5993..0000000000 --- a/awx/ui/client/src/scheduler/schedulerFormDetail.block.less +++ /dev/null @@ -1,77 +0,0 @@ -/** @define SchedulerFormDetail */ - -.SchedulerFormDetail-container { - padding: 15px; - border: 1px solid @b7grey; - border-radius: 5px; - margin-bottom: 20px; -} - -.SchedulerFormDetail-container--error { - border-color: @default-err; -} - -.SchedulerFormDetail-errorText { - text-align: center; - margin-bottom: 0px; - color: @default-err; -} - -.SchedulerFormDetail-label { - text-transform: uppercase; - color: @default-interface-txt; - margin-bottom: 15px; -} - -.SchedulerFormDetail-nlp { - margin-bottom: 10px; -} - -.SchedulerFormDetail-occurrenceHeader { - display: flex; - flex-wrap: wrap; -} - -.SchedulerFormDetail-labelOccurrence { - font-size: 13px; - font-weight: normal; - margin-bottom: 10px; - margin-right: 20px; -} - -.SchedulerFormDetail-labelDetail { - font-size: 12px; - text-transform: none; -} - -.SchedulerFormDetail-dateFormats { - text-transform: uppercase; - font-size: 13px; - color: @default-interface-txt; -} - -.SchedulerFormDetail-dateFormatsLabel { - font-weight: normal; -} - -.SchedulerFormDetail-radioLabel { - margin-top: -3px !important; - color: @default-data-txt !important; - font-weight: normal; - margin-left: 5px; -} - -.SchedulerFormDetail-dateFormats label:last-of-type { - margin-left: 10px; -} - -.SchedulerFormDetail-radioButton { - margin-top: 2px !important; - color: @default-interface-txt !important; -} - -.SchedulerFormDetail-occurrenceList { - margin-top: 10px; - padding-left: 0px; - list-style-type: none; -} diff --git a/awx/ui/client/src/scheduler/schedulerList.controller.js b/awx/ui/client/src/scheduler/schedulerList.controller.js deleted file mode 100644 index f301c25cce..0000000000 --- a/awx/ui/client/src/scheduler/schedulerList.controller.js +++ /dev/null @@ -1,211 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Schedules - * @description This controller's for schedules - */ - - -export default [ - '$filter', '$scope', '$location', '$stateParams', 'ScheduleList', 'Rest', - 'rbacUiControlService', 'JobTemplateModel', 'ToggleSchedule', 'DeleteSchedule', - '$q', '$state', 'Dataset', 'ParentObject', 'UnifiedJobsOptions', 'i18n', 'SchedulerStrings', - function($filter, $scope, $location, $stateParams, ScheduleList, Rest, - rbacUiControlService, JobTemplate, ToggleSchedule, DeleteSchedule, - $q, $state, Dataset, ParentObject, UnifiedJobsOptions, i18n, strings - ) { - - var base, scheduleEndpoint, - list = ScheduleList; - - init(); - - function init() { - if (ParentObject){ - $scope.parentObject = ParentObject; - scheduleEndpoint = ParentObject.endpoint|| ParentObject.related.schedules || `${ParentObject.related.inventory_source}schedules`; - $scope.canAdd = false; - rbacUiControlService.canAdd(scheduleEndpoint) - .then(function(params) { - $scope.canAdd = params.canAdd; - }); - if (_.has(ParentObject, 'type') && ParentObject.type === 'job_template') { - const jobTemplate = new JobTemplate(); - jobTemplate.getLaunch(ParentObject.id) - .then(({data}) => { - if (data.passwords_needed_to_start && - data.passwords_needed_to_start.length > 0 && - !ParentObject.ask_credential_on_launch - ) { - $scope.credentialRequiresPassword = true; - $scope.addTooltip = i18n._("Using a credential that requires a password on launch is prohibited when creating a Job Template schedule"); - } - }); - } - } - - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - $scope.unified_job_options = UnifiedJobsOptions.actions.GET; - - // _.forEach($scope[list.name], buildTooltips); - } - - $scope.isValid = (schedule) => { - let type = schedule.summary_fields.unified_job_template.unified_job_type; - switch(type){ - case 'job': - return _.every(['project', 'inventory'], _.partial(_.has, schedule.related)); - case 'project_update': - return _.has(schedule, 'related.project'); - case 'inventory_update': - return _.has(schedule, 'related.inventory'); - default: - return true; - } - }; - - $scope.$on(`${list.iterator}_options`, function(event, data){ - $scope.options = data.data.actions.GET; - optionsRequestDataProcessing(); - }); - - $scope.$watchCollection(`${$scope.list.name}`, function() { - optionsRequestDataProcessing(); - } - ); - - // iterate over the list and add fields like type label, after the - // OPTIONS request returns, or the list is sorted/paginated/searched - function optionsRequestDataProcessing(){ - $scope[list.name].forEach(function(item, item_idx) { - var itm = $scope[list.name][item_idx]; - - // Set the item type label - if (list.fields.type && $scope.unified_job_options && - $scope.unified_job_options.hasOwnProperty('type')) { - $scope.unified_job_options.type.choices.every(function(choice) { - if (choice[0] === itm.summary_fields.unified_job_template.unified_job_type) { - itm.type_label = choice[1]; - return false; - } - return true; - }); - } - buildTooltips(itm); - - let stateParams = { schedule_id: item.id }; - let route = ''; - if (item.summary_fields.unified_job_template) { - if (item.summary_fields.unified_job_template.unified_job_type === 'job') { - route = 'templates.editJobTemplate.schedules.edit'; - stateParams.job_template_id = item.summary_fields.unified_job_template.id; - } else if (item.summary_fields.unified_job_template.unified_job_type === 'project_update') { - route = 'projects.edit.schedules.edit'; - stateParams.project_id = item.summary_fields.unified_job_template.id; - } else if (item.summary_fields.unified_job_template.unified_job_type === 'workflow_job') { - route = 'templates.editWorkflowJobTemplate.schedules.edit'; - stateParams.workflow_job_template_id = item.summary_fields.unified_job_template.id; - } else if (item.summary_fields.unified_job_template.unified_job_type === 'inventory_update') { - route = 'inventories.edit.inventory_sources.edit.schedules.edit'; - stateParams.inventory_id = item.summary_fields.inventory.id; - stateParams.inventory_source_id = item.summary_fields.unified_job_template.id; - } else if (item.summary_fields.unified_job_template.unified_job_type === 'system_job') { - route = 'managementJobsList.schedule.edit'; - stateParams.id = item.summary_fields.unified_job_template.id; - } - } - itm.route = route; - itm.stateParams = stateParams; - itm.linkToDetails = `${route}(${JSON.stringify(stateParams)})`; - }); - } - - function buildTooltips(schedule) { - var job = schedule.summary_fields.unified_job_template; - if (schedule.enabled) { - const tip = (schedule.summary_fields.user_capabilities.edit || $scope.credentialRequiresPassword) ? strings.get('list.SCHEDULE_IS_ACTIVE') : strings.get('list.SCHEDULE_IS_ACTIVE_CLICK_TO_STOP'); - schedule.play_tip = tip; - schedule.status = 'active'; - schedule.status_tip = tip; - } else { - const tip = (schedule.summary_fields.user_capabilities.edit || $scope.credentialRequiresPassword) ? strings.get('list.SCHEDULE_IS_STOPPED') : strings.get('list.SCHEDULE_IS_STOPPED_CLICK_TO_STOP');//i18n._('Schedule is stopped.') : i18n._('Schedule is stopped. Click to activate.'); - schedule.play_tip = tip; - schedule.status = 'stopped'; - schedule.status_tip = tip; - } - - schedule.nameTip = $filter('sanitize')(schedule.name); - // include the word schedule if the schedule name does not include the word schedule - if (schedule.name.indexOf("schedule") === -1 && schedule.name.indexOf("Schedule") === -1) { - schedule.nameTip += " schedule"; - } - schedule.nameTip += " for "; - if (job.name.indexOf("job") === -1 && job.name.indexOf("Job") === -1) { - schedule.nameTip += "job "; - } - schedule.nameTip += $filter('sanitize')(job.name); - schedule.nameTip += `. ${strings.get('list.CLICK_TO_EDIT')}`; - } - - $scope.refreshSchedules = function() { - $state.go('.', null, { reload: true }); - }; - - $scope.addSchedule = function() { - if($state.current.name.endsWith('.edit')) { - $state.go('^.add'); - } - if(!$state.current.name.endsWith('.add')) { - $state.go('.add'); - } - }; - - $scope.editSchedule = function(schedule) { - $state.go(schedule.route, schedule.stateParams); - }; - - $scope.toggleSchedule = function(event, id) { - try { - $(event.target).tooltip('hide'); - } catch (e) { - // ignore - } - ToggleSchedule({ - scope: $scope, - id: id - }); - }; - - $scope.deleteSchedule = function(id) { - DeleteSchedule({ - scope: $scope, - id: id - }); - }; - - base = $location.path().replace(/^\//, '').split('/')[0]; - - if (base === 'management_jobs') { - $scope.base = base = 'system_job_templates'; - } - if ($stateParams.job_type) { - $scope.job_type = $stateParams.job_type; - } - - $scope.refreshJobs = function() { - $state.go('.', null, { reload: true }); - }; - - $scope.formCancel = function() { - $state.go('^', null, { reload: true }); - }; - } -]; diff --git a/awx/ui/client/src/scheduler/schedulertime.block.less b/awx/ui/client/src/scheduler/schedulertime.block.less deleted file mode 100644 index 64a87a46e7..0000000000 --- a/awx/ui/client/src/scheduler/schedulertime.block.less +++ /dev/null @@ -1,36 +0,0 @@ -/** @define SchedulerTime */ - -.SchedulerTime { - display: flex; - flex-wrap: wrap; - align-items: flex-start; -} - -span.ui-spinner.ui-widget.ui-widget-content.ui-corner-all { - flex: 1; -} - -.SchedulerTime-separator { - margin-left: 3px; - margin-right: 3px; - margin-top: 3px; -} - -.SchedulerTime-utc { - flex: 1; - display: flex; - flex-direction: column; - margin-left: 20px; - margin-top: -2px; - font-size: 12px; -} - -.SchedulerTime-utcLabel { - flex: 1; - font-weight: normal; - margin-bottom: 0; -} - -.SchedulerTime-utcTime { - flex: 1; -} diff --git a/awx/ui/client/src/scheduler/schedules.list.js b/awx/ui/client/src/scheduler/schedules.list.js deleted file mode 100644 index 7ab370d89c..0000000000 --- a/awx/ui/client/src/scheduler/schedules.list.js +++ /dev/null @@ -1,116 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['i18n', function(i18n) { - return { - - name: 'schedules', - iterator: 'schedule', - selectTitle: '', - editTitle: 'SCHEDULES', - listTitle: '{{parentObject | sanitize}} || SCHEDULES', - index: false, - hover: true, - layoutClass: 'List-staticColumnLayout--schedules', - staticColumns: [ - { - field: 'invalid', - content: { - label: '', - type: 'invalid', - nosort: true, - awToolTip: i18n._("Resources are missing from this template."), - dataPlacement: 'right', - ngShow: '!isValid(schedule)' - } - }, - { - field: 'toggleSchedule', - content: { - ngDisabled: "!schedule.summary_fields.user_capabilities.edit || credentialRequiresPassword", - label: '', - type: "toggle", - ngClick: "toggleSchedule($event, schedule.id)", - awToolTip: "{{ schedule.play_tip }}", - dataTipWatch: "schedule.play_tip", - dataPlacement: "right", - nosort: true, - } - } - ], - - fields: { - name: { - key: true, - label: i18n._('Name'), - uiSref: "{{schedule.linkToDetails}}", - columnClass: "col-sm-3 col-xs-6" - }, - dtstart: { - label: i18n._('First Run'), - filter: "longDate", - columnClass: "d-none d-sm-flex col-sm-2" - }, - next_run: { - label: i18n._('Next Run'), - filter: "longDate", - columnClass: "d-none d-sm-flex col-sm-2" - }, - dtend: { - label: i18n._('Final Run'), - filter: "longDate", - columnClass: "d-none d-sm-flex col-sm-2" - }, - }, - - actions: { - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refreshSchedules()", - actionClass: 'btn List-buttonDefault', - ngShow: "socketStatus == 'error'", - buttonContent: i18n._('REFRESH') - }, - add: { - mode: 'all', - ngClick: 'credentialRequiresPassword || addSchedule()', - awToolTip: i18n._('Add a new schedule'), - dataTipWatch: 'addTooltip', - actionClass: 'at-Button--add', - actionId: 'button-add--schedule', - ngShow: 'canAdd', - ngClass: "{ 'Form-tab--disabled': credentialRequiresPassword }" - } - }, - - fieldActions: { - columnClass: 'col-sm-3 col-xs-6', - edit: { - label: i18n._('Edit'), - ngClick: "editSchedule(schedule)", - icon: 'icon-edit', - awToolTip: i18n._('Edit schedule'), - dataPlacement: 'top', - ngShow: 'schedule.summary_fields.user_capabilities.edit && !credentialRequiresPassword' - }, - view: { - label: i18n._('View'), - ngClick: "editSchedule(schedule)", - awToolTip: i18n._('View schedule'), - dataPlacement: 'top', - ngShow: '!schedule.summary_fields.user_capabilities.edit || credentialRequiresPassword' - }, - "delete": { - label: i18n._('Delete'), - ngClick: "deleteSchedule(schedule.id)", - icon: 'icon-trash', - awToolTip: i18n._('Delete schedule'), - dataPlacement: 'top', - ngShow: 'schedule.summary_fields.user_capabilities.delete' - } - } - };}]; diff --git a/awx/ui/client/src/scheduler/schedules.route.js b/awx/ui/client/src/scheduler/schedules.route.js deleted file mode 100644 index 5126807c4b..0000000000 --- a/awx/ui/client/src/scheduler/schedules.route.js +++ /dev/null @@ -1,383 +0,0 @@ -import { N_ } from '../i18n'; -import {templateUrl} from '../shared/template-url/template-url.factory'; -import editScheduleResolve from './editSchedule.resolve'; - -const jobTemplatesSchedulesListRoute = { - searchPrefix: 'schedule', - name: 'templates.editJobTemplate.schedules', - route: '/schedules', - data: { - activityStream: true, - activityStreamTarget: 'job_template', - }, - ncyBreadcrumb: { - label: N_('SCHEDULES') - }, - resolve: { - Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = `${GetBasePath('job_templates')}${$stateParams.job_template_id}/schedules`; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ParentObject: ['$stateParams', 'Rest', 'GetBasePath', function($stateParams, Rest, GetBasePath){ - let path = `${GetBasePath('job_templates')}${$stateParams.job_template_id}`; - Rest.setUrl(path); - return Rest.get(path).then(response => response.data); - }], - UnifiedJobsOptions: ['Rest', 'GetBasePath', '$q', - function(Rest, GetBasePath, $q) { - Rest.setUrl(GetBasePath('unified_jobs')); - var val = $q.defer(); - Rest.options() - .then(function(data) { - val.resolve(data.data); - }, function(data) { - val.reject(data); - }); - return val.promise; - }], - ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams', - (SchedulesList, GetBasePath, $stateParams) => { - let list = _.cloneDeep(SchedulesList); - list.basePath = GetBasePath('job_templates') + $stateParams.job_template_id + '/schedules/'; - return list; - } - ] - }, - views: { - related: { - templateProvider: function(ScheduleList, generateList){ - ScheduleList.title = false; - let html = generateList.build({ - list: ScheduleList, - mode: 'edit' - }); - return html; - }, - controller: 'schedulerListController' - } - } -}; - -const jobTemplatesSchedulesAddRoute = { - name: 'templates.editJobTemplate.schedules.add', - route: '/add', - views: { - 'scheduler@templates': { - controller: 'schedulerAddController', - templateUrl: templateUrl("scheduler/schedulerForm"), - } - }, - ncyBreadcrumb: { - label: N_('CREATE SCHEDULE') - } -}; - -const jobTemplatesSchedulesEditRoute = { - name: 'templates.editJobTemplate.schedules.edit', - route: '/:schedule_id', - views: { - 'scheduler@templates': { - controller: 'schedulerEditController', - templateUrl: templateUrl("scheduler/schedulerForm"), - } - }, - ncyBreadcrumb: { - label: "{{breadcrumb.schedule_name}}" - }, - resolve: editScheduleResolve() -}; - -// workflows -const workflowSchedulesRoute = { - searchPrefix: 'schedule', - name: 'templates.editWorkflowJobTemplate.schedules', - route: '/schedules', - data: { - activityStream: true, - activityStreamTarget: 'workflow_job_template', - }, - ncyBreadcrumb: { - label: N_('SCHEDULES') - }, - resolve: { - Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = `${GetBasePath('workflow_job_templates')}${$stateParams.workflow_job_template_id}/schedules`; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ParentObject: ['$stateParams', 'Rest', 'GetBasePath', function($stateParams, Rest, GetBasePath){ - let path = `${GetBasePath('workflow_job_templates')}${$stateParams.workflow_job_template_id}`; - Rest.setUrl(path); - return Rest.get(path).then(response => response.data); - }], - UnifiedJobsOptions: ['Rest', 'GetBasePath', '$stateParams', '$q', - function(Rest, GetBasePath, $stateParams, $q) { - Rest.setUrl(GetBasePath('unified_jobs')); - var val = $q.defer(); - Rest.options() - .then(function(data) { - val.resolve(data.data); - }, function(data) { - val.reject(data); - }); - return val.promise; - }], - ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams', - (SchedulesList, GetBasePath, $stateParams) => { - let list = _.cloneDeep(SchedulesList); - list.basePath = GetBasePath('workflow_job_templates') + $stateParams.workflow_job_template_id + '/schedules/'; - return list; - } - ] - }, - views: { - related: { - templateProvider: function(ScheduleList, generateList){ - ScheduleList.title = false; - let html = generateList.build({ - list: ScheduleList, - mode: 'edit' - }); - return html; - }, - controller: 'schedulerListController' - } - } -}; - -const workflowSchedulesAddRoute = { - name: 'templates.editWorkflowJobTemplate.schedules.add', - route: '/add', - views: { - 'scheduler@templates': { - controller: 'schedulerAddController', - templateUrl: templateUrl("scheduler/schedulerForm"), - } - }, - ncyBreadcrumb: { - label: N_('CREATE SCHEDULE') - } -}; - -const workflowSchedulesEditRoute = { - name: 'templates.editWorkflowJobTemplate.schedules.edit', - route: '/:schedule_id', - views: { - 'scheduler@templates': { - controller: 'schedulerEditController', - templateUrl: templateUrl("scheduler/schedulerForm"), - } - }, - ncyBreadcrumb: { - label: '{{breadcrumb.schedule_name}}' - }, - resolve: editScheduleResolve() -}; - -const projectsSchedulesListRoute = { - searchPrefix: 'schedule', - name: 'projects.edit.schedules', - route: '/schedules', - data: { - activityStream: true, - activityStreamTarget: 'project', - }, - ncyBreadcrumb: { - label: N_('SCHEDULES') - }, - resolve: { - Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = `${GetBasePath('projects')}${$stateParams.project_id}/schedules`; - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ParentObject: ['$stateParams', 'Rest', 'GetBasePath', function($stateParams, Rest, GetBasePath){ - let path = `${GetBasePath('projects')}${$stateParams.project_id}`; - Rest.setUrl(path); - return Rest.get(path).then(response => response.data); - }], - UnifiedJobsOptions: ['Rest', 'GetBasePath', '$stateParams', '$q', - function(Rest, GetBasePath, $stateParams, $q) { - Rest.setUrl(GetBasePath('unified_jobs')); - var val = $q.defer(); - Rest.options() - .then(function(data) { - val.resolve(data.data); - }, function(data) { - val.reject(data); - }); - return val.promise; - }], - ScheduleList: ['SchedulesList', 'GetBasePath', '$stateParams', - (SchedulesList, GetBasePath, $stateParams) => { - let list = _.cloneDeep(SchedulesList); - list.basePath = GetBasePath('projects') + $stateParams.project_id + '/schedules/'; - return list; - } - ] - }, - views: { - related: { - templateProvider: function(ScheduleList, generateList){ - ScheduleList.title = false; - let html = generateList.build({ - list: ScheduleList, - mode: 'edit' - }); - return html; - }, - controller: 'schedulerListController' - } - } -}; - -const projectsSchedulesAddRoute = { - name: 'projects.edit.schedules.add', - route: '/add', - ncyBreadcrumb: { - label: N_('CREATE SCHEDULE') - }, - views: { - 'scheduler@projects': { - controller: 'schedulerAddController', - templateUrl: templateUrl("scheduler/schedulerForm"), - } - } -}; - -const projectsSchedulesEditRoute = { - name: 'projects.edit.schedules.edit', - route: '/:schedule_id', - ncyBreadcrumb: { - label: "{{breadcrumb.schedule_name}}" - }, - views: { - 'scheduler@projects': { - controller: 'schedulerEditController', - templateUrl: templateUrl("scheduler/schedulerForm"), - } - }, - resolve: editScheduleResolve() -}; - -const jobsSchedulesRoute = { - searchPrefix: 'schedule', - name: 'schedules', - route: '/schedules', - params: { - schedule_search: { - value: { - order_by: 'unified_job_template__polymorphic_ctype__model' - }, - dynamic: true - } - }, - data: { - activityStream: false, - }, - ncyBreadcrumb: { - label: N_('SCHEDULES') - }, - resolve: { - ScheduleList: ['ScheduledJobsList', function(list){ - return list; - }], - Dataset: ['ScheduleList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath('schedules'); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ParentObject: ['GetBasePath', (GetBasePath) =>{return {endpoint:GetBasePath('schedules')}; }], - UnifiedJobsOptions: ['Rest', 'GetBasePath', '$stateParams', '$q', - function(Rest, GetBasePath, $stateParams, $q) { - Rest.setUrl(GetBasePath('unified_jobs')); - var val = $q.defer(); - Rest.options() - .then(function(data) { - val.resolve(data.data); - }, function(data) { - val.reject(data); - }); - return val.promise; - }] - }, - views: { - '@': { - templateProvider: function(ScheduleList, generateList){ - - let html = generateList.build({ - list: ScheduleList, - mode: 'edit' - }); - html = generateList.wrapPanel(html); - let formPlaceholder = generateList.insertFormView(); - html = formPlaceholder + html; - return html; - }, - controller: 'schedulerListController' - } - } -}; - -// the /#/jobs/schedules/:schedule_id state needs to know about the type of -// resource is being scheduled. -const parentResolve = { - ParentObject: ['$stateParams', 'Rest', 'GetBasePath', 'scheduleResolve', - function($stateParams, Rest, GetBasePath, scheduleResolve){ - let path = scheduleResolve.related.unified_job_template; - Rest.setUrl(path); - return Rest.get(path).then(response => response.data); - } - ] -}; - -const jobsSchedulesEditRoute = { - name: 'schedules.edit', - route: '/:schedule_id', - ncyBreadcrumb: { - parent: 'schedules', - label: "{{breadcrumb.schedule_name}}" - }, - views: { - 'form':{ - templateProvider: function(ParentObject, $http){ - let path; - if(ParentObject.type === 'system_job_template'){ - path = templateUrl('management-jobs/scheduler/schedulerForm'); - } - else { - path = templateUrl('scheduler/schedulerForm'); - } - return $http.get(path).then(response => response.data); - }, - controllerProvider: function(ParentObject){ - if (ParentObject.type === 'system_job_template') { - return 'managementJobEditController'; - } - else { - return 'schedulerEditController'; - } - } - } - }, - resolve: _.merge(editScheduleResolve(), parentResolve) -}; - -export { - jobTemplatesSchedulesListRoute, - jobTemplatesSchedulesAddRoute, - jobTemplatesSchedulesEditRoute, - workflowSchedulesRoute, - workflowSchedulesAddRoute, - workflowSchedulesEditRoute, - projectsSchedulesListRoute, - projectsSchedulesAddRoute, - projectsSchedulesEditRoute, - jobsSchedulesRoute, - jobsSchedulesEditRoute -}; diff --git a/awx/ui/client/src/scheduler/spinnerInput.block.less b/awx/ui/client/src/scheduler/spinnerInput.block.less deleted file mode 100644 index 1f9a44437c..0000000000 --- a/awx/ui/client/src/scheduler/spinnerInput.block.less +++ /dev/null @@ -1,5 +0,0 @@ -/** @define SpinnerInput */ - -.SpinnerInput { - width: ~"calc(100% - 26px)"; -} diff --git a/awx/ui/client/src/shared/Modal.js b/awx/ui/client/src/shared/Modal.js deleted file mode 100644 index 1bcdd48314..0000000000 --- a/awx/ui/client/src/shared/Modal.js +++ /dev/null @@ -1,250 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name shared.function:Modal - * @description - * Modal.js - * - * Create a draggable, resizable modal dialog using jQueryUI. - * - * - */ - - -export default -angular.module('ModalDialog', ['Utilities']) - - /** - * @ngdoc method - * @name shared.function:Modal#CreateDialog - * @methodOf shared.function:Modal - * @description - * CreateDialog({ - * id: - id attribute value of the target DOM element - * scope: - Required, $scope associated with the #id DOM element - * buttons: - Required, Array of button objects. See example below. - * width: - Desired width of modal dialog on open. Defaults to 500. - * height: - Desired height of modal on open. Defaults to 600. - * minWidth: - Minimum width that must be maintained regardless of reize attempts. Defaults to 400. - * title: - Modal window title, optional - * onResizeStop: - Function to call when user stops resizing the dialog, optional - * onClose: - Function to call after window closes, optional - * onOpen: - Function to call after window opens, optional - * beforeDestroy: - Function to call during onClose and prior to destroying the window - * callback: - String to pass to scope.$emit() after dialog is created, optional - * }) - * - * Note that the dialog will be created but not opened. It's up to the caller to open it. Use callback - * option to respond to dialog created event. - */ - .factory('CreateDialog', ['Empty', function(Empty) { - - return function(params) { - - let scope = params.scope, - buttonSet = params.buttons, - width = params.width || 500, - height = params.height || 600, - minWidth = params.minWidth || 300, - title = params.title || '', - onResizeStop = params.onResizeStop, - onClose = params.onClose, - onOpen = params.onOpen, - _allowInteraction = params._allowInteraction, - callback = params.callback, - beforeDestroy = params.beforeDestroy, - closeOnEscape = (params.closeOnEscape === undefined) ? false : params.closeOnEscape, - resizable = (params.resizable === undefined) ? false : params.resizable, - draggable = (params.draggable === undefined) ? true : params.draggable, - dialogClass = params.dialogClass, - forms = _.chain([params.form]).flatten().compact().value(), - buttons, - id = params.id, - position = (params.position === undefined) ? { my: "center", at: "center", of: window } : params.position, - x, y, wh, ww; - - function updateButtonStatus(isValid) { - $('.ui-dialog[aria-describedby="' + id + '"]').find('.btn-primary').prop('disabled', !isValid); - } - - if (Empty(buttonSet)) { - // Default button object - buttonSet = [{ - label: "OK", - onClick: function() { - scope.modalOK(); - }, - icon: "", - "class": "btn btn-primary", - "id": "dialog-ok-button" - }]; - } - - buttons = {}; - buttonSet.forEach( function(btn) { - buttons[btn.label] = btn.onClick; - }); - - // Set modal dimensions based on viewport width - ww = $(document).width(); - wh = $(document).height(); - x = (width > ww) ? ww - 10 : width; - y = height === "auto" ? "auto" : ((height > wh) ? wh - 10 : height); - - // Create the modal - $('#' + id).dialog({ - buttons: buttons, - modal: true, - width: x, - height: y, - autoOpen: false, - minWidth: minWidth, - title: title, - closeOnEscape: closeOnEscape, - resizable: resizable, - draggable: draggable, - dialogClass: dialogClass, - position: position, - create: function () { - // Fix the close button - $('.ui-dialog[aria-describedby="' + id + '"]').find('.ui-dialog-titlebar button').empty().attr({'class': 'close'}).html(''); - - setTimeout(function() { - // Make buttons bootstrapy - $('.ui-dialog[aria-describedby="' + id + '"]').find('.ui-dialog-buttonset button').each(function () { - var txt = $(this).text(), self = $(this); - buttonSet.forEach(function(btn) { - if (txt === btn.label) { - self.attr({ "class": btn['class'], "id": btn.id }); - if (btn.icon) { - self.empty().html(' ' + btn.label); - } - } - }); - }); - }, 300); - - if (forms.length > 0) { - forms.map(function(form_ctrl) { - scope.$watch(form_ctrl.$name + '.$valid', updateButtonStatus); - }); - } - - setTimeout(function() { - scope.$apply(function() { - scope.$emit(callback); - }); - }, 300); - }, - resizeStop: function () { - // for some reason, after resizing dialog the form and fields (the content) doesn't expand to 100% - var dialog = $('.ui-dialog[aria-describedby="' + id + '"]'), - titleHeight = dialog.find('.ui-dialog-titlebar').outerHeight(), - buttonHeight = dialog.find('.ui-dialog-buttonpane').outerHeight(), - content = dialog.find('#' + id); - content.width(dialog.width() - 28); - content.css({ height: (dialog.height() - titleHeight - buttonHeight - 10) }); - if (onResizeStop) { - onResizeStop(); - } - }, - close: function () { - // Destroy on close - $('.tooltip').each(function () { - // Remove any lingering tooltip
elements - $(this).remove(); - }); - $('.popover').each(function () { - // remove lingering popover
elements - $(this).remove(); - }); - if (beforeDestroy) { - beforeDestroy(); - } - $('#' + id).dialog('destroy'); - $('#' + id).hide(); - if (onClose) { - onClose(); - } - }, - open: function () { - $('.tooltip').each(function () { - // Remove any lingering tooltip
elements - $(this).remove(); - }); - $('.popover').each(function () { - // remove lingering popover
elements - $(this).remove(); - }); - if (onOpen) { - onOpen(); - } - }, - _allowInteraction: _allowInteraction - }); - }; - }]) - - /** - * TextareaResize({ - * scope: - $scope associated with the textarea element - * textareaId: - id attribute value of the textarea - * modalId: - id attribute of the
element used to create the modal - * formId: - id attribute of the textarea's parent form - * parse: - if true, call ParseTypeChange and replace textarea with codemirror editor - * fld: - optional, form field name - * bottom_margin: - optional, integer value for additional margin to leave below the textarea - * onChange; - optional, function to call when the textarea value changes - * }) - * - * Use to resize a textarea field contained on a modal. Has only been tested where the - * form contains 1 textarea and the textarea is at the bottom of the form/modal. - * - **/ - .factory('TextareaResize', ['ParseTypeChange', 'Wait', function(ParseTypeChange, Wait){ - return function(params) { - - var scope = params.scope, - textareaId = params.textareaId, - modalId = params.modalId, - formId = params.formId, - fld = params.fld, - parse = (params.parse === undefined) ? true : params.parse, - bottom_margin = (params.bottom_margin) ? params.bottom_margin : 0, - onChange = params.onChange, - textarea, - formHeight, model, windowHeight, offset, rows; - - function waitStop() { - Wait('stop'); - } - - // Attempt to create the largest textarea field that will fit on the window. Minimum - // height is 6 rows, so on short windows you will see vertical scrolling - textarea = $('#' + textareaId); - if (scope.codeMirror) { - model = textarea.attr('ng-model'); - scope[model] = scope.codeMirror.getValue(); - scope.codeMirror.destroy(); - } - textarea.attr('rows', 1); - formHeight = $('#' + formId).height(); - windowHeight = $('#' + modalId).height() - 20; //leave a margin of 20px - offset = Math.floor(windowHeight - formHeight - bottom_margin); - rows = Math.floor(offset / 20); - rows = (rows < 6) ? 6 : rows; - textarea.attr('rows', rows); - while(rows > 6 && ($('#' + formId).height() > $('#' + modalId).height() + bottom_margin)) { - rows--; - textarea.attr('rows', rows); - } - if (parse) { - ParseTypeChange({ scope: scope, field_id: textareaId, onReady: waitStop, variable: fld, onChange: onChange }); - } - }; - }]); diff --git a/awx/ui/client/src/shared/Utilities.js b/awx/ui/client/src/shared/Utilities.js deleted file mode 100644 index 39ee42cda5..0000000000 --- a/awx/ui/client/src/shared/Utilities.js +++ /dev/null @@ -1,978 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -/** - * @ngdoc function - * @name shared.function:Utilities - * @description - * Utility functions - * - */ - -/* jshint devel:true */ - - - -export default -angular.module('Utilities', ['RestServices', 'Utilities']) - -/** - * @ngdoc method - * @name shared.function:Utilities#Empty - * @methodOf shared.function:Utilities - * @description Empty() - * - * Test if a value is 'empty'. Returns true if val is null | '' | undefined. - * Only works on non-Ojbect types. - * - */ -.factory('Empty', [ - function() { - return function(val) { - return (val === null || val === undefined || val === '') ? true : false; - }; - } -]) - -/** - * @ngdoc method - * @name shared.function:Utilities#ToggleClass - * @methodOf shared.function:Utilities - * @description - */ -.factory('ToggleClass', function() { - return function(selector, cssClass) { - // Toggles the existance of a css class on a given element - if ($(selector) && $(selector).hasClass(cssClass)) { - $(selector).removeClass(cssClass); - } else if ($(selector)) { - $(selector).addClass(cssClass); - } - }; -}) - - -/** - * @ngdoc method - * @name shared.function:Utilities#Alert - * @methodOf shared.function:Utilities - * @description Pass in the header and message you want displayed on TB modal dialog found in index.html. - * Assumes an #id of 'alert-modal'. Pass in an optional TB alert class (i.e. alert-danger, alert-success, - * alert-info...). Pass an optional function(){}, if you want a specific action to occur when user - * clicks 'OK' button. Set secondAlert to true, when a second dialog is needed. - */ -.factory('Alert', ['$rootScope', '$filter', function($rootScope, $filter) { - return function(hdr, msg, cls, action, secondAlert, disableButtons, backdrop, customStyle) { - var scope = $rootScope.$new(), - alertClass, local_backdrop; - if (customStyle !== true) { - msg = $filter('sanitize')(msg); - } - if (secondAlert) { - - $('#alertHeader2').html(hdr); - $('#alert2-modal-msg').html(msg); - - alertClass = (cls) ? cls : 'alert-danger'; //default alert class is alert-danger - local_backdrop = (backdrop === undefined || backdrop === null) ? "static" : backdrop; - - $('#alert2-modal-msg').attr({ "class": "alert " + alertClass }); - $('#alert-modal2').modal({ - show: true, - keyboard: true, - backdrop: local_backdrop - }); - scope.disableButtons2 = (disableButtons) ? true : false; - - $('#alert-modal2').on('hidden.bs.modal', function() { - $(document).unbind('keydown'); - if (action) { - action(); - } - $('#alert-modal2').off(); - }); - $('#alert-modal2').on('shown.bs.modal', function() { - $('#alert2_ok_btn').focus(); - }); - $(document).bind('keydown', function(e) { - if (e.keyCode === 27 || e.keyCode === 13) { - e.preventDefault(); - $('#alert-modal2').modal('hide'); - } - }); - } else { - - $('#alertHeader').html(hdr); - $('#alert-modal-msg').html(msg); - alertClass = (cls) ? cls : 'alert-danger'; //default alert class is alert-danger - local_backdrop = (backdrop === undefined || backdrop === null) ? "static" : backdrop; - - $('#alert-modal-msg').attr({ "class": "alert " + alertClass }); - $('#alert-modal').modal({ - show: true, - keyboard: true, - backdrop: local_backdrop - }); - - $('#alert-modal').on('hidden.bs.modal', function() { - $(document).unbind('keydown'); - if (action) { - action(); - } - $('.modal-backdrop').remove(); - $('#alert-modal').off(); - }); - $('#alert-modal').on('shown.bs.modal', function() { - $('#alert_ok_btn').focus(); - }); - $(document).bind('keydown', function(e) { - if (e.keyCode === 27 || e.keyCode === 13) { - e.preventDefault(); - $('#alert-modal').modal('hide'); - } - }); - - scope.disableButtons = (disableButtons) ? true : false; - } - }; -}]) - -/** - * @ngdoc method - * @name shared.function:Utilities#ProcessErrors - * @methodOf shared.function:Utilities - * @description For handling errors that are returned from the API - */ -.factory('ProcessErrors', ['$rootScope', '$cookies', '$log', '$location', 'Alert', 'Wait', - function($rootScope, $cookies, $log, $location, Alert, Wait) { - return function(scope, data, status, form, defaultMsg) { - var field, fieldErrors, msg, keys; - Wait('stop'); - $log.debug('Debug status: ' + status); - $log.debug('Debug data: '); - $log.debug(data); - if (defaultMsg.msg) { - $log.debug('Debug: ' + defaultMsg.msg); - } - if (status === 403) { - if (data && data.detail) { - msg = data.detail; - } else { - msg = 'The API responded with a 403 Access Denied error. Please contact your system administrator.'; - } - Alert(defaultMsg.hdr, msg); - } else if (status === 409) { - Alert('Conflict', data.conflict || "Resource currently in use."); - } else if (status === 410) { - Alert('Deleted Object', 'The requested object was previously deleted and can no longer be accessed.'); - } else if ((status === 'Session is expired') || (status === 401)) { - if ($rootScope.sessionTimer) { - $rootScope.sessionTimer.expireSession('idle'); - } - $location.url('/login'); - } else if (data && data.non_field_errors) { - Alert('Error!', data.non_field_errors); - } else if (data && data.detail) { - Alert(defaultMsg.hdr, defaultMsg.msg + ' ' + data.detail); - } else if (data && data.__all__) { - if (typeof data.__all__ === 'object' && Array.isArray(data.__all__)) { - Alert('Error!', data.__all__[0]); - } else { - Alert('Error!', data.__all__); - } - } else if (form) { //if no error code is detected it begins to loop through to see where the api threw an error - fieldErrors = false; - - const addApiErrors = (field, fld) => { - if (data[fld] && field.tab) { - // If the form is part of a tab group, activate the tab - $('#' + form.name + "_tabs a[href=\"#" + field.tab + '"]').tab('show'); - } - if (field.realName) { - if (field.realName) { - scope[fld + '_api_error'] = data[field.realName][0]; - //scope[form.name + '_form'][form.fields[field].realName].$setValidity('apiError', false); - $('[name="' + field.realName + '"]').addClass('ng-invalid'); - $('html, body').animate({scrollTop: $('[name="' + field.realName + '"]').offset().top}, 0); - fieldErrors = true; - } - } - if (field.sourceModel) { - if (data[fld]) { - scope[field.sourceModel + '_' + field.sourceField + '_api_error'] = - data[fld][0]; - //scope[form.name + '_form'][form.fields[field].sourceModel + '_' + form.fields[field].sourceField].$setValidity('apiError', false); - $('[name="' + field.sourceModel + '_' + field.sourceField + '"]').addClass('ng-invalid'); - $('[name="' + field.sourceModel + '_' + field.sourceField + '"]').ScrollTo({ "onlyIfOutside": true, "offsetTop": 100 }); - fieldErrors = true; - } - } else { - if (data[fld]) { - if (data[fld].message) { - scope[fld + '_api_error'] = data[fld].message; - } else { - scope[fld + '_api_error'] = data[fld][0]; - } - $('[name="' + fld + '"]').addClass('ng-invalid'); - $('label[for="' + fld + '"] span').addClass('error-color'); - $('html, body').animate({scrollTop: $('[name="' + fld + '"]').offset().top}, 0); - fieldErrors = true; - if(field.codeMirror){ - $(`#cm-${fld}-container .CodeMirror`).addClass('error-border'); - } - } - } - }; - - for (field in form.fields) { - if (form.fields[field].type === "checkbox_group") { - form.fields[field].fields.forEach(fld => { - addApiErrors(fld, fld.name); - }); - } else { - addApiErrors(form.fields[field], field); - } - } - if (!fieldErrors && defaultMsg) { - Alert(defaultMsg.hdr, defaultMsg.msg); - } - } else if (typeof data === 'object' && data !== null) { - if (Object.keys(data).length > 0) { - keys = Object.keys(data); - msg = ""; - _.forOwn(data, function(value, key) { - if (Array.isArray(data[key])) { - msg += `${key.toUpperCase()}: ${data[key][0]}`; - } else { - msg += `${key.toUpperCase()}: ${value} `; - } - }); - Alert(defaultMsg.hdr, msg); - } else { - Alert(defaultMsg.hdr, defaultMsg.msg); - } - } else { - Alert(defaultMsg.hdr, defaultMsg.msg); - } - }; - } -]) - -/** - * @ngdoc method - * @name shared.function:Utilities#HelpDialog - * @methodOf shared.function:Utilities - * @description Display a help dialog - * - * HelpDialog({ defn: }) - * discuss difference b/t this and other modal windows/dialogs - */ -.factory('HelpDialog', ['$rootScope', '$compile', '$location', 'Store', - function($rootScope, $compile, $location, Store) { - return function(params) { - - var defn = params.defn, - current_step = params.step, - autoShow = params.autoShow || false, - scope = (params.scope) ? params.scope : $rootScope.$new(); - - function setButtonMargin() { - var width = ($('.ui-dialog[aria-describedby="help-modal-dialog"] .ui-dialog-buttonpane').innerWidth() / 2) - $('#help-next-button').outerWidth() - 93; - $('#help-next-button').css({ 'margin-right': width + 'px' }); - } - - function showHelp(step) { - - var e, btns, ww, width, height, isOpen = false; - current_step = step; - - function buildHtml(step) { - var html = ''; - html += "

" + step.intro + "

\n"; - if (step.img) { - html += "
\n"; - html += "\n" : ""; - html += "" + step.box + "
"; - html += (autoShow && step.autoOffNotice) ? "
\n" : ""; - return html; - } - - width = (defn.story.width) ? defn.story.width : 510; - height = (defn.story.height) ? defn.story.height : 600; - - // Limit modal width to width of viewport - ww = $(document).width(); - width = (width > ww) ? ww : width; - - try { - isOpen = $('#help-modal-dialog').dialog('isOpen'); - } catch (err) { - // ignore - } - - e = angular.element(document.getElementById('help-modal-dialog')); - e.empty().html(buildHtml(defn.story.steps[current_step])); - setTimeout(function() { scope.$apply(function() { $compile(e)(scope); }); }); - - if (!isOpen) { - // Define buttons based on story length - btns = []; - if (defn.story.steps.length > 1) { - btns.push({ - text: "Prev", - click: function() { - if (current_step - 1 === 0) { - $('#help-prev-button').prop('disabled', true); - } - if (current_step - 1 < defn.story.steps.length - 1) { - $('#help-next-button').prop('disabled', false); - } - showHelp(current_step - 1); - }, - disabled: true - }); - btns.push({ - text: "Next", - click: function() { - if (current_step + 1 > 0) { - $('#help-prev-button').prop('disabled', false); - } - if (current_step + 1 >= defn.story.steps.length - 1) { - $('#help-next-button').prop('disabled', true); - } - showHelp(current_step + 1); - } - }); - } - btns.push({ - text: "Close", - click: function() { - $('#help-modal-dialog').dialog('close'); - } - }); - - $('.overlay').css({ - width: $(document).width(), - height: $(document).height() - }).fadeIn(); - - // Show the dialog - $('#help-modal-dialog').dialog({ - position: { - my: "center top", - at: "center top+150", - of: 'body' - }, - title: defn.story.hdr, - width: width, - height: height, - buttons: btns, - closeOnEscape: true, - show: 500, - hide: 500, - resizable: false, - close: function() { - $('.overlay').hide(); - $('#help-modal-dialog').empty(); - } - }); - - // Make the buttons look like TB and add FA icons - $('.ui-dialog-buttonset button').each(function() { - var c, h, i, l; - l = $(this).text(); - if (l === 'Close') { - h = "fa-times"; - c = "btn btn-default"; - i = "help-close-button"; - $(this).attr({ - 'class': c, - 'id': i - }).html(" Close"); - } else if (l === 'Prev') { - h = "fa-chevron-left"; - c = "btn btn-primary"; - i = "help-prev-button"; - $(this).attr({ - 'class': c, - 'id': i - }).html(" Prev"); - } else { - h = "fa-chevron-right"; - c = "btn btn-primary"; - i = "help-next-button"; - $(this).attr({ - 'class': c, - 'id': i - }).html("Next ").css({ - 'margin-right': '20px' - }); - } - }); - - $('.ui-dialog[aria-describedby="help-modal-dialog"]').find('.ui-dialog-titlebar button') - .empty().attr({ - 'class': 'close' - }).text('x'); - - // If user clicks the checkbox, update local storage - $('#auto-off-checkbox').click(function() { - if ($('input[name="auto-off-checkbox"]:checked').length) { - Store('inventoryAutoHelp', 'off'); - } else { - Store('inventoryAutoHelp', 'on'); - } - }); - - setButtonMargin(); - } - } - - showHelp(0); - }; - } -]) - - -/** - * @ngdoc method - * @name shared.function:Utilities#ReturnToCaller - * @methodOf shared.function:Utilities - * @description - * Split the current path by '/' and use the array elements from 0 up to and - * including idx as the new path. If no idx value supplied, use 0 to length - 1. - * - */ -.factory('ReturnToCaller', ['$location', 'Empty', - function($location, Empty) { - return function(idx) { - var paths = $location.path().replace(/^\//, '').split('/'), - newpath = '', - i; - idx = (Empty(idx)) ? paths.length - 1 : idx + 1; - for (i = 0; i < idx; i++) { - newpath += '/' + paths[i]; - } - $location.path(newpath); - }; - } -]) - - -/** - * @ngdoc method - * @name shared.function:Utilities#FormatDate - * @methodOf shared.function:Utilities - * @description - * Wrapper for data filter- an attempt to insure all dates display in - * the same format. Pass in date object or string. See: http://docs.angularjs.org/api/ng.filter:date - */ -.factory('FormatDate', ['$filter', - function($filter) { - return function(dt) { - return $filter('longDate')(dt); - }; - } -]) - -/** - * @ngdoc method - * @name shared.function:Utilities#Wait - * @methodOf shared.function:Utilities - * @description - * Display a spinning icon in the center of the screen to freeze the - * UI while waiting on async things to complete (i.e. API calls). - * Wait('start' | 'stop'); - * - */ -.factory('Wait', ['$rootScope', - function($rootScope) { - - return function(directive) { - var docw, doch, spinnyw, spinnyh; - if (directive === 'start' && !$rootScope.waiting) { - $rootScope.waiting = true; - docw = $(window).width(); - doch = $(window).height(); - spinnyw = $('.spinny').width(); - spinnyh = $('.spinny').height(); - $('.overlay').css({ - width: $(document).width(), - height: $(document).height() - }).fadeIn(); - $('.spinny').css({ - bottom: 15, - right: 15 - }).fadeIn(400); - } else if (directive === 'stop' && $rootScope.waiting) { - $('.spinny, .overlay').fadeOut(400, function() { - $rootScope.waiting = false; - }); - } - }; - } -]) - -.factory('HideElement', [ - function() { - return function(selector, action) { - // Fade-in a cloack or vail or a specific element - var target = $(selector), - width = target.css('width'), - height = target.css('height'), - position = target.position(), - parent = target.parent(), - borderRadius = target.css('border-radius'), - backgroundColor = target.css('background-color'), - margin = target.css('margin'), - padding = target.css('padding'); - - parent.append("
"); - $('#curtain-div').show(0, action); - }; - } -]) - -.factory('ShowElement', [ - function() { - return function() { - // And Fade-out the cloack revealing the element - $('#curtain-div').fadeOut(500, function() { - $(this).remove(); - }); - }; - } -]) - -/** - * @ngdoc method - * @name shared.function:Utilities#CreateSelect2 - * @methodOf shared.function:Utilities - * @description Make a regular select drop down a select2 dropdown - * To make a `` - -
- -
- ${uploadedText} - Current logo -
- -
`, - - link: function(scope) { - var fieldKey = scope.key; - var filePickerText = angular.element(document.getElementById('filePickerText')); - var filePickerError = angular.element(document.getElementById('filePickerError')); - var filePickerButton = angular.element(document.getElementById('filePickerButton')); - var filePicker = angular.element(document.getElementById('filePicker')); - - scope.imagePresent = global.$AnsibleConfig.custom_logo || false; - scope.imageData = $rootScope.custom_logo; - - scope.$on('loginUpdated', function() { - scope.imagePresent = global.$AnsibleConfig.custom_logo; - scope.imageData = $rootScope.custom_logo; - }); - - scope.$watch('imagePresent', (val) => { - if(val){ - filePickerButton.html(removeText); - } - else{ - filePickerButton.html(browseText); - } - }); - - scope.$on(fieldKey+'_reverted', function(e) { - scope.update(e, true); - }); - - scope.update = function(e, flag) { - if(scope.$parent[fieldKey] || flag ) { - e.preventDefault(); - scope.$parent[fieldKey] = ''; - filePickerButton.html(browseText); - filePickerText.val(''); - filePicker.context.value = ""; - scope.imagePresent = false; - } - else { - // Nothing exists so open file picker - } - }; - - scope.fileChange = function(file) { - filePickerError.html(''); - - SettingsUtils.imageProcess(file[0]) - .then(function(result) { - scope.$parent[fieldKey] = result; - filePickerText.val(file[0].name); - filePickerButton.html(removeText); - }).catch(function(error) { - filePickerText.html(file[0].name); - filePickerError.text(error); - }).finally(function() { - - }); - }; - - } - }; -}]) - - -.directive('surveyCheckboxes', function() { - return { - restrict: 'E', - require: 'ngModel', - scope: { ngModel: '=ngModel' }, - template: '
' + - '' + - '
', - link: function(scope, element, attrs, ctrl) { - scope.cbModel = {}; - ctrl.$setValidity('reqCheck', true); - angular.forEach(scope.ngModel.value, function(value) { - scope.cbModel[value] = true; - - }); - - if (scope.ngModel.required === true && scope.ngModel.value.length === 0) { - ctrl.$setValidity('reqCheck', false); - } - - ctrl.$parsers.unshift(function(viewValue) { - for (var c in scope.cbModel) { - if (scope.cbModel[c]) { - ctrl.$setValidity('checkbox', true); - } - } - ctrl.$setValidity('checkbox', false); - - return viewValue; - }); - - scope.update = function() { - var val = []; - angular.forEach(scope.cbModel, function(v, k) { - if (v) { - val.push(k); - } - }); - if (val.length > 0) { - scope.ngModel.value = val; - scope.$parent[scope.ngModel.name] = val; - ctrl.$setValidity('checkbox', true); - ctrl.$setValidity('reqCheck', true); - } else if (scope.ngModel.required === true) { - ctrl.$setValidity('checkbox', false); - } - }; - } - }; -}) - -// the disableRow directive disables table row click events -.directive('disableRow', function() { - return { - restrict: 'A', - link: function(scope, element, attrs) { - element.bind('click', function(event) { - if (scope.$eval(attrs.disableRow)) { - event.preventDefault(); - } - return; - }); - } - }; -}) - - -.directive('awSurveyQuestion', function() { - return { - require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - ctrl.$parsers.unshift(function(viewValue) { - var values = viewValue.split(" "), - result = "", - i; - result += values[0].charAt(0).toUpperCase() + values[0].substr(1) + ' '; - for (i = 1; i < values.length; i++) { - result += values[i] + ' '; - } - result = result.trim(); - if (result !== viewValue) { - ctrl.$setViewValue(result); - ctrl.$render(); - } - return result; - }); - } - }; -}) - -.directive('awMin', ['Empty', function(Empty) { - return { - restrict: 'A', - require: 'ngModel', - link: function(scope, elem, attr, ctrl) { - ctrl.$parsers.unshift(function(viewValue) { - var min = (attr.awMin) ? scope.$eval(attr.awMin) : -Infinity; - if (!Empty(min) && !Empty(viewValue) && Number(viewValue) < min) { - ctrl.$setValidity('awMin', false); - return viewValue; - } else { - ctrl.$setValidity('awMin', true); - return viewValue; - } - }); - } - }; -}]) - -.directive('awMax', ['Empty', function(Empty) { - return { - restrict: 'A', - require: 'ngModel', - link: function(scope, elem, attr, ctrl) { - ctrl.$parsers.unshift(function(viewValue) { - var max = (attr.awMax) ? scope.$eval(attr.awMax) : Infinity; - if (!Empty(max) && !Empty(viewValue) && Number(viewValue) > max) { - ctrl.$setValidity('awMax', false); - return viewValue; - } else { - ctrl.$setValidity('awMax', true); - return viewValue; - } - }); - } - }; -}]) - -.directive('awRange', ['Empty', function(Empty) { - return { - restrict: 'A', - require: 'ngModel', - link: function(scope, elem, attr, ctrl) { - - let checkRange = function(viewValue){ - ctrl.$setValidity('awRangeMin', true); - ctrl.$setValidity('awRangeMax', true); - var max = (attr.rangeMax) ? scope.$eval(attr.rangeMax) : Infinity; - var min = (attr.rangeMin) ? scope.$eval(attr.rangeMin) : -Infinity; - if (!Empty(max) && !Empty(viewValue) && Number(viewValue) > max) { - ctrl.$setValidity('awRangeMax', false); - } - else if(!Empty(min) && !Empty(viewValue) && Number(viewValue) < min) { - ctrl.$setValidity('awRangeMin', false); - } - return viewValue; - }; - - scope.$watch(attr.rangeMin, function () { - checkRange(scope.$eval(attr.ngModel)); - }); - - scope.$watch(attr.rangeMax, function () { - checkRange(scope.$eval(attr.ngModel)); - }); - - ctrl.$parsers.unshift(function(viewValue) { - return checkRange(viewValue); - }); - } - }; -}]) - -.directive('smartFloat', function() { - var FLOAT_REGEXP = /(^\-?\d+)?((\.|\,)\d+)?$/; - return { - require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - ctrl.$parsers.unshift(function(viewValue) { - if (viewValue === '' || FLOAT_REGEXP.test(viewValue)) { - ctrl.$setValidity('float', true); - return parseFloat(viewValue.replace(',', '.')); - } else { - ctrl.$setValidity('float', false); - return undefined; - } - }); - } - }; -}) - -// integer Validate that input is of type integer. Taken from Angular developer -// guide, form examples. Add min and max directives, and this will check -// entered values is within the range. -// -// Use input type of 'text'. Use of 'number' casuses browser validation to -// override/interfere with this directive. -.directive('integer', function() { - return { - restrict: 'A', - require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - ctrl.$parsers.unshift(function(viewValue) { - ctrl.$setValidity('min', true); - ctrl.$setValidity('max', true); - if (/^\-?\d*$/.test(viewValue)) { - // it is valid - ctrl.$setValidity('integer', true); - if (viewValue === '-' || viewValue === '-0' || viewValue === null) { - ctrl.$setValidity('integer', false); - return viewValue; - } - if (elm.attr('min') && - parseInt(viewValue, 10) < parseInt(elm.attr('min'), 10)) { - ctrl.$setValidity('min', false); - return viewValue; - } - if (elm.attr('max') && (parseInt(viewValue, 10) > parseInt(elm.attr('max'), 10))) { - ctrl.$setValidity('max', false); - return viewValue; - } - return viewValue; - } - // Invalid, return undefined (no model update) - ctrl.$setValidity('integer', false); - return viewValue; - }); - } - }; -}) - -//the awSurveyVariableName directive checks if the field contains any spaces. -// this could be elaborated in the future for other things we want to check this field against -.directive('awSurveyVariableName', function() { - var FLOAT_REGEXP = /^[a-zA-Z_$][0-9a-zA-Z_$]*$/; - return { - restrict: 'A', - require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - ctrl.$setValidity('required', true); // we only want the error message for incorrect characters to be displayed - ctrl.$parsers.unshift(function(viewValue) { - if (viewValue.length !== 0) { - if (FLOAT_REGEXP.test(viewValue) && viewValue.indexOf(' ') === -1) { //check for a spaces - ctrl.$setValidity('variable', true); - return viewValue; - } else { - ctrl.$setValidity('variable', false); // spaces found, therefore throw error. - return viewValue; - } - } else { - ctrl.$setValidity('variable', true); // spaces found, therefore throw error. - return viewValue; - } - }); - } - }; -}) - -// -// awRequiredWhen: { reqExpression: "", init: "true|false" } -// -// Make a field required conditionally using an expression. If the expression evaluates to true, the -// field will be required. Otherwise, the required attribute will be removed. -// -.directive('awRequiredWhen', function() { - return { - require: 'ngModel', - compile: function(tElem) { - return { - pre: function preLink() { - let label = $(tElem).closest('.form-group').find('label').first(); - $(label).prepend('*'); - }, - post: function postLink( scope, elm, attrs, ctrl ) { - function updateRequired() { - var isRequired = scope.$eval(attrs.awRequiredWhen); - - var viewValue = elm.val(), - label, validity = true; - label = $(elm).closest('.form-group').find('label').first(); - - if (isRequired && (elm.attr('required') === null || elm.attr('required') === undefined)) { - $(elm).attr('required', 'required'); - if(!$(label).find('span.Form-requiredAsterisk').length){ - $(label).prepend('*'); - } - } else if (!isRequired) { - elm.removeAttr('required'); - if (!attrs.awrequiredAlwaysShowAsterisk) { - $(label).find('span.Form-requiredAsterisk').remove(); - } - } - if (isRequired && (viewValue === undefined || viewValue === null || viewValue === '')) { - validity = false; - } - ctrl.$setValidity('required', validity); - } - - scope.$watchGroup([attrs.awRequiredWhen, $(elm).attr('name')], function() { - // watch for the aw-required-when expression to change value - updateRequired(); - }); - - if (attrs.awrequiredInit !== undefined && attrs.awrequiredInit !== null) { - // We already set a watcher on the attribute above so no need to call updateRequired() in here - scope[attrs.awRequiredWhen] = attrs.awrequiredInit; - } - } - }; - } - }; -}) - -// awPlaceholder: Dynamic placeholder set to a scope variable you want watched. -// Value will be place in field placeholder attribute. -.directive('awPlaceholder', [function() { - return { - require: 'ngModel', - link: function(scope, elm, attrs) { - $(elm).attr('placeholder', scope[attrs.awPlaceholder]); - scope.$watch(attrs.awPlaceholder, function(newVal) { - $(elm).attr('placeholder', newVal); - }); - } - }; -}]) - -// lookup Validate lookup value against API -.directive('awlookup', ['Rest', 'GetBasePath', '$q', '$state', function(Rest, GetBasePath, $q, $state) { - return { - require: 'ngModel', - link: function(scope, elm, attrs, fieldCtrl) { - let query, - basePath, - defer = $q.defer(), - autopopulateLookup, - modelKey = attrs.ngModel, - modelName = attrs.source, - watcher = attrs.awRequiredWhen || undefined, - watchBasePath, - awLookupWhen = attrs.awLookupWhen; - - if (attrs.autopopulatelookup !== undefined) { - autopopulateLookup = JSON.parse(attrs.autopopulatelookup); - } else { - autopopulateLookup = true; - } - - // The following block of code is for instances where the - // lookup field is reused by varying sub-forms. Example: The groups - // form will change it's credential lookup based on the - // source type. The basepath the lookup should utilize is dynamic - // in this case. You'd configure the "watchBasePath" key on the - // field's configuration in the form configuration field. - if (attrs.watchbasepath !== undefined) { - watchBasePath = attrs.watchbasepath; - scope.$watch(watchBasePath, (newValue) => { - if(newValue !== undefined && fieldIsAutopopulatable()){ - _doAutoPopulate(); - } - }); - } - - function _doAutoPopulate() { - let query = '?role_level=use_role'; - - if (attrs.watchbasepath !== undefined && scope[attrs.watchbasepath] !== undefined) { - basePath = scope[attrs.watchbasepath]; - if (attrs.watchbasepath !== "projectBasePath") { - query = '&role_level=use_role'; - } else { - query = ''; - } - } - else { - basePath = GetBasePath(elm.attr('data-basePath')) || elm.attr('data-basePath'); - let switchType = attrs.awlookuptype ? attrs.awlookuptype : modelName; - - switch(switchType) { - case 'credential': - query = '?credential_type__kind=ssh&role_level=use_role'; - break; - case 'scm_credential': - query = '?credential_type__kind=scm&role_level=use_role'; - break; - case 'network_credential': - query = '?credential_type__kind=net&role_level=use_role'; - break; - case 'insights_credential': - query = '?credential_type__kind=insights&role_level=use_role'; - break; - case 'organization': - query = '?role_level=admin_role'; - break; - case 'inventory_script': - query = '?role_level=admin_role&organization=' + scope.$resolve.inventoryData.summary_fields.organization.id; - break; - } - - } - - Rest.setUrl(`${basePath}` + query); - Rest.get() - .then(({data}) => { - if (data.count === 1) { - scope[modelKey] = data.results[0].name; - scope[modelName] = data.results[0].id; - } - }); - } - - if (fieldIsAutopopulatable()) { - _doAutoPopulate(); - } - - // This checks to see if the field meets the criteria to - // autopopulate: - // Population rules: - // - add form only - // - lookup is required - // - lookup is not promptable - // - user must only have access to 1 item the lookup is for - function fieldIsAutopopulatable() { - if (autopopulateLookup === false) { - return false; - } - if (scope.mode === "add") { - if(watcher){ - scope.$watch(watcher, () => { - if(Boolean(scope.$eval(watcher)) === true){ - - // if we get here then the field is required - // by way of awRequiredWhen - // and is a candidate for autopopulation - - _doAutoPopulate(); - } - }); - } - else if (attrs.required === true) { - return true; - } - else { - return false; - } - } - else { - return false; - } - } - - // query the API to see if field value corresponds to a valid resource - // .ng-pending will be applied to the directive element while the request is outstanding - // form.$pending will contain object reference to any ngModelControllers with outstanding requests - fieldCtrl.$asyncValidators.validResource = function(modelValue, viewValue) { - - if(awLookupWhen === undefined || (awLookupWhen !== undefined && Boolean(scope.$eval(awLookupWhen)) === true)) { - applyValidationStrategy(viewValue, fieldCtrl); - } - else { - defer.resolve(); - } - - return defer.promise; - }; - - function applyValidationStrategy(viewValue, ctrl) { - - // use supplied data attributes to build an endpoint, query, resolve outstanding promise - function applyValidation(viewValue) { - basePath = GetBasePath(elm.attr('data-basePath')) || elm.attr('data-basePath'); - query = elm.attr('data-query'); - query = query.replace(/\:value/, encodeURIComponent(viewValue)); - - let base = attrs.awlookuptype ? attrs.awlookuptype : ctrl.$name.split('_name')[0]; - if (attrs.watchbasepath !== undefined && scope[attrs.watchbasepath] !== undefined) { - basePath = scope[attrs.watchbasepath]; - query += '&role_level=use_role'; - query = query.replace('?', '&'); - } - else { - switch(base) { - case 'credential': - query += '&credential_type__namespace=ssh&role_level=use_role'; - break; - case 'scm_credential': - query += '&credential_type__namespace=scm&role_level=use_role'; - break; - case 'network_credential': - query += '&credential_type__namespace=net&role_level=use_role'; - break; - case 'cloud_credential': - query += '&cloud=true&role_level=use_role'; - break; - case 'organization': - if ($state.current.name.includes('inventories')) { - query += '&role_level=inventory_admin_role'; - } else if ($state.current.name.includes('templates.editWorkflowJobTemplate')) { - query += '&role_level=workflow_admin_role'; - } else if ($state.current.name.includes('projects')) { - query += '&role_level=project_admin_role'; - } else if ($state.current.name.includes('notifications')) { - query += '&role_level=notification_admin_role'; - } else { - query += '&role_level=admin_role'; - } - break; - case 'inventory_script': - query += '&role_level=admin_role&organization=' + scope.$resolve.inventoryData.summary_fields.organization.id; - break; - default: - query += '&role_level=use_role'; - } - } - - Rest.setUrl(`${basePath}${query}`); - // https://github.com/ansible/ansible-tower/issues/3549 - // capturing both success/failure conditions in .then() promise - // when #3549 is resolved, this will need to be partitioned into success/error or then/catch blocks - return Rest.get() - .then((res) => { - if (res.data.results.length > 0) { - scope[elm.attr('data-source')] = res.data.results[0].id; - return setValidity(ctrl, true); - } else { - scope[elm.attr('data-source')] = null; - return setValidity(ctrl, false); - } - }); - } - - function setValidity(ctrl, validity){ - var isRequired; - if (attrs.required) { - isRequired = true; - } else { - isRequired = false; - } - if (attrs.awRequiredWhen) { - if (attrs.awRequiredWhen.charAt(0) === "!") { - isRequired = !scope[attrs.awRequiredWhen.slice(1, attrs.awRequiredWhen.length)]; - } else { - isRequired = scope[attrs.awRequiredWhen]; - } - } - if (!isRequired && (viewValue === undefined || viewValue === undefined || viewValue === "")) { - validity = true; - } - ctrl.$setValidity('awlookup', validity); - return defer.resolve(validity); - } - - // Three common cases for clarity: - - // 1) Field is not required & pristine. Pass validation & skip async $pending state - // 2) Field is required. Always validate & use async $pending state - // 3) Field is not required, but is not $pristine. Always validate & use async $pending state - - // case 1 - if (!ctrl.$validators.required && ctrl.$pristine) { - return setValidity(ctrl, true); - } - // case 2 & 3 - else { - return applyValidation(viewValue); - } - } - } - }; -}]) - -// -// awValidUrl -// -.directive('awValidUrl', [function() { - return { - require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - ctrl.$parsers.unshift(function(viewValue) { - var validity = true, - rgx, rgx2; - if (viewValue !== '') { - ctrl.$setValidity('required', true); - rgx = /^(https|http|ssh)\:\/\//; - rgx2 = /\@/g; - if (!rgx.test(viewValue) || rgx2.test(viewValue)) { - validity = false; - } - } - ctrl.$setValidity('awvalidurl', validity); - - return viewValue; - }); - } - }; -}]) - -/* - * Enable TB tooltips. To add a tooltip to an element, include the following directive in - * the element's attributes: - * - * aw-tool-tip="<< tooltip text here >>" - * - * Include the standard TB data-XXX attributes to controll a tooltip's appearance. We will - * default placement to the left and delay to the config setting. - */ -.directive('awToolTip', ['$transitions', function($transitions) { - return { - link: function(scope, element, attrs) { - var delay = { show: 200, hide: 0 }, - placement, - container, - stateChangeWatcher; - if (attrs.awTipPlacement) { - placement = attrs.awTipPlacement; - } else { - placement = (attrs.placement !== undefined && attrs.placement !== null) ? attrs.placement : 'left'; - } - - container = attrs.container ? attrs.container : 'body'; - - var template; - - let tooltipInnerClass = (attrs.tooltipInnerClass || attrs.tooltipinnerclass) ? (attrs.tooltipInnerClass || attrs.tooltipinnerclass) : ''; - let tooltipOuterClass = attrs.tooltipOuterClass ? attrs.tooltipOuterClass : ''; - - template = ''; - - // This block helps clean up tooltips that may get orphaned by a click event - $(element).on('mouseenter', function(event) { - - var elem = $(event.target).parent(); - if (elem[0].nodeName === "SOURCE-SUMMARY-POPOVER") { - $('.popover').popover('hide'); - } - - if (stateChangeWatcher) { - // Un-bind - we don't want a bunch of listeners firing - stateChangeWatcher(); - } - - stateChangeWatcher = $transitions.onStart({}, function() { - // Go ahead and force the tooltip setTimeout to expire (if it hasn't already fired) - $(element).tooltip('hide'); - // Clean up any existing tooltips including this one - $('.tooltip').each(function() { - $(this).remove(); - }); - }); - }); - - $(element).on('hidden.bs.tooltip', function() { - // TB3RC1 is leaving behind tooltip
elements. This will remove them - // after a tooltip fades away. If not, they lay overtop of other elements and - // honk up the page. - $('.tooltip').each(function() { - $(this).remove(); - }); - }); - - $(element).tooltip({ - placement: placement, - delay: delay, - html: true, - title: attrs.awToolTip, - container: container, - trigger: 'hover', - template: template, - boundary: 'window' - }); - - if (attrs.tipWatch) { - // Add dataTipWatch: 'variable_name' - scope.$watch(attrs.tipWatch, function(newVal) { - // Where did fixTitle come from?: - // http://stackoverflow.com/questions/9501921/change-twitter-bootstrap-tooltip-content-on-click - $(element).tooltip('hide').attr('data-original-title', newVal).tooltip('_fixTitle'); - }); - } - } - }; -}]) - -/* - * Enable TB pop-overs. To add a pop-over to an element, include the following directive in - * the element's attributes: - * - * aw-pop-over="<< pop-over html here >>" - * - * Include the standard TB data-XXX attributes to controll the pop-over's appearance. We will - * default placement to the left, delay to 0 seconds, content type to HTML, and title to 'Help'. - */ -.directive('awPopOver', ['$compile', function($compile) { - return function(scope, element, attrs) { - var placement = (attrs.placement !== undefined && attrs.placement !== null) ? attrs.placement : 'left', - title = (attrs.overTitle) ? attrs.overTitle : (attrs.popoverTitle) ? attrs.popoverTitle : 'Help', - container = (attrs.container !== undefined) ? attrs.container : false, - trigger = (attrs.trigger !== undefined) ? attrs.trigger : 'manual', - template = '', - id_to_close = ""; - - if (element[0].id) { - template = ''; - } - - scope.triggerPopover = function(e) { - showPopover(e); - }; - - if (attrs.awPopOverWatch) { - $(element).popover({ - placement: placement, - delay: 0, - title: title, - content: function() { - return _.get(scope, attrs.awPopOverWatch); - }, - trigger: trigger, - html: true, - container: container, - template: template - }); - } else { - $(element).popover({ - placement: placement, - delay: 0, - title: title, - content: attrs.awPopOver, - trigger: trigger, - html: true, - container: container, - template: template - }); - } - $(element).attr('tabindex', -1); - - $(element).one('click', showPopover); - - function bindPopoverDismiss() { - $('body').one('click.popover' + id_to_close, function(e) { - if ($(e.target).parents(id_to_close).length === 0) { - // case: you clicked to open the popover and then you - // clicked outside of it...hide it. - $(element).popover('hide'); - } else { - // case: you clicked to open the popover and then you - // clicked inside the popover - bindPopoverDismiss(); - } - }); - } - - $(element).on('shown.bs.popover', function() { - bindPopoverDismiss(); - $(document).on('keydown.popover', dismissOnEsc); - }); - - $(element).on('hidden.bs.popover', function() { - $(element).off('click', dismissPopover); - $(element).off('click', showPopover); - $('body').off('click.popover.' + id_to_close); - $(element).one('click', showPopover); - $(document).off('keydown.popover', dismissOnEsc); - }); - - function showPopover(e) { - e.stopPropagation(); - - var self = $(element); - - // remove tool-tip - try { - element.tooltip('hide'); - } catch (ex) { - // ignore - } - - // this is called on the help-link (over and over again) - $('.help-link, .help-link-white').each(function() { - if (self.attr('id') !== $(this).attr('id')) { - try { - // not sure what this does different than the method above - $(this).popover('hide'); - } catch (e) { - // ignore - } - } - }); - - $('.popover').each(function() { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - $(this).remove(); - }); - $('.tooltip').each(function() { - // close any lingering tool tips - $(this).hide(); - }); - - // set id_to_close of the actual open element - id_to_close = "#" + $(element).attr('id') + "_popover_container"; - - // $(element).one('click', dismissPopover); - - $(element).popover('toggle'); - - $('.popover').each(function() { - $compile($(this))(scope); //make nested directives work! - }); - } - - function dismissPopover(e) { - e.stopPropagation(); - $(element).popover('hide'); - } - - function dismissOnEsc(e) { - if (e.keyCode === 27) { - $(element).popover('hide'); - $('.popover').each(function() { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - // $(this).remove(); - }); - } - } - - }; -}]) - -// -// Enable jqueryui slider widget on a numeric input field -// -// -// -.directive('awSlider', [function() { - return { - require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - var name = elm.attr('name'); - $('#' + name + '-slider').slider({ - value: 0, - step: 1, - min: elm.attr('min'), - max: elm.attr('max'), - disabled: (elm.attr('readonly')) ? true : false, - slide: function(e, u) { - ctrl.$setViewValue(u.value); - ctrl.$setValidity('required', true); - ctrl.$setValidity('min', true); - ctrl.$setValidity('max', true); - ctrl.$dirty = true; - ctrl.$render(); - if (!scope.$$phase) { - scope.$digest(); - } - } - }); - - $('#' + name + '-number').change(function() { - $('#' + name + '-slider').slider('value', parseInt($(this).val(), 10)); - }); - - } - }; -}]) - -// -// Enable jqueryui spinner widget on a numeric input field -// -// -// -.directive('awSpinner', [function() { - return { - require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - var disabled, opts; - disabled = elm.attr('data-disabled'); - opts = { - value: 0, - step: 1, - min: elm.attr('min'), - max: elm.attr('max'), - numberFormat: "d", - disabled: (elm.attr('readonly')) ? true : false, - icons: { - down: "Form-numberInputButton fa fa-angle-down", - up: "Form-numberInputButton fa fa-angle-up" - }, - spin: function(e, u) { - if (e.originalEvent && e.originalEvent.type === 'mousewheel') { - e.preventDefault(); - } else { - ctrl.$setViewValue(u.value); - ctrl.$setValidity('required', true); - ctrl.$setValidity('min', true); - ctrl.$setValidity('max', true); - ctrl.$dirty = true; - ctrl.$render(); - if (scope.job_template_form) { - // need a way to find the parent form and mark it dirty - scope.job_template_form.$dirty = true; - } - if (!scope.$$phase) { - scope.$digest(); - } - } - } - }; - - // hack to get ngDisabled to work - if (attrs.ngDisabled) { - scope.$watch(attrs.ngDisabled, function(val) { - opts.disabled = (val === true) ? true : false; - $(elm).spinner(opts); - }); - } - - if (disabled) { - opts.disabled = true; - } - $(elm).spinner(opts); - $('.ui-icon').text(''); - $(".ui-icon").removeClass('ui-icon ui-icon-triangle-1-n ui-icon-triangle-1-s'); - $(elm).on("click", function() { - $(elm).select(); - }); - } - }; -}]) - -/* - * Make an element draggable. Used on inventory groups tree. - * - * awDraggable: boolean || {{ expression }} - * - */ -.directive('awDraggable', [function() { - return function(scope, element, attrs) { - - if (attrs.awDraggable === "true") { - var containment = attrs.containment; //provide dataContainment:"#id" - $(element).draggable({ - containment: containment, - scroll: true, - revert: "invalid", - helper: "clone", - start: function(e, ui) { - ui.helper.addClass('draggable-clone'); - }, - zIndex: 100, - cursorAt: { left: -1 } - }); - } - }; -}]) - -// Toggle switch inspired by http://www.bootply.com/92189 -.directive('awToggleButton', [function() { - return function(scope, element) { - $(element).click(function() { - var next, choice; - $(this).find('.btn').toggleClass('active'); - if ($(this).find('.btn-primary').size() > 0) { - $(this).find('.btn').toggleClass('btn-primary'); - } - if ($(this).find('.btn-danger').size() > 0) { - $(this).find('.btn').toggleClass('btn-danger'); - } - if ($(this).find('.btn-success').size() > 0) { - $(this).find('.btn').toggleClass('btn-success'); - } - if ($(this).find('.btn-info').size() > 0) { - $(this).find('.btn').toggleClass('btn-info'); - } - $(this).find('.btn').toggleClass('btn-default'); - - // Add data-after-toggle="functionName" to the btn-group, and we'll - // execute here. The newly active choice is passed as a parameter. - if ($(this).attr('data-after-toggle')) { - next = $(this).attr('data-after-toggle'); - choice = $(this).find('.active').text(); - setTimeout(function() { - scope.$apply(function() { - scope[next](choice); - }); - }); - } - - }); - }; -}]) - -// -// Support dropping files on an element. Used on credentials page for SSH/RSA private keys -// Inspired by https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications -// -.directive('awDropFile', ['Alert', function(Alert) { - return { - require: 'ngModel', - link: function(scope, element, attrs, ctrl) { - $(element).on('dragenter', function(e) { - e.stopPropagation(); - e.preventDefault(); - }); - $(element).on('dragover', function(e) { - e.stopPropagation(); - e.preventDefault(); - }); - $(element).on('drop', function(e) { - var dt, files, reader; - e.stopPropagation(); - e.preventDefault(); - dt = e.originalEvent.dataTransfer; - files = dt.files; - reader = new FileReader(); - reader.onload = function() { - ctrl.$setViewValue(reader.result); - ctrl.$render(); - ctrl.$setValidity('required', true); - ctrl.$dirty = true; - if (!scope.$$phase) { - scope.$digest(); - } - }; - reader.onerror = function() { - Alert('Error', 'There was an error reading the selected file.'); - }; - if (files[0].size < 10000) { - reader.readAsText(files[0]); - } else { - Alert('Error', 'There was an error reading the selected file.'); - } - }); - } - }; -}]) - -.directive('awPasswordToggle', [function() { - return { - restrict: 'A', - link: function(scope, element) { - $(element).click(function() { - var buttonInnerHTML = $(element).html(); - if (buttonInnerHTML.indexOf("Show") > -1) { - $(element).html("Hide"); - $(element).closest('.input-group').find('input').first().attr("type", "text"); - } else { - $(element).html("Show"); - $(element).closest('.input-group').find('input').first().attr("type", "password"); - } - }); - } - }; -}]) - -.directive('awEnterKey', [function() { - return { - restrict: 'A', - link: function(scope, element, attrs) { - element.bind("keydown keypress", function(event) { - var keyCode = event.which || event.keyCode; - if (keyCode === 13) { - scope.$apply(function() { - scope.$eval(attrs.awEnterKey); - }); - event.preventDefault(); - } - }); - } - }; -}]) - -.directive('awTruncateBreadcrumb', ['BreadCrumbService', function(BreadCrumbService) { - return { - restrict: 'A', - scope: { - breadcrumbStep: '=' - }, - link: function(scope) { - scope.$watch('breadcrumbStep.ncyBreadcrumbLabel', function(){ - BreadCrumbService.truncateCrumbs(); - }); - } - }; -}]) - -.directive('awRequireMultiple', ['Empty', function(Empty) { - return { - require: 'ngModel', - link: function postLink(scope, element, attrs, ngModel) { - // Watch for changes to the required attribute - attrs.$observe('required', function() { - ngModel.$validate(); - }); - - ngModel.$validators.multipleSelect = function (modelValue) { - if(attrs.required) { - if(angular.isArray(modelValue)) { - // Checks to make sure at least one value in the array - return _.some(modelValue, function(arrayVal) { - return !Empty(arrayVal); - }); - } else { - return !Empty(modelValue); - } - } else { - return true; - } - }; - } - }; -}]); diff --git a/awx/ui/client/src/shared/download-standard-out.block.less b/awx/ui/client/src/shared/download-standard-out.block.less deleted file mode 100644 index 0efdb3001a..0000000000 --- a/awx/ui/client/src/shared/download-standard-out.block.less +++ /dev/null @@ -1,28 +0,0 @@ -/** @define DownloadStandardOut */ - -.DownloadStandardOut { - color: @default-bg !important; -} - -.DownloadStandardOut--onStandardOutPage { - margin-top: -3px; - margin-right: -9px; - float: right; -} - -.DownloadStandardOut--onModal { - margin-bottom: 10px; - float: right; -} - -.DownloadStandardOut-icon { - color: @default-bg; -} - -.DownloadStandardOut-icon--withText { - margin-right: 5px; -} - -.DownloadStandardOut-pre { - width: 100%; -} diff --git a/awx/ui/client/src/shared/filters/append.filter.js b/awx/ui/client/src/shared/filters/append.filter.js deleted file mode 100644 index 1493cf5997..0000000000 --- a/awx/ui/client/src/shared/filters/append.filter.js +++ /dev/null @@ -1,15 +0,0 @@ -export default function() { - return function(string, append) { - if (string) { - if (append) { - return string + append; - } - else { - return string; - } - } - else { - return ""; - } - }; -} diff --git a/awx/ui/client/src/shared/filters/capitalize.filter.js b/awx/ui/client/src/shared/filters/capitalize.filter.js deleted file mode 100644 index 859dd367e1..0000000000 --- a/awx/ui/client/src/shared/filters/capitalize.filter.js +++ /dev/null @@ -1,12 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default [function() { - return function(input) { - input = input.charAt(0).toUpperCase() + input.substr(1).toLowerCase(); - return input; - }; - }]; diff --git a/awx/ui/client/src/shared/filters/format-epoch.filter.js b/awx/ui/client/src/shared/filters/format-epoch.filter.js deleted file mode 100644 index 9d8fee351f..0000000000 --- a/awx/ui/client/src/shared/filters/format-epoch.filter.js +++ /dev/null @@ -1,14 +0,0 @@ -export default -[ 'moment', - function(moment) { - return function(seconds, formatStr) { - if (!formatStr) { - formatStr = 'll LT'; - } - - var millis = seconds * 1000; - - return moment(millis).format(formatStr); - }; - } -]; diff --git a/awx/ui/client/src/shared/filters/is-empty.filter.js b/awx/ui/client/src/shared/filters/is-empty.filter.js deleted file mode 100644 index a0ece767f1..0000000000 --- a/awx/ui/client/src/shared/filters/is-empty.filter.js +++ /dev/null @@ -1,17 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default function() { - return function (obj) { - var key; - for (key in obj) { - if (obj.hasOwnProperty(key)) { - return false; - } - } - return true; - }; - } diff --git a/awx/ui/client/src/shared/filters/long-date.filter.js b/awx/ui/client/src/shared/filters/long-date.filter.js deleted file mode 100644 index f2d058e3b2..0000000000 --- a/awx/ui/client/src/shared/filters/long-date.filter.js +++ /dev/null @@ -1,17 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default ['moment', function(moment) { - return function(input) { - var date; - if(input === null || input === undefined){ - return ""; - }else { - date = moment(input); - return date.format('l LTS'); - } - }; - }]; diff --git a/awx/ui/client/src/shared/filters/main.js b/awx/ui/client/src/shared/filters/main.js deleted file mode 100644 index 2298bb0723..0000000000 --- a/awx/ui/client/src/shared/filters/main.js +++ /dev/null @@ -1,17 +0,0 @@ -import prepend from './prepend.filter'; -import append from './append.filter'; -import isEmpty from './is-empty.filter'; -import capitalize from './capitalize.filter'; -import longDate from './long-date.filter'; -import sanitize from './xss-sanitizer.filter'; -import formatEpoch from './format-epoch.filter'; - -export default - angular.module('stringFilters', []) - .filter('prepend', prepend) - .filter('append', append) - .filter('isEmpty', isEmpty) - .filter('capitalize', capitalize) - .filter('longDate', longDate) - .filter('sanitize', sanitize) - .filter('formatEpoch', formatEpoch); diff --git a/awx/ui/client/src/shared/filters/prepend.filter.js b/awx/ui/client/src/shared/filters/prepend.filter.js deleted file mode 100644 index 93bad2889d..0000000000 --- a/awx/ui/client/src/shared/filters/prepend.filter.js +++ /dev/null @@ -1,15 +0,0 @@ -export default function() { - return function(string, prepend) { - if (string) { - if(prepend) { - return prepend + string; - } - else { - return string; - } - } - else { - return ""; - } - }; -} diff --git a/awx/ui/client/src/shared/filters/xss-sanitizer.filter.js b/awx/ui/client/src/shared/filters/xss-sanitizer.filter.js deleted file mode 100644 index ef1c16d32d..0000000000 --- a/awx/ui/client/src/shared/filters/xss-sanitizer.filter.js +++ /dev/null @@ -1,12 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default [function() { - return function(input) { - input = $("").text(input)[0].innerHTML; - return input; - }; - }]; diff --git a/awx/ui/client/src/shared/form-generator.js b/awx/ui/client/src/shared/form-generator.js deleted file mode 100644 index fca3a419f2..0000000000 --- a/awx/ui/client/src/shared/form-generator.js +++ /dev/null @@ -1,1970 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - - /** - * @ngdoc function - * @name shared.function:form-generator - * @description - * - * Generate form HTML from a form object. Form objects are found in /forms. - * - * #Generate and Inject Form - * - * To generate a form and inject it into the DOM the default method call is: - * - * ``` - * GenerateForm.inject(form, { mode: 'edit', related: true, scope: $scope}); - * ``` - * Expects 2 parameters where the first is a reference to a form object, and the second is an object of key/value parameter pairs. Returns the $scope object associated with the generated HTML. - * - * Parameters that can be passed: - * - * | Parameter | Required | Description | - * | --------- | -------- | ----------- | - * | html | | String of HTML to be injected. Overrides HTML that would otherwise be generated using the form object. (Not sure if this is actually used anywhere.) | - * | id | | The ID attribute value of the DOM elment that will receive the generated HTML. If provided, form generator will inject the HTML it genertates into the DOM element identified by the string value provided. Do not preceed the value with '#' | - * | mode | Y | 'add', 'edit' or 'modal'. Use add when creating new data - creating a new orgranization, for example. Use edit when modifying existing data. Modal is deprecated. Use the 'id' option to inject a form into a modal dialog. | - * | scope | | Reference to $scope object. Will be passed to $compile and associated with any angular directives contained within the generated HTML. | - * | showButtons | | true or false. If false, buttons defined in the buttons object will not be included in the generated HTML. | - * - * #Generate HTML Only - * - * To generate the HTML only and not inject it into the DOM use the buildHTML() method: - * - * ``` - * GenerateForm.buildHTML(JobVarsPromptForm, { mode: 'edit', modal: true, scope: scope }); - * ``` - * - * Pass the same parameters as above. Returns a string containing the generated HTML. - * - * #Reset Form - * - * Call GenerateFrom.reset() to clear user input, remove error messages and return the angular form object back to a pristine state. This is should be called when the user clicks the Reset button. - * - * #Form definitions - * - * See forms/*.js for examples. - * - * The form object can have the following attributes: - * - * | Attribute | Description | - * | --------- | ----------- | - * | collapse | true or false. If true, places the form inside a jQueryUI accordion | - * | collapseMode | 'add' or 'edit'. If the value of the mode parameter passed into .inject() or .buildHTML() matches collapseMode, the <form> will be placed in an accordion. | - * | collapseOpen | true or false. If true, the accordion will be open the first time the user views the form, or if no state information is found in local storage for the accordion. Subsequent views will depend on accordion state found in local storage. Each time user opens/closes an accordion the state is saved in local storage. | - * | collapseOpenFirst | true or false. If true, the collapse will be open everytime the accordion is viewed, regardless of state data found in local storage. | - * | collapseTitle | Text to use in the <h3> element of the accordion. Typically this will be 'Properties' | - * | name | Name to give the form object. Used to create the id and name attribute values in the
element. | - * | showActions | true or false. By default actions found in the actions object will be displayed at the top of the page. If set to false, actions will not be displayed. | - * | twoColumns | true or false. By default fields are placed in a single vertical column following the Basic Example in the [Bootstrap form documentation](http://getbootstrap.com/css/#forms). Set to true for a 2 column layout as seen on the Job Templates detail page.| - * | well | true or false. If true, wraps the with <div class="aw-form-well"></div> | - * - * The form object will contain a fields object to hold the definiation of each field in the form. Attributes on a field object determine the HTML generated for the actual <input> or <textarea> element. Fields can have the following attributes: - * - * | Attribute | Description | - * | --------- | ----------- | - * | awPopOver | Adds aw-pop-over directive. Set to a string containing the text or html to be evaluated by the directive. | - * | awPopOverWatch | Causes the awPopOver directive to add a $scope.$watch on the specified scop variable. When the value of the variable changes the popover text will be updated with the change. | - * | awRequiredWhen | Adds aw-required-when directive. Set to an object to be evaluated by the directive. | - * | capitalize | true or false. If true, apply the 'capitalize' filter to the field. | - * | class | String cotaining one or more CSS class values. | - * | column | If the twoColumn option is being used, supply an integer value of 1 or 2 representing the column in which to place the field. 1 places the field in the left column, and 2 places it on the right. | - * | dataContainer | Used with awPopOver. String providing the containment parameter. | - * | dataPlacement | Used with awPopOver and awToolTip. String providing the placement parameter (i.e. left, right, top, bottom, etc.). | - * | dataTitle | Used with awPopOver. String value for the title of the popover. | - * | default | Default value to place in the field when the form is in 'add' mode. | - * | defaultText | Default value to put into a select input. | - * | falseValue | For radio buttons and checkboxes. Value to set the model to when the checkbox or radio button is not selected. | - * | genHash | true or false. If true, places the field in an input group with a button that when clicked replaces the field contents with a hash as key. Used with host_config_key on the job templates detail page. | - * | integer | Adds the integer directive to validate that the value entered is of type integer. Add min and max to supply lower and upper range bounds to the entered value. | - * | label | Text to use as <label> element for the field | - * | ngChange | Adds ng-change directive. Set to the JS expression to be evaluated by ng-change. | - * | ngClick | Adds ng-click directive. Set to the JS expression to be evaluated by ng-click. | - * | ngHide | Adds ng-hide directive. Set to the JS expression to be evaluated by ng-hide. | - * | ngShow | Adds ng-show directive. Set to the JS expression to be evaluated by ng-show. | - - * | readonly | Defaults to false. When true the readonly attribute is set, disallowing changes to field content. | - * | required | boolean. Adds required flag to form field | - * | rows | Integer value used to set the row attribute for a textarea. | - * | sourceModel | Used in conjunction with sourceField when the data for the field is part of the summary_fields object returned by the API. Set to the name of the summary_fields object that contains the field. For example, the job_templates object returned by the API contains summary_fields.inventory. | - * | sourceField | String containing the summary_field.object.field name from the API summary_field object. For example, if a fields should be associated to the summary_fields.inventory.name, set the sourceModel to 'inventory' and the sourceField to 'name'. | - * | spinner | true or false. If true, adds aw-spinner directive. Optionally add min and max attributes to control the range of allowed values. | - * | type | String containing one of the following types defined in buildField: alertblock, hidden, text, password, email, textarea, select, number, checkbox, checkbox_group, radio, lookup, custom. | - * | trueValue | For radio buttons and checkboxes. Value to set the model to when the checkbox or radio button is selected. | - * | hasShowInputButton (sensitive type only) | This creates a button next to the input that toggles the input as text and password types. | - * The form object contains a buttons object for defining any buttons to be included in the generated HTML. Generally all forms will have a Reset and a Submit button. If no buttons should be generated define buttons as an empty object, or set the showButtons option to false. - * - * The icon used for the button is determined by SelectIcon() found in js/shared/generator-helpers.js. - * - * | Attribute | Description | - * | --------- | ----------- | - * | class | If the name of the button is reset or save, the class is automatically set to the correct bootstrap btn class for the color. Otherwise, provide a string with any classes to be added to the <button> element. | - * | label | For reset and save buttons the label is automatically set. For other types of buttons set label to the text string that should appear in the button. | - * | ngClick | Adds the ng-click directive to the button. Set to the JS expression for the ng-click directive to evaluate. | - * | ngDisabled | Only partially implemented at this point. For buttons other than reset, the ng-disabled directive is always added. The button will be disabled when the form is in an invalid state. | - * - * The form object may contain an actions object. The action object can contain one or more button definitions for buttons to appear in the top-right corner of the form. This may include activity stream, refresh, properties, etc. Each button object defined in actions may have the following attributes: - * - * | Attribute | Description | - * | --------- | ----------- | - * | awToolTip | Text or html to display in the button tooltip. Adds the aw-tool-tip directive. | - * | class | Optional classes to add to the <button> element. | - * | dataPlacement | Set the placement attribute of the tooltip - left, right, top, bottom, etc. | - * | ngClick | Set to the JS expression to be evaluated by the ng-click directive. | - * | mode | Set to edit or add, depending on which mode the button | - * | - * - * The form object may contain a related object. The related object contains one or more list objects defining sublists to display in accordions. For example, the Organization form contains a related users list and admins list. - * - * As originally conceived sublists were stored inside the form definition without regard to any list definitions found in the lists folder. In other words, lists/Users.js is completely different from the related.users object found in forms/Organizations.js. In reality they - * are very similar and lists/Users.js should be used to generate the users sublist on the organizations detail page. - * - * One approach to making this work and using list definintion inside a from was implemented in forms/JobTemplates.js. In controllers/JobTemplates.js within JobTemplatesEdit() the form object is created by calling the JobTemplateForm() method found in forms/JobTemplates.js. The - * method injects the SchedulesList and CompletedJobsList into the form object as related sets. Going forward this approach or similar should be used whenever a sublist needs to be added to a form. - * - * #Variable editing - * - * If the field type is textarea and the name is one of variables, extra_vars, inventory_variables or source_vars, then the parse type radio button group is added. This is the radio button group allowing the user to switch between JSON and YAML. - * - * Applying CodeMirror to the text area is handled by ParseTypeChange() found in helpers/Parse.js. Within the controller will be a call to ParseTypeChange that creates the CodeMirror object and sets up the required $scope methods for handles getting, setting and type conversion. - */ - -import GeneratorHelpers from './generator-helpers'; -import listGenerator from './list-generator/main'; - -export default -angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerator.name]) - -.factory('GenerateForm', ['$rootScope', '$compile', 'generateList', - 'Attr', 'Icon', 'Column', - 'NavigationLink', 'Empty', 'SelectIcon', - 'ActionButton', 'MessageBar', '$log', 'i18n', - function ($rootScope, $compile, GenerateList, - Attr, Icon, Column, NavigationLink, - Empty, SelectIcon, ActionButton, MessageBar, $log, i18n) { - return { - - setForm: function (form) { this.form = form; }, - - attr: Attr, - - icon: Icon, - - accordion_count: 0, - - scope: null, - - has: function (key) { - return (this.form[key] && this.form[key] !== null && this.form[key] !== undefined) ? true : false; - }, - // Not a very good way to do this - // Form sub-states expect to target ui-views related@stateName & modal@stateName - // Also wraps mess of generated HTML in a .card and at-Panel - wrapPanel(html, ignorePanel){ - if(ignorePanel) { - return ` -
- ${html} -
-
-
`; - } - else { - return ` - ${MessageBar(this.form)} -
- ${html} -
-
-
`; - } - }, - - inject: function (form, options) { - // - // Use to inject the form as html into the view. View MUST have an ng-bind for 'htmlTemplate'. - // Returns scope of form. - // - - var element, fld, set, show, self = this; - - if (options.modal) { - if (options.modal_body_id) { - element = angular.element(document.getElementById(options.modal_body_id)); - } else { - // use default dialog - element = angular.element(document.getElementById('form-modal-body')); - } - } else { - if (options.id) { - element = angular.element(document.getElementById(options.id)); - } else { - element = angular.element(document.getElementById('htmlTemplate')); - } - } - - this.mode = options.mode; - this.modal = (options.modal) ? true : false; - this.setForm(form); - - if (options.html) { - element.html(options.html); - } else { - element.html(this.build(options)); - } - - if (options.scope) { - this.scope = options.scope; - } else { - this.scope = element.scope(); - } - - if (options.mode) { - this.scope.mode = options.mode; - } - - if(options.mode === 'edit' && this.form.related && - !_.isEmpty(this.form.related)){ - var tabs = [this.form.name], that = this; - tabs.push(Object.keys(this.form.related)); - tabs = _.flatten(tabs); - _.map(tabs, function(itm){ - that.scope.$parent[itm+"Selected"] = false; - }); - this.scope.$parent[this.form.name+"Selected"] = true; - - - this.scope.$parent.toggleFormTabs = function($event){ - _.map(tabs, function(itm){ - that.scope.$parent[itm+"Selected"] = false; - }); - that.scope.$parent[$event.target.id.split('_tab')[0]+"Selected"] = true; - }; - - } - - for (fld in form.fields) { - this.scope[fld + '_field'] = form.fields[fld]; - this.scope[fld + '_field'].name = fld; - } - - for (fld in form.headerFields){ - this.scope[fld + '_field'] = form.headerFields[fld]; - this.scope[fld + '_field'].name = fld; - } - - $compile(element)(this.scope); - - if (!options.html) { - // Reset the scope to prevent displaying old data from our last visit to this form - for (fld in form.fields) { - this.scope[fld] = null; - } - for (set in form.related) { - this.scope[set] = null; - } - // if (((!options.modal) && options.related) || this.form.forceListeners) { - // this.addListeners(); - // } - if (options.mode === 'add') { - this.applyDefaults(form, this.scope); - } - } - - // Remove any lingering tooltip and popover
elements - $('.tooltip').each(function () { - $(this).remove(); - }); - - $('.popover').each(function () { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - $(this).remove(); - }); - - try { - $('#help-modal').empty().dialog('destroy'); - } catch (e) { - //ignore any errors should the dialog not be initialized - } - - if (options.modal) { - $rootScope.flashMessage = null; - this.scope.formModalActionDisabled = false; - this.scope.formModalInfo = false; //Disable info button for default modal - if (form) { - if (options.modal_title_id) { - this.scope[options.modal_title_id] = (options.mode === 'add') ? form.addTitle : form.editTitle; - } else { - this.scope.formModalHeader = (options.mode === 'add') ? form.addTitle : form.editTitle; //Default title for default modal - } - } - if (options.modal_selector) { - $(options.modal_selector).modal({ - show: true, - backdrop: 'static', - keyboard: true - }); - $(options.modal_selector).on('shown.bs.modal', function () { - $(options.modal_select + ' input:first').focus(); - }); - $(options.modal_selector).on('hidden.bs.modal', function () { - $('.tooltip').each(function () { - // Remove any lingering tooltip and popover
elements - $(this).remove(); - }); - - $('.popover').each(function () { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - $(this).remove(); - }); - }); - } else { - show = (options.show_modal === false) ? false : true; - $('#form-modal').modal({ - show: show, - backdrop: 'static', - keyboard: true - }); - $('#form-modal').on('shown.bs.modal', function () { - $('#form-modal input:first').focus(); - }); - $('#form-modal').on('hidden.bs.modal', function () { - $('.tooltip').each(function () { - // Remove any lingering tooltip and popover
elements - $(this).remove(); - }); - - $('.popover').each(function () { - // remove lingering popover
. Seems to be a bug in TB3 RC1 - $(this).remove(); - }); - }); - } - $(document).bind('keydown', function (e) { - if (e.keyCode === 27) { - if (options.modal_selector) { - $(options.modal_selector).modal('hide'); - } - $('#prompt-modal').modal('hide'); - $('#form-modal').modal('hide'); - } - }); - } - - if (self.scope && !self.scope.$$phase) { - setTimeout(function() { - if (self.scope) { - self.scope.$digest(); - } - }, 100); - } - - return self.scope; - - }, - - buildHTML: function(form, options) { - // Get HTML without actually injecting into DOM. Caller is responsible for any injection. - // Example: - // html = GenerateForm.buildHTML(JobVarsPromptForm, { mode: 'edit', modal: true, scope: scope }); - - this.mode = options.mode; - //this.modal = (options.modal) ? true : false; - this.setForm(form); - return this.build(options); - }, - - applyDefaults: function (form, scope, ignoreMode) { - if(!ignoreMode) { - // Note: This is a hack. Ideally, mode should be set in each -.controller.js - // The mode is needed by the awlookup directive to auto-populate form fields when there is a - // single related resource. - scope.mode = this.mode; - } - - for (var fld in form.fields) { - if (form.fields[fld]['default'] || form.fields[fld]['default'] === 0) { - if (form.fields[fld].type === 'select' && scope[fld + '_options']) { - scope[fld] = scope[fld + '_options'][form.fields[fld]['default']]; - } else { - scope[fld] = form.fields[fld]['default']; - } - } - } - }, - - reset: function () { - // The form field values cannot be reset with jQuery. Each field is tied to a model, so to clear the field - // value, you have to clear the model. - - var fld, scope = this.scope, - form = this.form; - - if (scope[form.name + '_form']) { - scope[form.name + '_form'].$setPristine(); - } - - function resetField(f, fld) { - // f is the field object, fld is the key - - if (f.type === 'checkbox_group') { - for (var i = 0; i < f.fields.length; i++) { - scope[f.fields[i].name] = ''; - scope[f.fields[i].name + '_api_error'] = ''; - scope[form.name + '_form'][f.fields[i].name].$setValidity('apiError', true); - } - } else { - scope[fld] = ''; - scope[fld + '_api_error'] = ''; - } - if (f.sourceModel) { - scope[f.sourceModel + '_' + f.sourceField] = ''; - scope[f.sourceModel + '_' + f.sourceField + '_api_error'] = ''; - if (scope[form.name + '_form'][f.sourceModel + '_' + f.sourceField]) { - scope[form.name + '_form'][f.sourceModel + '_' + f.sourceField].$setValidity('apiError', true); - } - } - if (f.type === 'lookup' && scope[form.name + '_form'][f.sourceModel + '_' + f.sourceField]) { - scope[form.name + '_form'][f.sourceModel + '_' + f.sourceField].$setPristine(); - scope[form.name + '_form'][f.sourceModel + '_' + f.sourceField].$setValidity('apiError', true); - } - if (scope[form.name + '_form'][fld]) { - scope[form.name + '_form'][fld].$setPristine(); - scope[form.name + '_form'][fld].$setValidity('apiError', true); - } - if (f.awPassMatch && scope[form.name + '_form'][fld]) { - scope[form.name + '_form'][fld].$setValidity('awpassmatch', true); - } - if (f.subCheckbox) { - scope[f.subCheckbox.variable] = false; - } - } - - for (fld in form.fields) { - resetField(form.fields[fld], fld); - } - if (form.statusFields) { - for (fld in form.statusFields) { - resetField(form.statusFields[fld], fld); - } - } - if (this.mode === 'add') { - this.applyDefaults(form, scope); - } - }, - - checkAutoFill: function(params) { - var fld, model, newVal, type, - scope = (params && params.scope) ? params.scope : this.scope; - for (fld in this.form.fields) { - if (this.form.fields[fld].type === 'text' || this.form.fields[fld].type === 'textarea') { - type = (this.form.fields[fld].type === 'text') ? 'input' : 'textarea'; - model = scope[this.form.name + '_form'][fld]; - newVal = $(type + '[name="' + fld + '"]').val(); - if (newVal && model && model.$viewValue !== newVal) { - model.$setViewValue(newVal); - } - } - } - }, - - genID: function () { - var id = new Date(); - return id.getTime(); - }, - - headerField: function (fld, field) { - var html = ''; - if (field.label) { - html += "\n"; - } - html += " - -
- `; - } else if (field.type === 'html') { - html += field.html; - } - return html; - }, - - - buildField: function (fld, field, options, form) { - var i, fldWidth, offset, html = '', error_message, - horizontal = (this.form.horizontal) ? true : false; - - function getFieldWidth() { - var x; - if (form.formFieldSize) { - x = form.formFieldSize; - } else if (field.xtraWide) { - x = "col-lg-10"; - } else if (field.column) { - x = "col-lg-8"; - } else if (!form.formFieldSize && options.modal) { - x = "col-lg-10"; - } else { - x = "col-lg-6"; - } - return x; - } - - function getLabelWidth() { - var x; - if (form.formLabelSize) { - x = form.formLabelSize; - } else if (field.column) { - x = "col-lg-4"; - } else if (!form.formLabelSize && options.modal) { - x = "col-lg-2"; - } else { - x = "col-lg-2"; - } - return x; - } - - function buildId(field, fld, form) { - var html = ''; - if (field.id) { - html += Attr(field, 'id'); - } else { - html += "id=\"" + form.name + "_" + fld + "\" "; - } - return html; - } - - function buildCheckbox(form, field, fld, idx) { - var html = ''; - - html += "
"; - html += "${field.label}`; - html += (field.awPopOver) ? Attr(field, 'awPopOver', fld) : ""; - html += `
`; - - return html; - } - - function label(options) { - var html = ''; - if (field.label || field.labelBind) { - html += "\n"; - } - - return html; - } - - if (field.type === 'toggle'){ - html += ` - - - - `; - } - - if (field.type === 'alertblock') { - html += "
\n"; - html += "
\n"; - html += "
×\n" : ""; - html += field.alertTxt; - html += "
\n"; - html += "
\n"; - html += "
\n"; - } - - if ((!field.readonly) || (field.readonly && options.mode === 'edit')) { - - if((field.excludeMode === undefined || field.excludeMode !== options.mode) && field.type !== 'alertblock' && field.type !== 'workflow-chart') { - - html += `
${definedInFileMessage}` : ``; - - // toggle switches - if(field.type === 'toggleSwitch') { - let labelOptions = {}; - - if (field.subCheckbox) { - labelOptions.checkbox = { - id: `${this.form.name}_${fld}_ask_chbox`, - ngModel: field.subCheckbox.variable, - ngShow: field.subCheckbox.ngShow, - ngChange: field.subCheckbox.ngChange, - ngDisabled: field.subCheckbox.ngDisabled || field.ngDisabled, - text: field.subCheckbox.text || '' - }; - } - - html += label(labelOptions); - - html += ` -
- -
-
- `; - } - - //text fields - if (field.type === 'text' || field.type === 'password' || field.type === 'email') { - let labelOptions = {}; - - if (field.subCheckbox) { - labelOptions.checkbox = { - id: `${this.form.name}_${fld}_ask_chbox`, - ngShow: field.subCheckbox.ngShow, - ngChange: field.subCheckbox.ngChange, - ngModel: field.subCheckbox.variable, - ngDisabled: field.subCheckbox.ngDisabled || field.ngDisabled, - text: field.subCheckbox.text || '' - }; - } - - html += label(labelOptions); - - html += "
\n" : ""; - - if (field.control === null || field.control === undefined || field.control) { - html += "\n"; - html += "\n
\n"; - } - - if (field.genHash) { - const defaultGenHashButtonTemplate = ` - - - `; - const genHashButtonTemplate = _.get(field, 'genHashButtonTemplate', defaultGenHashButtonTemplate); - html += `${genHashButtonTemplate}\n
\n`; - } - - // Add error messages - if (field.required || field.awRequiredWhen) { - error_message = i18n._('Please enter a value.'); - html += "
" + (field.requiredErrorMsg ? field.requiredErrorMsg : error_message) + "
\n"; - } - if (field.type === "email") { - error_message = i18n._('Please enter a valid email address.'); - html += "
${error_message}
`; - } - if (field.awPassMatch) { - error_message = i18n._('This value does not match the password you entered previously. Please confirm that password.'); - html += "
${error_message}
`; - } - if (field.awValidUrl) { - error_message = i18n._("Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character."); - html += "
${error_message}
`; - } - - html += "
\n"; - - html += "
\n"; - } - - //fields with sensitive data that needs to be obfuscated from view - if (field.type === 'sensitive') { - field.showInputInnerHTML = i18n._("Show"); - field.inputType = "password"; - - html += "\t" + label(); - if (field.hasShowInputButton) { - var tooltip = i18n._("Toggle the display of plaintext."); - html += "\
\n"; - // TODO: make it so that the button won't show up if the mode is edit, hasShowInputButton !== true, and there are no contents in the field. - html += "\n"; - html += "
\n"; - } - if (field.type === "email") { - error_message = i18n._("Please enter a valid email address."); - html += "
${error_message}
`; - } - if (field.awPassMatch) { - error_message = i18n._("This value does not match the password you entered previously. Please confirm that password."); - html += "
${error_message}
`; - } - if (field.awValidUrl) { - error_message = i18n._("Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character."); - html += "
${error_message}
`; - } - - html += "
\n
\n"; - } - - //textarea fields - if (field.type === 'textarea') { - let labelOptions = {}; - - if (field.subCheckbox) { - labelOptions.checkbox = { - id: `${this.form.name}_${fld}_ask_chbox`, - ngModel: field.subCheckbox.variable, - ngShow: field.subCheckbox.ngShow, - ngChange: field.subCheckbox.ngChange, - ngDisabled: field.subCheckbox.ngDisabled || field.ngDisabled, - text: field.subCheckbox.text || '' - }; - } - - html += label(labelOptions); - - html += "
" + (field.requiredErrorMsg ? field.requiredErrorMsg : i18n._("Please enter a value.")) + "
\n"; - } - html += "
\n"; - html += "
\n"; - } - - //select field - if (field.type === 'select') { - let labelOptions = {}; - - if (field.subCheckbox) { - labelOptions.checkbox = { - id: `${this.form.name}_${fld}_ask_chbox`, - ngShow: field.subCheckbox.ngShow, - ngModel: field.subCheckbox.variable, - ngChange: field.subCheckbox.ngChange, - ngDisabled: field.subCheckbox.ngDisabled || field.ngDisabled, - text: field.subCheckbox.text - }; - } - - if (field.onError) { - labelOptions.onError = { - id: `${this.form.name}_${fld}_error_text`, - ngShow: field.onError.ngShow, - ngModel: field.onError.variable, - text: field.onError.text - }; - } - - html += label(labelOptions); - - html += "
\n"; - html += "\n"; - html += "
\n"; - - // Add error messages - if (field.required || field.awRequiredWhen) { - html += "
" + (field.requiredErrorMsg ? field.requiredErrorMsg : i18n._("Please select a value.")); - if (field.includePlaybookNotFoundError) { - html += " Playbook {{ job_template_obj.playbook }} not found for project.\n"; - } - html += "
\n"; - } - if (field.label === "Labels") { - html += `
${field.onError.text}
`; - } - html += "
\n"; - - - html += "
\n"; - } - - //number field - if (field.type === 'number') { - let labelOptions = {}; - - if (field.subCheckbox) { - labelOptions.checkbox = { - id: `${this.form.name}_${fld}_ask_chbox`, - ngShow: field.subCheckbox.ngShow, - ngChange: field.subCheckbox.ngChange, - ngModel: field.subCheckbox.variable, - ngDisabled: field.subCheckbox.ngDisabled || field.ngDisabled, - text: field.subCheckbox.text || '' - }; - } - - html += label(labelOptions); - - html += "
" + (field.requiredErrorMsg ? field.requiredErrorMsg : i18n._("Please select a value.")) + "
\n"; - } - if (field.integer) { - html += "
" + i18n._("Please enter a number.") + "
\n"; - } - if (field.min !== undefined || field.max !== undefined) { - html += "
"; - if (field.max !== undefined) { - html += i18n.sprintf(i18n._("Please enter a number greater than %d and less than %d."), field.min, field.max); - } else { - html += i18n.sprintf(i18n._("Please enter a number greater than %d."), field.min); - } - html += "
\n"; - } - html += "
\n"; - html += "
\n"; - } - - //checkbox group - if (field.type === 'checkbox_group') { - - html += label(); - - html += "
" + (field.requiredErrorMsg ? field.requiredErrorMsg : i18n._("Please select at least one value.")) + "
\n"; - } - if (field.integer) { - html += "
" + i18n._("Please select a number.") + "
\n"; - } - if (field.min || field.max) { - html += "
" + i18n._("Please select a number between ") + field.min + i18n._(" and ") + - field.max + "
\n"; - } - html += "
\n"; - for (i = 0; i < field.fields.length; i++) { - html += "
\n"; - } - html += "
\n"; - html += "
\n"; - } - - //checkbox - if (field.type === 'checkbox') { - - if (horizontal) { - fldWidth = getFieldWidth(); - offset = 12 - parseInt(fldWidth.replace(/[A-Z,a-z,-]/g, ''),10); - html += "
\n"; - } - - html += "
\n"; - html += buildCheckbox(this.form, field, fld, undefined, false); - html += (field.icon) ? Icon(field.icon) : ""; - html += "
\n"; - html += "
\n"; - - if (horizontal) { - html += "
\n"; - } - } - - // radio button - if (field.type === 'radio') { - - if (horizontal) { - fldWidth = getFieldWidth(); - offset = 12 - parseInt(fldWidth.replace(/[A-Z,a-z,-]/g, ''),10); - html += "
\n"; - } - - html += "
\n"; - html += "
\n"; - html += "
\n"; - - if (horizontal) { - html += "
\n"; - } - } - - //lookup type fields - if (field.type === 'lookup') { - let defaultLookupNgClick = `$state.go($state.current.name + '.${field.sourceModel}', {selected: ${field.sourceModel}})`; - let labelOptions = {}; - - if (field.subCheckbox) { - labelOptions.checkbox = { - id: `${this.form.name}_${fld}_ask_chbox`, - ngShow: field.subCheckbox.ngShow, - ngChange: field.subCheckbox.ngChange, - ngModel: field.subCheckbox.variable, - ngDisabled: field.subCheckbox.ngDisabled || field.ngDisabled, - text: field.subCheckbox.text || '' - }; - } - - html += label(labelOptions); - - html += "
`; - html += "\n"; - html += ``; - html += "\n"; - html += "" + (field.requiredErrorMsg ? field.requiredErrorMsg : i18n._("Please select a value.")) + "
\n"; - html += "
" + i18n._("That value was not found. Please enter or select a valid value.") + "
\n"; - } else { - html += "
" + i18n._("That value was not found. Please enter or select a valid value.") + "
\n"; - } - html += "
\n"; - html += "
\n"; - } - - if (field.type === 'code_mirror') { - html += '"; - html += "
"; - html += (options.mode === 'edit') ? this.form.editTitle : this.form.addTitle; - if(this.form.name === "user"){ - html+= "" + i18n._("Admin") + ""; - html+= "" + i18n._("Auditor") + ""; - html+= "LDAP"; - html+= "{{external_account}}"; - html+= "" + i18n._("Last logged in: ") + "{{ last_login | longDate }}"; - } - if(this.form.name === "smartinventory"){ - html+= "" + i18n._("Smart Inventory") + ""; - } - html += "
\n"; - html += "
"; - if(this.form.headerFields){ - var that = this; - _.forEach(this.form.headerFields, function(value, key){ - html += that.buildHeaderField(key, value, options, that.form); - }); - html += "
\n"; - } - else{ html += "
\n"; } - if(this.form.cancelButton !== undefined && this.form.cancelButton === false) { - html += "
"; - html += "
"; - } else { - html += "
"; - html += "
\n"; - } - html += "
"; //end of Form-header - } - - if (!_.isEmpty(this.form.related) || !_.isEmpty(this.form.relatedButtons)) { - var collection, details = i18n._('Details'); - html += "
"; - - if(this.mode === "edit"){ - html += `
` + - `${details}
`; - - for (itm in this.form.related) { - collection = this.form.related[itm]; - html += `
${(collection.title || collection.editTitle)}
`; - } - - for (itm in this.form.relatedButtons) { - button = this.form.relatedButtons[itm]; - - // Build button HTML - html += "
";//tabHolder - } - - if(!_.isEmpty(this.form.related) && this.mode === "edit"){ - html += `
`; - } - - html += "\n"; - html += "
{{ flashMessage }}
\n"; - - var currentSubForm; - var hasSubFormField; - // original, single-column form - section = ''; - group = ''; - for (fld in this.form.fields) { - field = this.form.fields[fld]; - if (!(options.modal && field.excludeModal)) { - if (field.group && field.group !== group) { - if (group !== '') { - html += "
\n"; - } - html += "
\n"; - html += "
" + field.group + "
\n"; - group = field.group; - } - if (field.section && field.section !== section) { - if (section !== '') { - html += "
\n"; - } else { - html += "
\n"; - html += "
\n"; - } - sectionShow = (this.form[field.section + 'Show']) ? " ng-show=\"" + this.form[field.section + 'Show'] + "\"" : ""; - html += "" + field.section + "\n"; - html += "\n"; - section = field.section; - } - - // To hide/show the subform when the value changes on parent - if (field.hasSubForm === true) { - hasSubFormField = fld; - } - - // Add a subform container - if(field.subForm && currentSubForm === undefined) { - currentSubForm = field.subForm; - var subFormTitle = this.form.subFormTitles[field.subForm]; - - html += '
'; - html += ''+ subFormTitle +''; - } - else if (!field.subForm && currentSubForm !== undefined) { - currentSubForm = undefined; - html += '
'; - } - - html += this.buildField(fld, field, options, this.form); - // console.log('*********') - // console.log(html) - - } - } - if (currentSubForm) { - currentSubForm = undefined; - html += '
'; - } - if (section !== '') { - html += "\n\n"; - } - if (group !== '') { - html += "\n"; - } - - html += "\n"; - - //buttons - if ((options.showButtons === undefined || options.showButtons === true) && !this.modal) { - if (this.has('buttons')) { - - html += "
\n"; - } - - for (btn in this.form.buttons) { - if (typeof this.form.buttons[btn] === 'object') { - button = this.form.buttons[btn]; - - if (button.component === 'at-launch-template') { - html += ``; - } else { - // Set default color and label for Save and Reset - if (btn === 'save') { - button.label = i18n._('Save'); - button['class'] = 'Form-saveButton'; - } - if (btn === 'select') { - button.label = i18n._('Select'); - button['class'] = 'Form-saveButton'; - } - if (btn === 'cancel') { - button.label = i18n._('Cancel'); - button['class'] = 'Form-cancelButton'; - } - if (btn === 'close') { - button.label = i18n._('Close'); - button['class'] = 'Form-cancelButton'; - } - if (btn === 'launch') { - button.label = i18n._('Launch'); - button['class'] = 'Form-launchButton'; - } - if (btn === 'add_survey') { - button.label = i18n._('Add Survey'); - button['class'] = 'Form-surveyButton'; - } - if (btn === 'edit_survey') { - button.label = i18n._('Edit Survey'); - button['class'] = 'Form-surveyButton'; - } - if (btn === 'view_survey') { - button.label = i18n._('View Survey'); - button['class'] = 'Form-surveyButton'; - } - if (btn === 'workflow_visualizer') { - button.label = i18n._('Workflow Visualizer'); - button['class'] = 'Form-primaryButton'; - } - - // Build button HTML - html += "
\n"; - - if (this.form.horizontal) { - html += "\n"; - } - } - } - - if(!_.isEmpty(this.form.related) && this.mode === "edit"){ - html += ``; - } - - if (this.form.include){ - _.forEach(this.form.include, (template) =>{ - html += `
`; - }); - } - // console.log(html); - return this.wrapPanel(html, options.noPanel); - }, - - buildCollection: function (params) { - // Currently, there are two ways we reference a list definition in a form - // Permissions lists are defined with boilerplate JSON in model.related - // this.GenerateCollection() is shaped around supporting this definition - // Notifications lists contain a reference to the NotificationList object, which contains the list's JSON definition - // However, Notification Lists contain fields that are only rendered by with generateList.build's chain - // @extendme rip out remaining HTML-concat silliness and directivize ¯\_(ツ)_/¯ - this.form = params.form; - var html = '', - collection = this.form.related[params.related]; - - if (collection.generateList) { - html += GenerateList.build({ mode: params.mode, list: collection}); - } - else { - html += this.GenerateCollection({ form: this.form, related: params.related }, {mode: params.mode}); - } - - return html; - }, - - GenerateCollection: function(params, options) { - var html = '', - form = params.form, - itm = params.related, - collection = form.related[itm], - act, fld, cnt, base, fAction, width; - - if (collection.instructions) { - html += "
\n"; - html += "\n"; - html += "Hint: " + collection.instructions + "\n"; - html += "
\n"; - } - - var actionButtons = ""; - Object.keys(collection.actions || {}) - .forEach(act => { - actionButtons += ActionButton(collection - .actions[act]); - }); - var hideOnSuperuser = (hideOnSuperuser === true) ? true : false; - if(actionButtons.length === 0 ){ - // The search bar should be full width if there are no - // action buttons - width = "col-lg-12 col-md-12 col-sm-12 col-xs-12"; - } - else { - width = "col-lg-8 col-md-8 col-sm-8 col-xs-12"; - } - - if(actionButtons.length>0){ - html += `
- ${actionButtons} -
`; - } - - // smart-search directive - html += ` -
- - -
- `; - - - //html += ""; - - // Message for when a search returns no results. This should only get shown after a search is executed with no results. - html += ` -
-
`; - html += i18n._('No records matched your search.'); - html += `
-
- `; - - // Show the "no items" box when loading is done and the user isn't actively searching and there are no results - var emptyListText = (collection.emptyListText) ? collection.emptyListText : i18n._("PLEASE ADD ITEMS TO THIS LIST"); - html += `
`; - html += `
${emptyListText}
`; - html += '
'; - - html += ` -
- ${i18n._('System Administrators have access to all ' + collection.iterator + 's')} -
- `; - - // Start the list - html += ` -
-
-
- `; - for (fld in collection.fields) { - html += `
- ${collection.fields[fld].label} -
`; - } - if (collection.fieldActions) { - html += `
${i18n._('Actions')}
`; - } - html += "
"; - - html += "
\n"; - if (collection.index === undefined || collection.index !== false) { - html += "
{{ $index + ((" + collection.iterator + "_page - 1) * " + - collection.iterator + "_page_size) + 1 }}.
\n"; - } - cnt = 1; - base = (collection.base) ? collection.base : itm; - base = base.replace(/^\//, ''); - for (fld in collection.fields) { - if (!collection.fields[fld].searchOnly) { - cnt++; - html += Column({ - list: collection, - fld: fld, - options: options, - base: base - }); - } - } - - // Row level actions - if (collection.fieldActions) { - html += `
`; - for (act in collection.fieldActions) { - if (act !== 'columnClass') { - fAction = collection.fieldActions[act]; - html += ""; - } - } - html += "
"; - html += "
\n"; - } - - // Message for loading - html += "
\n"; - html += "
" + i18n._("Loading...") + "
\n"; - html += "
\n"; - - // End List - html += "
\n"; - //html += "
\n"; // close well - html += "\n"; // close list-wrapper div - - html += ``; - return html; - }, - }; - - function createCheckbox (options) { - let ngChange = options.ngChange ? `ng-change="${options.ngChange}"` : ''; - let ngDisabled = options.ngDisabled ? `ng-disabled="${options.ngDisabled}"` : ''; - let ngModel = options.ngModel ? `ng-model="${options.ngModel}"` : ''; - let ngShow = options.ngShow ? `ng-show="${options.ngShow}"` : ''; - - return ` -
- -
`; - } - - } -]); diff --git a/awx/ui/client/src/shared/generator-helpers.js b/awx/ui/client/src/shared/generator-helpers.js deleted file mode 100644 index e70da8bfa8..0000000000 --- a/awx/ui/client/src/shared/generator-helpers.js +++ /dev/null @@ -1,735 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name shared.function:generator-helpers - * @description - * GeneratorHelpers - * - * Functions shared between FormGenerator and ListGenerator - * - */ - import systemStatus from '../smart-status/main'; - - -export default -angular.module('GeneratorHelpers', [systemStatus.name]) - -.factory('Attr', function () { - return function (obj, key, fld) { - var i, s, result, - value = (typeof obj[key] === "string") ? obj[key].replace(/[\"]/g, '"').replace(/[\']/g, ''') : obj[key]; - - if (/^ng/.test(key)) { - result = 'ng-' + key.replace(/^ng/, '').toLowerCase() + "=\"" + value + "\" "; - } else if (/^data|^aw/.test(key) && key !== 'awPopOver') { - s = ''; - for (i = 0; i < key.length; i++) { - if (/[A-Z]/.test(key.charAt(i))) { - s += '-' + key.charAt(i).toLowerCase(); - } else { - s += key.charAt(i); - } - } - result = s + "=\"" + value + "\" "; - } else { - switch (key) { - // In the cases where we specify trueValue and falseValue, - // the boolean value from the API is getting converted to - // a string. After upgrading to angular 1.4, we need to quote - // the ng-true-value and ng-false-value values so we compare - // them appropriately. - // - case 'trueValue': - result = "ng-true-value=\"'" + value + "'\" "; - break; - case 'falseValue': - result = "ng-false-value=\"'" + value + "'\" "; - break; - case 'awPopOver': - // construct the entire help link - result = " "; - break; - case 'columnShow': - result = "ng-show=\"" + value + "\" "; - break; - case 'iconName': - result = "icon-name=\"" + value + "\" "; - break; - case 'iconSize': - result = "icon-size=\"" + value + "\" "; - break; - case 'icon': - // new method of constructing icon tag. Replaces Icon method. - result = ""; - break; - case 'autocomplete': - result = "autocomplete=\""; - result += (value) ? 'true' : 'false'; - result += "\" "; - break; - case 'columnClass': - result = 'class="'; - result += value; - result += '"'; - break; - case 'awLookupWhen': - result = "ng-attr-awlookup=\"" + value + "\" "; - break; - default: - result = key + "=\"" + value + "\" "; - } - } - - return result; - - }; -}) - -.factory('Icon', function () { - return function (icon) { - return " "; - }; -}) - -.factory('SelectIcon', ['Icon', - function (Icon) { - return function (params) { - // Common point for matching any type of action to the appropriate - // icon. The intention is to maintain consistent meaning and presentation - // for every icon used in the application. - var icon, - action = params.action, - size = params.size; - switch (action) { - case 'system_tracking': - icon = "fa-crosshairs"; - break; - case 'help': - icon = "fa-question-circle"; - break; - case 'add': - case 'create': - icon = "fa-plus"; - break; - case 'edit': - icon = "fa-pencil"; - break; - case 'delete': - icon = "fa-trash-o"; - break; - case 'group_update': - case 'source_update': - icon = 'fa-refresh'; - break; - case 'inventory_update': - icon = 'fa-refresh'; - break; - case 'scm_update': - icon = 'fa-refresh'; - break; - case 'run': - case 'rerun': - case 'submit': - icon = 'icon-launch'; - break; - case 'launch': - icon = 'icon-launch'; - break; - case 'stream': - icon = 'fa-clock-o'; - break; - case 'socket': - icon = 'fa-power-off'; - break; - case 'refresh': - icon = 'fa-refresh'; - break; - case 'close': - icon = 'fa-arrow-left'; - break; - case 'form_submit': - icon = 'fa-check-square-o'; - break; - case 'properties': - icon = "fa-pencil"; - break; - case 'reset': - icon = "fa-undo"; - break; - case 'view': - icon = "fa-search-plus"; - break; - case 'sync_status': - icon = "fa-cloud"; - break; - case 'schedule': - icon = "fa-calendar"; - break; - case 'question_cancel': - icon = 'fa-times'; - break; - case 'job_details': - icon = 'fa-list-ul'; - break; - case 'test': - icon = 'fa-bell-o'; - break; - case 'copy': - icon = "fa-copy"; - break; - case 'insights': - icon = "fa-info"; - break; - case 'network': - icon = "fa-sitemap"; - break; - case 'cancel': - icon = "fa-minus-circle"; - break; - } - icon += (size) ? " " + size : ""; - return Icon(icon); - }; - } -]) - - -.factory('NavigationLink', ['Attr', 'Icon', - function (Attr, Icon) { - return function (link) { - var html = "\n"; - } else { - html = ''; - } - - html += "
\n"; - html += "\n"; - html += "\n"; - html += "
\n"; - html += (params.td === undefined || params.td !== false) ? "\n" : ""; - - return html; - - }; - } -]) - -.factory('BadgeCount', [ - function () { - return function (params) { - // Adds a badge count with optional tooltip - - var list = params.list, - fld = params.fld, - field = list.fields[fld], - html = ''; - html = "\n"; - if (!field.noLink){ - html += ""; - html += "{{ " + list.iterator + '.' + fld + " }}"; - html += ""; - html += (field.badgeLabel) ? " " + field.badgeLabel : ""; - html += "\n"; - html += "\n"; - return html; - }; - } -]) - -.factory('Badge', [ - function () { - return function (field) { - - // Adds an icon(s) with optional tooltip - - var i, html = ''; - - if (field.badges) { - for (i = 0; i < field.badges.length; i++) { - if (field.badges[i].toolTip) { - html += "
"; - if (field.badges[i].toolTip) { - html += ""; - } - html += "\n"; - } - } - else if(field.badgeCustom === true){ - html += field.badgeIcon; - } - else { - if (field.badgeToolTip) { - html += ""; - if (field.badgeToolTip) { - html += ""; - } - html += "\n"; - } - return html; - }; - } -]) - -// List field with multiple icons -.factory('BuildLink', ['Attr', 'Icon', function(Attr, Icon){ - return function(params) { - var html = '', - field = params.field, - list = params.list, - base = params.base, - fld = params.fld; - - if (field.linkTo) { - html += " "; - } else if (field.icon) { - html += Icon(field.icon) + " "; - } - - // Add data binds - if (!field.ngBindHtml && !field.iconOnly && !field.ngEllipsis && (field.showValue === undefined || field.showValue === true)) { - if (field.ngBind) { - html += "{{ " + field.ngBind; - } else { - html += "{{" + list.iterator + "." + fld; - } - if (field.filter) { - html += " | " + field.filter + " }}"; - } - else { - html += " }}"; - } - } - - // Add additional text: - if (field.text) { - html += field.text; - } - html += ""; - if (field.alt_text) { - html += "  " + field.alt_text; - } - return html; - }; -}]) - -.factory('Template', ['Attr', function(Attr) { - return function(field) { - var ngClass = (field.ngClass) ? Attr(field, 'ngClass') : null; - var classList = (field.columnClass) ? Attr(field, 'columnClass') : null; - var ngInclude = (field.ngInclude) ? Attr(field, 'ngInclude') : null; - var attrs = _.compact([ngClass, classList, ngInclude]); - - return ''; - }; -}]) - -.factory('Column', ['i18n', 'Attr', 'Icon', 'DropDown', 'Badge', 'BadgeCount', 'BuildLink', 'Template', - function (i18n, Attr, Icon, DropDown, Badge, BadgeCount, BuildLink, Template) { - return function (params) { - var list = params.list, - fld = params.fld, - options = params.options, - base = params.base, - field = params.field ? params.field : list.fields[fld], - html = ''; - - field.columnClass = field.columnClass ? "List-tableCell " + field.columnClass : "List-tableCell"; - const classList = Attr(field, 'columnClass'); - - if (field.type !== undefined && field.type === 'DropDown') { - html = DropDown(params); - } else if (field.type === 'role') { - html += ` -
- - -
- `; - } else if (field.type === 'team_roles') { - html += ` -
- - -
- `; - } else if (field.type === 'labels') { - let showDelete = field.showDelete === undefined ? true : field.showDelete; - html += ` -
- - -
- `; - } else if (field.type === 'related_groups') { - let showDelete = field.showDelete === undefined ? true : field.showDelete; - html += ` -
- - -
- `; - } else if (field.type === 'owners') { - html += ` -
- -
- `; - } else if (field.type === 'revision') { - html += ` -
- -
`; - } else if (field.type === 'badgeCount') { - html = BadgeCount(params); - } else if (field.type === 'badgeOnly') { - html = Badge(field); - } else if (field.type === 'template') { - html = Template(field); - } else if (field.type === 'toggle') { - const ngIf = field.ngIf ? `ng-if="${field.ngIf}"` : ''; - html += ` -
- -
- `; - } else if (field.type === 'invalid') { - html += `
`; - html += ""; - html += "
"; - } else { - html += "
" : ""; - - //Add ngHide - //html += (field.ngHide) ? "" : ""; - - // Badge - if (options.mode !== 'lookup' && (field.badges || (field.badgeIcon && field.badgePlacement && field.badgePlacement === 'left'))) { - html += Badge(field); - } - - // Add collapse/expand icon --used on job_events page - if (list.hasChildren && field.hasChildren) { - html += ""; - } - - if (list.name === 'groups') { - html += "
"; - } - if (list.name === 'hosts') { - html += "
"; - } - - // Start the Link - if ((field.key || field.link || field.linkTo || field.ngClick || field.ngHref || field.uiSref || field.awToolTip || field.awPopOver) && - options.mode !== 'lookup' && options.mode !== 'select' && !field.noLink && !field.ngBindHtml) { - if(field.noLink === true){ - // provide an override here in case we want key=true for sorting purposes but don't want links -- see: portal mode, - } - else if (field.icons) { - field.icons.forEach(function(icon, idx) { - var key, i = field.icons[idx]; - for (key in i) { - field[key] = i[key]; - } - html += BuildLink({ - list: list, - field: field, - fld: fld, - base: field.linkBase || base - }) + ' '; - }); - } - else if(field.smartStatus){ - html += ''; - } - else { - html += BuildLink({ - list: list, - field: field, - fld: fld, - base: field.linkBase || base - }); - } - } - else { - if(field.simpleTip) { - html += ``; - } - // Add icon: - if (field.ngShowIcon) { - html += " "; - } else if (field.icon) { - html += Icon(field.icon) + " "; - } - // Add data binds - if (!field.ngBindHtml && !field.iconOnly && (field.showValue === undefined || field.showValue === true)) { - if (field.ngBind) { - html += "{{ " + field.ngBind; - } else { - html += "{{ " + list.iterator + "." + fld; - } - if (field.filter) { - html += " | " + field.filter + " }}"; - } - else { - html += " }}"; - } - } - // Add additional text: - if (field.text) { - html += field.text; - } - if(field.simpleTip) { - html += ``; - } - } - - if (list.name === 'hosts' || list.name === 'groups') { - html += "
"; - } - - // close ngShow - html += (field.ngShow) ? "" : ""; - - //close ngHide - //html += (field.ngHide) ? "" : ""; - - // Specific to Job Events page -showing event detail/results - html += (field.appendHTML) ? "
\n" : ""; - - // Badge - if (options.mode !== 'lookup' && field.badgeIcon && field.badgePlacement && field.badgePlacement !== 'left') { - html += Badge(field); - } - - // Field Tag - if (field.tag) { - html += ` - ${field.tag} - `; - } - } - html += "
"; - } - return html; - }; - } -]) - -.factory('ActionButton', function () { - return function (options) { - - var html = ''; - html += '
`; - } - return html; - }; -}); diff --git a/awx/ui/client/src/shared/icon/icon.block.less b/awx/ui/client/src/shared/icon/icon.block.less deleted file mode 100644 index 5cff28b209..0000000000 --- a/awx/ui/client/src/shared/icon/icon.block.less +++ /dev/null @@ -1,7 +0,0 @@ -/** @define Icon */ - -.Icon { - path, g { - fill: #242424; - } -} diff --git a/awx/ui/client/src/shared/icon/icon.directive.js b/awx/ui/client/src/shared/icon/icon.directive.js deleted file mode 100644 index c38abc7698..0000000000 --- a/awx/ui/client/src/shared/icon/icon.directive.js +++ /dev/null @@ -1,46 +0,0 @@ -export default - [ 'templateUrl', - '$rootScope', - function(templateUrl, $rootScope) { - return { - restrict: 'E', - templateUrl: templateUrl('shared/icon/icon'), - scope: { - }, - link: function(scope, element, attrs) { - - function buildSvgs() { - var svg = $('svg', element); - var iconPath = '#' + attrs.name; - - if ($(iconPath).length === 0) { - return; - } - - // Make a copy of the tag to insert its contents into this - // element's svg tag - var content = $(iconPath).clone(); - - // Copy classes & viewBox off the so that we preserve any styling - // when we copy the item inline - var classes = $(iconPath).attr('class'); - - // viewBox needs to be access via native - // javascript's setAttribute function - var viewBox = $(iconPath)[0].getAttribute('viewBox'); - - svg[0].setAttribute('viewBox', viewBox); - svg.attr('class', classes) - .html(content.contents()); - } - - $rootScope.$on('include-svg.svg-ready', function() { - buildSvgs(); - }); - - buildSvgs(); - - } - }; - } - ]; diff --git a/awx/ui/client/src/shared/icon/icon.partial.html b/awx/ui/client/src/shared/icon/icon.partial.html deleted file mode 100644 index 7640e25707..0000000000 --- a/awx/ui/client/src/shared/icon/icon.partial.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/awx/ui/client/src/shared/icon/include-svg.directive.js b/awx/ui/client/src/shared/icon/include-svg.directive.js deleted file mode 100644 index dcfa55f045..0000000000 --- a/awx/ui/client/src/shared/icon/include-svg.directive.js +++ /dev/null @@ -1,13 +0,0 @@ -export default ['$http', '$rootScope', function($http, $rootScope) { - return { - restrict: 'E', - link: function(scope, element, attrs) { - var path = attrs.href; - - $http.get(path).then(function(response) { - element.append(response.data); - $rootScope.$emit('include-svg.svg-ready'); - }); - } - }; -}]; diff --git a/awx/ui/client/src/shared/icon/main.js b/awx/ui/client/src/shared/icon/main.js deleted file mode 100644 index 87c8a0d474..0000000000 --- a/awx/ui/client/src/shared/icon/main.js +++ /dev/null @@ -1,7 +0,0 @@ -import icon from './icon.directive'; -//import includeSvg from './include-svg.directive'; - -export default - angular.module('awIcon', []) - .directive('awIcon', icon); - //.directive('includeSvg', includeSvg); diff --git a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.directive.js b/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.directive.js deleted file mode 100644 index eebd9e6832..0000000000 --- a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.directive.js +++ /dev/null @@ -1,121 +0,0 @@ -export default ['templateUrl', '$window', function(templateUrl, $window) { - return { - restrict: 'E', - scope: { - instanceGroups: '=' - }, - templateUrl: templateUrl('shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal'), - - link: function(scope, element) { - - $('#instance-groups-modal').on('hidden.bs.modal', function () { - $('#instance-groups-modal').off('hidden.bs.modal'); - $(element).remove(); - }); - - scope.showModal = function() { - $('#instance-groups-modal').modal('show'); - }; - - scope.destroyModal = function() { - $('#instance-groups-modal').modal('hide'); - }; - }, - - controller: ['$scope', '$compile', 'QuerySet', 'GetBasePath','generateList', 'InstanceGroupList', function($scope, $compile, qs, GetBasePath, GenerateList, InstanceGroupList) { - - function init() { - - $scope.instance_group_queryset = { - order_by: 'name', - page_size: 5 - }; - - $scope.instance_group_default_params = { - order_by: 'name', - page_size: 5 - }; - - qs.search(GetBasePath('instance_groups'), $scope.instance_group_queryset) - .then(res => { - $scope.instance_group_dataset = res.data; - $scope.instance_groups = $scope.instance_group_dataset.results; - - let instanceGroupList = _.cloneDeep(InstanceGroupList); - - instanceGroupList.listTitle = false; - instanceGroupList.well = false; - instanceGroupList.multiSelect = true; - instanceGroupList.multiSelectPreview = { - selectedRows: 'igTags', - availableRows: 'instance_groups' - }; - instanceGroupList.fields.name.ngClick = "linkoutInstanceGroup(instance_group)"; - instanceGroupList.fields.name.columnClass = 'col-md-11 col-sm-11 col-xs-11'; - delete instanceGroupList.fields.consumed_capacity; - delete instanceGroupList.fields.jobs_running; - - let html = `${GenerateList.build({ - list: instanceGroupList, - input_type: 'instance-groups-modal-body', - hideViewPerPage: true, - mode: 'lookup' - })}`; - - $scope.list = instanceGroupList; - $('#instance-groups-modal-body').append($compile(html)($scope)); - - if ($scope.instanceGroups) { - $scope.instanceGroups = $scope.instanceGroups.map( (item) => { - item.isSelected = true; - if (!$scope.igTags) { - $scope.igTags = []; - } - $scope.igTags.push(item); - return item; - }); - } - - $scope.showModal(); - }); - - $scope.$watch('instance_groups', function(){ - angular.forEach($scope.instance_groups, function(instanceGroupRow) { - angular.forEach($scope.igTags, function(selectedInstanceGroup){ - if(selectedInstanceGroup.id === instanceGroupRow.id) { - instanceGroupRow.isSelected = true; - } - }); - }); - }); - } - - init(); - - $scope.$on("selectedOrDeselected", function(e, value) { - let item = value.value; - if (value.isSelected) { - if(!$scope.igTags) { - $scope.igTags = []; - } - $scope.igTags.push(item); - } else { - _.remove($scope.igTags, { id: item.id }); - } - }); - - $scope.linkoutInstanceGroup = function(instanceGroup) { - $window.open('/#/instance_groups/' + instanceGroup.id + '/instances','_blank'); - }; - - $scope.cancelForm = function() { - $scope.destroyModal(); - }; - - $scope.saveForm = function() { - $scope.instanceGroups = $scope.igTags; - $scope.destroyModal(); - }; - }] - }; -}]; diff --git a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html b/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html deleted file mode 100644 index 434b204dcc..0000000000 --- a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html +++ /dev/null @@ -1,22 +0,0 @@ - diff --git a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-multiselect.controller.js b/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-multiselect.controller.js deleted file mode 100644 index 91b7795a1f..0000000000 --- a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups-multiselect.controller.js +++ /dev/null @@ -1,14 +0,0 @@ -export default ['$scope', - function($scope) { - - $scope.instanceGroupsTags = []; - - $scope.$watch('instanceGroups', function() { - $scope.instanceGroupsTags = $scope.instanceGroups; - }, true); - - $scope.deleteTag = function(tag){ - _.remove($scope.instanceGroups, {id: tag.id}); - }; - } -]; \ No newline at end of file diff --git a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.block.less b/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.block.less deleted file mode 100644 index bbfef9de99..0000000000 --- a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.block.less +++ /dev/null @@ -1,15 +0,0 @@ -#instance-groups-panel { - table { - overflow: hidden; - } - .List-header { - margin-bottom: 20px; - } - .isActive { - border-left: 10px solid @list-row-select-bord; - } - .instances-list, - .instance-jobs-list { - margin-top: 20px; - } -} diff --git a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.directive.js b/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.directive.js deleted file mode 100644 index cdb781b1d9..0000000000 --- a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.directive.js +++ /dev/null @@ -1,19 +0,0 @@ -import instanceGroupsMultiselectController from './instance-groups-multiselect.controller'; -export default ['templateUrl', '$compile', - function(templateUrl, $compile) { - return { - scope: { - instanceGroups: '=', - fieldIsDisabled: '=' - }, - restrict: 'E', - templateUrl: templateUrl('shared/instance-groups-multiselect/instance-groups'), - controller: instanceGroupsMultiselectController, - link: function(scope) { - scope.openInstanceGroupsModal = function() { - $('#content-container').append($compile('')(scope)); - }; - } - }; - } -]; diff --git a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.partial.html b/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.partial.html deleted file mode 100644 index 1876c9b9bd..0000000000 --- a/awx/ui/client/src/shared/instance-groups-multiselect/instance-groups.partial.html +++ /dev/null @@ -1,18 +0,0 @@ -
- - - - -
- -
-
- {{tag.name | sanitize}} -
-
-
diff --git a/awx/ui/client/src/shared/layouts/one-plus-one.less b/awx/ui/client/src/shared/layouts/one-plus-one.less deleted file mode 100644 index 4414be8758..0000000000 --- a/awx/ui/client/src/shared/layouts/one-plus-one.less +++ /dev/null @@ -1,48 +0,0 @@ -/* -* Large resolution 1/2 + 1/2 width panels -* Small resolution: 100% width panels, stacked -* Options: static height, custom breakpoint -*/ - -.OnePlusOne-container(@height: 100%; @breakpoint: 900px){ - height: ~"calc(100vh - 150px)"; - display: flex; - flex-direction: row; - @media screen and(max-width: @breakpoint){ - flex-direction: column; - height: 100%; - } -} - -.OnePlusOne-panel--left(@height: 100%; @breakpoint: 900px){ - flex: 1 1; - height: @height; - width: 100%; - max-width: 50%; - margin-right: 20px; - @media screen and (max-width: @breakpoint){ - max-width: 100%; - margin-right: 0px; - height: inherit; - } -} - -.OnePlusOne-panel--right(@height: 100%; @breakpoint: 900px){ - flex: 1 1; - height: @height; - width: 100%; - max-width: 50%; - margin-right: 0px; - @media screen and (max-width: @breakpoint) { - max-width: 100%; - height: inherit; - } -} - -.OnePlusOne-panelHeader{ - color: @default-interface-txt; - font-size: 14px; - font-weight: bold; - margin-right: 10px; - display: flex; -} diff --git a/awx/ui/client/src/shared/layouts/one-plus-two.less b/awx/ui/client/src/shared/layouts/one-plus-two.less deleted file mode 100644 index c9514daae5..0000000000 --- a/awx/ui/client/src/shared/layouts/one-plus-two.less +++ /dev/null @@ -1,68 +0,0 @@ -/* -* Large resolution: 1/3 + 2/3 width panels -* Small resolution: 100% width panels, stacked -* Options: static height, custom breakpoint -* -* Style conventions -* .ModuleName-component--subComponent -*/ - -.OnePlusTwo-container(@height: 100%; @breakpoint: 900px){ - height: @height; - display: flex; - flex-direction: row; - @media screen and (max-width: @breakpoint){ - flex-direction: column; - } -} - -.OnePlusTwo-left--panel(@height: 100%; @breakpoint: 900px) { - flex: 1 0; - height: @height; - width: 100%; - margin-right: 20px; - @media screen and (max-width: @breakpoint){ - height: inherit; - margin-right: 0px; - max-width: none; - } -} - -.OnePlusTwo-right--panel(@height: 100%; @breakpoint: 900px) { - height: @height; - flex: 2 0; - @media screen and (max-width: @breakpoint){ - flex-direction: column; - } -} - -.OnePlusTwo-panelHeader { - color: @default-interface-txt; - font-size: 14px; - font-weight: bold; - margin-right: 10px; - display: flex; -} - -.OnePlusTwo-left--details { - margin-top: 25px; -} - -.OnePlusTwo-left--detailsRow { - display: flex; -} - -.OnePlusTwo-left--detailsLabel { - word-wrap: break-word; - width: 170px; - display: inline-block; - color: @default-interface-txt; - text-transform: uppercase; - font-weight: 400; -} - -.OnePlusTwo-left--detailsContent { - display: inline-block; - width: 220px; - word-wrap: break-word; -} diff --git a/awx/ui/client/src/shared/limit-panels/limit-panels.directive.js b/awx/ui/client/src/shared/limit-panels/limit-panels.directive.js deleted file mode 100644 index 04505785bf..0000000000 --- a/awx/ui/client/src/shared/limit-panels/limit-panels.directive.js +++ /dev/null @@ -1,34 +0,0 @@ -export default [function() { - return { - restrict: 'E', - scope: { - maxPanels: '@', - panelContainer: '@' - }, - link: function(scope) { - - const maxPanels = parseInt(scope.maxPanels); - - scope.$watch( - () => angular.element('#' + scope.panelContainer).find('.at-Panel').length, - () => { - const panels = angular.element('#' + scope.panelContainer).find('.at-Panel'); - if(panels.length > maxPanels) { - // hide the excess panels - $(panels).each(function( index ) { - if(index+1 > maxPanels) { - $(this).addClass('d-none'); - } - else { - $(this).removeClass('d-none'); - } - }); - } else { - // show all the panels - $(panels).removeClass('d-none'); - } - } - ); - } - }; -}]; diff --git a/awx/ui/client/src/shared/limit-panels/main.js b/awx/ui/client/src/shared/limit-panels/main.js deleted file mode 100644 index 407cb09a95..0000000000 --- a/awx/ui/client/src/shared/limit-panels/main.js +++ /dev/null @@ -1,5 +0,0 @@ -import directive from './limit-panels.directive'; - -export default - angular.module('LimitPanelsModule', []) - .directive('awLimitPanels', directive); diff --git a/awx/ui/client/src/shared/list-generator/list-actions.partial.html b/awx/ui/client/src/shared/list-generator/list-actions.partial.html deleted file mode 100644 index b64a57df08..0000000000 --- a/awx/ui/client/src/shared/list-generator/list-actions.partial.html +++ /dev/null @@ -1,71 +0,0 @@ - -
- -
-
-
-
- - -
- - - -
- -
- - -
- - - -
- -
- diff --git a/awx/ui/client/src/shared/list-generator/list-generator.factory.js b/awx/ui/client/src/shared/list-generator/list-generator.factory.js deleted file mode 100644 index cc888bc0e5..0000000000 --- a/awx/ui/client/src/shared/list-generator/list-generator.factory.js +++ /dev/null @@ -1,596 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name shared.function:list-generator - * @description - * #ListGenerator - * - * Use GenerateList.inject(list_object, { key:value }) to generate HTML from a list object and inject it into the DOM. Returns the $scope of the new list. - * - * Pass in a list object and a JSON object of key:value parameters. List objects are found in lists/*.js. Possible parameters include: - * - * | Parameter | Required | Description | - * | --------- | -------- | ----------- | - * | activityStream | | Used in widgets/stream.js to create the list contained within the activity stream widget. | - * | hdr | | Deprecated. Was used when list generator created the lookup dialog. This was moved to helpers/Lookup.js. | - * | id | | DOM element ID attribute value. Use to inject the list into a custom DOM element. Otherwise, the HTML for a list will be injected into the DOM element with an ID attribute of 'htmlTemplate'. | - * | listSize | | Bootstrap size class to apply to the grid column containing the action buttons, which generally appears to the right of the search widget. Defaults to 'col-lg-8 col-md-6 col-sm-4 col-xs-3'. | - * | mode | Yes | One of 'edit', 'lookup', 'select', or 'summary'. Generally this will be 'edit'. helpers/Lookup.js uses 'lookup' to generate the lookup dialog. The 'select' option is used in certain controllers when multiple objects are being added to a parent object. For example, building a select list of Users that can be added to an Oranization. 'summary' is no longer used. | - * | scope | | If the HTML will be injected into the DOM by list generator, pass in an optional $scope to be used in conjuction with $compile. The list will be associated with the scope value. Otherwise, the scope of the DOM element will be fetched passed to $compile. | - * | showSearch | | true or false. Set to false, if the search widget should not be included in the generated HTML. | - * - * #HTML only - * - * Use the buildHTML() method to get a string containing the generated HTML for a list object. buldHTML() expects the same parameters as the inject method. For example: - * ``` - * var html = GenerateList.buildHTML({ - * mode: 'edit', - * showSearch: false - * }); - * ``` - * - * #List Objects - * - * List objects are found in lists/*.js. Any API endpoint that returns a collection or array is represented with a list object. Examples inlcude Organizations, Credentials, Inventories, etc. - * A list can have the following attributes: - * - * | Attribute | Description | - * | --------- | ----------- | - * | index | true or false. If false, the index column, which adds a sequential number to each table row starting with 1, will not be added to the table. | - * | iterator | String containing a descriptive name of a single row in the collection - inventory, organization, credential, etc. Used to generate name and ID attributes in the list HTML. | - * | name | Name of the collection. Generally matches the endpoint name - inventories, organizations, etc. Will match the $scope variable containing the array of rows comprising the collection. | - * | selectTitle | Descriptive title used when mode is 'select'. | - * | selectInstructions | Text and HTML used to create popover for help button when mode is 'select'. | - * | editTitle | Descriptive title used when mode is 'edit'. | - * - * ##Fields - * - * A list contains a fields object. Each column in the list is defined as a separate object within the fields object. A field definition may contain the following attributes: - * - * | Attribute | Description | - * | --------- | ----------- | - * | columnClass | String of CSS class names to add to the <td> elemnts of the table column. | - * | columnClick | Adds an ng-click directive to the <td> element. | - * | excludeModal | true or false. If false, the field will not be included in the generated HTML when the mode is 'lookup' | - * | key | true or false. If set to true, helpers/search.js will use the field name as the default sort order when generating the API request. | - * | noLink | true or false. If set to true this will override any 'key', 'linkTo', 'ngClick', or other option that would cause the field to be a link. Used in portal mode and custom inv. script. | - * | label | Text string used as the column header text. | - * | linkTo | Wraps the field value with an <a> element. Set to the value of the href attribute. | - * | ngClick | Wraps the field value with an <a> and adds the ng-click directive. Set to the JS expression that ng-click will evaluate. | - * | nosort | true or false. Setting to false removes the ability to sort the table by the column. | - * | searchOnly | true or false. Set to true if the field should be included in the search widget but not included as a column in the generated HTML <table>. | - * | searchOptions | Array of { name: 'Descriptive Name', value: 'api_value' } objects used to generate <options> for the <select> when searchType is 'select'. | - * | searchType | One of the available search types defined in helpers/search.js. | - * | sourceField | Name of the attribute within summary_fields. that the field maps to in the API response object. Used in conjunction with sourceModel. | - * | sourceModel | Name of the summary_fields object that the field maps to in the API response object. | - * - * ##Field Actions - * - * A list contains a fieldActions object. Each icon found in the Actions column is defined as an object within the fieldActions object. fieldActions can have a columnClass attribute, - * which may contain a string of CSS class names to add to the action <td> element. It may also contain a label attribute, which can be set to false to suppress the Actions column header. - * - * Field action items can have the following attributes: - * - * | Attribute | Description | - * | --------- | ----------- | - * | actionclass | Set to a string containing any CSS classes to add to the button. | - * | awToolTip | Adds the aw-tool-tip directive. Set to the value of the HTML or text to dislay in the tooltip. | - * | buttonContent | String containing button content. HTML is accepted in this string. | - * | dataPlacement | Set to the Bootstrip tooltip placement - right, left, top, bottom, etc. | - * | dataTipWatch | Set to the $scope variable that contains the text and HTML to display in the tooltip. A $scope.$watch will be added to the variable so that anytime its value changes the tooltip will change. | - * | mode | One of 'all' or 'edit'. Will generally be 'all'. Note that field actions are not displayed when the list is in 'lookup' mode. | - * | ngClass | Adds the ng-class directive. Set to the JS expression that ng-class will evaluate. | - * | ngShow | Adds the ng-show directive. Set to the JS expression that ng-show will evaluate. | - * - * ##Actions - * - * A list can contain an actions object. The actions object contains an object for each action button displayed in the top-right corner of the list container. An action can have the same - * attributes as an action defined in fieldAction. Both are actions. Clicking on an action evaluates the JS found in the ngClick attribute. In both cases icon is generated automatically by the SelectIcon() method in js/shared/generator-helpers.js. - * The real difference is that an <a> element is used to generate fieldAction items while a <button> element is used for action items. - */ - -import { templateUrl } from '../../shared/template-url/template-url.factory'; - -export default ['$compile', 'Attr', 'Icon', - 'Column', 'DropDown', 'SelectIcon', 'ActionButton', 'i18n', - function($compile, Attr, Icon, Column, DropDown, - SelectIcon, ActionButton, i18n) { - return { - - setList: function(list) { - this.list = list; - }, - - setOptions: function(options) { - this.options = options; - }, - - attr: Attr, - - icon: Icon, - - has: function(key) { - return (this.form[key] && this.form[key] !== null && this.form[key] !== undefined) ? true : false; - }, - - buildHTML: function(list, options) { - this.setList(list); - return this.build(options); - }, - - build: function(options) { - this.list = options.list; - this.options = options; - - var html = '', - list = this.list, - base, action, fld, field_action, fAction, itm; - - if (options.mode !== 'lookup') { - // Don't display an empty
if there is no listTitle - if ((options.title !== false && list.title !== false) && list.listTitle !== undefined) { - html += "
"; - html += "
"; - if (list.listTitle && options.listTitle !== false) { - html += "
" + list.listTitle + "
"; - // We want to show the list title badge by default and only hide it when the list config specifically passes a false flag - list.listTitleBadge = (typeof list.listTitleBadge === 'boolean' && list.listTitleBadge === false) ? false : true; - if (list.listTitleBadge) { - html += `{{ ${list.iterator}_dataset.count }}`; - } - } - html += "
"; - if (options.cancelButton === true) { - html += "
"; - html += "
\n"; - } - html += "
"; - } - } - - if (options.mode === 'edit' && list.editInstructions) { - html += "
\n"; - html += "\n"; - html += "Hint: " + list.editInstructions + "\n"; - html += "
\n"; - } - - if (list.multiSelectPreview) { - html += ""; - } - - if (options.instructions) { - html += "
" + options.instructions + "
\n"; - } else if (list.instructions) { - html += "
" + list.instructions + "
\n"; - } - - if (options.mode !== 'lookup' && (list.well === undefined || list.well)) { - html += `
`; - html += (!list.wellOverride) ? "List-well" : ""; - html += `">`; - // List actions - html += "
"; - html += "
"; - html += `
`; - - for (action in list.actions) { - list.actions[action] = _.defaults(list.actions[action], { dataPlacement: "top" }); - } - - html += "
"; - if (list.toolbarAuxAction) { - html += `
${list.toolbarAuxAction}
`; - } - html += "\n
"; - html += "
"; - // End list actions - } - - html += (list.searchRowActions) ? "
" : ""; - if (options.showSearch === undefined || options.showSearch === true) { - let singleSearchParam = list.singleSearchParam && list.singleSearchParam.param ? `single-search-param="${list.singleSearchParam.param}"` : ''; - html += ` -
- - -
- `; - } - if (list.searchRowActions) { - html += "
"; - - var actionButtons = ""; - Object.keys(list.searchRowActions || {}) - .forEach(act => { - actionButtons += ActionButton(list.searchRowActions[act]); - }); - html += ` -
- ${actionButtons} -
- `; - html += "
"; - } - - if (options.showSearch !== false) { - // Message for when a search returns no results. This should only get shown after a search is executed with no results. - html +=` -
-
No records matched your search.
-
- `; - } - - // Show the "no items" box when loading is done and the user isn't actively searching and there are no results - if (options.showEmptyPanel === undefined || options.showEmptyPanel === true){ - html += `
`; - html += (list.emptyListText) ? list.emptyListText : i18n._("PLEASE ADD ITEMS TO THIS LIST"); - html += "
"; - } - - // Add a title and optionally a close button (used on Inventory->Groups) - if (options.mode !== 'lookup' && list.showTitle) { - html += "
"; - html += (options.mode === 'edit' || options.mode === 'summary') ? list.editTitle : list.addTitle; - html += "
\n"; - } - - // table header row - html += "
0\""; - html += (list.awCustomScroll) ? " aw-custom-scroll " : ""; - html += ">\n"; - - function buildTable() { - var extraClasses = list['class']; - var multiSelect = list.multiSelect ? 'multi-select-list' : null; - var multiSelectExtended = list.multiSelectExtended ? 'true' : 'false'; - - if (options.mode === 'summary') { - extraClasses += ' table-summary'; - } - - return $('
') - .attr('id', list.name + '_table') - .addClass('List-table') - .addClass(extraClasses) - .attr('multi-select-list', multiSelect) - .attr('is-extended', multiSelectExtended); - } - - var table = buildTable(); - var innerTable = ''; - - if (!options.skipTableHead) { - innerTable += this.buildHeader(options); - } - - const layoutClass = options.mode === 'lookup' ? "List-lookupLayout" : (_.has(list, 'layoutClass') ? list.layoutClass : "List-defaultLayout"); - - // table body - // gotcha: transcluded elements require custom scope linking - binding to $parent models assumes a very rigid DOM hierarchy - // see: lookup-modal.directive.js for example - innerTable += options.mode === 'lookup' ? `
` : `
`; - - innerTable += "
"; - - let handleEditStateParams = function(stateParams){ - let matchingConditions = []; - - angular.forEach(stateParams, function(stateParam) { - matchingConditions.push(`$stateParams['` + stateParam + `'] == ${list.iterator}.id`); - }); - return matchingConditions; - }; - - if (options.mode !== 'lookup') { - let activeRowClass; - if(list && list.fieldActions && list.fieldActions.edit && list.fieldActions.edit.editStateParams) { - let matchingConditions = handleEditStateParams(list.fieldActions.edit.editStateParams); - activeRowClass = `ng-class="{'List-tableRow--selected' : ${matchingConditions.join(' || ')}}"`; - } - else if (list.iterator === 'inventory') { - activeRowClass = `ng-class="{'List-tableRow--selected': ($stateParams['${list.iterator}_id'] == ${list.iterator}.id) || ($stateParams['smartinventory_id'] == ${list.iterator}.id)}"`; - } - else { - activeRowClass = `ng-class="{'List-tableRow--selected' : $stateParams['${list.iterator}_id'] == ${list.iterator}.id}"`; - } - innerTable += `
`; - if (list.multiSelect) { - innerTable += - `
- -
`; - } - if(list.staticColumns) { - angular.forEach(list.staticColumns, function(staticColumn) { - innerTable += `
`; - innerTable += Column({ - list: list, - fld: staticColumn.field, - field: staticColumn.content, - options: options, - base: base - }); - innerTable += `
`; - }); - } - } else { - innerTable += `
`; - if (list.multiSelect) { - innerTable += ''; - } else { - if (options.input_type === "radio") { //added by JT so that lookup forms can be either radio inputs or check box inputs - innerTable += ``; - } - else { // its assumed that options.input_type = checkbox - innerTable += ""; - } - } - innerTable += `
`; - } - - innerTable += `
`; - - if (list.index) { - innerTable += "
{{ $index + ((" + list.iterator + "_page - 1) * " + list.iterator + "_page_size) + 1 }}.
\n"; - } - - base = (list.base) ? list.base : list.name; - base = base.replace(/^\//, ''); - for (fld in list.fields) { - if ((list.fields[fld].searchOnly === undefined || list.fields[fld].searchOnly === false) && - !(options.mode === 'lookup' && list.fields[fld].excludeModal === true)) { - innerTable += Column({ - list: list, - fld: fld, - options: options, - base: base - }); - } - } - - if (options.mode === 'select') { - if (options.input_type === "radio") { //added by JT so that lookup forms can be either radio inputs or check box inputs - innerTable += "
"; - } else { // its assumed that options.input_type = checkbox - innerTable += "
"; - } - } else if ((options.mode === 'edit' || options.mode === 'summary') && list.fieldActions) { - - // Row level actions - - innerTable += `
`; - - for (field_action in list.fieldActions) { - if (field_action !== 'columnClass') { - if (list.fieldActions[field_action].type && list.fieldActions[field_action].type === 'DropDown') { - innerTable += DropDown({ - list: list, - fld: field_action, - options: options, - base: base, - type: 'fieldActions', - td: false - }); - } - if (field_action === 'pending_deletion') { - innerTable += `${i18n._('Pending Delete')}`; - } else if (field_action === 'submit') { - innerTable += ``; - } else { - // Plug in Dropdown Component - if (field_action === 'submit' && list.fieldActions[field_action].relaunch === true) { - innerTable += ``; - } else if (field_action === 'submit' && list.fieldActions[field_action].launch === true) { - innerTable += ``; - } else { - fAction = list.fieldActions[field_action]; - innerTable += ""; - } - } - } - } - innerTable += "
\n"; - } - - // might need to wrap this in lookup logic - // innerTable += "
\n"; - // End List - innerTable += "
\n"; - - table.html(innerTable); - html += table.prop('outerHTML'); - - html += "
\n"; - - if (options.mode === 'select' && (options.selectButton === undefined || options.selectButton)) { - html += "
\n"; - html += " \n"; - html += "
\n"; - } - - if (options.paginate === undefined || options.paginate === true) { - let hide_view_per_page = (options.mode === "lookup" || options.hideViewPerPage) ? true : false; - html += `
`; - } - - if (options.mode === 'lookup' && options.lookupMessage) { - html = `
${options.lookupMessage}
` + html; - } - - return html; - }, - - buildHeader: function(options) { - const list = this.list; - let fld; - let html = ''; - - if (options === undefined) { - options = this.options; - } - - // will probably need some different classes for handling different layouts here - const layoutClass = options.mode === 'lookup' ? "List-lookupLayout" : (_.has(list, 'layoutClass') ? list.layoutClass : "List-defaultLayout"); - html += `
`; - - html += `
`; - - if (list.multiSelect) { - html += `
`; - } - - if (options.mode !== 'lookup' && list.staticColumns) { - angular.forEach(list.staticColumns, function() { - html += `
`; - }); - } - - html += `
`; - - for (fld in list.fields) { - if (options.mode !== 'lookup' || (options.mode === 'lookup' && (fld === 'name' || _.has(list.fields[fld], 'includeModal')))){ - let customClass = list.fields[fld].columnClass || ''; - const ngIf = list.fields[fld].ngIf ? `ng-if="${list.fields[fld].ngIf}"` : ''; - html += `
-
`; - } - } - - if(options.mode === 'edit' && list.fieldActions) { - html += `
"; - html += (list.fieldActions.label === undefined || list.fieldActions.label) ? i18n._("Actions") : ""; - html += "
"; - } - - html += "
"; - - html += `
`; - - return html; - }, - - wrapPanel: function(html){ - return ` -
${html}
`; - }, - - insertFormView: function(){ - return `
`; - }, - - insertSchedulerView: function(){ - return `
`; - } - }; - } -]; diff --git a/awx/ui/client/src/shared/list-generator/main.js b/awx/ui/client/src/shared/list-generator/main.js deleted file mode 100644 index 488179a1bf..0000000000 --- a/awx/ui/client/src/shared/list-generator/main.js +++ /dev/null @@ -1,15 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import generateList from './list-generator.factory'; -import toolbarButton from './toolbar-button.directive'; -import generatorHelpers from '../generator-helpers'; -import multiSelectList from '../multi-select-list/main'; - -export default - angular.module('listGenerator', [generatorHelpers.name, multiSelectList.name]) - .factory('generateList', generateList) - .directive('toolbarButton', toolbarButton); diff --git a/awx/ui/client/src/shared/list-generator/toolbar-button.directive.js b/awx/ui/client/src/shared/list-generator/toolbar-button.directive.js deleted file mode 100644 index fb9402212c..0000000000 --- a/awx/ui/client/src/shared/list-generator/toolbar-button.directive.js +++ /dev/null @@ -1,66 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['SelectIcon', function(SelectIcon) { - return { - restrict: 'A', - scope: {}, - link: function(scope, element, attrs) { - - var toolbar = attrs.toolbar; - - if (toolbar) { - //if this is a toolbar button, set some defaults - attrs.class = 'btn-xs btn-primary'; - attrs.iconSize = 'fa-lg'; - } - - element.addClass('btn'); - - // If no class specified, default - // to btn-sm - if (_.isEmpty(attrs.class)) { - element.addClass("btn-sm"); - } else { - element.addClass(attrs.class); - } - - if (attrs.awPopOver) { - element.addClass("help-link-white"); - } - - if (attrs.iconName && _.isEmpty(attrs.id)) { - element.attr("id",attrs.iconName + "_btn"); - } - - if (!_.isEmpty(attrs.img)) { - $("") - .attr("src", $basePath + "assets/" + attrs.img) - .css({ width: "12px", height: "12px" }) - .appendTo(element); - } - - if (!_.isEmpty(attrs.iconClass)) { - $("") - .addClass(attrs.iconClass) - .appendTo(element); - } - else { - var icon = SelectIcon({ - action: attrs.iconName, - size: attrs.iconSize - }); - - $(icon).appendTo(element); - } - - if (!toolbar && !_.isEmpty(attrs.label)) { - element.text(attrs.label); - } - - } - }; -}]; diff --git a/awx/ui/client/src/shared/load-config/load-config.factory.js b/awx/ui/client/src/shared/load-config/load-config.factory.js deleted file mode 100644 index 56916cd7a4..0000000000 --- a/awx/ui/client/src/shared/load-config/load-config.factory.js +++ /dev/null @@ -1,40 +0,0 @@ -export default - function LoadConfig($rootScope, Store) { - return function() { - - var configSettings = {}; - - if(global.$ConfigResponse.custom_logo) { - configSettings.custom_logo = true; - $rootScope.custom_logo = global.$ConfigResponse.custom_logo; - } else { - configSettings.custom_logo = false; - } - - if(global.$ConfigResponse.custom_login_info) { - configSettings.custom_login_info = global.$ConfigResponse.custom_login_info; - $rootScope.custom_login_info = global.$ConfigResponse.custom_login_info; - } else { - configSettings.custom_login_info = false; - } - - if (global.$ConfigResponse.login_redirect_override) { - configSettings.login_redirect_override = global.$ConfigResponse.login_redirect_override; - } - - // Auto-resolving what used to be found when attempting to load local_setting.json - if ($rootScope.loginConfig) { - $rootScope.loginConfig.resolve('config loaded'); - } - global.$AnsibleConfig = configSettings; - Store('AnsibleConfig', global.$AnsibleConfig); - $rootScope.$emit('ConfigReady'); - - // Load new hardcoded settings from above - $rootScope.$emit('LoadConfig'); - - }; - } - -LoadConfig.$inject = - [ '$rootScope', 'Store' ]; diff --git a/awx/ui/client/src/shared/load-config/main.js b/awx/ui/client/src/shared/load-config/main.js deleted file mode 100644 index 3accf42ffa..0000000000 --- a/awx/ui/client/src/shared/load-config/main.js +++ /dev/null @@ -1,5 +0,0 @@ -import LoadConfig from './load-config.factory'; - -export default - angular.module('loadconfig', []) - .factory('LoadConfig', LoadConfig); diff --git a/awx/ui/client/src/shared/lookup/lookup-modal.block.less b/awx/ui/client/src/shared/lookup/lookup-modal.block.less deleted file mode 100644 index e5d7993f71..0000000000 --- a/awx/ui/client/src/shared/lookup/lookup-modal.block.less +++ /dev/null @@ -1,3 +0,0 @@ -.Lookup .modal-body{ - padding-top: 0px; -} diff --git a/awx/ui/client/src/shared/lookup/lookup-modal.directive.js b/awx/ui/client/src/shared/lookup/lookup-modal.directive.js deleted file mode 100644 index cee16d2e1c..0000000000 --- a/awx/ui/client/src/shared/lookup/lookup-modal.directive.js +++ /dev/null @@ -1,119 +0,0 @@ -export default ['templateUrl', 'i18n', function(templateUrl, i18n) { - return { - restrict: 'E', - replace: true, - transclude: true, - scope: false, - templateUrl: templateUrl('shared/lookup/lookup-modal'), - link: function(scope, element, attrs, controller, transcludefn) { - - transcludefn(scope, (clone, linked_scope) => { - // scope.$resolve is a reference to resolvables in stateDefinition.resolve block - // https://ui-router.github.io/docs/latest/interfaces/state.statedeclaration.html#resolve - let list = linked_scope.$resolve.ListDefinition, - Dataset = linked_scope.$resolve.Dataset; - // search init - linked_scope.list = list; - linked_scope[`${list.iterator}_dataset`] = Dataset.data; - linked_scope[list.name] = linked_scope[`${list.iterator}_dataset`].results; - - element.find('.modal-body').append(clone); - - scope.init(element); - - }); - $('#form-modal').modal('show'); - }, - controller: ['$scope', '$state', 'EventService', function($scope, $state, eventService) { - let listeners, modal; - - function clickIsOutsideModal(e) { - const m = modal.getBoundingClientRect(); - const cx = e.clientX; - const cy = e.clientY; - - if (cx < m.left || cx > m.right || cy > m.bottom || cy < m.top) { - return true; - } - - return false; - } - - function clickToHide(event) { - if (clickIsOutsideModal(event)) { - $scope.cancelForm(); - } - } - - $scope.init = function(el) { - let list = $scope.list; - [modal] = el.find('.modal-dialog'); - if($state.params.selected) { - let selection = $scope[list.name].find(({id}) => id === parseInt($state.params.selected)); - $scope.currentSelection = _.pick(selection, 'id', 'name'); - } - $scope.$watch(list.name, function(){ - selectRowIfPresent(); - }); - let resource = list.iterator.replace(/_/g, ' '); - $scope.modalTitle = i18n._('Select') + ' ' + i18n._(resource); - - listeners = eventService.addListeners([ - [window, 'click', clickToHide] - ]); - }; - - function selectRowIfPresent(){ - let list = $scope.list; - if($scope.currentSelection && $scope.currentSelection.id) { - $scope[list.name].forEach(function(row) { - if (row.id === $scope.currentSelection.id) { - row.checked = 1; - } - }); - } - } - - $scope.saveForm = function () { - eventService.remove(listeners); - let list = $scope.list; - if($scope.currentSelection.name !== null) { - $scope.$parent[`${list.iterator}_name`] = $scope.currentSelection.name; - } - $scope.$parent[list.iterator] = $scope.currentSelection.id; - $state.go('^'); - }; - - $scope.cancelForm = function() { - eventService.remove(listeners); - $state.go('^'); - }; - - $scope.toggle_row = function (selectedRow) { - let list = $scope.list; - let count = 0; - $scope[list.name].forEach(function(row) { - if (row.id === selectedRow.id) { - if (row.checked) { - row.success_class = 'success'; - } else { - row.checked = 1; - row.success_class = ''; - } - $scope.currentSelection = { - name: row.name, - id: row.id - }; - } else { - row.checked = 0; - row.success_class = ''; - } - if (row.checked) { - count++; - } - }); - }; - - }] - }; -}]; diff --git a/awx/ui/client/src/shared/lookup/lookup-modal.partial.html b/awx/ui/client/src/shared/lookup/lookup-modal.partial.html deleted file mode 100644 index 6fbe7bb4c6..0000000000 --- a/awx/ui/client/src/shared/lookup/lookup-modal.partial.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/awx/ui/client/src/shared/lookup/main.js b/awx/ui/client/src/shared/lookup/main.js deleted file mode 100644 index df069649ab..0000000000 --- a/awx/ui/client/src/shared/lookup/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import directive from './lookup-modal.directive'; - -export default - angular.module('LookupModalModule', []) - .directive('lookupModal', directive); diff --git a/awx/ui/client/src/shared/main.js b/awx/ui/client/src/shared/main.js deleted file mode 100644 index bb3b3942ff..0000000000 --- a/awx/ui/client/src/shared/main.js +++ /dev/null @@ -1,72 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import listGenerator from './list-generator/main'; -import formGenerator from './form-generator'; -import lookupModal from './lookup/main'; -import smartSearch from './smart-search/main'; -import paginate from './paginate/main'; -import columnSort from './column-sort/main'; -import filters from './filters/main'; -import truncatedText from './truncated-text.directive'; -import stateExtender from './stateExtender.provider'; -import rbacUiControl from './rbacUiControl'; -import socket from './socket/main'; -import templateUrl from './template-url/main'; -import RestServices from '../rest/main'; -import stateDefinitions from './stateDefinitions.factory'; -import apiLoader from './api-loader'; -import variables from './variables/main'; -import parse from './parse/main'; -import loadconfig from './load-config/main'; -import nextpage from './next-page/main'; -import Modal from './Modal'; -import moment from './moment/main'; -import config from './config/main'; -import PromptDialog from './prompt-dialog'; -import directives from './directives'; -import orgAdminLookup from './org-admin-lookup/main'; -import limitPanels from './limit-panels/main'; -import multiSelectPreview from './multi-select-preview/main'; -import credentialTypesLookup from './credentialTypesLookup.factory'; -import utilities from './Utilities'; - -export default -angular.module('shared', [ - listGenerator.name, - formGenerator.name, - lookupModal.name, - smartSearch.name, - paginate.name, - columnSort.name, - filters.name, - 'ui.router', - rbacUiControl.name, - socket.name, - templateUrl.name, - RestServices.name, - apiLoader.name, - variables.name, - parse.name, - loadconfig.name, - nextpage.name, - Modal.name, - moment.name, - config.name, - PromptDialog.name, - directives.name, - filters.name, - orgAdminLookup.name, - limitPanels.name, - multiSelectPreview.name, - utilities.name, - 'ngCookies', - 'angular-duration-format' - ]) - .factory('stateDefinitions', stateDefinitions) - .factory('credentialTypesLookup', credentialTypesLookup) - .directive('truncatedText', truncatedText) - .provider('$stateExtender', stateExtender); diff --git a/awx/ui/client/src/shared/media-object.block.less b/awx/ui/client/src/shared/media-object.block.less deleted file mode 100644 index 085999154f..0000000000 --- a/awx/ui/client/src/shared/media-object.block.less +++ /dev/null @@ -1,14 +0,0 @@ -/** @define Media */ - -.Media { - display: flex; - align-items: flex-start; - - &-figure { - margin-right: 1.4rem; - } - - &-body { - flex: 1; - } -} diff --git a/awx/ui/client/src/shared/modal/modal.less b/awx/ui/client/src/shared/modal/modal.less deleted file mode 100644 index 5b09e72b92..0000000000 --- a/awx/ui/client/src/shared/modal/modal.less +++ /dev/null @@ -1,133 +0,0 @@ -.Modal-content { - display:flex; - flex-wrap:wrap; - flex-direction: row; - padding: 15px 20px; - -webkit-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); - -moz-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); - box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.25); -} - -.Modal-header { - display: flex; - width: 100%; - margin-bottom: 20px; -} - -.Modal-title { - flex: 1 0 auto; - text-transform: uppercase; - color: @list-header-txt; - font-size: 14px; - font-weight: bold; - width: calc(100%-18px); - word-break: break-word; -} - -.Modal-exitHolder{ - justify-content: flex-end; - display:flex; -} - -.Modal-exit{ - cursor:pointer; - padding:0px; - border: none; - height:20px; - font-size: 20px; - background-color:@default-bg; - color:@default-icon-hov; - line-height:1; - opacity: 1; -} - -.Modal-exit:hover{ - color: @default-icon; - opacity: 1; -} - -.Modal-body { - width: 100%; -} - -.Modal-bodyQuery { - margin-bottom: 20px; - color: @default-interface-txt; -} - -.Modal-bodyTarget { - color: @default-data-txt; -} - -.Modal-footer { - display: flex; - justify-content: flex-end; - margin-top: 20px; - width: 100%; -} - -.Modal-defaultButton { - background-color: @default-bg; - color: @btn-txt; - text-transform: uppercase; - border-radius: 5px; - border: 1px solid @btn-bord; - transition: background-color 0.2s; - padding-left:15px; - padding-right: 15px; -} - -.Modal-defaultButton:hover { - background-color: @btn-bg-hov; - color: @btn-txt; -} - -.Modal-errorButton { - background-color: @default-err; - color: @btn-txt-sel; - text-transform: uppercase; - border-radius: 5px; - transition: background-color 0.2s; - padding-left:15px; - padding-right: 15px; -} - -.Modal-errorButton:hover { - background-color: @default-err-hov; - color: @btn-txt-sel; -} - -.Modal-errorButton--sourcesDelete:hover{ - cursor: not-allowed; -} - -.Modal-primaryButton { - background-color: @default-link; - color: @default-bg; - text-transform: uppercase; - border-radius: 5px; - transition: background-color 0.2s; - padding-left:15px; - padding-right: 15px; -} - -.Modal-primaryButton:hover { - background-color: @default-link-hov; - color: @default-bg; -} - -.Modal-errorButton:focus { - color: @btn-txt-sel; -} - -.Modal-footerButton { - padding: 4px 8px; -} - -.Modal-footerButton + .Modal-footerButton { - margin-left: 20px; -} - -.Modal-titleResourceName { - color: @default-err; -} diff --git a/awx/ui/client/src/shared/moment/main.js b/awx/ui/client/src/shared/moment/main.js deleted file mode 100644 index f1c70d88c0..0000000000 --- a/awx/ui/client/src/shared/moment/main.js +++ /dev/null @@ -1,9 +0,0 @@ -import newMoment from './moment'; - -export default - angular.module('moment', ['angularMoment']) - .config(function() { - // Remove the global variable for moment - delete window.moment; - }) - .constant('moment', newMoment); diff --git a/awx/ui/client/src/shared/moment/moment.js b/awx/ui/client/src/shared/moment/moment.js deleted file mode 100644 index bf03763b50..0000000000 --- a/awx/ui/client/src/shared/moment/moment.js +++ /dev/null @@ -1,21 +0,0 @@ -var originalMoment = require('moment'); -import {merge} from 'lodash'; - -function moment() { - - // navigator.language is available in all modern browsers. - // however navigator.languages is a new technology that - // lists the user's preferred languages, the first in the array - // being the user's top choice. navigator.languages is currently - // comptabile with chrome>v32, ffox>32, but not IE/Safari - var lang = window.navigator.languages ? - window.navigator.languages[0] : - (window.navigator.language || window.navigator.userLanguage); - - originalMoment.locale(lang); - return originalMoment.apply(this, arguments); -} - -merge(moment, originalMoment); - -export default moment; diff --git a/awx/ui/client/src/shared/multi-select-list/main.js b/awx/ui/client/src/shared/multi-select-list/main.js deleted file mode 100644 index 0c1bb7fcba..0000000000 --- a/awx/ui/client/src/shared/multi-select-list/main.js +++ /dev/null @@ -1,16 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import multiSelect from './multi-select-list.directive'; -//import selectAll from './select-all.directive'; -import selectListItem from './select-list-item.directive'; -import templateUrl from '../template-url/main'; - -export default - angular.module('multiSelectList', [templateUrl.name]) - .directive('multiSelectList', multiSelect) - //.directive('selectAll', selectAll) - .directive('selectListItem', selectListItem); diff --git a/awx/ui/client/src/shared/multi-select-list/multi-select-list.controller.js b/awx/ui/client/src/shared/multi-select-list/multi-select-list.controller.js deleted file mode 100644 index 9cd4766769..0000000000 --- a/awx/ui/client/src/shared/multi-select-list/multi-select-list.controller.js +++ /dev/null @@ -1,206 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc object - * @name multiSelectList.controller:multiSelectList - * - * @description - * - * `multiSelectList` controller provides the API for the {@link multiSelectList.directive:multiSelectList `multiSelectList`} directive. The controller contains methods for selecting/deselecting items, controlling the extended selection, registering items to be selectable and emitting an event on the directive's `$scope`. - * - */ -export default ['$scope', - function ($scope) { - $scope.items = []; - $scope.selection = { - isExtended: false, - selectedItems: [], - deselectedItems: [] - }; - - // Makes $scope.selection.length an alias for $scope.selectedItems.length - Object.defineProperty($scope.selection, - 'length', - { get: function() { - return this.selectedItems.length; - } - }); - - function rebuildSelections() { - var _items = _($scope.items).chain(); - - $scope.selection.selectedItems = - _items.filter(function(item) { - return item.isSelected; - }).map('value').value(); - - $scope.selection.deselectedItems = - _items.map('value').difference($scope.selection.selectedItems) - .value(); - - /** - * - * @ngdoc event - * @name multiSelectList.selectionChanged - * @eventOf multiSelectList.directive:multiSelectList - * - */ - $scope.$emit('multiSelectList.selectionChanged', $scope.selection); - } - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#registerItem - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Prepares an object to be tracked in the select list. Returns the - * decorated item created by - * {@link multiSelectList.controller:multiSelectList#decorateItem `decorateItem`} - */ - this.registerItem = function(item) { - var foundItem = _.find($scope.items, function(existingItem) { return existingItem.id === item.id; }); - - if(foundItem) { - return foundItem; - } - else { - var decoratedItem = this.decorateItem(item); - $scope.items = $scope.items.concat(decoratedItem); - return decoratedItem; - } - }; - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#deregisterItem - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Removes an item from the list; called if the item is removed from the display - * so that it is no longer tracked as a selectable item. - */ - this.deregisterItem = function(leavingItem) { - $scope.items = $scope.items.filter(function(item) { - return leavingItem !== item; - }); - rebuildSelections(); - }; - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#decorateItem - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * - * This decorates an item with an object that has an `isSelected` property. - * This value is used to determine the lists of selected and non-selected - * items to emit with the `multiSelectList.selectionChanged` - * event. - */ - this.decorateItem = function(item) { - return { - isSelected: false, - id: item.id, - value: item - }; - }; - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#selectAll - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Marks all items in the list as selected. - * Triggers {@link multiSelectList.selectionChanged `multiSelectList.selectionChanged`} - */ - this.selectAll = function() { - $scope.items.forEach(function(item) { - item.isSelected = true; - }); - rebuildSelections(); - }; - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#deselectAll - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Marks all items in the list as not selected. - * Triggers {@link multiSelectList.selectionChanged `multiSelectList.selectionChanged`} - */ - this.deselectAll = function() { - $scope.items.forEach(function(item) { - item.isSelected = false; - }); - $scope.selection.isExtended = false; - rebuildSelections(); - }; - - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#deselectAllExtended - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Disables extended selection. - * Triggers {@link multiSelectList.selectionChanged `multiSelectList.selectionChanged`} - */ - this.deselectAllExtended = function() { - $scope.selection.isExtended = false; - rebuildSelections(); - }; - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#selectAllExtended - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Enables extended selection. - * Triggers {@link multiSelectList.selectionChanged `multiSelectList.selectionChanged`} - */ - this.selectAllExtended = function() { - $scope.selection.isExtended = true; - rebuildSelections(); - }; - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#selectItem - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Marks an item as selected. - * Triggers {@link multiSelectList.selectionChanged `multiSelectList.selectionChanged`} - * - */ - this.selectItem = function(item) { - item.isSelected = true; - rebuildSelections(); - }; - - /** - * @ngdoc method - * @name multiSelectList.controller:multiSelectList#deregisterItem - * @methodOf multiSelectList.controller:multiSelectList - * - * @description - * Marks an item as not selected. - * Triggers {@link multiSelectList.selectionChanged `multiSelectList.selectionChanged`} - * - */ - this.deselectItem = function(item) { - item.isSelected = false; - rebuildSelections(); - }; - - }]; diff --git a/awx/ui/client/src/shared/multi-select-list/multi-select-list.directive.js b/awx/ui/client/src/shared/multi-select-list/multi-select-list.directive.js deleted file mode 100644 index 71424d3cbe..0000000000 --- a/awx/ui/client/src/shared/multi-select-list/multi-select-list.directive.js +++ /dev/null @@ -1,146 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc overview - * @name multiSelectList - * @scope - * @description Does some stuff - * - * @ngdoc directive - * @name multiSelectList.directive:multiSelectList - * @description - * The `multiSelectList` directive works in conjunction with the - * `selectListItem` and (optionally) the `selectAll` directives to - * render checkboxes with list items and tracking the selected state - * of each item. The `selectListItem` directive renders a checkbox, - * and the `multiSelectList` directive tracks the selected state - * of list items. The `selectAll` directive renders a checkbox that - * will select/deselect all items in the list. - * - * - * This directive exposes a special object on its local scope called - * `selection` that is used to access the current selection state. - * The following properties on `selection` are available: - * - * | Property | Type | Details | - * |-------------------|-----------------|-------------------------------------------------------------| - * | `selectedItems` | {@type array} | The items that are currently selected | - * | `deselectedItem` | {@type array} | The items that are currently _not_ selected | - * | `isExtended` | {@type boolean} | Indicates that the user has requested an extended selection | - * | `length` | {@type number} | The length of the selected items array | - * - * Use the `multi-select-list` directive to indicate that you want - * to allow users to select items in a list. To display a checkbox - * next to each item, use the {@link multiSelectList.directive:selectListItem `select-list-item`} directive. - * - * # Rendering a basic multi-select list - * - * @example - * - * This example creates a list of names and then - * uses `multiSelectList` to make the names - * selectable: - * - - -
-
    -
  • - - {{item.name}} -
  • -
-
-
- -
- - # Making other elements respond to the state of the selction - - In this example, we'll see how to make a button that enables/disables - itself based on some property of the selection. - - - - angular.module('stateTrackingExample', ['multiSelectList']) - .controller('namesController', ['$scope', function($scope) { - $scope.names = - [ { name: 'John' - }, - { name: 'Jared' - }, - { name: 'Joe' - }, - { name: 'James' - }, - { name: 'Matt' - }, - { name: 'Luke' - }, - { name: 'Chris' - } - ]; - - // Initial logic for buttons - $scope.noSelections = true; - $scope.atLeastOneSelection = false; - $scope.exactlyTwoSelections = false; - - var cleanup = $scope.$on('multiSelectList.selectionChanged', function(e, selection) { - // Recalculate logic for buttons whenever selections change - $scope.noSelections = selection.length == 0; - $scope.atLeastOneSelection = selection.length >= 1; - $scope.exactlyTwoSelections = selection.length == 2; - }); - }]); - - -
- - - -
    -
  • - - {{item.name}} -
  • -
-
-
- -
- - * -*/ -import controller from './multi-select-list.controller'; - -export default -[ function() { - return { - restrict: 'A', - scope: { - }, - controller: controller - }; - }]; diff --git a/awx/ui/client/src/shared/multi-select-list/select-all.directive.js b/awx/ui/client/src/shared/multi-select-list/select-all.directive.js deleted file mode 100644 index 4470f05e79..0000000000 --- a/awx/ui/client/src/shared/multi-select-list/select-all.directive.js +++ /dev/null @@ -1,193 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc directive - * @name multiSelectList.directive:selectAll - * @scope - * @restrict E - * - * @param {string} label The text that will appear next to the checkbox - * @param {number} itemsLength The number of displayed items in the list - * @param {number} extendedItemsLength The total number of items in the list used for extended mode (see below) - * @param {string_expression} extendedLabel A custom label to display when prompting the user to extend the selection; this is an expression so strings must be in single quotes ('), but you can use scope varibles here to display the count of items with the `extendedItemsLength` property - * @param {boolean_expression} selectionsEmpty An expression that evaluates to a truthy value used to disable - * the select all checkbox when the displayed list is empty - * - * @description - * - * Use the `select-all` directive as a child of a `multi-select-list` - * to present the user with a checkbox that, when checked, checks all - * `select-list-item` children, and when unchecked it unchecks them. - * - * - -
-
    -
  • - -
  • -
  • - - {{item.name}} -
  • -
-
-
- - *
- * - * ## Extended Selections - * - * In some cases the list items you are displaying are only a subset of - * a larger list (eg. using pagination or infinite scroll to seperate - * items). In these cases, when a user checks "select all", it may be - * useful to give them the option to also select all the remaining - * items in the list. - * - * This behavior is controlled by the `extendedItemsLength` property - * of this directive. Set it to the total length of items in the list. - * For example, if you have a list of 100 items, displayed 10 per page, - * then `itemsLength` would be 10 and `extendedItemsLength` would be 100. - * When the user checks "select all" in the above example, it will show - * a button prompting them to "Select all 100 items". When the user selects - * this option, the `select-all` directive tells the `multiSelectList` - * controller that the selection is "extended" to all the items in the list. - * Listeners to the `multiSelectList.selectionChanged` event can then use this - * flag to respond differently when all items are selected. - * - * - * - - angular.module('extendedSelectionExample', ['multiSelectList']) - .controller('namesController', ['$scope', function($scope) { - - var cleanup = $scope.$on('multiSelectList.selectionChanged', function(e, selection) { - $scope.isSelectionExtended = selection.isExtended; - }); - - $scope.$on('$destroy', cleanup); - - $scope.allNames = - [ { name: 'John' - }, - { name: 'Jared' - }, - { name: 'Joe' - }, - { name: 'James' - }, - { name: 'Matt' - }, - { name: 'Luke' - }, - { name: 'Chris' - } - ]; - - $scope.firstPageOfNames = - $scope.allNames.slice(0,3); - }]); - - -
-

Extended Selection

-
    -
  • - -
  • -
  • - - {{item.name}} -
  • -
-
-
- *
- */ -// TODO: Extract to its own helper -// Example: -// template('shared/multi-select-list/select-all') -// // => -// '/static/js/shared/multi-select-list/select-all.html -// - -export default - [ 'templateUrl', - function(templateUrl) { - return { - require: '^multiSelectList', - restrict: 'E', - scope: { - label: '@', - itemsLength: '=', - extendedItemsLength: '=', - extendedLabel: '&', - isSelectionEmpty: '=selectionsEmpty' - }, - templateUrl: templateUrl('shared/multi-select-list/select-all'), - link: function(scope, element, attrs, controller) { - - scope.label = scope.label || 'All'; - scope.selectExtendedLabel = scope.extendedLabel() || 'Select all ' + scope.extendedItemsLength + ' items'; - scope.deselectExtendedLabel = scope.deselectExtendedLabel || 'Deselect extra items'; - - scope.doSelectAll = function() { - if (scope.isSelected) { - controller.selectAll(); - - if (scope.supportsExtendedItems) { - scope.showExtendedMessage = scope.itemsLength !== scope.extendedItemsLength; - } - } else { - controller.deselectAll(); - - if (scope.isSelectionExtended) { - scope.deselectAllExtended(); - } - - scope.showExtendedMessage = false; - } - }; - - scope.$watch('extendedItemsLength', function(value) { - scope.supportsExtendedItems = _.isNumber(value); - }); - - scope.$watch('isSelectionEmpty', function(value) { - if (value) { - scope.isSelected = false; - } - }); - - scope.selectAllExtended = function() { - controller.selectAllExtended(scope.extendedItemsLength); - scope.isSelectionExtended = true; - }; - - scope.deselectAllExtended = function() { - controller.deselectAllExtended(scope.extendedItemsLength); - scope.isSelectionExtended = false; - }; - - } - }; - }]; diff --git a/awx/ui/client/src/shared/multi-select-list/select-all.partial.html b/awx/ui/client/src/shared/multi-select-list/select-all.partial.html deleted file mode 100644 index e16d664345..0000000000 --- a/awx/ui/client/src/shared/multi-select-list/select-all.partial.html +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/awx/ui/client/src/shared/multi-select-list/select-list-item.directive.js b/awx/ui/client/src/shared/multi-select-list/select-list-item.directive.js deleted file mode 100644 index 31d64431f0..0000000000 --- a/awx/ui/client/src/shared/multi-select-list/select-list-item.directive.js +++ /dev/null @@ -1,50 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc directive - * @name multiSelectList.directive:selectListItem - * @restrict E - * @scope - * @description - * - The `select-list-item` directive renders a checkbox for tracking - the state of a given item in a list. When the user checks the - checkbox it tells the `multi-select-list` controller to select - the item; when the user unchecks the checkbox it tells the controller - to deselect the item. - - @example - - For examples of using this directive, see {@link multiSelectList.directive:multiSelectList multiSelectList}. - - */ -export default - [ function() { - return { - restrict: 'E', - scope: { - item: '=item', - disabled: '=' - }, - require: '^multiSelectList', - template: '', - link: function(scope, element, attrs, multiSelectList) { - - scope.decoratedItem = multiSelectList.registerItem(scope.item); - - scope.userInteractionSelect = function(item) { - if (item.isSelected === true) { - multiSelectList.selectItem(scope.decoratedItem); - } else if (item.isSelected === false) { - multiSelectList.deselectItem(scope.decoratedItem); - } - scope.$emit("selectedOrDeselected", scope.decoratedItem); - }; - - } - }; - }]; diff --git a/awx/ui/client/src/shared/multi-select-preview/main.js b/awx/ui/client/src/shared/multi-select-preview/main.js deleted file mode 100644 index 1f50c494c0..0000000000 --- a/awx/ui/client/src/shared/multi-select-preview/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import multiSelectPreview from './multi-select-preview.directive'; - -export default - angular.module('multiSelectPreview', []) - .directive('multiSelectPreview', multiSelectPreview); diff --git a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.block.less b/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.block.less deleted file mode 100644 index 2a21ab3f2e..0000000000 --- a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.block.less +++ /dev/null @@ -1,97 +0,0 @@ -.MultiSelectPreview { - display: flex; - flex: 1 0 auto; - margin-bottom: 15px; - align-items: baseline; -} - -.MultiSelectPreview-selectedItems { - display: flex; - flex: 0 0 100%; - background-color: @default-no-items-bord; - border: 1px solid @default-border; - padding: 10px; - border-radius: 5px; -} - -.MultiSelectPreview-selectedItemsLabel, .MultiSelectPreview-label { - color: @default-interface-txt; - margin-right: 10px; -} - -.MultiSelectPreview-selectedItemsLabel { - flex: 0 0 80px; - line-height: 29px; -} - -.MultiSelectPreview-previewTags--outer { - flex: 1 0 auto; - max-width: ~"calc(100% - 140px)"; -} - -.MultiSelectPreview-previewTags--inner { - display: flex; - flex-wrap: wrap; - align-items: flex-start; -} - -.MultiSelectPreview-previewTagContainer { - display: flex; -} - -.MultiSelectPreview-previewTagRevert { - flex: 0 0 60px; - line-height: 29px; -} - -.MultiSelectPreview-revertLink { - font-size: 12px; -} - -.MultiSelectPreview-previewTagContainerDelete { - background-color: @default-link; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - color: @default-bg; - padding: 0 5px; - margin: 4px 0px; - align-items: center; - display: flex; - cursor: pointer; -} - -.MultiSelectPreview-previewTagContainerDelete:hover { - border-color: @default-err; - background-color: @default-err; -} - -.MultiSelectPreview-previewTagContainerDelete:hover > .MultiSelectPreview-previewTagContainerTagDelete { - color: @default-bg; -} - -.MultiSelectPreview-previewTag { - border-radius: 5px; - padding: 2px 10px; - margin: 4px 0px; - font-size: 12px; - color: @default-interface-txt; - background-color: @default-list-header-bg; - margin-right: 5px; - max-width: 100%; - display: inline-block; -} - -.MultiSelectPreview-previewTagLabel { - color: @default-list-header-bg; -} - -.MultiSelectPreview-previewTag--deletable { - color: @default-bg; - background-color: @default-link; - margin-right: 0px; - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-right: 0; - max-width: ~"calc(100% - 23px)"; - margin-right: 5px; -} diff --git a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.controller.js b/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.controller.js deleted file mode 100644 index be166234c7..0000000000 --- a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.controller.js +++ /dev/null @@ -1,21 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', - function ($scope) { - $scope.unselectSelectedRow = function(index) { - - angular.forEach($scope.availableRows, function(value) { - if(value.id === $scope.selectedRows[index].id) { - value.isSelected = false; - } - }); - - $scope.selectedRows.splice(index, 1); - - }; - } -]; diff --git a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.directive.js b/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.directive.js deleted file mode 100644 index 6805840f19..0000000000 --- a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.directive.js +++ /dev/null @@ -1,20 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - import MultiSelectPreviewController from './multi-select-preview.controller'; - - export default ['templateUrl', function(templateUrl) { - return { - restrict: 'E', - replace: true, - scope: { - selectedRows: '=', - availableRows: '=' - }, - controller: MultiSelectPreviewController, - templateUrl: templateUrl('shared/multi-select-preview/multi-select-preview') - }; - }]; diff --git a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.partial.html b/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.partial.html deleted file mode 100644 index 891026dd8a..0000000000 --- a/awx/ui/client/src/shared/multi-select-preview/multi-select-preview.partial.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
- SELECTED: -
-
-
-
- - -
-
-
-
-
diff --git a/awx/ui/client/src/shared/next-page/main.js b/awx/ui/client/src/shared/next-page/main.js deleted file mode 100644 index 8d9e83f28a..0000000000 --- a/awx/ui/client/src/shared/next-page/main.js +++ /dev/null @@ -1,5 +0,0 @@ -import NextPage from './next-page.factory'; - -export default - angular.module('nextpage', []) - .factory('NextPage', NextPage); diff --git a/awx/ui/client/src/shared/next-page/next-page.factory.js b/awx/ui/client/src/shared/next-page/next-page.factory.js deleted file mode 100644 index fa5bce3dc7..0000000000 --- a/awx/ui/client/src/shared/next-page/next-page.factory.js +++ /dev/null @@ -1,28 +0,0 @@ -export default - function NextPage(Rest, $q) { - return function(params) { - - let getNext = function(getNextParams){ - Rest.setUrl(getNextParams.url); - return Rest.get() - .then(function (res) { - if (res.data.next) { - return getNext({ - url: res.data.next, - arrayOfValues: getNextParams.arrayOfValues.concat(res.data.results) - }); - } else { - return $q.resolve(getNextParams.arrayOfValues.concat(res.data.results)); - } - }) - .catch(function(response) { - return $q.reject( response ); - }); - }; - - return getNext(params); - - }; - } - -NextPage.$inject = ['Rest', '$q']; diff --git a/awx/ui/client/src/shared/org-admin-lookup/main.js b/awx/ui/client/src/shared/org-admin-lookup/main.js deleted file mode 100644 index 3d4f162f62..0000000000 --- a/awx/ui/client/src/shared/org-admin-lookup/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import OrgAdminLookupFactory from './org-admin-lookup.factory'; - -export default - angular.module('orgAdminLookup', []) - .service('OrgAdminLookup', OrgAdminLookupFactory); diff --git a/awx/ui/client/src/shared/org-admin-lookup/org-admin-lookup.factory.js b/awx/ui/client/src/shared/org-admin-lookup/org-admin-lookup.factory.js deleted file mode 100644 index 3e86cd866c..0000000000 --- a/awx/ui/client/src/shared/org-admin-lookup/org-admin-lookup.factory.js +++ /dev/null @@ -1,65 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - ['Rest', 'Authorization', 'GetBasePath', 'ProcessErrors', '$rootScope', '$q', - function(Rest, Authorization, GetBasePath, ProcessErrors, $rootScope, $q){ - return { - checkForAdminAccess: function(params) { - // params.organization - id of the organization in question - var deferred = $q.defer(); - if(Authorization.getUserInfo('is_superuser') !== true) { - Rest.setUrl(GetBasePath('users') + $rootScope.current_user.id + '/admin_of_organizations'); - Rest.get({ params: { id: params.organization } }) - .then(({data}) => { - if(data.count && data.count > 0) { - deferred.resolve(true); - } - else { - deferred.resolve(false); - } - }); - } - else { - deferred.resolve(true); - } - - return deferred.promise; - }, - - checkForRoleLevelAdminAccess: function(organization_id, role_level) { - let deferred = $q.defer(); - let params = { - role_level, - id: organization_id - }; - - if(Authorization.getUserInfo('is_superuser') !== true) { - Rest.setUrl(GetBasePath('organizations')); - Rest.get({ params: params }) - .then(({data}) => { - if(data.count && data.count > 0) { - deferred.resolve(true); - } - else { - deferred.resolve(false); - } - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get organization data based on role_level. Return status: ' + status - }); - }); - } - else { - deferred.resolve(true); - } - return deferred.promise; - } - }; - } - ]; diff --git a/awx/ui/client/src/shared/paginate/main.js b/awx/ui/client/src/shared/paginate/main.js deleted file mode 100644 index 394f9b9034..0000000000 --- a/awx/ui/client/src/shared/paginate/main.js +++ /dev/null @@ -1,13 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import directive from './paginate.directive'; -import controller from './paginate.controller'; - -export default - angular.module('PaginateModule', []) - .directive('paginate', directive) - .controller('PaginateController', controller); diff --git a/awx/ui/client/src/shared/paginate/paginate.block.less b/awx/ui/client/src/shared/paginate/paginate.block.less deleted file mode 100644 index 0947c4d4e2..0000000000 --- a/awx/ui/client/src/shared/paginate/paginate.block.less +++ /dev/null @@ -1,80 +0,0 @@ - // @todo cleanup these messy overrides for styles in ansible-ui.min.css - -.Paginate-controls--first a, -.Paginate-controls--previous a{ - border-radius: 4px 0 0 4px; - } -.Paginate-controls--last a, -.Paginate-controls--next a{ - border-radius: 0px 4px 4px 0; -} - - .Paginate-controls--item a { - font-size: 12px; - padding: 3px 6px !important; - border-color: @list-pagin-bord; - } - -.Paginate { - margin-top: 20px; - font-size: 10px !important; - color: @list-pagin-text; - text-transform: uppercase; - display: flex; - justify-content: flex-end; -} - -.Paginate-pager--pageof { - line-height: 25px; - margin-left: 10px; -} - -.Paginate-wrapper { - display: flex; - flex: 1 0 auto; -} - -.Paginate-controls { - margin-bottom: 0px; -} - -.Paginate-controls--active { - color: #fff !important; - border-color: @default-icon-hov !important; - background-color: @default-icon-hov !important; -} - -.Paginate-total { - display: flex; - align-items: flex-end; - margin: 0 0 -2px 10px; -} - -.Paginate-filterLabel{ - padding: 0px 10px 0px 10px; -} - -.Paginate-filteringDropdowns{ - display: flex; - align-items: center; - line-height: 25px; -} - -.Paginate-dropdown{ - z-index: 1041; - margin-bottom: 10px; -} - -.Paginate-filteringDropdowns { - & > .DashboardGraphs-periodDropdown { - min-width: 50px; - - & > ul { - min-width: 50px; - } - } -} - -.Paginate-itemsOf { - line-height: 25px; -} diff --git a/awx/ui/client/src/shared/paginate/paginate.controller.js b/awx/ui/client/src/shared/paginate/paginate.controller.js deleted file mode 100644 index 10a30bcaef..0000000000 --- a/awx/ui/client/src/shared/paginate/paginate.controller.js +++ /dev/null @@ -1,132 +0,0 @@ -export default ['$scope', '$stateParams', '$state', 'GetBasePath', 'QuerySet', '$interpolate', - function($scope, $stateParams, $state, GetBasePath, qs, $interpolate) { - - let pageSize = $scope.querySet ? $scope.querySet.page_size || 20 : $stateParams[`${$scope.iterator}_search`].page_size || 20, - queryset, path; - - $scope.pageSize = pageSize; - $scope.basePageSize = parseInt(pageSize) === 5 ? 5 : 20; - $scope.maxVisiblePages = $scope.maxVisiblePages ? parseInt($scope.maxVisiblePages) : 10; - - $scope.filter = function(id){ - let pageSize = Number(id); - $('#period-dropdown') - .replaceWith(""+id+ - "\n"); - - if ($scope.querySet){ - $scope.querySet = _.merge($scope.querySet, { page_size: `${pageSize}`}); - } else { - $scope.querySet = _.merge($stateParams[`${$scope.iterator}_search`], { page_size: `${pageSize}`}); - } - $scope.toPage(1); - }; - - $scope.toPage = function(page) { - if (page === 0 || page > $scope.last) { - return; - } - if (GetBasePath($scope.basePath) || $scope.basePath) { - path = GetBasePath($scope.basePath) || $scope.basePath; - } else { - let interpolator = $interpolate($scope.basePath); - path = interpolator({ $stateParams: $stateParams }); - } - if ($scope.querySet) { - // merging $scope.querySet seems to destroy our initial reference which - // kills the two-way binding here. To fix that, clone the queryset first - // and merge with that object. - let origQuerySet = _.cloneDeep($scope.querySet); - queryset = _.merge(origQuerySet, { page: page }); - - } else { - let origStateParams = _.cloneDeep($stateParams[`${$scope.iterator}_search`]); - queryset = _.merge(origStateParams, { page: page }); - } - if (!$scope.querySet) { - $state.go('.', { - [$scope.iterator + '_search']: queryset - }, {notify: false}); - } - qs.search(path, queryset).then((res) => { - if ($scope.querySet) { - // Update the query set - $scope.querySet = queryset; - } - $scope.dataset = res.data; - $scope.collection = res.data.results; - $scope.$emit('updateDataset', res.data, queryset); - }); - $('html, body').animate({scrollTop: 0}, 0); - }; - - function calcLast() { - return Math.ceil($scope.dataset.count / $scope.pageSize); - } - - function calcCurrent() { - if ($scope.querySet) { - return parseInt($scope.querySet.page || '1'); - } else { - return parseInt($stateParams[`${$scope.iterator}_search`].page || '1'); - } - } - - function calcPageRange(current, last) { - let result = [], - maxVisiblePages = parseInt($scope.maxVisiblePages), - pagesLeft, - pagesRight; - if (maxVisiblePages % 2) { - // It's an odd number - pagesLeft = (maxVisiblePages - 1) / 2; - pagesRight = ((maxVisiblePages - 1) / 2) + 1; - } else { - // Its an even number - pagesLeft = pagesRight = maxVisiblePages / 2; - } - if (last < maxVisiblePages) { - // Don't have enough pages to exceed the max range - just show all of them - result = _.range(1, last + 1); - } else if (current === last) { - result = _.range(last + 1 - maxVisiblePages, last + 1); - } else { - let topOfRange = current + pagesRight > maxVisiblePages + 1 ? (current + pagesRight < last + 1 ? current + pagesRight : last + 1) : maxVisiblePages + 1; - let bottomOfRange = (topOfRange === last + 1) ? last + 1 - maxVisiblePages : (current - pagesLeft > 0 ? current - pagesLeft : 1); - result = _.range(bottomOfRange, topOfRange); - } - return result; - } - - function calcDataRange() { - if ($scope.current === 1 && $scope.dataset.count < parseInt($scope.pageSize)) { - return `1 - ${$scope.dataset.count}`; - } else if ($scope.current === 1) { - return `1 - ${$scope.pageSize}`; - } else { - let floor = (($scope.current - 1) * parseInt($scope.pageSize)) + 1; - let ceil = floor + parseInt($scope.pageSize) - 1 < $scope.dataset.count ? floor + parseInt($scope.pageSize) - 1 : $scope.dataset.count; - return `${floor} - ${ceil}`; - } - } - - function calcPageSize(){ - let pageSize = $scope.querySet ? $scope.querySet.page_size || 20 : $stateParams[`${$scope.iterator}_search`].page_size || 20; - return Number(pageSize) ; - } - - let updatePaginationVariables = function() { - $scope.pageSize = calcPageSize(); - $scope.current = calcCurrent(); - $scope.last = calcLast(); - $scope.pageRange = calcPageRange($scope.current, $scope.last); - $scope.dataRange = calcDataRange(); - }; - - updatePaginationVariables(); - - $scope.$watch('collection', function(){ - updatePaginationVariables(); - }); - } -]; diff --git a/awx/ui/client/src/shared/paginate/paginate.directive.js b/awx/ui/client/src/shared/paginate/paginate.directive.js deleted file mode 100644 index b07ad12212..0000000000 --- a/awx/ui/client/src/shared/paginate/paginate.directive.js +++ /dev/null @@ -1,19 +0,0 @@ -export default ['templateUrl', - function(templateUrl) { - return { - restrict: 'E', - replace: false, - scope: { - collection: '=', - dataset: '=', - iterator: '@', - basePath: '@', - querySet: '=?', - maxVisiblePages: '@', - hideViewPerPage: '=' - }, - controller: 'PaginateController', - templateUrl: templateUrl('shared/paginate/paginate') - }; - } -]; diff --git a/awx/ui/client/src/shared/paginate/paginate.partial.html b/awx/ui/client/src/shared/paginate/paginate.partial.html deleted file mode 100644 index c7dd1268d9..0000000000 --- a/awx/ui/client/src/shared/paginate/paginate.partial.html +++ /dev/null @@ -1,73 +0,0 @@ -
-
- - {{ 'Page' | translate }} - {{current}} {{ 'of' | translate }} - {{last}} - -
-
- - {{ 'ITEMS' | translate }}  - {{dataRange}} - {{ 'of' | translate }} {{dataset.count | number}} - -
-
VIEW PER PAGE
-
- - {{pageSize}} - - -
-
-
-
diff --git a/awx/ui/client/src/shared/parse/main.js b/awx/ui/client/src/shared/parse/main.js deleted file mode 100644 index 962bf14bcf..0000000000 --- a/awx/ui/client/src/shared/parse/main.js +++ /dev/null @@ -1,5 +0,0 @@ -import ParseTypeChange from './parse-type-change.factory'; - -export default - angular.module('parse', []) - .factory('ParseTypeChange', ParseTypeChange); diff --git a/awx/ui/client/src/shared/parse/parse-type-change.factory.js b/awx/ui/client/src/shared/parse/parse-type-change.factory.js deleted file mode 100644 index eaa3ff0c45..0000000000 --- a/awx/ui/client/src/shared/parse/parse-type-change.factory.js +++ /dev/null @@ -1,124 +0,0 @@ -import 'codemirror/lib/codemirror.js'; -import 'codemirror/mode/javascript/javascript.js'; -import 'codemirror/mode/yaml/yaml.js'; -import 'codemirror/mode/jinja2/jinja2.js'; -import 'codemirror/addon/lint/lint.js'; -import 'angular-codemirror/lib/yaml-lint.js'; -import 'codemirror/addon/edit/closebrackets.js'; -import 'codemirror/addon/edit/matchbrackets.js'; -import 'codemirror/addon/selection/active-line.js'; - -export default - function ParseTypeChange(Alert, AngularCodeMirror) { - return function(params) { - var scope = params.scope, - field_id = params.field_id, - fld = (params.variable) ? params.variable : 'variables', - pfld = (params.parse_variable) ? params.parse_variable : 'parseType', - onReady = params.onReady, - onChange = params.onChange, - readOnly = params.readOnly; - - function removeField(fld) { - //set our model to the last change in CodeMirror and then destroy CodeMirror - scope[fld] = scope[fld + 'codeMirror'].getValue(); - $('#cm-' + fld + '-container > .CodeMirror').empty().remove(); - } - - function createField(onChange, onReady, fld) { - //hide the textarea and show a fresh CodeMirror with the current mode (json or yaml) - let variableEditModes = { - yaml: { - mode: 'text/x-yaml', - matchBrackets: true, - autoCloseBrackets: true, - styleActiveLine: true, - lineNumbers: true, - gutters: ['CodeMirror-lint-markers'], - lint: true, - scrollbarStyle: null - }, - json: { - mode: 'application/json', - styleActiveLine: true, - matchBrackets: true, - autoCloseBrackets: true, - lineNumbers: true, - gutters: ['CodeMirror-lint-markers'], - lint: true, - scrollbarStyle: null - } - }; - scope[fld + 'codeMirror'] = AngularCodeMirror(readOnly); - scope[fld + 'codeMirror'].addModes(variableEditModes); - scope[fld + 'codeMirror'].showTextArea({ - scope: scope, - model: fld, - element: field_id, - lineNumbers: true, - mode: scope[pfld], - onReady: onReady, - onChange: onChange - }); - } - // Hide the textarea and show a CodeMirror editor - createField(onChange, onReady, fld); - - - // Toggle displayed variable string between JSON and YAML - scope.parseTypeChange = function(model, fld) { - var json_obj; - if (scope[model] === 'json') { - // converting yaml to json - try { - removeField(fld); - - json_obj = jsyaml.load(scope[fld]); - - if ($.isEmptyObject(json_obj)) { - if (Array.isArray(json_obj)) { - scope[fld] = "[]"; - } else { - scope[fld] = "{}"; - } - } else { - scope[fld] = JSON.stringify(json_obj, null, " "); - } - createField(onReady, onChange, fld); - } - catch (e) { - Alert('Parse Error', 'Failed to parse valid YAML. ' + e.message); - setTimeout( function() { scope.$apply( function() { scope[model] = 'yaml'; createField(onReady, onChange, fld); }); }, 500); - } - } - else { - // convert json to yaml - try { - removeField(fld); - let jsonString = scope[fld]; - if (jsonString.trim() === '') { - jsonString = '{}'; - } - - json_obj = JSON.parse(jsonString); - if ($.isEmptyObject(json_obj)) { - scope[fld] = '---'; - } - else { - scope[fld] = jsyaml.safeDump(json_obj); - } - createField(onReady, onChange, fld); - } - catch (e) { - Alert('Parse Error', 'Failed to parse valid JSON. ' + e.message); - setTimeout( function() { scope.$apply( function() { scope[model] = 'json'; createField(onReady, onChange, fld); }); }, 500 ); - } - } - }; - }; - } - -ParseTypeChange.$inject = - [ 'Alert', - 'AngularCodeMirror' - ]; diff --git a/awx/ui/client/src/shared/prompt-dialog.js b/awx/ui/client/src/shared/prompt-dialog.js deleted file mode 100644 index cfcc9e0e2e..0000000000 --- a/awx/ui/client/src/shared/prompt-dialog.js +++ /dev/null @@ -1,133 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name shared.function:prompt-dialog - * @description - * PromptDialog - * Prompt the user with a Yes/No dialog to confirm an action such - * as Delete. Assumes a hidden dialog already exists in $scope. - * See example at bottom. If user responds with Yes, execute action - * parameter. - * - * params: { hdr: 'header msg', - * body: 'body text/html', - * class: 'btn-class for Yes button', --defaults to btn-danger - * action: function() {} --action to take, if use clicks Yes - * } - */ - - -/** -* @ngdoc method -* @name shared.function:prompt-dialog#PromptDialog -* @methodOf shared.function:prompt-dialog -* @description discuss difference b/t this and other modals -*/ - -export default -angular.module('PromptDialog', ['Utilities']) - .factory('Prompt', [ 'AppStrings', - function (strings) { - return function (params) { - - var dialog = angular.element(document.getElementById('prompt-modal')), - scope = dialog.scope(), cls, local_backdrop; - - scope.promptHeader = params.hdr; - scope.promptResourceName = params.resourceName; - scope.promptBody = params.body; - scope.promptAction = params.action; - scope.promptActionText = (params.actionText === null || params.actionText === undefined || params.actionText === '') ? strings.get('YES') : params.actionText; - scope.cancelActionText = (params.cancelText === null || params.cancelText === undefined || params.cancelText === '') ? strings.get('CANCEL') : params.cancelText; - scope.hideActionButton = params.hideActionButton ? true : false; - - local_backdrop = (params.backdrop === undefined) ? "static" : params.backdrop; - - cls = (params['class'] === null || params['class'] === undefined) ? 'Modal-errorButton' : params['class']; - - $('#prompt_action_btn').removeClass('Modal-errorButton Modal-primaryButton').addClass(cls); - - // bootstrap modal's have an open defect with disallowing tab index's of the background of the modal - // This will keep the tab indexing on the modal's focus. This is to fix an issue with tabbing working when - // the user is attempting to delete something. Might need to be checked for other occurances of the bootstrap - // modal other than deleting - function disableTabModalShown() { - - $('.modal').on('shown.bs.modal', function() { - - var modal = $(this), - focusableChildren = modal.find('a[href], a[data-dismiss], area[href], input, select, textarea, button, iframe, object, embed, *[tabindex], *[contenteditable]'), - numElements = focusableChildren.length, - currentIndex = 0, - focus, - focusPrevious, - focusNext; - - $(document.activeElement).blur(); - - focus = function() { - var focusableElement = focusableChildren[currentIndex]; - if (focusableElement) { - focusableElement.focus(); - } - }; - - focusPrevious = function () { - currentIndex--; - if (currentIndex < 0) { - currentIndex = numElements - 1; - } - - focus(); - - return false; - }; - - focusNext = function () { - currentIndex++; - if (currentIndex >= numElements) { - currentIndex = 0; - } - - focus(); - - return false; - }; - - $(document).on('keydown', function (e) { - - if (e.keyCode === 9 && e.shiftKey) { - e.preventDefault(); - focusPrevious(); - } - else if (e.keyCode === 9) { - e.preventDefault(); - focusNext(); - } - }); - - $(this).focus(); - }); - - $('.modal').on('hidden.bs.modal', function() { - $(document).unbind('keydown'); - }); - } - - - $('#prompt-modal').off('hidden.bs.modal'); - $('#prompt-modal').modal({ - backdrop: 'static', - keyboard: true, - show: true - }); - disableTabModalShown(); - - }; - } - ]); diff --git a/awx/ui/client/src/shared/prompt/prompt.less b/awx/ui/client/src/shared/prompt/prompt.less deleted file mode 100644 index b2ad010803..0000000000 --- a/awx/ui/client/src/shared/prompt/prompt.less +++ /dev/null @@ -1,29 +0,0 @@ -.Prompt-bodyQuery { - margin-bottom: 20px; - color: @default-interface-txt; - word-break: break-word; -} - -.Prompt-bodyTarget { - color: @default-data-txt; - word-break: break-word; -} - -.Prompt-bodyNote { - margin: 20px 0; - color: @default-interface-txt; -} - -.Prompt-bodyNote--emphasis { - text-transform: uppercase; - color: @default-err; -} - -.Prompt-emphasis { - font-weight: bold; - text-transform: uppercase; -} - -.Prompt-warningResourceTitle { - margin-right: 10px; -} diff --git a/awx/ui/client/src/shared/rbacUiControl.js b/awx/ui/client/src/shared/rbacUiControl.js deleted file mode 100644 index b65c6c57bd..0000000000 --- a/awx/ui/client/src/shared/rbacUiControl.js +++ /dev/null @@ -1,32 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - angular.module('rbacUiControl', []) - .service('rbacUiControlService', ['$q', 'GetBasePath', 'Rest', 'Wait', function($q, GetBasePath, Rest, Wait){ - this.canAdd = function(apiPath) { - var canAddVal = $q.defer(); - - if (/api\/v[0-9]+\//.test(apiPath)) { - Rest.setUrl(apiPath); - } else { - Rest.setUrl(GetBasePath(apiPath)); - } - - Wait("start"); - Rest.options() - .then(({data}) => { - if (data.actions.POST) { - canAddVal.resolve({canAdd: true, options: data}); - } else { - canAddVal.resolve({canAdd: false}); - } - Wait("stop"); - }); - - return canAddVal.promise; - }; - }]); diff --git a/awx/ui/client/src/shared/smart-search/django-search-model.class.js b/awx/ui/client/src/shared/smart-search/django-search-model.class.js deleted file mode 100644 index 3809e47a31..0000000000 --- a/awx/ui/client/src/shared/smart-search/django-search-model.class.js +++ /dev/null @@ -1,50 +0,0 @@ -export default -class DjangoSearchModel { - /* - @property name - supplied model name - @property base { - field: { - type: 'string' // string, bool, field, choice, datetime, - label: 'Label', // Capitalized - help_text: 'Some helpful descriptive text' - } - } - @@property related ['field' ...] - */ - constructor(name, baseFields, relatedSearchFields) { - function trimRelated(relatedSearchField){ - return relatedSearchField.replace(/\__search$/, ""); - } - this.name = name; - this.searchExamples = []; - this.related = _.uniq(_.map(relatedSearchFields, trimRelated)); - // Remove "object" type fields from this list - for (var key in baseFields) { - if (baseFields.hasOwnProperty(key)) { - if (baseFields[key].type === 'object'){ - delete baseFields[key]; - } - } - } - delete baseFields.url; - this.base = baseFields; - if(baseFields.id) { - this.searchExamples.push("id:>10"); - } - // Loop across the base fields and try find one of type = string and one of type = datetime - let stringFound = false, - dateTimeFound = false; - - _.forEach(baseFields, (value, key) => { - if(!stringFound && value.type === 'string') { - this.searchExamples.push(key + ":foobar"); - stringFound = true; - } - if(!dateTimeFound && value.type === 'datetime') { - this.searchExamples.push(key + ":>=2000-01-01T00:00:00Z"); - this.searchExamples.push(key + ":<2000-01-01"); - dateTimeFound = true; - } - }); - } -} diff --git a/awx/ui/client/src/shared/smart-search/main.js b/awx/ui/client/src/shared/smart-search/main.js deleted file mode 100644 index e7aaf825a7..0000000000 --- a/awx/ui/client/src/shared/smart-search/main.js +++ /dev/null @@ -1,13 +0,0 @@ -import directive from './smart-search.directive'; -import controller from './smart-search.controller'; -import service from './queryset.service'; -import DjangoSearchModel from './django-search-model.class'; -import smartSearchService from './smart-search.service'; - -export default -angular.module('SmartSearchModule', []) - .directive('smartSearch', directive) - .controller('SmartSearchController', controller) - .service('QuerySet', service) - .service('SmartSearchService', smartSearchService) - .constant('DjangoSearchModel', DjangoSearchModel); diff --git a/awx/ui/client/src/shared/smart-search/queryset.service.js b/awx/ui/client/src/shared/smart-search/queryset.service.js deleted file mode 100644 index 216045eee3..0000000000 --- a/awx/ui/client/src/shared/smart-search/queryset.service.js +++ /dev/null @@ -1,524 +0,0 @@ -function searchWithoutKey (term, singleSearchParam = null) { - if (singleSearchParam) { - return { [singleSearchParam]: `search=${encodeURIComponent(term)}` }; - } - return { search: encodeURIComponent(term) }; -} - -function QuerysetService ($q, Rest, ProcessErrors, $rootScope, Wait, DjangoSearchModel, SmartSearchService) { - return { - // kick off building a model for a specific endpoint - // this is usually a list's basePath - // unified_jobs is the exception, where we need to fetch many subclass OPTIONS and summary_fields - initFieldset(path, name) { - let defer = $q.defer(); - defer.resolve(this.getCommonModelOptions(path, name)); - return defer.promise; - }, - getCommonModelOptions(path, name) { - let base, - defer = $q.defer(); - - this.url = path; - this.options(path) - .then((res) => { - base = res.data.actions.GET; - let relatedSearchFields = res.data.related_search_fields; - defer.resolve({ - models: { - [name]: new DjangoSearchModel(name, base, relatedSearchFields) - }, - options: res - }); - }); - return defer.promise; - }, - replaceDefaultFlags (value) { - if (value) { - value = value.toString().replace(/__icontains_DEFAULT/g, "__icontains"); - value = value.toString().replace(/__search_DEFAULT/g, "__search"); - } - - return value; - }, - replaceEncodedTokens(value) { - return decodeURIComponent(value).replace(/"|'/g, ""); - }, - encodeTerms(value, key, singleSearchParam){ - key = this.replaceDefaultFlags(key); - value = this.replaceDefaultFlags(value); - var that = this; - if (Array.isArray(value)){ - value = _.uniq(_.flattenDeep(value)); - let concated = ''; - angular.forEach(value, function(item){ - if(item && typeof item === 'string' && !singleSearchParam) { - item = that.replaceEncodedTokens(item); - } - concated += `${key}=${item}&`; - }); - - return concated; - } - else { - if(value && typeof value === 'string' && !singleSearchParam) { - value = this.replaceEncodedTokens(value); - } - - return `${key}=${value}&`; - } - }, - // encodes ui-router params from {operand__key__comparator: value} pairs to API-consumable URL - encodeQueryset(params, singleSearchParam) { - let queryset; - queryset = _.reduce(params, (result, value, key) => { - return result + this.encodeTerms(value, key, singleSearchParam); - }, ''); - queryset = queryset.substring(0, queryset.length - 1); - return angular.isObject(params) ? `?${queryset}` : ''; - - }, - // like encodeQueryset, but return an actual unstringified API-consumable http param object - encodeQuerysetObject(params) { - return _.reduce(params, (obj, value, key) => { - const encodedKey = this.replaceDefaultFlags(key); - const values = Array.isArray(value) ? value : [value]; - - obj[encodedKey] = values - .map(value => this.replaceDefaultFlags(value)) - .map(value => this.replaceEncodedTokens(value)) - .join(','); - - return obj; - }, {}); - }, - // encodes a ui smart-search param to a django-friendly param - // operand:key:comparator:value => {operand__key__comparator: value} - encodeParam({ term, relatedSearchTerm, searchTerm, singleSearchParam }){ - // Assumption here is that we have a key and a value so the length - // of the paramParts array will be 2. [0] is the key and [1] the value - let paramParts = SmartSearchService.splitTermIntoParts(term); - let keySplit = paramParts[0].split('.'); - let exclude = false; - let lessThanGreaterThan = paramParts[1].match(/^(>|<).*$/) ? true : false; - if(keySplit[0].match(/^-/g)) { - exclude = true; - keySplit[0] = keySplit[0].replace(/^-/, ''); - } - let paramString = exclude ? "not__" : ""; - let valueString = paramParts[1]; - - if(keySplit.length === 1) { - if(searchTerm && !lessThanGreaterThan) { - if(singleSearchParam) { - paramString += keySplit[0] + '__icontains'; - } - else { - paramString += keySplit[0] + '__icontains_DEFAULT'; - } - } - else if(relatedSearchTerm) { - if(singleSearchParam) { - paramString += keySplit[0]; - } - else { - paramString += keySplit[0] + '__search_DEFAULT'; - } - } - else { - paramString += keySplit[0]; - } - } - else { - paramString += keySplit.join('__'); - } - - if(lessThanGreaterThan) { - if(paramParts[1].match(/^>=.*$/)) { - paramString += '__gte'; - valueString = valueString.replace(/^(>=)/,""); - } - else if(paramParts[1].match(/^<=.*$/)) { - paramString += '__lte'; - valueString = valueString.replace(/^(<=)/,""); - } - else if(paramParts[1].match(/^<.*$/)) { - paramString += '__lt'; - valueString = valueString.replace(/^(<)/,""); - } - else if(paramParts[1].match(/^>.*$/)) { - paramString += '__gt'; - valueString = valueString.replace(/^(>)/,""); - } - } - - if(singleSearchParam) { - return {[singleSearchParam]: paramString + "=" + valueString}; - } - else { - return {[paramString] : encodeURIComponent(valueString)}; - } - }, - // decodes a django queryset param into a ui smart-search tag or set of tags - decodeParam(value, key){ - - let decodeParamString = function(searchString) { - if(key === 'search') { - // Don't include 'search:' in the search tag - return decodeURIComponent(`${searchString}`); - } - else { - key = key.toString().replace(/__icontains_DEFAULT/g, ""); - key = key.toString().replace(/__search_DEFAULT/g, ""); - let split = key.split('__'); - let decodedParam = searchString; - let exclude = false; - if(key.startsWith('not__')) { - exclude = true; - split = split.splice(1, split.length); - } - if(key.endsWith('__gt')) { - decodedParam = '>' + decodedParam; - split = split.splice(0, split.length-1); - } - else if(key.endsWith('__lt')) { - decodedParam = '<' + decodedParam; - split = split.splice(0, split.length-1); - } - else if(key.endsWith('__gte')) { - decodedParam = '>=' + decodedParam; - split = split.splice(0, split.length-1); - } - else if(key.endsWith('__lte')) { - decodedParam = '<=' + decodedParam; - split = split.splice(0, split.length-1); - } - - let uriDecodedParam = decodeURIComponent(decodedParam); - - return exclude ? `-${split.join('.')}:${uriDecodedParam}` : `${split.join('.')}:${uriDecodedParam}`; - } - }; - - if (Array.isArray(value)){ - value = _.uniq(_.flattenDeep(value)); - return _.map(value, (item) => { - return decodeParamString(item); - }); - } - else { - return decodeParamString(value); - } - }, - // encodes a django queryset for ui-router's URLMatcherFactory - // {operand__key__comparator: value, } => 'operand:key:comparator:value;...' - // value.isArray expands to: - // {operand__key__comparator: [value1, value2], } => 'operand:key:comparator:value1;operand:key:comparator:value1...' - encodeArr(params) { - let url; - url = _.reduce(params, (result, value, key) => { - return result.concat(encodeUrlString(value, key)); - }, []); - - return url.join(';'); - - // {key:'value'} => 'key:value' - // {key: [value1, value2, ...]} => ['key:value1', 'key:value2'] - function encodeUrlString(value, key){ - if (Array.isArray(value)){ - value = _.uniq(_.flattenDeep(value)); - return _.map(value, (item) => { - return `${key}:${item}`; - }); - } - else { - return `${key}:${value}`; - } - } - }, - // decodes a django queryset for ui-router's URLMatcherFactory - // 'operand:key:comparator:value,...' => {operand__key__comparator: value, } - decodeArr(arr) { - let params = {}; - - if (!arr) { - return params; - } - - _.forEach(arr.split(';'), (item) => { - let key = item.split(':')[0], - value = item.split(':')[1]; - if(!params[key]){ - params[key] = value; - } - else if (Array.isArray(params[key])){ - params[key] = _.uniq(_.flattenDeep(params[key])); - params[key].push(value); - } - else { - params[key] = [params[key], value]; - } - }); - return params; - }, - // REST utilities - options(endpoint) { - Rest.setUrl(endpoint); - return Rest.options(endpoint); - }, - search(endpoint, params, singleSearchParam) { - Wait('start'); - this.url = `${endpoint}${this.encodeQueryset(params, singleSearchParam)}`; - Rest.setUrl(this.url); - - return Rest.get() - .then(function(response) { - Wait('stop'); - - if (response - .headers('X-UI-Max-Events') !== null) { - response.data.maxEvents = response. - headers('X-UI-Max-Events'); - } - - return response; - }) - .catch(function(response) { - Wait('stop'); - - this.error(response.data, response.status); - - throw response; - }.bind(this)); - }, - error(data, status) { - if(data && data.detail){ - let error = typeof data.detail === "string" ? data.detail : JSON.parse(data.detail); - - if(_.isArray(error)){ - data.detail = error[0]; - } - } - ProcessErrors($rootScope, data, status, null, { - hdr: 'Error!', - msg: `Invalid search term entered. GET returned: ${status}` - }); - }, - // Removes state definition defaults and pagination terms - stripDefaultParams(params, defaultParams) { - if (!params) { - return []; - } - if(defaultParams) { - let stripped =_.pickBy(params, (value, key) => { - // setting the default value of a term to null in a state definition is a very explicit way to ensure it will NEVER generate a search tag, even with a non-default value - return defaultParams[key] !== value && key !== 'order_by' && key !== 'page' && key !== 'page_size' && defaultParams[key] !== null; - }); - let strippedCopy = _.cloneDeep(stripped); - if(_.keys(_.pickBy(defaultParams, _.keys(strippedCopy))).length > 0){ - for (var key in strippedCopy) { - if (strippedCopy.hasOwnProperty(key)) { - let value = strippedCopy[key]; - if(_.isArray(value)){ - let index = _.indexOf(value, defaultParams[key]); - value = value.splice(index, 1)[0]; - } - } - } - stripped = strippedCopy; - } - return _(strippedCopy).map(this.decodeParam).flatten().value(); - } - else { - return _(params).map(this.decodeParam).flatten().value(); - } - }, - mergeQueryset (queryset, additional, singleSearchParam) { - const space = '%20and%20'; - - const merged = _.mergeWith({}, queryset, additional, (objectValue, sourceValue, key, object) => { - if (!(object[key] && object[key] !== sourceValue)) { - // // https://lodash.com/docs/3.10.1#each - // If this returns undefined merging is handled by default _.merge algorithm - return undefined; - } - - if (_.isArray(object[key])) { - object[key].push(sourceValue); - return object[key]; - } - - if (singleSearchParam) { - if (!object[key]) { - return sourceValue; - } - - const singleSearchParamKeys = object[key].split(space); - - if (_.includes(singleSearchParamKeys, sourceValue)) { - return object[key]; - } - - return `${object[key]}${space}${sourceValue}`; - } - - // Start the array of keys - return [object[key], sourceValue]; - }); - - return merged; - }, - getSearchInputQueryset (searchInput, isFilterableBaseField = null, isRelatedField = null, isAnsibleFactField = null, singleSearchParam = null) { - // XXX Should find a better approach than passing in the two 'is...Field' callbacks XXX - const encodedAnd = '%20and%20'; - const encodedOr = '%20or%20'; - let params = {}; - - // Remove leading/trailing whitespace if there is any - const terms = (searchInput) ? searchInput.trim() : ''; - - if (!(terms && terms !== '')) { - return; - } - - let splitTerms; - - if (singleSearchParam === 'host_filter') { - splitTerms = SmartSearchService.splitFilterIntoTerms(terms); - } else { - splitTerms = SmartSearchService.splitSearchIntoTerms(terms); - } - - const combineSameSearches = (a, b) => { - if (!a) { - return undefined; - } - - if (_.isArray(a)) { - return a.concat(b); - } - - if (singleSearchParam) { - if (b === 'or') { - return `${a}${encodedOr}`; - } else if (a.match(/%20or%20$/g)) { - return `${a}${b}`; - } else { - return `${a}${encodedAnd}${b}`; - } - } - - return [a, b]; - }; - - _.each(splitTerms, term => { - const termParts = SmartSearchService.splitTermIntoParts(term); - let termParams; - - if (termParts.length === 1) { - if (singleSearchParam && termParts[0].toLowerCase() === "or") { - termParams = { [singleSearchParam]: "or" }; - } else { - termParams = searchWithoutKey(term, singleSearchParam); - } - } else if ((isAnsibleFactField && isAnsibleFactField(termParts)) || (isFilterableBaseField && isFilterableBaseField(termParts))) { - termParams = this.encodeParam({ term, singleSearchParam, searchTerm: true }); - } else if (isRelatedField && isRelatedField(termParts)) { - termParams = this.encodeParam({ term, singleSearchParam, relatedSearchTerm: true }); - } else { - termParams = searchWithoutKey(term, singleSearchParam); - } - - params = _.mergeWith(params, termParams, combineSameSearches); - }); - - return params; - }, - removeTermsFromQueryset(queryset, term, isFilterableBaseField, isRelatedField = null, isAnsibleFactField = null, singleSearchParam = null) { - const modifiedQueryset = _.cloneDeep(queryset); - - const removeSingleTermFromQueryset = (value, key) => { - const space = '%20and%20'; - - if (Array.isArray(modifiedQueryset[key])) { - modifiedQueryset[key] = modifiedQueryset[key].filter(item => item !== value); - if (modifiedQueryset[key].length < 1) { - delete modifiedQueryset[key]; - } - } else if (singleSearchParam && _.get(modifiedQueryset, singleSearchParam, []).includes(space)) { - const searchParamParts = modifiedQueryset[singleSearchParam].split(space); - // The value side of each paramPart might have been encoded in - // SmartSearch.splitFilterIntoTerms - _.each(searchParamParts, (paramPart, paramPartIndex) => { - searchParamParts[paramPartIndex] = decodeURIComponent(paramPart); - }); - - const paramPartIndex = searchParamParts.indexOf(decodeURIComponent(value)); - - if (paramPartIndex !== -1) { - searchParamParts.splice(paramPartIndex, 1); - } - - modifiedQueryset[singleSearchParam] = searchParamParts.join(space); - - } else { - delete modifiedQueryset[key]; - } - }; - - const termParts = SmartSearchService.splitTermIntoParts(term); - - let removed; - - if (termParts.length === 1) { - removed = searchWithoutKey(term, singleSearchParam); - } else if ((isAnsibleFactField && isAnsibleFactField(termParts)) || (isFilterableBaseField && isFilterableBaseField(termParts))) { - removed = this.encodeParam({ term, singleSearchParam, searchTerm: true }); - } else if (isRelatedField && isRelatedField(termParts)) { - removed = this.encodeParam({ term, singleSearchParam, relatedSearchTerm: true }); - } else { - removed = searchWithoutKey(term, singleSearchParam); - } - - if (!removed) { - removed = searchWithoutKey(termParts[termParts.length - 1], singleSearchParam); - } - - _.each(removed, removeSingleTermFromQueryset); - - return modifiedQueryset; - }, - createSearchTagsFromQueryset(queryset, defaultParams = null, singleSearchParam = null) { - const space = '%20and%20'; - const modifiedQueryset = angular.copy(queryset); - - let searchTags = []; - - if (singleSearchParam && modifiedQueryset[singleSearchParam]) { - const searchParam = modifiedQueryset[singleSearchParam].split(space); - delete modifiedQueryset[singleSearchParam]; - - $.each(searchParam, (index, param) => { - const paramParts = decodeURIComponent(param).split(/=(.+)/); - const reconstructedSearchString = this.decodeParam(paramParts[1], paramParts[0]); - - searchTags.push(reconstructedSearchString); - }); - } - - return searchTags.concat(this.stripDefaultParams(modifiedQueryset, defaultParams)); - } - }; -} - -QuerysetService.$inject = [ - '$q', - 'Rest', - 'ProcessErrors', - '$rootScope', - 'Wait', - 'DjangoSearchModel', - 'SmartSearchService', -]; - -export default QuerysetService; diff --git a/awx/ui/client/src/shared/smart-search/smart-search.block.less b/awx/ui/client/src/shared/smart-search/smart-search.block.less deleted file mode 100644 index c5e0f2b3ea..0000000000 --- a/awx/ui/client/src/shared/smart-search/smart-search.block.less +++ /dev/null @@ -1,256 +0,0 @@ -@import "../branding/colors.default.less"; -.SmartSearch { - padding-left: 15px; - padding-right: 15px; - display: block; -} - -.SmartSearch-form { - width: 100%; -} - -.SmartSearch-bar { - display: flex; - padding: 0; - font-size: 12px; - align-items: stretch; - line-height: 20px; - width: 50%; -} - -.SmartSearch-bar--fullWidth { - width: 100%; -} - -.SmartSearch-tags{ - padding-left: 0px; -} - -.SmartSearch-bar i { - font-size: 16px; - color: @default-icon; -} - -.SmartSearch-searchTermContainer { - flex: initial; - flex-grow: 1; - border: 1px solid @b7grey; - border-radius: 4px; - display: flex; - background-color: @default-bg; - position: relative; - height: 34px; -} - -.SmartSearch-searchTermContainer.is-open { - border-bottom-right-radius: 0; -} - -.SmartSearch-input { - flex: 1 0 auto; - margin: 0 10px; - border: none; - font-size: 14px; - height: 100%; - width: 100%; -} - -.SmartSearch-input:focus, -.SmartSearch-input:active { - outline: 0; -} - -.SmartSearch-searchTermContainer input:placeholder-shown { - color: @default-icon !important; - text-transform: uppercase; -} - -.SmartSearch-searchButton { - flex: initial; - margin-left: auto; - padding: 8px 10px; - border-left: 1px solid @b7grey; - background-color: @default-bg; - cursor: pointer; - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; - z-index: 1; -} - -.SmartSearch-searchButton:not(.SmartSearch-searchButton--disabled):hover { - background-color: @default-tertiary-bg; -} - -.SmartSearch-searchButton--disabled { - cursor: not-allowed; - opacity: 0.65; -} - -.SmartSearch-flexContainer { - display: flex; - width: 100%; - flex-wrap: wrap; -} - -.SmartSearch-tagContainer { - display: flex; - max-width: 100%; - margin-top: 10px; -} - -.SmartSearch-tag { - border-radius: 5px; - padding: 2px 10px; - margin: 0px; - font-size: 12px; - color: @default-interface-txt; - background-color: @default-bg; - margin-right: 10px; - max-width: 100%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - height: 20px; -} - -.SmartSearch-tag--deletable { - margin-right: 0px; - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-right: 0; - max-width: ~"calc(100% - 23px)"; - background-color: @default-link; - color: @default-bg; - margin-right: 10px; -} - -.SmartSearch-deleteContainer { - background-color: @default-link!important; - color: white; - background-color: @default-bg; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - padding: 0 5px; - margin: 0px; - align-items: center; - display: flex; - cursor: pointer; - height: 20px; -} - -.SmartSearch-tagDelete { - font-size: 13px; -} - -.SmartSearch-name { - flex: initial; - max-width: 100%; -} - -.SmartSearch-tag--deletable > .SmartSearch-name { - max-width: ~"calc(100% - 23px)"; -} - -.SmartSearch-deleteContainer:hover, -{ - border-color: @default-err; - background-color: @default-err!important; -} - -.SmartSearch-deleteContainer:hover > .SmartSearch-tagDelete { - color: @default-bg; -} -.SmartSearch-clearAll-container{ - .at-mixin-VerticallyCenter(); -} -.SmartSearch-clearAll{ - font-size: 10px; - padding-top: 14px; -} -.SmartSearch-keyToggle { - margin-right: auto; - margin-left: 20px; - text-transform: uppercase; - background-color: @default-bg; - border-radius: 5px; - color: @default-interface-txt; - border: 1px solid @b7grey; - cursor: pointer; - min-width: 70px; - height: 34px; - line-height: 20px; -} - -.SmartSearch-keyToggle:hover { - background-color: @default-tertiary-bg; -} - -.SmartSearch-keyToggle.is-active { - background-color: @default-link; - border-color: @default-link; - color: @default-bg; - &:hover{ - background-color: @default-link-hov; - } -} - -.SmartSearch-keyPane { - max-height: 215px; - overflow: auto; - margin: 10px 0 0 0; - font-size: 12px; - width: 100%; - padding: 20px; - border-radius: 4px; - border: 1px solid @d7grey; - background-color: @login-notice-bg; - color: @login-notice-text; - position: relative; -} - -.SmartSearch-keyRow { - margin-bottom: 15px; -} - -.SmartSearch-keyRow:last-child { - margin-bottom: 0; -} - -.SmartSearch-keyName { - flex: 1 0 auto; - text-transform: uppercase; - font-weight: bold; - padding-bottom: 3px; -} - -.SmartSearch-keyComparators { - flex: 1 0 auto; -} - -.SmartSearch-keyPane--exit { - background-color: @login-notice-bg; -} - -.SmartSearch-examples { - display: flex; - flex-wrap: wrap; -} - -.SmartSearch-examples--title { - margin-right: 5px; -} - -.SmartSearch-examples--search { - color: @default-err; - background-color: @default-bg; - border: 1px solid @default-border; - border-radius: 5px; - padding: 0px 5px; - margin-right: 5px; -} - -@media (max-width: 700px) { - .SmartSearch-bar { - width: 100%; - } -} diff --git a/awx/ui/client/src/shared/smart-search/smart-search.controller.js b/awx/ui/client/src/shared/smart-search/smart-search.controller.js deleted file mode 100644 index 80aabc22e9..0000000000 --- a/awx/ui/client/src/shared/smart-search/smart-search.controller.js +++ /dev/null @@ -1,297 +0,0 @@ -function SmartSearchController ( - $scope, - $rootScope, - $state, - $stateParams, - $transitions, - configService, - GetBasePath, - i18n, - qs -) { - const searchKey = `${$scope.iterator}_search`; - const optionsKey = `${$scope.list.iterator}_options`; - - let path; - let defaults; - let queryset; - let transitionSuccessListener; - - const compareParams = (a, b) => { - for (let key in a) { - if (!(key in b) || a[key].toString() !== b[key].toString()) { - return false; - } - } - for (let key in b) { - if (!(key in a)) { - return false; - } - } - return true; - }; - - const generateSearchTags = () => { - const { singleSearchParam } = $scope; - $scope.searchTags = qs.createSearchTagsFromQueryset(queryset, defaults, singleSearchParam); - }; - - const listenForTransitionSuccess = () => { - transitionSuccessListener = $transitions.onSuccess({}, trans => { - // State has changed - check to see if this is a param change - if (trans.from().name === trans.to().name) { - if (!compareParams(trans.params('from')[searchKey], trans.params('to')[searchKey])) { - // Params are not the same - we need to update the search. This should only - // happen when the user hits the forward/back browser navigation buttons. - queryset = trans.params('to')[searchKey]; - qs.search(path, queryset).then((res) => { - $scope.dataset = res.data; - $scope.collection = res.data.results; - $scope.$emit('updateDataset', res.data, queryset); - }); - - $scope.searchTerm = null; - generateSearchTags(); - } - } - }); - }; - - const isAnsibleFactField = (termParts) => { - const rootField = termParts[0].split('.')[0].replace(/^-/, ''); - return rootField === 'ansible_facts'; - }; - - const revertSearch = (queryToBeRestored) => { - queryset = queryToBeRestored; - // https://ui-router.github.io/docs/latest/interfaces/params.paramdeclaration.html#dynamic - // This transition will not reload controllers/resolves/views - // but will register new $stateParams[$scope.iterator + '_search'] terms - if (!$scope.querySet) { - transitionSuccessListener(); - $state.go('.', { [searchKey]: queryset }) - .then(() => listenForTransitionSuccess()); - } - qs.search(path, queryset).then((res) => { - if ($scope.querySet) { - $scope.querySet = queryset; - } - $scope.dataset = res.data; - $scope.collection = res.data.results; - $scope.$emit('updateDataset', res.data, queryset); - }); - - $scope.searchTerm = null; - - generateSearchTags(); - }; - - const isFilterableBaseField = (termParts) => { - const rootField = termParts[0].split('.')[0].replace(/^-/, ''); - const listName = $scope.list.name; - const baseFieldPath = `models.${listName}.base.${rootField}`; - const isBaseField = _.has($scope, `${baseFieldPath}`); - - const isFilterable = _.get($scope, `${baseFieldPath}.filterable`); - const isBaseModelRelatedSearchTermField = (_.get($scope, `${baseFieldPath}.type`) === 'field'); - - return isBaseField && !isBaseModelRelatedSearchTermField && isFilterable; - }; - - const isRelatedField = (termParts) => { - const rootField = termParts[0].split('.')[0].replace(/^-/, ''); - const listName = $scope.list.name; - const baseRelatedTypePath = `models.${listName}.base.${rootField}.type`; - const relatedTypePath = `models.${listName}.related`; - - const isRelatedSearchTermField = (_.includes(_.get($scope, relatedTypePath), rootField)); - const isBaseModelRelatedSearchTermField = (_.get($scope, baseRelatedTypePath) === 'field'); - - return (isRelatedSearchTermField || isBaseModelRelatedSearchTermField); - }; - - configService.getConfig() - .then(config => { - let version; - if ($rootScope.BRAND_NAME === 'Tower') { - try { - [version] = config.version.split('-'); - } catch (err) { - version = 'latest'; - } - } else { - version = 'latest'; - } - - $scope.documentationLink = `http://docs.ansible.com/ansible-tower/${version}/html/userguide/search_sort.html`; - $scope.searchPlaceholder = i18n._('Search'); - - if ($scope.defaultParams) { - defaults = $scope.defaultParams; - } else { - // steps through the current tree of $state configurations, grabs default search params - const stateConfig = _.find($state.$current.path, step => _.has(step, `params.${searchKey}`)); - defaults = stateConfig.params[searchKey].config.value; - } - - if ($scope.querySet) { - queryset = $scope.querySet; - } else { - queryset = $state.params[searchKey]; - } - - path = GetBasePath($scope.basePath) || $scope.basePath; - generateSearchTags(); - - qs.initFieldset(path, $scope.djangoModel) - .then((data) => { - $scope.models = data.models; - $scope.options = data.options.data; - $scope.keyFields = _.reduce(data.models[$scope.djangoModel].base, (result, value, key) => { - if (value.filterable) { - result.push(key); - } - return result; - }, []); - if ($scope.list) { - $scope.$emit(optionsKey, data.options); - } - }); - $scope.$on('$destroy', () => { - if (transitionSuccessListener) { - transitionSuccessListener(); - } - }); - $scope.$watch('disableSearch', disableSearch => { - if (disableSearch) { - $scope.searchPlaceholder = i18n._('Cannot search running job'); - } else { - $scope.searchPlaceholder = i18n._('Search'); - } - }); - listenForTransitionSuccess(); - }); - - - $scope.toggleKeyPane = () => { - $scope.showKeyPane = !$scope.showKeyPane; - }; - - $scope.addTerms = terms => { - if (terms && terms !== "") { - const { singleSearchParam } = $scope; - const unmodifiedQueryset = _.clone(queryset); - - const searchInputQueryset = qs.getSearchInputQueryset(terms, isFilterableBaseField, isRelatedField, isAnsibleFactField, singleSearchParam); - queryset = qs.mergeQueryset(queryset, searchInputQueryset, singleSearchParam); - - // Go back to the first page after a new search - delete queryset.page; - - // https://ui-router.github.io/docs/latest/interfaces/params.paramdeclaration.html#dynamic - // This transition will not reload controllers/resolves/views but will register new - // $stateParams[searchKey] terms. - if (!$scope.querySet) { - transitionSuccessListener(); - $state.go('.', { [searchKey]: queryset }) - .then(() => { - // same as above in $scope.remove. For some reason deleting the page - // from the queryset works for all lists except lists in modals. - delete $stateParams[searchKey].page; - listenForTransitionSuccess(); - }); - } - - qs.search(path, queryset, singleSearchParam) - .then(({ data }) => { - if ($scope.querySet) { - $scope.querySet = queryset; - } - $scope.dataset = data; - $scope.collection = data.results; - $scope.$emit('updateDataset', data, queryset); - }) - .catch(() => revertSearch(unmodifiedQueryset)); - - $scope.searchTerm = null; - - generateSearchTags(); - } - }; - // remove tag, merge new queryset, $state.go - $scope.removeTerm = index => { - const { singleSearchParam } = $scope; - const [term] = $scope.searchTags.splice(index, 1); - - queryset = qs.removeTermsFromQueryset(queryset, term, isFilterableBaseField, isRelatedField, isAnsibleFactField, singleSearchParam); - - if (!$scope.querySet) { - transitionSuccessListener(); - $state.go('.', { [searchKey]: queryset }) - .then(() => { - // for some reason deleting a tag from a list in a modal does not - // remove the param from $stateParams. Here we'll manually check to make sure - // that that happened and remove it if it didn't. - const clearedParams = qs.removeTermsFromQueryset($stateParams[searchKey], term, isFilterableBaseField, isRelatedField, isAnsibleFactField, singleSearchParam); - $stateParams[searchKey] = clearedParams; - listenForTransitionSuccess(); - }); - } - - qs.search(path, queryset) - .then(({ data }) => { - if ($scope.querySet) { - $scope.querySet = queryset; - } - $scope.dataset = data; - $scope.collection = data.results; - $scope.$emit('updateDataset', data, queryset); - }); - - generateSearchTags(); - }; - - $scope.clearAllTerms = () => { - _.forOwn(defaults, (value, key) => { - // preserve the `credential_type` queryset param if it exists - if (key === 'credential_type') { - defaults[key] = queryset[key]; - } - }); - const cleared = _(defaults).omitBy(_.isNull).value(); - delete cleared.page; - queryset = cleared; - - if (!$scope.querySet) { - transitionSuccessListener(); - $state.go('.', { [searchKey]: queryset }) - .then(() => listenForTransitionSuccess()); - } - - qs.search(path, queryset) - .then(({ data }) => { - if ($scope.querySet) { - $scope.querySet = queryset; - } - $scope.dataset = data; - $scope.collection = data.results; - $scope.$emit('updateDataset', data, queryset); - }); - - $scope.searchTags = qs.stripDefaultParams(queryset, defaults); - }; -} - -SmartSearchController.$inject = [ - '$scope', - '$rootScope', - '$state', - '$stateParams', - '$transitions', - 'ConfigService', - 'GetBasePath', - 'i18n', - 'QuerySet', -]; - -export default SmartSearchController; diff --git a/awx/ui/client/src/shared/smart-search/smart-search.directive.js b/awx/ui/client/src/shared/smart-search/smart-search.directive.js deleted file mode 100644 index 6ae367a0c8..0000000000 --- a/awx/ui/client/src/shared/smart-search/smart-search.directive.js +++ /dev/null @@ -1,27 +0,0 @@ -export default ['templateUrl', - function(templateUrl) { - return { - restrict: 'E', - replace: false, - transclude: { - actions: '?div' // preferably would transclude an actions directive here - }, - scope: { - djangoModel: '@', - basePath: '@', - iterator: '@', - list: '=', - dataset: '=', - collection: '=', - searchTags: '=', - disableSearch: '=', - defaultParams: '=', - querySet: '=', - singleSearchParam: '@', - searchBarFullWidth: '=' - }, - controller: 'SmartSearchController', - templateUrl: templateUrl('shared/smart-search/smart-search') - }; - } -]; diff --git a/awx/ui/client/src/shared/smart-search/smart-search.partial.html b/awx/ui/client/src/shared/smart-search/smart-search.partial.html deleted file mode 100644 index 40c70b2de7..0000000000 --- a/awx/ui/client/src/shared/smart-search/smart-search.partial.html +++ /dev/null @@ -1,53 +0,0 @@ -
- -
-
- -
- -
-
- -
-
-
- Key -
-
- -
-
-
-
- -
-
- CLEAR ALL -
-
-
-
- -
-
-
-
- EXAMPLES: -
- -
-
-
- FIELDS: {{ field }}, -
-
- RELATED FIELDS: {{ relation }}, -
-
- {{ 'ADDITIONAL INFORMATION' | translate }}: - {{ 'For additional information on advanced search syntax please see the Ansible Tower' | translate }} - {{ 'documentation' | translate }}. -
-
-
diff --git a/awx/ui/client/src/shared/smart-search/smart-search.service.js b/awx/ui/client/src/shared/smart-search/smart-search.service.js deleted file mode 100644 index fc540c3573..0000000000 --- a/awx/ui/client/src/shared/smart-search/smart-search.service.js +++ /dev/null @@ -1,63 +0,0 @@ -export default [function() { - return { - /** - * For the Smart Host Filter, values with spaces are wrapped with double quotes on input. - * To avoid having these quoted values split up and treated as terms themselves, some - * work is done to encode quotes in quoted values and the spaces within those quoted - * values before calling to `splitSearchIntoTerms`. - */ - splitFilterIntoTerms (searchString) { - if (!searchString) { - return null; - } - - let groups = []; - let quoted; - - // This split _may_ split search terms down the middle - // ex) searchString=ansible_facts.some_other_thing:"foo foobar" ansible_facts.some_thing:"foobar" - // would result in 3 different substring's but only two search terms - // This logic handles that scenario with the `quoted` variable - searchString.split(' ').forEach(substring => { - if (/:"/g.test(substring)) { - if (/"$/.test(substring)) { - groups.push(this.encode(substring)); - } else { - quoted = substring; - } - } else if (quoted) { - quoted += ` ${substring}`; - - if (/"/g.test(substring)) { - groups.push(this.encode(quoted)); - quoted = undefined; - } - } else { - groups.push(substring); - } - }); - - return this.splitSearchIntoTerms(groups.join(' ')); - }, - encode (string) { - string = string.replace(/'/g, '%27'); - - return string.replace(/("| )/g, match => encodeURIComponent(match)); - }, - splitSearchIntoTerms(searchString) { - return searchString.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g); - }, - splitTermIntoParts(searchTerm) { - let breakOnColon = searchTerm.match(/(?:[^:"]+|"[^"]*")+/g); - - if(breakOnColon.length > 2) { - // concat all the strings after the first one together - let stringsToJoin = breakOnColon.slice(1,breakOnColon.length); - return [breakOnColon[0], stringsToJoin.join(':')]; - } - else { - return breakOnColon; - } - } - }; -}]; diff --git a/awx/ui/client/src/shared/socket/main.js b/awx/ui/client/src/shared/socket/main.js deleted file mode 100644 index 0b512aa8c1..0000000000 --- a/awx/ui/client/src/shared/socket/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import socketService from './socket.service'; - -export default - angular.module('socket', []) - .service('SocketService', socketService); diff --git a/awx/ui/client/src/shared/socket/socket.service.js b/awx/ui/client/src/shared/socket/socket.service.js deleted file mode 100644 index 9ad9180d35..0000000000 --- a/awx/ui/client/src/shared/socket/socket.service.js +++ /dev/null @@ -1,291 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ -import ReconnectingWebSocket from 'reconnectingwebsocket'; -export default -['$rootScope', '$location', '$log','$state', '$q', 'i18n', 'GetBasePath', 'Rest', '$cookies', - function ($rootScope, $location, $log, $state, $q, i18n, GetBasePath, Rest, $cookies) { - var needsResubscribing = false, - socketPromise = $q.defer(), - needsRefreshAfterBlur; - return { - init: function() { - var self = this, - host = window.location.host, - protocol, - url; - - if($location.protocol() === 'http'){ - protocol = 'ws'; - } - if($location.protocol() === 'https'){ - protocol = 'wss'; - } - url = `${protocol}://${host}/websocket/`; - - // only toggle background tabbed sockets if the - // UI_LIVE_UPDATES_ENABLED flag is true in the settings file - if(window.liveUpdates){ - document.addEventListener('visibilitychange', function() { - $log.debug(document.visibilityState); - if(document.visibilityState === 'hidden'){ - window.liveUpdates = false; - } - else if(document.visibilityState === 'visible'){ - window.liveUpdates = true; - if(needsRefreshAfterBlur){ - $state.go('.', null, {reload: true}); - needsRefreshAfterBlur = false; - } - - } - }); - } - - - if (!$rootScope.sessionTimer || ($rootScope.sessionTimer && !$rootScope.sessionTimer.isExpired())) { - - $log.debug('Socket connecting to: ' + url); - self.socket = new ReconnectingWebSocket(url, null, { - timeoutInterval: 3000, - maxReconnectAttempts: 10 }); - - self.socket.onopen = function () { - $log.debug("Websocket connection opened. Socket readyState: " + self.socket.readyState); - socketPromise.resolve(); - self.checkStatus(); - if(needsResubscribing){ - self.subscribe(self.getLast()); - needsResubscribing = false; - } - - }; - - self.socket.onerror = function (error) { - self.checkStatus(); - $log.debug('Websocket Error Logged: ' + error); //log errors - }; - - self.socket.onconnecting = function () { - self.checkStatus(); - $log.debug('Websocket reconnecting'); - needsResubscribing = true; - }; - - self.socket.onclose = function () { - self.checkStatus(); - $log.debug(`Websocket disconnected`); - }; - - self.socket.onmessage = this.onMessage; - - return self.socket; - } - else { - // encountered expired token, redirect to login page - $rootScope.sessionTimer.expireSession('idle'); - $location.url('/login'); - } - }, - onMessage: function(e){ - // Function called when messages are received on by the UI from - // the API over the websocket. This will route each message to - // the appropriate controller for the current $state. - $log.debug('Received From Server: ' + e.data); - - var data = JSON.parse(e.data), str = ""; - - if (data.group_name === 'jobs' && - 'type' in data && - data.type === 'workflow_approval' - ) { - $rootScope.$broadcast('ws-approval'); - } - - if ( - !window.liveUpdates && - data.group_name !== "control" && - $state.current.name !== "output" && - !$state.current.name.includes('settings') - ) { - $log.debug('Message from server dropped: ' + e.data); - needsRefreshAfterBlur = true; - return; - } - - if(data.group_name==="jobs" && !('status' in data)){ - // we know that this must have been a - // summary complete message b/c status is missing. - // A an object w/ group_name === "jobs" AND a 'status' key - // means it was for the event: status_changed. - $log.debug('Job summary_complete ' + data.unified_job_id); - $rootScope.$broadcast('ws-jobs-summary', data); - return; - } - else if(data.group_name==="job_events"){ - // The naming scheme is "ws" then a - // dash (-) and the group_name, then the job ID - // ex: 'ws-jobs-' - str = `ws-${data.group_name}-${data.job}`; - } - else if(data.group_name==="project_update_events"){ - str = `ws-${data.group_name}-${data.project_update}`; - } - else if(data.group_name==="ad_hoc_command_events"){ - str = `ws-${data.group_name}-${data.ad_hoc_command}`; - } - else if(data.group_name==="system_job_events"){ - str = `ws-${data.group_name}-${data.system_job}`; - } - else if(data.group_name==="inventory_update_events"){ - str = `ws-${data.group_name}-${data.inventory_update}`; - } - else if(data.group_name === "control" && data.reason === "limit_reached"){ - // If we got a `limit_reached_` message, determine - // if the current session is still valid (it may have been - // invalidated) - // If so, log the user out and show a meaningful error - $log.debug(data.reason); - let url = GetBasePath('me'); - Rest.get(url) - .catch(function(resp) { - if (resp.status === 401) { - $rootScope.sessionTimer.expireSession('session_limit'); - $state.go('signOut'); - } - }); - } - else { - // The naming scheme is "ws" then a - // dash (-) and the group_name. - // ex: 'ws-jobs' - str = `ws-${data.group_name}`; - } - $rootScope.$broadcast(str, data); - }, - disconnect: function(){ - if(this.socket){ - this.socket.close(); - delete this.socket; - $log.debug("Socket deleted: "+this.socket); - } - }, - subscribe: function(state){ - // Subscribe is used to tell the API that the UI wants to - // listen for specific messages. A subscription object could - // look like {"groups":{"jobs": ["status_changed", "summary"]}. - // This is used by all socket-enabled $states - state.data.socket.groups.control = ['limit_reached_' + $rootScope.current_user.id]; - state.data.socket.xrftoken = $cookies.get('csrftoken'); - this.emit(JSON.stringify(state.data.socket)); - this.setLast(state); - }, - unsubscribe: function(state){ - // Unsubscribing tells the API that the user is no longer on - // on a socket-enabled page, and sends an empty groups object - // to the API: {"groups": {}}. - // This is used for all pages that are socket-disabled - state.data.socket.xrftoken = $cookies.get('csrftoken'); - if(this.requiresNewSubscribe(state)){ - this.emit(JSON.stringify(state.data.socket) || JSON.stringify({"groups": {}})); - } - this.setLast(state); - }, - setLast: function(state){ - this.last = state; - }, - getLast: function(){ - return this.last; - }, - requiresNewSubscribe(state){ - // This function is used for unsubscribing. If the last $state - // required an "unsubscribe", then we don't need to unsubscribe - // again, b/c the UI is already unsubscribed from all groups - if (this.getLast() !== undefined){ - if( _.isEmpty(state.data.socket.groups) && _.isEmpty(this.getLast().data.socket.groups)){ - return false; - } - else { - return true; - } - } - else { - return true; - } - }, - checkStatus: function() { - // Function for changing the socket indicator icon in the nav bar - var self = this; - if(self){ - if(self.socket){ - if (self.socket.readyState === 0 ) { - $rootScope.socketStatus = 'connecting'; - $rootScope.socketTip = i18n._(`Live events: attempting to connect to the ${$rootScope.BRAND_NAME} server.`); - } - else if (self.socket.readyState === 1){ - $rootScope.socketStatus = 'ok'; - $rootScope.socketTip = i18n._("Live events: connected. Pages containing job status information will automatically update in real-time."); - } - else if (self.socket.readyState === 2 || self.socket.readyState === 3 ){ - $rootScope.socketStatus = 'error'; - $rootScope.socketTip = i18n._(`Live events: error connecting to the ${$rootScope.BRAND_NAME} server.`); - } - return; - } - } - - }, - emit: function(data, callback) { - // Function used for sending objects to the API over the - // websocket. - var self = this; - socketPromise.promise.then(function(){ - if(self.socket.readyState === 0){ - $log.debug('Unable to send message, waiting 500ms to resend. Socket readyState: ' + self.socket.readyState); - setTimeout(function(){ - self.subscribe(self.getLast()); - }, 500); - } - else if(self.socket.readyState === 1){ - self.socket.send(data, function () { - var args = arguments; - self.scope.$apply(function () { - if (callback) { - callback.apply(self.socket, args); - } - }); - }); - $log.debug('Sent to Websocket Server: ' + data); - } - }); - }, - addStateResolve: function(state, id){ - // This function is used for add a state resolve to all states, - // socket-enabled AND socket-disabled, and whether the $state - // requires a subscribe or an unsubscribe - var self = this; - return socketPromise.promise.then(function(){ - if (_.get(state, 'data.socket.groups.jobs')) { - if (!state.data.socket.groups.jobs.includes("status_changed")) { - state.data.socket.groups.jobs.push("status_changed"); - } - } - else if(!state.data || !state.data.socket){ - _.merge(state.data, {socket: {groups: {jobs: ["status_changed"]}}}); - } - ["job_events", "ad_hoc_command_events", "workflow_events", - "project_update_events", "inventory_update_events", - "system_job_events" - ].forEach(function(group) { - if(state.data && state.data.socket && state.data.socket.groups.hasOwnProperty(group)){ - state.data.socket.groups[group] = [id]; - } - }); - self.subscribe(state); - return true; - }); - } - }; - }]; diff --git a/awx/ui/client/src/shared/stateDefinitions.factory.js b/awx/ui/client/src/shared/stateDefinitions.factory.js deleted file mode 100644 index e72df8e2f9..0000000000 --- a/awx/ui/client/src/shared/stateDefinitions.factory.js +++ /dev/null @@ -1,942 +0,0 @@ -/** - * @ngdoc interface - * @name stateDefinitions - * @description An API for generating a standard set of state definitions - * generateTree - builds a full list/form tree - * generateListNode - builds a single list node e.g. {name: 'projects', ...} - * generateFormNode - builds a form node definition e.g. {name: 'projects.add', ...} - * generateFormListDefinitions - builds form list definitions attached to a form node e.g. {name: 'projects.edit.permissions', ...} - * generateLookupNodes - Attaches to a form node. Builds an abstract '*.lookup' node with field-specific 'lookup.*' children e.g. {name: 'projects.add.lookup.organizations', ...} - */ - -export default ['$injector', '$stateExtender', '$log', 'i18n', -function($injector, $stateExtender, $log, i18n) { - return { - /** - * @ngdoc method - * @name stateDefinitions.generateTree - * @description intended for consumption by $stateProvider.state.lazyLoad in a placeholder node - * @param {object} params - { - parent: 'stateName', // the name of the top-most node of this tree - modes: ['add', 'edit'], // form modes to include in this state tree - list: 'InjectableListDefinition', - form: 'InjectableFormDefinition', - controllers: { - list: 'Injectable' || Object, - add: 'Injectable' || Object, - edit: 'Injectable' || Object, - } - * @returns {object} Promise which resolves to an object.state containing array of all state definitions in this tree - * e.g. {state: [{...}, {...}, ...]} - */ - generateTree: function(params) { - let form, list, formStates, listState, - states = []; - //return defer.promise; - return new Promise((resolve) => { - // returns array of the following states: - // resource.add, resource.edit - // resource.add.lookup, resource.add.lookup.* => [field in form.fields if field.type == 'lookup'] - // resource.edit.lookup, resource.edit.lookup.* => [field in form.fields if field.type == 'lookup'] - // resource.edit.* => [relationship in form.related] - if (params.list) { - list = $injector.get(params.list); - - listState = this.generateListNode(list, params); - states.push(listState); - } - if (params.form) { - // handle inconsistent typing of form definitions - // can be either an object or fn - form = $injector.get(params.form); - form = typeof(form) === 'function' ? form() : form; - - formStates = _.map(params.modes, (mode) => this.generateFormNode(mode, form, params)); - states = states.concat(_.flatten(formStates)); - } - - $log.debug('*** Generated State Tree', states); - resolve({ states: states }); - }); - }, - - /** - * @ngdoc method - * @name stateDefinitions.generateListNode - * @description builds single list node - * @params {object} list - list definition/configuration object - * @params {object} params - * @returns {object} a list state definition - */ - generateListNode: function(list, params) { - let state, - url = params.urls && params.urls.list ? params.urls.list : (params.url ? params.url : `/${list.name}`); - - // allows passed-in params to specify a custom templateUrl - // otherwise, use html returned by generateList.build() to fulfill templateProvider fn - function generateTemplateBlock() { - if (params.templates && params.templates.list) { - return params.templates.list; - } else { - return function(ListDefinition, generateList) { - let html = generateList.build({ - list: ListDefinition, - mode: 'edit' - }); - html = generateList.wrapPanel(html); - // generateList.formView() inserts a ui-view="form" inside the list view's hierarchy - html = generateList.insertFormView() + html; - if(params.generateSchedulerView){ - html = generateList.insertSchedulerView() + html; - } - return html; - }; - } - } - - let views = params.views ? params.views : { - '@': { - // resolves to a variable property name: - // 'templateUrl' OR 'templateProvider' - [params.templates && params.templates.list ? 'templateUrl' : 'templateProvider']: generateTemplateBlock(), - controller: params.controllers.list, - } - }; - - state = $stateExtender.buildDefinition({ - searchPrefix: list.iterator, - name: params.parent, - url: url, - data: params.data, - ncyBreadcrumb: { - label: list.title - }, - resolve: { - Dataset: [params.list, 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - ListDefinition: () => list - }, - views: views - }); - // allow passed-in params to override default resolve block - if (params.resolve && params.resolve.list) { - state.resolve = _.merge(state.resolve, params.resolve.list); - } - // allow passed-in params to override default ncyBreadcrumb property - if (params.ncyBreadcrumb) { - state.ncyBreadcrumb = params.ncyBreadcrumb; - } - if (list.search) { - state.params[`${list.iterator}_search`].value = _.merge(state.params[`${list.iterator}_search`].value, list.search); - } - return state; - }, - /** - * @ngdoc method - * @name stateDefinitions.generateFormNode - * @description builds a node of form states, e.g. resource.edit.** or resource.add.** - * @param {string} mode - 'add' || 'edit' - the form mode of this node - * @param {object} form - form definition/configuration object - * @returns {array} Array of state definitions required by form mode [{...}, {...}, ...] - */ - generateFormNode: function(mode, form, params) { - let formNode, - states = [], - url; - switch (mode) { - case 'add': - url = params.urls && params.urls.add ? params.urls.add : (params.url ? params.url : '/add'); - // breadcrumbName necessary for resources that are more than one word like - // job templates. form.name can't have spaces in it or it busts form gen - formNode = $stateExtender.buildDefinition({ - name: params.name || `${params.parent}.add`, - url: url, - ncyBreadcrumb: { - [params.parent ? 'parent' : null]: `${params.parent}`, - label: i18n.sprintf(i18n._("CREATE %s"), i18n._(`${form.breadcrumbName || form.name.toUpperCase()}`)) - }, - views: { - 'form': { - templateProvider: function(FormDefinition, GenerateForm) { - let form = typeof(FormDefinition) === 'function' ? - FormDefinition() : FormDefinition; - return GenerateForm.buildHTML(form, { - mode: 'add', - related: false - }); - }, - controller: params.controllers.add - } - }, - resolve: { - 'FormDefinition': [params.form, function(definition) { - return definition; - }] - } - }); - if (params.resolve && params.resolve.add) { - formNode.resolve = _.merge(formNode.resolve, params.resolve.add); - } - break; - case 'edit': - url = params.urls && params.urls.edit ? params.urls.edit : (params.url ? params.url : `/:${form.name}_id`); - let breadcrumbLabel = params.breadcrumbs && params.breadcrumbs.edit ? params.breadcrumbs.edit : '{{parentObject.name || name}}'; - let formNodeState = { - name: params.name || `${params.parent}.edit`, - url: url, - ncyBreadcrumb: { - [params.parent ? 'parent' : null]: `${params.parent}`, - label: breadcrumbLabel - }, - views: { - 'form': { - templateProvider: function(FormDefinition, GenerateForm) { - let form = typeof(FormDefinition) === 'function' ? - FormDefinition() : FormDefinition; - return GenerateForm.buildHTML(form, { - mode: 'edit' - }); - }, - controller: params.controllers.edit - } - }, - resolve: { - FormDefinition: [params.form, function(definition) { - return definition; - }], - resourceData: ['FormDefinition', 'Rest', '$stateParams', 'GetBasePath', '$q', 'ProcessErrors', - function(FormDefinition, Rest, $stateParams, GetBasePath, $q, ProcessErrors) { - let form, path; - let deferred = $q.defer(); - form = typeof(FormDefinition) === 'function' ? - FormDefinition() : FormDefinition; - if (GetBasePath(form.basePath) === undefined && GetBasePath(form.stateTree) === undefined ){ - throw { name: 'NotImplementedError', message: `${form.name} form definition is missing basePath or stateTree property.` }; - } - else{ - path = (GetBasePath(form.basePath) || GetBasePath(form.stateTree) || form.basePath) + $stateParams[`${form.name}_id`]; - } - Rest.setUrl(path); - Rest.get() - .then((response) => deferred.resolve(response)) - .catch(({ data, status }) => { - ProcessErrors(null, data, status, null, - { - hdr: i18n._('Error!'), - msg: i18n._('Unable to get resource: ') + status - } - ); - deferred.reject(); - }); - return deferred.promise; - } - ] - }, - }; - if (params.data && params.data.activityStreamTarget) { - formNodeState.data = {}; - formNodeState.data.activityStreamId = params.data.activityStreamId ? params.data.activityStreamId : params.data.activityStreamTarget + '_id'; - formNodeState.data.activityStreamTarget = params.data.activityStreamTarget; - } - formNode = $stateExtender.buildDefinition(formNodeState); - - if (params.resolve && params.resolve.edit) { - formNode.resolve = _.merge(formNode.resolve, params.resolve.edit); - } - break; - } - states.push(formNode); - states = states.concat(this.generateLookupNodes(form, formNode)).concat(this.generateFormListDefinitions(form, formNode, params)); - return states; - }, - /** - * @ngdoc method - * @name stateDefinitions.generateFormListDefinitions - * @description builds state definitions for a form's related lists, like notifications/permissions - * @param {object} form - form definition/configuration object - * @params {object} formStateDefinition - the parent form node - * @returns {array} Array of state definitions [{...}, {...}, ...] - */ - generateFormListDefinitions: function(form, formStateDefinition, params) { - function buildRbacUserTeamDirective(){ - let states = []; - - states.push($stateExtender.buildDefinition({ - name: `${formStateDefinition.name}.permissions.add`, - squashSearchUrl: true, - url: '/add-permissions', - params: { - project_search: { - value: {order_by: 'name', page_size: '5', role_level: 'admin_role'}, - dynamic: true - }, - job_template_search: { - value: {order_by: 'name', page_size: '5', role_level: 'admin_role'}, - dynamic: true - }, - workflow_template_search: { - value: {order_by: 'name', page_size: '5', role_level: 'admin_role'}, - dynamic: true - }, - inventory_search: { - value: {order_by: 'name', page_size: '5', role_level: 'admin_role'}, - dynamic: true - }, - credential_search: { - value: {order_by: 'name', page_size: '5', role_level: 'admin_role'}, - dynamic: true - }, - organization_search: { - value: {order_by: 'name', page_size: '5', role_level: 'admin_role'}, - dynamic: true - } - }, - ncyBreadcrumb:{ - skip:true - }, - views: { - [`modal@${formStateDefinition.name}`]: { - template: `` - } - }, - resolve: { - jobTemplatesDataset: ['QuerySet', '$stateParams', 'GetBasePath', - function(qs, $stateParams, GetBasePath) { - let path = GetBasePath('job_templates'); - return qs.search(path, $stateParams.job_template_search); - } - ], - workflowTemplatesDataset: ['QuerySet', '$stateParams', 'GetBasePath', - function(qs, $stateParams, GetBasePath) { - let path = GetBasePath('workflow_job_templates'); - return qs.search(path, $stateParams.workflow_template_search); - } - ], - projectsDataset: ['ProjectList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - inventoriesDataset: ['InventoryList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - credentialsDataset: ['CredentialList', 'QuerySet', '$stateParams', 'GetBasePath', 'resourceData', 'Rest', '$q', - function(list, qs, $stateParams, GetBasePath, resourceData, Rest, $q) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - - if(resourceData.data.type === "team") { - $stateParams[`${list.iterator}_search`].organization = resourceData.data.organization; - } - - if(resourceData.data.type === "user") { - - let resolve = $q.defer(); - - let getMoreOrgs = function(data, arr) { - Rest.setUrl(data.next); - Rest.get() - .then(function (resData) { - if (data.next) { - getMoreOrgs(resData.data, arr.concat(resData.data.results)); - } else { - resolve.resolve(arr.concat(resData.data.results)); - } - }); - }; - - Rest.setUrl(GetBasePath('users') + `${resourceData.data.id}/organizations?page_size=200`); - Rest.get() - .then(function(resData) { - if (resData.data.next) { - getMoreOrgs(resData.data, resData.data.results); - } else { - resolve.resolve(resData.data.results); - } - }); - - return resolve.promise.then(function (organizations) { - if(organizations && organizations.length > 0) { - let orgIds = _.map(organizations, function(organization){ - return organization.id; - }); - - $stateParams[`${list.iterator}_search`].or__organization = 'null'; - $stateParams[`${list.iterator}_search`].or__organization__in = orgIds.join(); - - } - else { - $stateParams[`${list.iterator}_search`].organization = 'null'; - } - - return qs.search(path, $stateParams[`${list.iterator}_search`]); - }); - - } - else { - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - } - ], - organizationsDataset: ['OrganizationList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - }, - onExit: function($state) { - if ($state.transition) { - $('#add-permissions-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - }, - })); - return states; - } - - function buildRbacResourceDirective() { - let states = []; - - states.push($stateExtender.buildDefinition({ - name: `${formStateDefinition.name}.permissions.add`, - squashSearchUrl: true, - url: '/add-permissions', - params: { - user_search: { - value: { order_by: 'username', page_size: '5', is_superuser: false }, - dynamic: true, - }, - team_search: { - value: { order_by: 'name', page_size: '5' }, - dynamic: true - } - }, - views: { - [`modal@${formStateDefinition.name}`]: { - template: `` - } - }, - ncyBreadcrumb:{ - skip:true - }, - resolve: { - usersDataset: ['addPermissionsUsersList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams.user_search); - - } - ], - teamsDataset: ['addPermissionsTeamsList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams.team_search); - } - ] - }, - onExit: function($state) { - if ($state.transition) { - $('#add-permissions-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - }, - })); - return states; - } - - function buildNotificationState(field) { - let state, - list = field.include ? $injector.get(field.include) : field, - breadcrumbLabel = (field.iterator.replace('_', ' ') + 's').toUpperCase(); - state = $stateExtender.buildDefinition({ - searchPrefix: `${list.iterator}`, - name: `${formStateDefinition.name}.${list.iterator}s`, - url: `/${list.iterator}s`, - ncyBreadcrumb: { - parent: `${formStateDefinition.name}`, - label: `${breadcrumbLabel}` - }, - params: { - [list.iterator + '_search']: { - value: { order_by: field.order_by ? field.order_by : 'name' } - } - }, - views: { - 'related': { - templateProvider: function(FormDefinition, GenerateForm, $stateParams, SourcesFormDefinition) { - var form, html; - if($stateParams && $stateParams.inventory_source_id){ - form = SourcesFormDefinition; - } - else { - form = typeof(FormDefinition) === 'function' ? - FormDefinition() : FormDefinition; - } - html = GenerateForm.buildCollection({ - mode: 'edit', - related: `${list.iterator}s`, - form: form - }); - return html; - }, - controller: ['$scope', 'ListDefinition', 'Dataset', 'ToggleNotification', 'NotificationsListInit', 'GetBasePath', '$stateParams', - function($scope, list, Dataset, ToggleNotification, NotificationsListInit, GetBasePath, $stateParams) { - var url , params = $stateParams, id; - if(params.hasOwnProperty('project_id')){ - id = params.project_id; - url = GetBasePath('projects'); - } - if(params.hasOwnProperty('job_template_id')){ - id = params.job_template_id; - url = GetBasePath('job_templates'); - } - if(params.hasOwnProperty('workflow_job_template_id')){ - id = params.workflow_job_template_id; - url = GetBasePath('workflow_job_templates'); - } - if(params.hasOwnProperty('inventory_source_id')){ - id = params.inventory_source_id; - url = GetBasePath('inventory_sources'); - } - if(params.hasOwnProperty('organization_id')){ - id = params.organization_id; - url = GetBasePath('organizations'); - } - function init() { - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - - NotificationsListInit({ - scope: $scope, - url: url, - id: id - }); - - $scope.$watch(`${list.iterator}_dataset`, function() { - // The list data has changed and we need to update which notifications are on/off - $scope.$emit('relatednotifications'); - }); - } - - $scope.toggleNotification = function(event, notifier_id, column) { - var notifier = this.notification; - try { - $(event.target).tooltip('hide'); - } - catch(e) { - // ignore - } - ToggleNotification({ - scope: $scope, - url: url + id, - notifier: notifier, - column: column, - callback: 'NotificationRefresh' - }); - }; - - init(); - - } - ] - } - }, - resolve: { - ListDefinition: () => { - return list; - }, - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ] - } - }); - return state; - } - - function buildRbacUserDirective() { - let states = []; - - states.push($stateExtender.buildDefinition({ - name: `${formStateDefinition.name}.users.add`, - url: '/add-user', - searchPrefix: 'add_user', - params: { - add_user_search: { - value: { order_by: 'username', page_size: '5' }, - dynamic: true - } - }, - views: { - [`modal@${formStateDefinition.name}`]: { - template: `` - } - }, - ncyBreadcrumb:{ - skip:true - }, - resolve: { - roleToExclude: ['$stateParams', 'Rest', 'GetBasePath', 'i18n', function($stateParams, Rest, GetBasePath, i18n) { - const basePath = ($stateParams.team_id) ? GetBasePath('teams') + `${$stateParams.team_id}/object_roles` : - GetBasePath('organizations') + `${$stateParams.organization_id}/object_roles`; - Rest.setUrl(basePath); - return Rest.get().then(({data}) => { - return data.results - .filter(({name}) => name === i18n._('Member')) - .map(({id}) => id)[0]; - }); - }], - usersDataset: ['addPermissionsUsersList', 'QuerySet', '$stateParams', 'GetBasePath', 'roleToExclude', - function(list, qs, $stateParams, GetBasePath, roleToExclude) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - if (roleToExclude) { - $stateParams.add_user_search.not__roles = roleToExclude; - } - return qs.search(path, $stateParams.add_user_search); - } - ], - defaultParams: ['$stateParams', 'usersDataset', function($stateParams) { - return $stateParams.add_user_search; - }] - }, - onExit: function($state) { - if ($state.transition) { - $('#add-permissions-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - }, - })); - return states; - } - - function buildListNodes(field) { - let states = []; - if(!field.skipGenerator) { - if(field.iterator === 'notification'){ - states.push(buildNotificationState(field)); - states = _.flatten(states); - } - else{ - states.push(buildListDefinition(field)); - if (field.iterator === 'permission' && field.actions && field.actions.add) { - if (form.name === 'user' || form.name === 'team'){ - states.push(buildRbacUserTeamDirective()); - } - else { - states.push(buildRbacResourceDirective()); - } - } - else if (field.iterator === 'user' && field.actions && field.actions.add) { - if(form.name === 'team' || form.name === 'organization') { - states.push(buildRbacUserDirective()); - } - } - } - } - - states = _.flatten(states); - return states; - } - - function buildListDefinition(field) { - let state, - list = field.include ? $injector.get(field.include) : field, - // Added this line specifically for Completed Jobs but should be OK - // for all the rest of the related tabs - breadcrumbLabel = (field.iterator.replace('_', ' ') + 's').toUpperCase(), - stateConfig = { - searchPrefix: `${list.iterator}`, - name: `${formStateDefinition.name}.${list.iterator}s`, - url: `/${list.iterator}s`, - ncyBreadcrumb: { - parent: `${formStateDefinition.name}`, - label: `${breadcrumbLabel}` - }, - params: { - [list.iterator + '_search']: { - value: { order_by: field.order_by ? field.order_by : 'name' } - }, - }, - views: { - 'related': { - templateProvider: function(FormDefinition, GenerateForm) { - let html = GenerateForm.buildCollection({ - mode: 'edit', - related: `${list.iterator}s`, - form: typeof(FormDefinition) === 'function' ? - FormDefinition() : FormDefinition - }); - return html; - } - } - }, - resolve: { - ListDefinition: () => { - return list; - }, - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope) => { - // allow related list definitions to use interpolated $rootScope / $stateParams in basePath field - let path, interpolator; - if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ] - } - }; - - if(params.controllers && params.controllers.related && params.controllers.related[field.name]) { - stateConfig.views.related.controller = params.controllers.related[field.name]; - } - else if(field.name === 'permissions') { - stateConfig.views.related.controller = 'PermissionsList'; - } - else { - // Generic controller - stateConfig.views.related.controller = ['$scope', 'ListDefinition', 'Dataset', - function($scope, list, Dataset) { - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[`${list.iterator}s`] = $scope[`${list.iterator}_dataset`].results; - } - ]; - } - - state = $stateExtender.buildDefinition(stateConfig); - // appy any default search parameters in form definition - if (field.search) { - state.params[`${field.iterator}_search`].value = _.merge(state.params[`${field.iterator}_search`].value, field.search); - } - - return state; - } - return _(form.related).map(buildListNodes).flatten().value(); - }, - /** - * @ngdoc method - * @name stateDefinitions.generateLookupNode - * @description builds a node of child states for each lookup field in a form - * @param {object} form - form definition/configuration object - * @params {object} formStateDefinition - the parent form node - * @returns {array} Array of state definitions [{...}, {...}, ...] - */ - generateLookupNodes: function(form, formStateDefinition) { - - function buildFieldDefinition(field) { - - // Some lookup modals require some additional default params, - // namely organization and inventory_script, and insights - // credentials. If these params - // aren't set as default params out of the gate, then smart - // search will think they need to be set as search tags. - var params; - if(field.sourceModel === "organization"){ - if (form.name === "notification_template") { - // Users with admin_role role level should also have - // notification_admin_role so this should handle regular admin - // users as well as notification admin users - params = { - page_size: '5', - role_level: 'notification_admin_role' - }; - } else { - params = { - page_size: '5', - role_level: 'admin_role' - }; - } - } - else if(field.sourceModel === "inventory_script"){ - params = { - page_size: '5', - role_level: 'admin_role', - organization: null - }; - } - else if(field.sourceModel === "insights_credential"){ - params = { - page_size: '5', - role_level: 'admin_role', - credential_type: null - }; - } - else if(field.sourceModel === 'host') { - params = { - page_size: '5' - }; - } - else { - params = { - page_size: '5', - role_level: 'use_role' - }; - } - - let state = $stateExtender.buildDefinition({ - searchPrefix: field.sourceModel, - //squashSearchUrl: true, @issue enable - name: `${formStateDefinition.name}.${field.sourceModel}`, - url: `/${field.sourceModel}?selected`, - // a lookup field's basePath takes precedence over generic list definition's basePath, if supplied - data: { - basePath: field.basePath || null, - formChildState: true - }, - params: { - [field.sourceModel + '_search']: { - value: params - } - }, - ncyBreadcrumb: { - skip: true - }, - views: { - 'modal': { - templateProvider: function(ListDefinition, generateList) { - const listConfig = { - mode: 'lookup', - list: ListDefinition, - input_type: 'radio' - }; - - if (field.lookupMessage) { - listConfig.lookupMessage = field.lookupMessage; - } - - let list_html = generateList.build(listConfig); - - return `${list_html}`; - } - } - }, - resolve: { - ListDefinition: [field.list, function(list) { - let listClone = _.cloneDeep(list); - listClone.iterator = field.sourceModel; - return listClone; - }], - OrganizationId: ['ListDefinition', 'InventoriesService', '$stateParams', '$rootScope', - function(list, InventoriesService, $stateParams, $rootScope){ - if(list.iterator === 'inventory_script'){ - if($rootScope.$$childTail && - $rootScope.$$childTail.$resolve && - $rootScope.$$childTail.$resolve.hasOwnProperty('inventoryData')){ - return $rootScope.$$childTail.$resolve.inventoryData.summary_fields.organization.id; - } - else { - return InventoriesService.getInventory($stateParams.inventory_id).then(res => res.data.summary_fields.organization.id); - } - - } - else { - return; - } - }], - InsightsCredTypePK: ['ListDefinition', 'Rest', 'GetBasePath', 'ProcessErrors', - function(list, Rest, GetBasePath,ProcessErrors) { - if(list.iterator === 'insights_credential'){ - Rest.setUrl(GetBasePath('credential_types') + '?name=Insights'); - return Rest.get() - .then(({data}) => { - return data.results[0].id; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get credential type data: ' + status - }); - }); - } - }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', '$state', 'OrganizationId', 'InsightsCredTypePK', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope, $state, OrganizationId, InsightsCredTypePK) => { - // allow lookup field definitions to use interpolated $stateParams / $rootScope in basePath field - // the basePath on a form's lookup field will take precedence over the general model list's basepath - let path, interpolator; - if ($state.transition._targetState._definition.data && GetBasePath($state.transition._targetState._definition.data.basePath)) { - path = GetBasePath($state.transition._targetState._definition.data.basePath); - } else if ($state.transition._targetState._definition.data && $state.transition._targetState._definition.data.basePath) { - interpolator = $interpolate($state.transition._targetState._definition.data.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } else if (GetBasePath(list.basePath)) { - path = GetBasePath(list.basePath); - } else { - interpolator = $interpolate(list.basePath); - path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); - } - // Need to change the role_level here b/c organizations and inventory scripts - // don't have a "use_role", only "admin_role" and "read_role" - if(list.iterator === "organization"){ - if ($state.current.name.includes('inventories')) { - $stateParams[`${list.iterator}_search`].role_level = "inventory_admin_role"; - } else if ($state.current.name.includes('projects')) { - $stateParams[`${list.iterator}_search`].role_level = "project_admin_role"; - } else if ($state.current.name.includes('templates.addWorkflowJobTemplate') || $state.current.name.includes('templates.editWorkflowJobTemplate')) { - $stateParams[`${list.iterator}_search`].role_level = "workflow_admin_role"; - } - } - if(list.iterator === "inventory_script"){ - $stateParams[`${list.iterator}_search`].role_level = "admin_role"; - $stateParams[`${list.iterator}_search`].organization = OrganizationId; - } - if(list.iterator === "insights_credential"){ - $stateParams[`${list.iterator}_search`].role_level = "admin_role"; - $stateParams[`${list.iterator}_search`].credential_type = InsightsCredTypePK.toString() ; - } - if(list.iterator === 'credential') { - if($state.current.name.includes('projects.edit') || $state.current.name.includes('projects.add')) { - state.params[`${list.iterator}_search`].value = _.merge(state.params[`${list.iterator}_search`].value, $stateParams[`${list.iterator}_search`]); - } - } - - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ] - }, - onExit: function($state) { - if ($state.transition) { - $('#form-modal').modal('hide'); - $('.modal-backdrop').remove(); - $('body').removeClass('modal-open'); - } - }, - }); - if (field.search) { - state.params[`${field.sourceModel}_search`].value = _.merge(state.params[`${field.sourceModel}_search`].value, field.search); - } - return state; - } - return _(form.fields).filter({ type: 'lookup' }).map(buildFieldDefinition).value(); - } - - }; - -}]; diff --git a/awx/ui/client/src/shared/stateExtender.provider.js b/awx/ui/client/src/shared/stateExtender.provider.js deleted file mode 100644 index 2ca49c3a76..0000000000 --- a/awx/ui/client/src/shared/stateExtender.provider.js +++ /dev/null @@ -1,75 +0,0 @@ -export default function($stateProvider) { - this.$get = function() { - return { - // attaches socket as resolvable if specified in state definition - addSocket: function(state){ - // The login route has a 'null' socket because it should - // neither subscribe or unsubscribe - if(state.data && state.data.socket!==null){ - if(!state.resolve){ - state.resolve = {}; - } - state.resolve.socket = ['SocketService', '$stateParams', - function(SocketService, $stateParams) { - SocketService.addStateResolve(state, $stateParams.id); - } - ]; - } - }, - // builds a state definition with default slaw - buildDefinition: function(state) { - let params, defaults, definition, - searchPrefix = state.searchPrefix ? `${state.searchPrefix}_search` : null, - route = state.route || state.url; - - if (searchPrefix) { - defaults = { - params: { - [searchPrefix]: { - value: { - page_size: "20", - order_by: "name" - }, - dynamic: true, - squash: false - } - } - }; - route = !state.squashSearchUrl ? `${route}?{${searchPrefix}:queryset}` : route; - params = state.params === undefined ? defaults.params : _.merge(defaults.params, state.params); - } else { - params = state.params; - } - - definition = { - name: state.name, - url: route, - abstract: state.abstract, - controller: state.controller, - templateUrl: state.templateUrl, - templateProvider: state.templateProvider, - resolve: state.resolve, - params: params, - data: state.data, - ncyBreadcrumb: state.ncyBreadcrumb, - onEnter: state.onEnter, - onExit: state.onExit, - template: state.template, - controllerAs: state.controllerAs, - views: state.views, - parent: state.parent, - redirectTo: state.redirectTo, - // new in uiRouter 1.0 - lazyLoad: state.lazyLoad, - }; - this.addSocket(definition); - return definition; - }, - // registers a state definition with $stateProvider service - addState: function(state) { - let definition = this.buildDefinition(state); - $stateProvider.state(state.name, definition); - } - }; - }; -} diff --git a/awx/ui/client/src/shared/template-url/main.js b/awx/ui/client/src/shared/template-url/main.js deleted file mode 100644 index 8c1c64185e..0000000000 --- a/awx/ui/client/src/shared/template-url/main.js +++ /dev/null @@ -1,6 +0,0 @@ -import templateUrl from './template-url.factory'; - -export default - angular.module('templateUrl', []) - .factory('templateUrl', templateUrl); - diff --git a/awx/ui/client/src/shared/template-url/template-url.factory.js b/awx/ui/client/src/shared/template-url/template-url.factory.js deleted file mode 100644 index bcdd1d5e87..0000000000 --- a/awx/ui/client/src/shared/template-url/template-url.factory.js +++ /dev/null @@ -1,26 +0,0 @@ -// This function is accessible outside of angular -// -export function templateUrl(path) { - return _templateUrl(null, path); -} - -function _templateUrl($sce, path, isTrusted) { - isTrusted = isTrusted !== false; // defaults to true, can be passed in as false - var parts = ['', 'static/partials']; - parts.push(path); - - var url = parts.join('/') + '.partial.html'; - - if (isTrusted && $sce) { - url = $sce.trustAsResourceUrl(url); - } - - return url; -} - -export default - [ '$sce', - function($sce) { - return _.partial(_templateUrl, $sce); - } - ]; diff --git a/awx/ui/client/src/shared/text-label.less b/awx/ui/client/src/shared/text-label.less deleted file mode 100644 index 91ff0f1a65..0000000000 --- a/awx/ui/client/src/shared/text-label.less +++ /dev/null @@ -1,18 +0,0 @@ -/* oops */ - -.include-text-label(@background-color; @color; @content) { - display: inline-block; - content: @content; - - border-radius: 3px; - background-color: @background-color; - color: @color; - text-transform: uppercase; - font-size: .7em; - font-weight: bold; - font-style: normal; - margin-left: 0.5em; - padding: 0.35em; - padding-bottom: 0.2em; - line-height: 1.1; -} diff --git a/awx/ui/client/src/shared/title.directive.js b/awx/ui/client/src/shared/title.directive.js deleted file mode 100644 index 717b0912b7..0000000000 --- a/awx/ui/client/src/shared/title.directive.js +++ /dev/null @@ -1,17 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/* jshint unused: vars */ - -export default function() { - return function(scope, element, attrs) { - if (attrs.awToolTip) { - return; - } - - element.tooltip(); - }; -} diff --git a/awx/ui/client/src/shared/truncated-text.directive.js b/awx/ui/client/src/shared/truncated-text.directive.js deleted file mode 100644 index bf3d1fd8cc..0000000000 --- a/awx/ui/client/src/shared/truncated-text.directive.js +++ /dev/null @@ -1,84 +0,0 @@ -/* jshint unused: vars */ - -function link($compile, scope, element, attrs) { - - // If the element is a DOM comment, that means - // it's been hidden with `ng-if` so don't try - // to process it or we get an error! - if (element[0].nodeType === 8) { - element = element.next(); - - // Element was removed due to `ng-if`, so don't - // worry about it - if (element.length === 0) { - return; - } - } - - - function elementTextWillWrap(element) { - - if (element[0].nodeType === 8) { - return false; - } - - var fullTextWidth = element[0].scrollWidth; - var elementWidth = element.outerWidth(); - - // HACK: For some reason many of my divs - // are ending up with a 1px size diff. - // Guessing this is because of 3 cols - // at 33% flex-basis, with 8px padding. - // Perhaps the padding is pushing it over - // in JavaScript but not visually? Using - // threshold to filter those out. - var threshold = 5; - - if(fullTextWidth > elementWidth && - fullTextWidth - elementWidth > threshold) { - return true; - } - - return false; - } - - function getText() { - return element.text(); - } - - function addTitleIfWrapping(text) { - - if (elementTextWillWrap(element)) { - element - .addClass('u-truncatedText') - .removeAttr('truncated-text') - .attr('title', text); - - $compile(element)(scope); - } - } - - scope.$watch(getText, addTitleIfWrapping); - - // HACK: This handles truncating _after_ other elements - // are added that affect the size of this element. I - // wanted to leave this as a regular event binding, but - // was running into issues with the resized element getting - // removed from the DOM after truncating! No idea why yet. - element.resize(function() { - addTitleIfWrapping(getText()); - }); - - scope.$watch('$destroy', function() { - element.off('resize'); - }); -} - -export default - ['$compile', - function($compile) { - return { - link: _.partial(link, $compile) - }; - } - ]; diff --git a/awx/ui/client/src/shared/upgrade/upgrade.block.less b/awx/ui/client/src/shared/upgrade/upgrade.block.less deleted file mode 100644 index 4d0203fa32..0000000000 --- a/awx/ui/client/src/shared/upgrade/upgrade.block.less +++ /dev/null @@ -1,57 +0,0 @@ -.at-Upgrade--panel { - align-items: center; - background-color: @at-color-body-background-light; - border-radius: 10px; - color: @at-color-body-text; - display: flex; - flex-direction: column; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: @at-font-size-jumbotron-text; - height: ~"calc(100vh - 40px)"; - justify-content: center; - margin: @at-space-4x; - padding: @at-space-10x; -} - - .at-Upgrade--header { - display: flex; - font-size: @at-font-size-jumbotron-heading; - margin-top: @at-space-2x; - } - - .at-Upgrade--text { - align-items: center; - display: flex; - flex-flow: column; - } - - .at-Upgrade--brand { - margin-right: .4em; - } - - .at-Upgrade--icon { - color: @at-gray-b7; - } - - .at-Upgrade--loading:after { - content: "\2026"; - display: inline-block; - overflow: hidden; - position: absolute; - vertical-align: bottom; - width: 0px; - animation: ellipsis steps(4, end) 1500ms infinite; - -webkit-animation: ellipsis steps(4, end) 1500ms infinite; - } - - @keyframes ellipsis { - to { - width: 30px; - } - } - - @-webkit-keyframes ellipsis { - to { - width: 30px; - } - } diff --git a/awx/ui/client/src/shared/utilities/alerts.less b/awx/ui/client/src/shared/utilities/alerts.less deleted file mode 100644 index 1aaed20998..0000000000 --- a/awx/ui/client/src/shared/utilities/alerts.less +++ /dev/null @@ -1,8 +0,0 @@ -.u-input-info-alert { - border-color: #31708f !important; -} - -.u-info-alert { - color: #31708f !important; -} - diff --git a/awx/ui/client/src/shared/utilities/hidden.less b/awx/ui/client/src/shared/utilities/hidden.less deleted file mode 100644 index 36942122d4..0000000000 --- a/awx/ui/client/src/shared/utilities/hidden.less +++ /dev/null @@ -1,4 +0,0 @@ -.u-hiddenVisually { - visibility: hidden; -} - diff --git a/awx/ui/client/src/shared/utilities/icons.less b/awx/ui/client/src/shared/utilities/icons.less deleted file mode 100644 index 654f4f0800..0000000000 --- a/awx/ui/client/src/shared/utilities/icons.less +++ /dev/null @@ -1,14 +0,0 @@ -/* not bem */ - -.icon(@icon-var) { - display: flex; - align-self: center; - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - content: @icon-var; -} diff --git a/awx/ui/client/src/shared/utilities/layer.less b/awx/ui/client/src/shared/utilities/layer.less deleted file mode 100644 index e5af025d5b..0000000000 --- a/awx/ui/client/src/shared/utilities/layer.less +++ /dev/null @@ -1,4 +0,0 @@ -.u-layer { - position: relative; - z-index: 10000; -} diff --git a/awx/ui/client/src/shared/utilities/truncated-text.less b/awx/ui/client/src/shared/utilities/truncated-text.less deleted file mode 100644 index 42be763ab9..0000000000 --- a/awx/ui/client/src/shared/utilities/truncated-text.less +++ /dev/null @@ -1,9 +0,0 @@ -.u-truncatedText { - overflow: hidden; - text-overflow: ellipsis; -} - -.u-wrappedText { - white-space: normal; - word-wrap: break-word; -} diff --git a/awx/ui/client/src/shared/utilities/unbold.less b/awx/ui/client/src/shared/utilities/unbold.less deleted file mode 100644 index 35654737e0..0000000000 --- a/awx/ui/client/src/shared/utilities/unbold.less +++ /dev/null @@ -1,3 +0,0 @@ -.u-unbold { - font-weight: normal; -} diff --git a/awx/ui/client/src/shared/utilities/wordwrap.less b/awx/ui/client/src/shared/utilities/wordwrap.less deleted file mode 100644 index 7ca289d4da..0000000000 --- a/awx/ui/client/src/shared/utilities/wordwrap.less +++ /dev/null @@ -1,10 +0,0 @@ -.u-wordwrap { - white-space: -moz-pre-wrap !important; - white-space: -webkit-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - white-space: pre-wrap; - word-wrap: break-word; - word-break: break-all; - white-space: normal; -} \ No newline at end of file diff --git a/awx/ui/client/src/shared/variables/main.js b/awx/ui/client/src/shared/variables/main.js deleted file mode 100644 index 29942a7ff9..0000000000 --- a/awx/ui/client/src/shared/variables/main.js +++ /dev/null @@ -1,9 +0,0 @@ -import ParseVariableString from './parse-variable-string.factory'; -import SortVariables from './sort-variables.factory'; -import ToJSON from './to-json.factory'; - -export default - angular.module('variables', []) - .factory('ParseVariableString', ParseVariableString) - .factory('SortVariables', SortVariables) - .factory('ToJSON', ToJSON); diff --git a/awx/ui/client/src/shared/variables/parse-variable-string.factory.js b/awx/ui/client/src/shared/variables/parse-variable-string.factory.js deleted file mode 100644 index 71e145897f..0000000000 --- a/awx/ui/client/src/shared/variables/parse-variable-string.factory.js +++ /dev/null @@ -1,55 +0,0 @@ -export default - function ParseVariableString($log, ProcessErrors, SortVariables) { - return function (variables) { - var result = "---", json_obj; - if (typeof variables === 'string') { - if (variables === "{}" || variables === "null" || variables === "" || variables === "\"\"") { - // String is empty, return --- - } else { - try { - json_obj = JSON.parse(variables); - json_obj = SortVariables(json_obj); - result = jsyaml.safeDump(json_obj); - - } - catch (e) { - $log.debug('Attempt to parse extra_vars as JSON failed. Check that the variables parse as yaml. Set the raw string as the result.'); - try { - // do safeLoad, which well error if not valid yaml - json_obj = jsyaml.safeLoad(variables); - // but just send the variables - result = variables; - } - catch(e2) { - ProcessErrors(null, variables, e2.message, null, { hdr: 'Error!', - msg: 'Attempts to parse variables as JSON and YAML failed. Last attempt returned: ' + e2.message }); - } - } - } - } - else { - if ($.isEmptyObject(variables) || variables === null) { - // Empty object, return --- - } - else { - // convert object to yaml - try { - json_obj = SortVariables(variables); - result = jsyaml.safeDump(json_obj); - // result = variables; - } - catch(e3) { - ProcessErrors(null, variables, e3.message, null, { hdr: 'Error!', - msg: 'Attempt to convert JSON object to YAML document failed: ' + e3.message }); - } - } - } - return result; - }; - } - -ParseVariableString.$inject = - [ '$log', - 'ProcessErrors', - 'SortVariables' - ]; diff --git a/awx/ui/client/src/shared/variables/sort-variables.factory.js b/awx/ui/client/src/shared/variables/sort-variables.factory.js deleted file mode 100644 index a9cb3a363b..0000000000 --- a/awx/ui/client/src/shared/variables/sort-variables.factory.js +++ /dev/null @@ -1,23 +0,0 @@ -export default - function SortVariables() { - return function(variableObj) { - var newObj; - function sortIt(objToSort) { - var i, - keys = Object.keys(objToSort), - newObj = {}; - keys = keys.sort(); - for (i=0; i < keys.length; i++) { - if (typeof objToSort[keys[i]] === 'object' && objToSort[keys[i]] !== null && !Array.isArray(objToSort[keys[i]])) { - newObj[keys[i]] = sortIt(objToSort[keys[i]]); - } - else { - newObj[keys[i]] = objToSort[keys[i]]; - } - } - return newObj; - } - newObj = sortIt(variableObj); - return newObj; - }; - } diff --git a/awx/ui/client/src/shared/variables/to-json.factory.js b/awx/ui/client/src/shared/variables/to-json.factory.js deleted file mode 100644 index 70996d489e..0000000000 --- a/awx/ui/client/src/shared/variables/to-json.factory.js +++ /dev/null @@ -1,80 +0,0 @@ -export default - function ToJSON($log, ProcessErrors) { - return function(parseType, variables, stringify, reviver) { - var json_data, - result, - tmp; - // bracketVar, - // key, - // lines, i, newVars = []; - if (parseType === 'json') { - try { - // perform a check to see if the user cleared the field completly - if(variables.trim() === "" || variables.trim() === "{" || variables.trim() === "}" ){ - variables = "{}"; - } - //parse a JSON string - if (reviver) { - json_data = JSON.parse(variables, reviver); - } - else { - json_data = JSON.parse(variables); - } - } - catch(e) { - json_data = {}; - $log.error('Failed to parse JSON string. Parser returned: ' + e.message); - ProcessErrors(null, variables, e.message, null, { hdr: 'Error!', - msg: 'Failed to parse JSON string. Parser returned: ' + e.message }); - throw 'Parse error. Failed to parse variables.'; - } - } else { - try { - if(variables.trim() === "" || variables.trim() === "-" || variables.trim() === "--"){ - variables = '---'; - } - json_data = jsyaml.safeLoad(variables); - if(json_data!==null){ - // unparsing just to make sure no weird characters are included. - tmp = jsyaml.dump(json_data); - if(tmp.indexOf('[object Object]')!==-1){ - throw "Failed to parse YAML string. Parser returned' + key + ' : ' +value + '.' "; - } - } - } - catch(e) { - json_data = undefined; // {}; - // $log.error('Failed to parse YAML string. Parser returned undefined'); - ProcessErrors(null, variables, e.message, null, { hdr: 'Error!', - msg: 'Failed to parse YAML string. Parser returned undefined'}); - } - } - // Make sure our JSON is actually an object - if (typeof json_data !== 'object') { - ProcessErrors(null, variables, null, null, { hdr: 'Error!', - msg: 'Failed to parse variables. Attempted to parse ' + parseType + '. Parser did not return an object.' }); - // setTimeout( function() { - throw 'Parse error. Failed to parse variables.'; - // }, 1000); - } - result = json_data; - if (stringify) { - if(json_data === undefined){ - result = undefined; - } - else if ($.isEmptyObject(json_data)) { - result = ""; - } else { - // utilize the parsing to get here - // but send the raw variable string - result = variables; - } - } - return result; - }; - } - -ToJSON.$inject = - [ '$log', - 'ProcessErrors' - ]; diff --git a/awx/ui/client/src/smart-status/main.js b/awx/ui/client/src/smart-status/main.js deleted file mode 100644 index dfa2b35f0f..0000000000 --- a/awx/ui/client/src/smart-status/main.js +++ /dev/null @@ -1,10 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import smartStatusDirective from './smart-status.directive'; -export default - angular.module('systemStatus', []) - .directive('awSmartStatus', smartStatusDirective); diff --git a/awx/ui/client/src/smart-status/smart-status.block.less b/awx/ui/client/src/smart-status/smart-status.block.less deleted file mode 100644 index 7e90874166..0000000000 --- a/awx/ui/client/src/smart-status/smart-status.block.less +++ /dev/null @@ -1,106 +0,0 @@ -/** @define SmartStatus */ - -.SmartStatus-container{ - display:flex; -} - -.SmartStatus-iconContainer{ - padding: 2px; - flex: 0 1 auto; -} - -.SmartStatus-icon { - width: 14px; - height: 14px; -} - -.SmartStatus-iconDirectionPlaceholder { - width: 14px; - height: 7px; - border: 1px solid @d7grey; - background: #f2f2f2; -} - -.SmartStatus-iconDirectionPlaceholder--bottom { - border-bottom: 0; -} - -.SmartStatus-iconDirectionPlaceholder--top { - border-top: 0; -} - -.SmartStatus-iconIndicator { - width: 14px; - height: 7px; -} - -.SmartStatus-iconIndicator--success { - background: #5cb85c; -} - -.SmartStatus-iconIndicator--failed { - background: #d9534f; -} - -.SmartStatus-iconPlaceholder { - height: 14px; - width: 14px; - border: 1px solid @d7grey; - background: #f2f2f2; -} - -.SmartStatus-tooltip--successful, -.SmartStatus-tooltip--success{ - color: @default-succ; - padding-right: 0px; - text-shadow: - -1px -1px 0 @default-bg, - 1px -1px 0 @default-bg, - -1px 1px 0 @default-bg, - 1px 1px 0 @default-bg; - -} - -.SmartStatus-tooltip--error, .SmartStatus-tooltip--failed{ - color: @default-err; - padding-right: 0px; - text-shadow: - -1px -1px 0 @default-bg, - 1px -1px 0 @default-bg, - -1px 1px 0 @default-bg, - 1px 1px 0 @default-bg; -} - -.SmartStatus-tooltip--running{ - color: @default-data-txt; - padding-right: 0px; - text-shadow: - -1px -1px 0 @default-bg, - 1px -1px 0 @default-bg, - -1px 1px 0 @default-bg, - 1px 1px 0 @default-bg; - .pulsate(); -} - -.SmartStatus-waiting { - width: 14px; - height: 14px; - border: 1px solid @d7grey; -} - -@keyframes pulse_animation { - 0% { transform: scale(1); } - 50% { transform: scale(0); } - 100% { transform: scale(1); } -} - -.SmartStatus-running { - height: 14px; - width: 14px; - background-color: @default-succ; - animation-name: pulse_animation; - animation-duration: 5000ms; - transform-origin:70% 70%; - animation-iteration-count: infinite; - animation-timing-function: linear; -} diff --git a/awx/ui/client/src/smart-status/smart-status.controller.js b/awx/ui/client/src/smart-status/smart-status.controller.js deleted file mode 100644 index 1e07342d58..0000000000 --- a/awx/ui/client/src/smart-status/smart-status.controller.js +++ /dev/null @@ -1,112 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$filter', 'i18n', 'JobsStrings', - function ($scope, $filter, i18n, JobsStrings) { - - const strings = JobsStrings; - - function isFailureState(status) { - return status === 'failed' || status === 'error' || status === 'canceled'; - } - - function getTranslatedStatusString(status) { - switch (status) { - case 'new': - return strings.get('list.NEW'); - case 'pending': - return strings.get('list.PENDING'); - case 'waiting': - return strings.get('list.WAITING'); - case 'running': - return strings.get('list.RUNNING'); - case 'successful': - return strings.get('list.SUCCESSFUL'); - case 'failed': - return strings.get('list.FAILED'); - case 'error': - return strings.get('list.ERROR'); - case 'canceled': - return strings.get('list.CANCELED'); - default: - return status; - } - } - - function init(){ - var singleJobStatus = true; - var firstJobStatus; - var recentJobs = $scope.jobs; - var detailsBaseUrl; - - if(!recentJobs){ - return; - } - - var sparkData = - _.sortBy(recentJobs.map(function(job) { - const finished = $filter('longDate')(job.finished) || job.status+""; - - // We now get the job type of recent jobs associated with a JT - if (job.type === 'workflow_job') { - detailsBaseUrl = '/#/workflows/'; - } else if (job.type === 'job') { - detailsBaseUrl = '/#/jobs/playbook/'; - } - - const data = { - status: job.status, - jobId: job.id, - sortDate: job.finished || "running" + job.id, - finished: finished, - status_tip: `${i18n._('JOB ID')}: ${job.id}
${i18n._('STATUS')}: ${getTranslatedStatusString(job.status).toUpperCase()}
${i18n._('FINISHED')}: ${finished}`, - detailsUrl: detailsBaseUrl + job.id - }; - - // If we've already determined that there are both failed and successful jobs OR if the current job in the loop is - // pending/waiting/running then we don't worry about checking for a single job status - if(singleJobStatus && (isFailureState(job.status) || job.status === "successful")) { - if(firstJobStatus) { - // We've already been through at least once and have a first job status - if(!(isFailureState(firstJobStatus) && isFailureState(job.status) || firstJobStatus === job.status)) { - // We have a different status in the array - singleJobStatus = false; - } - } - else { - // We haven't set a first job status yet so go ahead set it - firstJobStatus = job.status; - } - } - - return data; - }), "sortDate").reverse(); - - $scope.singleJobStatus = singleJobStatus; - - $scope.sparkArray = sparkData; - $scope.placeholders = new Array(10 - sparkData.length); - } - $scope.$watch('jobs', function(){ - init(); - }, true); - -}]; - -// -// -// JOB_STATUS_CHOICES = [ -// ('new', _('New')), # Job has been created, but not started. -// ('pending', _('Pending')), # Job has been queued, but is not yet running. -// ('waiting', _('Waiting')), # Job is waiting on an update/dependency. -// ('running', _('Running')), # Job is currently running. -// ('successful', _('Successful')), # Job completed successfully. -// ('failed', _('Failed')), # Job completed, but with failures. -// ('error', _('Error')), # The job was unable to run. -// ('canceled', _('Canceled')), # The job was canceled before completion. -// final states only***** -// ] -// diff --git a/awx/ui/client/src/smart-status/smart-status.directive.js b/awx/ui/client/src/smart-status/smart-status.directive.js deleted file mode 100644 index a4486e125e..0000000000 --- a/awx/ui/client/src/smart-status/smart-status.directive.js +++ /dev/null @@ -1,19 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import smartStatusController from './smart-status.controller'; -export default [ 'templateUrl', - function(templateUrl) { - return { - scope: { - jobs: '=', - templateType: '=?', - }, - templateUrl: templateUrl('smart-status/smart-status'), - restrict: 'E', - controller: smartStatusController - }; -}]; diff --git a/awx/ui/client/src/smart-status/smart-status.partial.html b/awx/ui/client/src/smart-status/smart-status.partial.html deleted file mode 100644 index c7f2108cf7..0000000000 --- a/awx/ui/client/src/smart-status/smart-status.partial.html +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/awx/ui/client/src/standard-out/standard-out-factories/delete-job.factory.js b/awx/ui/client/src/standard-out/standard-out-factories/delete-job.factory.js deleted file mode 100644 index 6e28362f3a..0000000000 --- a/awx/ui/client/src/standard-out/standard-out-factories/delete-job.factory.js +++ /dev/null @@ -1,145 +0,0 @@ -export default -function DeleteJob($state, Find, Rest, Wait, ProcessErrors, Prompt, Alert, - $filter, i18n) { - return function(params) { - var scope = params.scope, - id = params.id, - job = params.job, - callback = params.callback, - action, jobs, url, action_label, hdr; - - if (!job) { - if (scope.completed_jobs) { - jobs = scope.completed_jobs; - } - else if (scope.running_jobs) { - jobs = scope.running_jobs; - } - else if (scope.queued_jobs) { - jobs = scope.queued_jobs; - } - else if (scope.all_jobs) { - jobs = scope.all_jobs; - } - else if (scope.jobs) { - jobs = scope.jobs; - } - job = Find({list: jobs, key: 'id', val: id }); - } - - if (job.status === 'pending' || job.status === 'running' || job.status === 'waiting') { - url = job.related.cancel; - action_label = 'cancel'; - hdr = i18n._('Cancel'); - } else { - url = job.url; - action_label = 'delete'; - hdr = i18n._('Delete'); - } - - action = function () { - Wait('start'); - Rest.setUrl(url); - if (action_label === 'cancel') { - Rest.post() - .then(() => { - $('#prompt-modal').modal('hide'); - if (callback) { - scope.$emit(callback, action_label); - } - else { - $state.reload(); - Wait('stop'); - } - }) - .catch(({obj, status}) => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - if (status === 403) { - Alert('Error', obj.detail); - } - // Ignore the error. The job most likely already finished. - // ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + - // ' failed. POST returned status: ' + status }); - }); - } else { - Rest.destroy() - .then(() => { - $('#prompt-modal').modal('hide'); - if (callback) { - scope.$emit(callback, action_label); - } - else { - let reloadListStateParams = null; - - if(scope.jobs.length === 1 && $state.params.job_search && !_.isEmpty($state.params.job_search.page) && $state.params.job_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.job_search.page = (parseInt(reloadListStateParams.job_search.page)-1).toString(); - } - - $state.go('.', reloadListStateParams, {reload: true}); - Wait('stop'); - } - }) - .catch(({obj, status}) => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - if (status === 403) { - Alert('Error', obj.detail); - } - // Ignore the error. The job most likely already finished. - //ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + - // ' failed. DELETE returned status: ' + status }); - }); - } - }; - - if (scope.removeCancelNotAllowed) { - scope.removeCancelNotAllowed(); - } - scope.removeCancelNotAllowed = scope.$on('CancelNotAllowed', function() { - Wait('stop'); - Alert('Job Completed', 'The request to cancel the job could not be submitted. The job already completed.', 'alert-info'); - }); - - if (scope.removeCancelJob) { - scope.removeCancelJob(); - } - scope.removeCancelJob = scope.$on('CancelJob', function() { - var cancelBody = "
" + i18n._("Are you sure you want to submit the request to cancel this job?") + "
"; - var deleteBody = "
" + i18n._("Are you sure you want to delete this job?") + "
"; - Prompt({ - hdr: hdr, - resourceName: `#${job.id} ` + $filter('sanitize')(job.name), - body: (action_label === 'cancel' || job.status === 'new') ? cancelBody : deleteBody, - action: action, - actionText: (action_label === 'cancel' || job.status === 'new') ? i18n._("OK") : i18n._("DELETE") - }); - }); - - if (action_label === 'cancel') { - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - if (data.can_cancel) { - scope.$emit('CancelJob'); - } - else { - scope.$emit('CancelNotAllowed'); - } - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + - ' failed. GET returned: ' + status }); - }); - } - else { - scope.$emit('CancelJob'); - } - }; -} - -DeleteJob.$inject = -[ '$state', 'Find', 'Rest', 'Wait', - 'ProcessErrors', 'Prompt', 'Alert', '$filter', 'i18n' -]; diff --git a/awx/ui/client/src/standard-out/standard-out-factories/main.js b/awx/ui/client/src/standard-out/standard-out-factories/main.js deleted file mode 100644 index 935c8dca37..0000000000 --- a/awx/ui/client/src/standard-out/standard-out-factories/main.js +++ /dev/null @@ -1,13 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import lookUpName from './lookup-name.factory'; -import DeleteJob from './delete-job.factory'; - -export default - angular.module('StandardOutHelper', []) - .factory('LookUpName', lookUpName) - .factory('DeleteJob', DeleteJob); diff --git a/awx/ui/client/src/teams/add/teams-add.controller.js b/awx/ui/client/src/teams/add/teams-add.controller.js deleted file mode 100644 index e33c918a63..0000000000 --- a/awx/ui/client/src/teams/add/teams-add.controller.js +++ /dev/null @@ -1,66 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$rootScope', 'TeamForm', 'GenerateForm', 'Rest', - 'Alert', 'ProcessErrors', 'GetBasePath', 'Wait', '$state', - function($scope, $rootScope, TeamForm, GenerateForm, Rest, Alert, - ProcessErrors, GetBasePath, Wait, $state) { - - Rest.setUrl(GetBasePath('teams')); - Rest.options() - .then(({data}) => { - if (!data.actions.POST) { - $state.go("^"); - Alert('Permission Error', 'You do not have permission to add a team.', 'alert-info'); - } - }); - - // Inject dynamic view - var defaultUrl = GetBasePath('teams'), - form = TeamForm; - - init(); - - function init() { - $scope.canEditOrg = true; - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - $rootScope.flashMessage = null; - } - - // Save - $scope.formSave = function() { - var fld, data; - GenerateForm.clearApiErrors($scope); - Wait('start'); - Rest.setUrl(defaultUrl); - data = {}; - for (fld in form.fields) { - data[fld] = $scope[fld]; - } - Rest.post(data) - .then(({data}) => { - Wait('stop'); - $rootScope.flashMessage = "New team successfully created!"; - $rootScope.$broadcast("EditIndicatorChange", "users", data.id); - $state.go('teams.edit', { team_id: data.id }, { reload: true }); - }) - .catch(({data, status}) => { - Wait('stop'); - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to add new team. Post returned status: ' + - status - }); - }); - }; - - $scope.formCancel = function() { - $state.go('teams'); - }; - } -]; diff --git a/awx/ui/client/src/teams/edit/teams-edit.controller.js b/awx/ui/client/src/teams/edit/teams-edit.controller.js deleted file mode 100644 index db6eab8bee..0000000000 --- a/awx/ui/client/src/teams/edit/teams-edit.controller.js +++ /dev/null @@ -1,101 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', '$rootScope', '$stateParams', 'TeamForm', 'Rest', - 'ProcessErrors', 'GetBasePath', 'Wait', '$state', 'OrgAdminLookup', 'resolvedModels', 'resourceData', - function($scope, $rootScope, $stateParams, TeamForm, Rest, ProcessErrors, - GetBasePath, Wait, $state, OrgAdminLookup, models, Dataset) { - - const { me } = models; - const { data } = Dataset; - const id = $stateParams.team_id; - const defaultUrl = GetBasePath('teams') + id; - let form = TeamForm; - - init(); - - function init() { - $scope.canEdit = me.get('summary_fields.user_capabilities.edit'); - $scope.isOrgAdmin = me.get('related.admin_of_organizations.count') > 0; - $scope.team_id = id; - _.forEach(form.fields, (value, key) => { - $scope[key] = data[key]; - }); - $scope.organization_name = data.summary_fields.organization.name; - - OrgAdminLookup.checkForAdminAccess({organization: data.organization}) - .then(function(canEditOrg){ - $scope.canEditOrg = canEditOrg; - }); - - $scope.team_obj = data; - - $scope.$watch('team_obj.summary_fields.user_capabilities.edit', function(val) { - $scope.canAdd = (val === false) ? false : true; - }); - } - - // prepares a data payload for a PUT request to the API - function processNewData(fields) { - var data = {}; - _.forEach(fields, function(value, key) { - if ($scope[key] !== '' && $scope[key] !== null && $scope[key] !== undefined) { - data[key] = $scope[key]; - } - }); - return data; - } - - $scope.formCancel = function() { - $state.go('teams', null, { reload: true }); - }; - - $scope.formSave = function() { - $rootScope.flashMessage = null; - if ($scope[form.name + '_form'].$valid) { - var data = processNewData(form.fields); - Rest.setUrl(defaultUrl); - Rest.put(data).then(() => { - $state.go($state.current, null, { reload: true }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Failed to retrieve user: ' + - $stateParams.id + '. GET status: ' + status - }); - }); - } - }; - - init(); - - $scope.redirectToResource = function(resource) { - let type = resource.summary_fields.resource_type.replace(/ /g , "_"); - var id = resource.related[type].split("/")[4]; - switch (type) { - case 'organization': - $state.go('organizations.edit', { "organization_id": id }, { reload: true }); - break; - case 'credential': - $state.go('credentials.edit', { "credential_id": id }, { reload: true }); - break; - case 'project': - $state.go('projects.edit', { "project_id": id }, { reload: true }); - break; - case 'inventory': - $state.go('inventories.edit', { "inventory_id": id }, { reload: true }); - break; - case 'job_template': - $state.go('templates.editJobTemplate', { "job_template_id": id }, { reload: true }); - break; - case 'workflow_job_template': - $state.go('templates.editWorkflowJobTemplate', { "workflow_job_template_id": id }, { reload: true }); - break; - } - }; - } -]; diff --git a/awx/ui/client/src/teams/list/teams-list.controller.js b/awx/ui/client/src/teams/list/teams-list.controller.js deleted file mode 100644 index 25826495a2..0000000000 --- a/awx/ui/client/src/teams/list/teams-list.controller.js +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', 'Rest', 'TeamList', 'Prompt', - 'ProcessErrors', 'GetBasePath', 'Wait', '$state', '$filter', - 'rbacUiControlService', 'Dataset', 'resolvedModels', 'i18n', - function($scope, Rest, TeamList, Prompt, ProcessErrors, - GetBasePath, Wait, $state, $filter, rbacUiControlService, Dataset, models, i18n) { - - const { me } = models; - var list = TeamList, - defaultUrl = GetBasePath('teams'); - - init(); - - function init() { - $scope.canEdit = me.get('summary_fields.user_capabilities.edit'); - $scope.canAdd = false; - - rbacUiControlService.canAdd('teams') - .then(function(params) { - $scope.canAdd = params.canAdd; - }); - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - $scope.selected = []; - } - - $scope.addTeam = function() { - $state.go('teams.add'); - }; - - $scope.editTeam = function(id) { - $state.go('teams.edit', { team_id: id }); - }; - - $scope.deleteTeam = function(id, name) { - - var action = function() { - Wait('start'); - var url = defaultUrl + id + '/'; - Rest.setUrl(url); - Rest.destroy() - .then(() => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - - let reloadListStateParams = null; - - if($scope.teams.length === 1 && $state.params.team_search && _.has($state, 'params.team_search.page') && $state.params.team_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.team_search.page = (parseInt(reloadListStateParams.team_search.page)-1).toString(); - } - - if (parseInt($state.params.team_id) === id) { - $state.go('^', reloadListStateParams, { reload: true }); - } else { - $state.go('.', reloadListStateParams, { reload: true }); - } - }) - .catch(({data, status}) => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - Prompt({ - hdr: i18n._('Delete'), - resourceName: $filter('sanitize')(name), - body: '
' + i18n._('Are you sure you want to delete this team?') + '
', - action: action, - actionText: i18n._('DELETE') - }); - }; - } -]; diff --git a/awx/ui/client/src/teams/main.js b/awx/ui/client/src/teams/main.js deleted file mode 100644 index 7140e9aaf9..0000000000 --- a/awx/ui/client/src/teams/main.js +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import TeamsList from './list/teams-list.controller'; -import TeamsAdd from './add/teams-add.controller'; -import TeamsEdit from './edit/teams-edit.controller'; -import TeamList from './teams.list'; -import TeamForm from './teams.form'; -import { N_ } from '../i18n'; - -export default -angular.module('Teams', []) - .controller('TeamsList', TeamsList) - .controller('TeamsAdd', TeamsAdd) - .controller('TeamsEdit', TeamsEdit) - .factory('TeamList', TeamList) - .factory('TeamForm', TeamForm) - .config(['$stateProvider', 'stateDefinitionsProvider', - function($stateProvider, stateDefinitionsProvider) { - let stateDefinitions = stateDefinitionsProvider.$get(); - - // lazily generate a tree of substates which will replace this node in ui-router's stateRegistry - // see: stateDefinition.factory for usage documentation - $stateProvider.state({ - name: 'teams.**', - url: '/teams', - lazyLoad: () => stateDefinitions.generateTree({ - parent: 'teams', - modes: ['add', 'edit'], - list: 'TeamList', - form: 'TeamForm', - controllers: { - list: TeamsList, - add: TeamsAdd, - edit: TeamsEdit - }, - data: { - activityStream: true, - activityStreamTarget: 'team' - }, - resolve: { - edit: { - resolvedModels: ['MeModel', '$q', function(Me, $q) { - const promises = { - me: new Me('get').then((me) => me.extend('get', 'admin_of_organizations')) - }; - - return $q.all(promises); - }] - }, - list: { - resolvedModels: ['MeModel', '$q', function(Me, $q) { - const promises = { - me: new Me('get') - }; - - return $q.all(promises); - }] - } - }, - ncyBreadcrumb: { - label: N_('TEAMS') - } - }) - }); - } - ]); diff --git a/awx/ui/client/src/teams/teams.form.js b/awx/ui/client/src/teams/teams.form.js deleted file mode 100644 index c3d32a062d..0000000000 --- a/awx/ui/client/src/teams/teams.form.js +++ /dev/null @@ -1,178 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Teams - * @description This form is for adding/editing teams -*/ - -export default ['i18n', function(i18n) { - return { - - addTitle: i18n._('NEW TEAM'), //Legend in add mode - editTitle: '{{ name }}', //Legend in edit mode - name: 'team', - // the top-most node of generated state tree - stateTree: 'teams', - tabs: true, - messageBar: { - ngShow: 'isOrgAdmin && !canEdit', - message: i18n._("Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams.") - }, - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(team_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - capitalize: false - }, - description: { - label: i18n._('Description'), - type: 'text', - ngDisabled: '!(team_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - list: 'OrganizationList', - sourceModel: 'organization', - basePath: 'organizations', - sourceField: 'name', - ngDisabled: '!(team_obj.summary_fields.user_capabilities.edit || canAdd) || !canEditOrg', - awLookupWhen: '(team_obj.summary_fields.user_capabilities.edit || canAdd) && canEditOrg', - required: true, - } - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(team_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(team_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(team_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - related: { - users: { - name: 'users', - dataPlacement: 'top', - awToolTip: i18n._('Please save before adding users.'), - basePath: 'api/v2/teams/{{$stateParams.team_id}}/access_list/', - search: { - order_by: 'username' - }, - type: 'collection', - title: i18n._('Users'), - iterator: 'user', - index: false, - open: false, - actions: { - add: { - ngClick: "$state.go('.add')", - label: i18n._('Add'), - awToolTip: i18n._('Add User'), - actionClass: 'at-Button--add', - actionId: 'button-add--user', - ngShow: '(team_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - fields: { - username: { - key: true, - label: i18n._('User'), - linkBase: 'users', - columnClass: 'col-sm-3' - }, - first_name: { - label: i18n._('First Name'), - columnClass: 'col-sm-3' - }, - last_name: { - label: i18n._('Last Name'), - columnClass: 'col-sm-3' - }, - role: { - label: i18n._('Role'), - type: 'role', - nosort: true, - columnClass: 'col-sm-3' - } - } - }, - permissions: { - name: 'permissions', - basePath: 'api/v2/teams/{{$stateParams.team_id}}/roles/', - search: { - page_size: '10', - // @todo ask about name field / serializer on this endpoint - order_by: 'id' - }, - awToolTip: i18n._('Please save before assigning permissions.'), - dataPlacement: 'top', - hideSearchAndActions: true, - type: 'collection', - title: i18n._('Permissions'), - iterator: 'permission', - open: false, - index: false, - emptyListText: i18n._('No permissions have been granted'), - fields: { - name: { - label: i18n._('Name'), - ngBind: 'permission.summary_fields.resource_name', - ngClick: "redirectToResource(permission)", - nosort: true, - columnClass: 'col-sm-4' - }, - type: { - label: i18n._('Type'), - ngBind: 'permission.summary_fields.resource_type_display_name', - nosort: true, - columnClass: 'col-sm-3' - }, - role: { - label: i18n._('Role'), - ngBind: 'permission.name', - nosort: true, - columnClass: 'col-sm-3' - } - }, - fieldActions: { - columnClass: 'col-sm-2', - "delete": { - label: i18n._('Remove'), - ngClick: 'deletePermissionFromTeam(team_id, team_obj.name, permission.name, permission.summary_fields.resource_name, permission.related.teams)', - 'class': "List-actionButton--delete", - iconClass: 'fa fa-times', - awToolTip: i18n._('Dissassociate permission from team'), - dataPlacement: 'top', - ngShow: 'permission.summary_fields.user_capabilities.unattach' - } - }, - actions: { - add: { - ngClick: "$state.go('.add')", - label: i18n._('Add'), - awToolTip: i18n._('Grant Permission'), - actionClass: 'at-Button--add', - actionId: 'button-add--permission', - ngShow: '(team_obj.summary_fields.user_capabilities.edit || canEditOrg)' - } - } - } - }, - };}]; diff --git a/awx/ui/client/src/teams/teams.list.js b/awx/ui/client/src/teams/teams.list.js deleted file mode 100644 index 11d0d9e749..0000000000 --- a/awx/ui/client/src/teams/teams.list.js +++ /dev/null @@ -1,81 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default ['i18n', function(i18n) { - return { - - name: 'teams', - iterator: 'team', - selectTitle: i18n._('Add Team'), - editTitle: i18n._('TEAMS'), - listTitle: i18n._('TEAMS'), - selectInstructions: i18n.sprintf(i18n._("Click on a row to select it, and click Finished when done. Click the %s button to create a new team."), " "), - index: false, - hover: true, - - fields: { - name: { - key: true, - label: i18n._('Name'), - columnClass: 'col-md-4 col-sm-9 col-xs-9', - modalColumnClass: 'col-md-8', - awToolTip: '{{team.description | sanitize}}', - dataPlacement: 'top' - }, - organization: { - label: i18n._('Organization'), - ngBind: 'team.summary_fields.organization.name', - sourceModel: 'organization', - sourceField: 'name', - columnClass: 'd-none d-md-flex col-md-4', - excludeModal: true - } - }, - - actions: { - add: { - mode: 'all', // One of: edit, select, all - ngClick: 'addTeam()', - awToolTip: i18n._('Create a new team'), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd && canEdit' - } - }, - - fieldActions: { - - columnClass: 'col-md-4 col-sm-3 col-xs-3', - - edit: { - label: i18n._('Edit'), - ngClick: "editTeam(team.id)", - icon: 'icon-edit', - "class": 'btn-xs btn-default', - awToolTip: i18n._('Edit team'), - dataPlacement: 'top', - ngShow: 'team.summary_fields.user_capabilities.edit' - }, - view: { - label: i18n._('View'), - ngClick: "editTeam(team.id)", - "class": 'btn-xs btn-default', - awToolTip: i18n._('View team'), - dataPlacement: 'top', - ngShow: '!team.summary_fields.user_capabilities.edit' - }, - "delete": { - label: i18n._('Delete'), - ngClick: "deleteTeam(team.id, team.name)", - icon: 'icon-trash', - "class": 'btn-xs btn-danger', - awToolTip: i18n._('Delete team'), - dataPlacement: 'top', - ngShow: 'team.summary_fields.user_capabilities.delete' - } - } - };}]; diff --git a/awx/ui/client/src/templates/inventory-sources.list.js b/awx/ui/client/src/templates/inventory-sources.list.js deleted file mode 100644 index 712a81835f..0000000000 --- a/awx/ui/client/src/templates/inventory-sources.list.js +++ /dev/null @@ -1,31 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default { - name: 'workflow_inventory_sources', - iterator: 'inventory_source', - basePath: 'inventory_sources', - listTitle: 'INVENTORY SOURCES', - index: false, - hover: true, - searchBarFullWidth: true, - - fields: { - name: { - label: 'Name', - columnClass: 'col-md-11', - simpleTip: { - awToolTip: "Inventory: {{inventory_source.summary_fields.inventory.name}}", - dataPlacement: "top" - } - } - }, - - actions: {}, - - fieldActions: {} -}; diff --git a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js deleted file mode 100644 index 0665db8529..0000000000 --- a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js +++ /dev/null @@ -1,705 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - export default - [ '$filter', '$scope', - '$stateParams', 'JobTemplateForm', 'GenerateForm', 'Rest', 'Alert', - 'ProcessErrors', 'GetBasePath', 'hashSetup', 'ParseTypeChange', 'Wait', - 'Empty', 'ToJSON', 'CallbackHelpInit', 'GetChoices', '$state', 'availableLabels', - 'CreateSelect2', '$q', 'i18n', 'Inventory', 'Project', 'InstanceGroupsService', - 'MultiCredentialService', 'ConfigData', 'resolvedModels', '$compile', - function( - $filter, $scope, - $stateParams, JobTemplateForm, GenerateForm, Rest, Alert, - ProcessErrors, GetBasePath, hashSetup, ParseTypeChange, Wait, - Empty, ToJSON, CallbackHelpInit, GetChoices, - $state, availableLabels, CreateSelect2, $q, i18n, Inventory, Project, InstanceGroupsService, - MultiCredentialService, ConfigData, resolvedModels, $compile - ) { - - // Inject dynamic view - let defaultUrl = GetBasePath('job_templates'), - form = JobTemplateForm(), - generator = GenerateForm, - main = {}, - selectPlaybook, checkSCMStatus, - callback; - - const jobTemplate = resolvedModels[0]; - - $scope.canAddJobTemplate = jobTemplate.options('actions.POST'); - $scope.disableLaunch = true; - - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - $scope.can_edit = true; - $scope.allow_callbacks = false; - $scope.playbook_options = []; - $scope.webhook_service_options = []; - $scope.mode = "add"; - $scope.parseType = 'yaml'; - $scope.credentialNotPresent = false; - $scope.canGetAllRelatedResources = true; - $scope.webhook_key_help = i18n._('Webhook services can use this as a shared secret.'); - - // - // webhook credential - all handlers, dynamic state, etc. live here - // - - $scope.webhookCredential = { - id: null, - name: null, - isModalOpen: false, - isModalReady: false, - modalTitle: i18n._('Select Webhook Credential'), - modalBaseParams: { - order_by: 'name', - page_size: 5, - credential_type__namespace: null, - }, - modalSelectedId: null, - modalSelectedName: null, - }; - - $scope.handleWebhookCredentialLookupClick = () => { - $scope.webhookCredential.modalSelectedId = $scope.webhookCredential.id; - $scope.webhookCredential.isModalOpen = true; - }; - - $scope.handleWebhookCredentialTagDelete = () => { - $scope.webhookCredential.id = null; - $scope.webhookCredential.name = null; - }; - - $scope.handleWebhookCredentialModalClose = () => { - $scope.webhookCredential.isModalOpen = false; - $scope.webhookCredential.isModalReady = false; - }; - - $scope.handleWebhookCredentialModalReady = () => { - $scope.webhookCredential.isModalReady = true; - }; - - $scope.handleWebhookCredentialModalItemSelect = (item) => { - $scope.webhookCredential.modalSelectedId = item.id; - $scope.webhookCredential.modalSelectedName = item.name; - }; - - $scope.handleWebhookCredentialModalCancel = () => { - $scope.webhookCredential.isModalOpen = false; - $scope.webhookCredential.isModalReady = false; - $scope.webhookCredential.modalSelectedId = null; - $scope.webhookCredential.modalSelectedName = null; - - }; - - $scope.handleWebhookCredentialSelect = () => { - $scope.webhookCredential.isModalOpen = false; - $scope.webhookCredential.isModalReady = false; - $scope.webhookCredential.id = $scope.webhookCredential.modalSelectedId; - $scope.webhookCredential.name = $scope.webhookCredential.modalSelectedName; - $scope.webhookCredential.modalSelectedId = null; - $scope.webhookCredential.modalSelectedName = null; - }; - - $scope.handleWebhookKeyButtonClick = () => {}; - - $('#content-container').append($compile(` - - - - - ${i18n._('CANCEL')} - - - ${i18n._('SELECT')} - - - `)($scope)); - - $scope.$watch('webhook_service', (newValue, oldValue) => { - const newServiceValue = newValue && typeof newValue === 'object' ? newValue.value : newValue; - const oldServiceValue = oldValue && typeof oldValue === 'object' ? oldValue.value : oldValue; - if (newServiceValue !== oldServiceValue || newServiceValue === newValue) { - $scope.webhook_service = { value: newServiceValue }; - sync_webhook_service_select2(); - $scope.webhookCredential.modalBaseParams.credential_type__namespace = newServiceValue ? - `${newServiceValue}_token` - : null; - if (newServiceValue !== newValue || newValue === null) { - $scope.webhookCredential.id = null; - $scope.webhookCredential.name = null; - } - } - }); - - hashSetup({ - scope: $scope, - main: main, - check_field: 'allow_callbacks', - default_val: false - }); - CallbackHelpInit({ scope: $scope }); - // set initial vals for webhook checkbox - $scope.enable_webhook = false; - main.enable_webhook = false; - - $scope.surveyTooltip = i18n._('Please save before adding a survey to this job template.'); - - MultiCredentialService.getCredentialTypes() - .then(({ data }) => { - $scope.multiCredential = { - credentialTypes: data.results, - selectedCredentials: [] - }; - }); - - callback = function() { - // Make sure the form controller knows there was a change - $scope[form.name + '_form'].$setDirty(); - }; - - var selectCount = 0; - - if ($scope.removeChoicesReady) { - $scope.removeChoicesReady(); - } - $scope.removeChoicesReady = $scope.$on('choicesReadyVerbosity', function () { - ParseTypeChange({ - scope: $scope, - field_id: 'extra_vars', - variable: 'extra_vars', - onChange: callback - }); - - selectCount++; - if (selectCount === 3) { - var verbosity; - // this sets the default options for the selects as specified by the controller. - for (verbosity in $scope.verbosity_options) { - if ($scope.verbosity_options[verbosity].isDefault) { - $scope.verbosity = $scope.verbosity_options[verbosity]; - } - } - $scope.job_type = $scope.job_type_options[form.fields.job_type.default]; - const virtualEnvs = ConfigData.custom_virtualenvs || []; - $scope.custom_virtualenvs_options = virtualEnvs; - - CreateSelect2({ - element:'#job_template_job_type', - multiple: false - }); - CreateSelect2({ - element:'#job_template_labels', - multiple: true, - addNew: true - }); - CreateSelect2({ - element:'#playbook-select', - addNew: true, - multiple: false, - scope: $scope, - options: 'playbook_options', - model: 'playbook' - }); - CreateSelect2({ - element:'#job_template_verbosity', - multiple: false - }); - CreateSelect2({ - element:'#job_template_job_tags', - multiple: true, - addNew: true - }); - - CreateSelect2({ - element:'#job_template_skip_tags', - multiple: true, - addNew: true - }); - - CreateSelect2({ - element: '#job_template_custom_virtualenv', - multiple: false, - opts: $scope.custom_virtualenvs_options - }); - CreateSelect2({ - element:'#webhook-service-select', - addNew: false, - multiple: false, - scope: $scope, - options: 'webhook_service_options', - model: 'webhook_service' - }); - } - }); - - // setup verbosity options select - GetChoices({ - scope: $scope, - url: defaultUrl, - field: 'verbosity', - variable: 'verbosity_options', - callback: 'choicesReadyVerbosity' - }); - - // setup job type options select - GetChoices({ - scope: $scope, - url: defaultUrl, - field: 'job_type', - variable: 'job_type_options', - callback: 'choicesReadyVerbosity' - }); - GetChoices({ - scope: $scope, - url: defaultUrl, - field: 'webhook_service', - variable: 'webhook_service_options', - callback: 'choicesReadyVerbosity' - }); - $scope.labelOptions = availableLabels - .map((i) => ({label: i.name, value: i.id})); - $scope.$emit("choicesReadyVerbosity"); - - function sync_playbook_select2() { - CreateSelect2({ - element:'#playbook-select', - addNew: true, - multiple: false, - scope: $scope, - options: 'playbook_options', - model: 'playbook' - }); - } - - function sync_webhook_service_select2() { - CreateSelect2({ - element:'#webhook-service-select', - addNew: false, - multiple: false, - scope: $scope, - options: 'webhook_service_options', - model: 'webhook_service' - }); - } - - $scope.toggleForm = function(key) { - $scope[key] = !$scope[key]; - }; - - // Update playbook select whenever project value changes - selectPlaybook = function (oldValue, newValue) { - var url; - if (oldValue !== newValue) { - if ($scope.project) { - Wait('start'); - url = GetBasePath('projects') + $scope.project + '/playbooks/'; - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - var i, opts = []; - for (i = 0; i < data.length; i++) { - opts.push(data[i]); - } - if ($scope.playbook && opts.indexOf($scope.playbook) === -1) { - opts.push($scope.playbook); - } - $scope.playbook_options = opts; - sync_playbook_select2(); - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { hdr: 'Error!', - msg: 'Failed to get playbook list for ' + url + '. GET returned status: ' + status }); - }); - } - } - }; - - $scope.jobTypeChange = function() { - sync_playbook_select2(); - }; - - // Detect and alert user to potential SCM status issues - checkSCMStatus = function (oldValue, newValue) { - if ((oldValue !== newValue || (oldValue === undefined && newValue === undefined)) && !Empty($scope.project)) { - Rest.setUrl(GetBasePath('projects') + $scope.project + '/'); - Rest.get() - .then(({data}) => { - $scope.allow_branch_override = data.allow_override; - $scope.allow_playbook_selection = true; - selectPlaybook('force_load'); - - var msg; - switch (data.status) { - case 'failed': - msg = `
${i18n._('The Project selected has a status of')} \"${i18n._('failed')}\". ${i18n._('You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook.')}
`; - break; - case 'never updated': - msg = `
${i18n._('The Project selected has a status of')} \"${i18n._('never updated')}\". ${i18n._('You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook.')}
`; - break; - case 'missing': - msg = `
${i18n._('The selected project has a status of')} \"${i18n._('missing')}\". ${i18n._('Please check the server and make sure the directory exists and file permissions are set correctly.')}
`; - break; - } - if (msg) { - Alert(i18n._('Warning'), msg, 'alert-info alert-info--noTextTransform', null, null, null, null, true); - } - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { hdr: 'Error!', - msg: 'Failed to get project ' + $scope.project + '. GET returned status: ' + status }); - }); - } else { - $scope.allow_playbook_selection = false; - } - }; - - if(Inventory){ - $scope.inventory = Inventory.id; - $scope.inventory_name = Inventory.name; - } - if(Project){ - $scope.project = Project.id; - $scope.project_name = Project.name; - selectPlaybook('force_load'); - checkSCMStatus(); - } - - // Register a watcher on project_name - if ($scope.selectPlaybookUnregister) { - $scope.selectPlaybookUnregister(); - } - $scope.selectPlaybookUnregister = $scope.$watch('project', function (newValue, oldValue) { - if (newValue !== oldValue) { - selectPlaybook(oldValue, newValue); - checkSCMStatus(); - } - }); - - if ($scope.removeSurveySaved) { - $scope.removeSurveySaved(); - } - $scope.removeSurveySaved = $scope.$on('SurveySaved', function() { - Wait('stop'); - $scope.survey_exists = true; - $scope.invalid_survey = false; - }); - - - function saveCompleted(id) { - $state.go('templates.editJobTemplate', {job_template_id: id}, {reload: true}); - } - - // Save - $scope.formSave = function () { - var fld, data = {}; - $scope.invalid_survey = false; - - // Can't have a survey enabled without a survey - if($scope.survey_enabled === true && - $scope.survey_exists !== true){ - $scope.survey_enabled = false; - } - - generator.clearApiErrors($scope); - - Wait('start'); - - try { - for (fld in form.fields) { - if (form.fields[fld].type === 'select' && - fld !== 'playbook' && fld !== 'custom_virtualenv' && $scope[fld]) { - data[fld] = $scope[fld].value; - } - else if(form.fields[fld].type === 'checkbox_group') { - // Loop across the checkboxes - for(var i=0; i option").filter("[data-select2-tag=true]").each(function(optionIndex, option) { - $("#job_template_labels").siblings(".select2").first().find(".select2-selection__choice").each(function(labelIndex, label) { - if($(option).text() === $(label).attr('title')) { - // Mark that the option has a label present so that we can filter by that down below - $(option).attr('data-label-is-present', true); - } - }); - }); - - $scope.newLabels = $("#job_template_labels > option") - .filter("[data-select2-tag=true]") - .filter("[data-label-is-present=true]") - .map((i, val) => ({name: $(val).text()})); - - $scope.job_tags = _.map($scope.job_tags, function(i){return i.value;}); - $("#job_template_job_tags").siblings(".select2").first().find(".select2-selection__choice").each(function(optionIndex, option){ - $scope.job_tags.push(option.title); - }); - - $scope.skip_tags = _.map($scope.skip_tags, function(i){return i.value;}); - $("#job_template_skip_tags").siblings(".select2").first().find(".select2-selection__choice").each(function(optionIndex, option){ - $scope.skip_tags.push(option.title); - }); - - data.job_tags = (Array.isArray($scope.job_tags)) ? _.uniq($scope.job_tags).join() : ""; - data.skip_tags = (Array.isArray($scope.skip_tags)) ? _.uniq($scope.skip_tags).join() : ""; - - Rest.setUrl(defaultUrl); - Rest.post(data) - .then(({data}) => { - if (data.related && data.related.callback) { - Alert('Callback URL', - `Host callbacks are enabled for this template. The callback URL is: -

- - ${$scope.callback_server_path} - ${data.related.callback} - -

-

The host configuration key is: - - ${$filter('sanitize')(data.host_config_key)} - -

`, - 'alert-danger', saveCompleted, null, null, - null, true); - } - - var orgDefer = $q.defer(); - var associationDefer = $q.defer(); - Rest.setUrl(data.related.labels); - - var currentLabels = Rest.get() - .then(function(data) { - return data.data.results - .map(val => val.id); - }); - - currentLabels.then(function (current) { - var labelsToAdd = ($scope.labels || []) - .map(val => val.value); - var labelsToDisassociate = current - .filter(val => labelsToAdd - .indexOf(val) === -1) - .map(val => ({id: val, disassociate: true})); - var labelsToAssociate = labelsToAdd - .filter(val => current - .indexOf(val) === -1) - .map(val => ({id: val, associate: true})); - var pass = labelsToDisassociate - .concat(labelsToAssociate); - associationDefer.resolve(pass); - }); - - Rest.setUrl(GetBasePath("organizations")); - Rest.get() - .then(({data}) => { - orgDefer.resolve(data.results[0].id); - }); - - orgDefer.promise.then(function(orgId) { - var toPost = []; - $scope.newLabels = $scope.newLabels - .map(function(i, val) { - val.organization = orgId; - return val; - }); - - $scope.newLabels.each(function(i, val) { - toPost.push(val); - }); - - associationDefer.promise.then(function(arr) { - toPost = toPost - .concat(arr); - - Rest.setUrl(data.related.labels); - - var defers = []; - for (var i = 0; i < toPost.length; i++) { - defers.push(Rest.post(toPost[i])); - } - $q.all(defers) - .then(function() { - $scope.addedItem = data.id; - - if($scope.survey_questions && - $scope.survey_questions.length > 0){ - //once the job template information - // is saved we submit the survey - // info to the correct endpoint - var url = data.url+ 'survey_spec/'; - Rest.setUrl(url); - Rest.post({ name: $scope.survey_name, - description: $scope.survey_description, - spec: $scope.survey_questions }) - .then(() => { - Wait('stop'); - }) - .error(function (data, - status) { - ProcessErrors( - $scope, - data, - status, - form, - { - hdr: 'Error!', - msg: 'Failed to add new ' + - 'survey. Post returned ' + - 'status: ' + - status - }); - }); - } - - MultiCredentialService - .saveRelated(data, $scope.multiCredential.selectedCredentials) - .then(() => saveCompleted(data.id)); - }); - }); - }); - - const instance_group_url = data.related.instance_groups; - InstanceGroupsService.addInstanceGroups(instance_group_url, $scope.instance_groups) - .then(() => { - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to post instance groups. POST returned ' + - 'status: ' + status - }); - }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to add new job ' + - 'template. POST returned status: ' + status - }); - }); - } catch (err) { - Wait('stop'); - Alert("Error", "Error parsing extra variables. " + - "Parser returned: " + err); - } - }; - - $scope.formCancel = function () { - $state.transitionTo('templates'); - }; - - let handleLabelCount = () => { - /** - * This block of code specifically handles the client-side validation of the `labels` field. - * Due to it's detached nature in relation to the other job template fields, we must - * validate this field client-side in order to avoid the edge case where a user can make a - * successful POST to the `job_templates` endpoint but however encounter a 200 error from - * the `labels` endpoint due to a character limit. - * - * We leverage two of select2's available events, `select` and `unselect`, to detect when the user - * has either added or removed a label. From there, we set a flag and do simple string length - * checks to make sure a label's chacacter count remains under 512. Otherwise, we disable the "Save" button - * by invalidating the field and inform the user of the error. - */ - - - $scope.job_template_labels_isValid = true; - const maxCount = 512; - const jt_label_id = 'job_template_labels'; - - // Detect when a new label is added - $(`#${jt_label_id}`).on('select2:select', (e) => { - const { text } = e.params.data; - - // If the character count of an added label is greater than 512, we set `labels` field as invalid - if (text.length > maxCount) { - $scope.job_template_form.labels.$setValidity(`${jt_label_id}`, false); - $scope.job_template_labels_isValid = false; - } - }); - - // Detect when a label is removed - $(`#${jt_label_id}`).on('select2:unselect', (e) => { - const { text } = e.params.data; - - /* If the character count of a removed label is greater than 512 AND the field is currently marked - as invalid, we set it back to valid */ - if (text.length > maxCount && $scope.job_template_form.labels.$error) { - $scope.job_template_form.labels.$setValidity(`${jt_label_id}`, true); - $scope.job_template_labels_isValid = true; - } - }); - }; - - handleLabelCount(); - } - ]; diff --git a/awx/ui/client/src/templates/job_templates/add-job-template/main.js b/awx/ui/client/src/templates/job_templates/add-job-template/main.js deleted file mode 100644 index fedbed4898..0000000000 --- a/awx/ui/client/src/templates/job_templates/add-job-template/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './job-template-add.controller'; - -export default - angular.module('jobTemplateAdd', []) - .controller('JobTemplateAdd', controller); diff --git a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js deleted file mode 100644 index 59776c426b..0000000000 --- a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js +++ /dev/null @@ -1,1012 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:JobTemplatesEdit - * @description This controller's for Job Template Edit -*/ - -export default - [ '$filter', '$scope', - '$stateParams', 'JobTemplateForm', 'GenerateForm', - 'Rest', 'Alert', 'ProcessErrors', 'GetBasePath', 'hashSetup', - 'ParseTypeChange', 'Wait', 'selectedLabels', 'i18n', - 'Empty', 'ToJSON', 'GetChoices', 'CallbackHelpInit', - 'initSurvey', '$state', 'CreateSelect2', 'isNotificationAdmin', - 'ToggleNotification','$q', 'InstanceGroupsService', 'InstanceGroupsData', - 'MultiCredentialService', 'availableLabels', 'projectGetPermissionDenied', - 'inventoryGetPermissionDenied', 'jobTemplateData', 'ParseVariableString', 'ConfigData', '$compile', 'webhookKey', - function( - $filter, $scope, - $stateParams, JobTemplateForm, GenerateForm, Rest, Alert, - ProcessErrors, GetBasePath, hashSetup, - ParseTypeChange, Wait, selectedLabels, i18n, - Empty, ToJSON, GetChoices, CallbackHelpInit, - SurveyControllerInit, $state, CreateSelect2, isNotificationAdmin, - ToggleNotification, $q, InstanceGroupsService, InstanceGroupsData, - MultiCredentialService, availableLabels, projectGetPermissionDenied, - inventoryGetPermissionDenied, jobTemplateData, ParseVariableString, ConfigData, $compile, webhookKey - ) { - - $scope.$watch('job_template_obj.summary_fields.user_capabilities.edit', function(val) { - if (val === false) { - $scope.canAddJobTemplate = false; - } - }); - - let defaultUrl = GetBasePath('job_templates'), - generator = GenerateForm, - form = JobTemplateForm(), - main = {}, - id = $stateParams.job_template_id, - callback, - choicesCount = 0, - instance_group_url = defaultUrl + id + '/instance_groups', - select2LoadDefer = [], - launchHasBeenEnabled = false; - - init(); - function init() { - - CallbackHelpInit({ scope: $scope }); - - // To toggle notifications a user needs to have a read role on the JT - // _and_ have at least a notification template admin role on an org. - // If the user has gotten this far it's safe to say they have - // at least read access to the JT - $scope.sufficientRoleForNotifToggle = isNotificationAdmin; - $scope.sufficientRoleForNotif = isNotificationAdmin || $scope.user_is_system_auditor; - $scope.playbook_options = null; - $scope.webhook_service_options = null; - $scope.playbook = null; - $scope.webhook_service = jobTemplateData.webhook_service; - $scope.webhook_url = ''; - $scope.mode = 'edit'; - $scope.parseType = 'yaml'; - $scope.showJobType = false; - $scope.instance_groups = InstanceGroupsData; - $scope.credentialNotPresent = false; - $scope.surveyTooltip = i18n._('Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch.'); - $scope.job_tag_options = []; - $scope.skip_tag_options = []; - const virtualEnvs = ConfigData.custom_virtualenvs || []; - $scope.custom_virtualenvs_options = virtualEnvs; - $scope.webhook_url_help = i18n._('Webhook services can launch jobs with this job template by making a POST request to this URL.'); - $scope.webhook_key_help = i18n._('Webhook services can use this as a shared secret.'); - - $scope.currentlySavedWebhookKey = webhookKey; - $scope.webhook_key = webhookKey; - - // - // webhook credential - all handlers, dynamic state, etc. live here - // - - $scope.webhookCredential = { - id: _.get(jobTemplateData, ['summary_fields', 'webhook_credential', 'id']), - name: _.get(jobTemplateData, ['summary_fields', 'webhook_credential', 'name']), - isModalOpen: false, - isModalReady: false, - modalSelectedId: null, - modalSelectedName: null, - modalBaseParams: { - order_by: 'name', - page_size: 5, - credential_type__namespace: `${jobTemplateData.webhook_service}_token`, - }, - modalTitle: i18n._('Select Webhook Credential'), - }; - - $scope.handleWebhookCredentialLookupClick = () => { - $scope.webhookCredential.modalSelectedId = $scope.webhookCredential.id; - $scope.webhookCredential.isModalOpen = true; - }; - - $scope.handleWebhookCredentialTagDelete = () => { - $scope.webhookCredential.id = null; - $scope.webhookCredential.name = null; - }; - - $scope.handleWebhookCredentialModalClose = () => { - $scope.webhookCredential.isModalOpen = false; - $scope.webhookCredential.isModalReady = false; - }; - - $scope.handleWebhookCredentialModalReady = () => { - $scope.webhookCredential.isModalReady = true; - }; - - $scope.handleWebhookCredentialModalItemSelect = (item) => { - $scope.webhookCredential.modalSelectedId = item.id; - $scope.webhookCredential.modalSelectedName = item.name; - }; - - $scope.handleWebhookCredentialModalCancel = () => { - $scope.webhookCredential.isModalOpen = false; - $scope.webhookCredential.isModalReady = false; - $scope.webhookCredential.modalSelectedId = null; - $scope.webhookCredential.modalSelectedName = null; - }; - - $scope.handleWebhookCredentialSelect = () => { - $scope.webhookCredential.isModalOpen = false; - $scope.webhookCredential.isModalReady = false; - $scope.webhookCredential.id = $scope.webhookCredential.modalSelectedId; - $scope.webhookCredential.name = $scope.webhookCredential.modalSelectedName; - $scope.webhookCredential.modalSelectedId = null; - $scope.webhookCredential.modalSelectedName = null; - }; - - $scope.handleWebhookKeyButtonClick = () => { - Rest.setUrl(jobTemplateData.related.webhook_key); - Wait('start'); - Rest.post({}) - .then(({ data }) => { - $scope.currentlySavedWebhookKey = data.webhook_key; - $scope.webhook_key = data.webhook_key; - }) - .catch(({ data }) => { - const errorMsg = `Failed to generate new webhook key. POST returned status: ${status}`; - ProcessErrors($scope, data, status, form, { hdr: 'Error!', msg: errorMsg }); - }) - .finally(() => { - Wait('stop'); - }); - }; - - $('#content-container').append($compile(` - - - - - ${i18n._('CANCEL')} - - - ${i18n._('SELECT')} - - - `)($scope)); - - $scope.$watch('webhook_service', (newValue, oldValue) => { - const newServiceValue = newValue && typeof newValue === 'object' ? newValue.value : newValue; - const oldServiceValue = oldValue && typeof oldValue === 'object' ? oldValue.value : oldValue; - if (newServiceValue) { - $scope.webhook_url = `${$scope.callback_server_path}${jobTemplateData.url}${newServiceValue}/`; - } else { - $scope.webhook_url = ''; - $scope.webhook_key = ''; - } - if (newServiceValue !== oldServiceValue || newServiceValue === newValue) { - $scope.webhook_service = { value: newServiceValue }; - sync_webhook_service_select2(); - $scope.webhookCredential.modalBaseParams.credential_type__namespace = newServiceValue ? - `${newServiceValue}_token` : null; - if (newServiceValue !== newValue || newValue === null) { - $scope.webhookCredential.id = null; - $scope.webhookCredential.name = null; - } - if (newServiceValue !== newValue) { - if (newServiceValue === jobTemplateData.webhook_service) { - $scope.webhook_key = $scope.currentlySavedWebhookKey; - } else { - $scope.webhook_key = i18n._('A NEW WEBHOOK KEY WILL BE GENERATED ON SAVE'); - } - } - } - }); - - $scope.$watch('verbosity', sync_verbosity_select2); - $scope.$watch('job_type', sync_job_type_select2); - - SurveyControllerInit({ - scope: $scope, - parent_scope: $scope, - id: id, - templateType: 'job_template' - }); - - $scope.$watch('project', function (newValue, oldValue) { - if (newValue !== oldValue) { - if (oldValue) { - $scope.scm_branch = null; - $scope.ask_scm_branch_on_launch = false; - } - - var url; - if ($scope.playbook) { - $scope.playbook_options = [$scope.playbook]; - } - - if (!Empty($scope.project)) { - // If a project exists, show its playbooks. - $scope.allow_playbook_selection = true; - } - - if (!Empty($scope.project) && $scope.job_template_obj.summary_fields.user_capabilities.edit) { - let promises = []; - url = GetBasePath('projects') + $scope.project + '/playbooks/'; - Wait('start'); - Rest.setUrl(url); - promises.push(Rest.get() - .then(({data}) => { - $scope.disablePlaybookBecausePermissionDenied = false; - $scope.playbook_options = []; - var playbookNotFound = true; - for (var i = 0; i < data.length; i++) { - $scope.playbook_options.push(data[i]); - if (data[i] === $scope.playbook) { - $scope.job_template_form.playbook.$setValidity('required', true); - playbookNotFound = false; - } - } - if ($scope.playbook && $scope.playbook_options.indexOf($scope.playbook) === -1) { - $scope.playbook_options.push($scope.playbook); - } - $scope.playbookNotFound = playbookNotFound; - sync_playbook_select2(); - if ($scope.playbook) { - jobTemplateLoadFinished(); - } - }) - .catch( (error) => { - if (error.status === 403) { - /* user doesn't have access to see the project, no big deal. */ - $scope.disablePlaybookBecausePermissionDenied = true; - } else { - Alert('Missing Playbooks', 'Unable to retrieve the list of playbooks for this project. Choose a different ' + - ' project or make the playbooks available on the file system.', 'alert-info'); - } - Wait('stop'); - })); - - - Rest.setUrl(GetBasePath('projects') + $scope.project + '/'); - promises.push(Rest.get() - .then(({data}) => { - $scope.allow_branch_override = data.allow_override; - var msg; - switch (data.status) { - case 'failed': - msg = "
The Project selected has a status of \"failed\". You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook."; - break; - case 'never updated': - msg = "
The Project selected has a status of \"never updated\". You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook."; - break; - case 'missing': - msg = '
The selected project has a status of \"missing\". Please check the server and make sure ' + - ' the directory exists and file permissions are set correctly.
'; - break; - } - if (msg) { - Alert('Warning', msg, 'alert-info alert-info--noTextTransform', null, null, null, null, true); - } - }) - .catch(({data, status}) => { - if (status === 403) { - /* User doesn't have read access to the project, no problem. */ - } else { - ProcessErrors($scope, data, status, form, { hdr: 'Error!', msg: 'Failed to get project ' + $scope.project + - '. GET returned status: ' + status }); - } - })); - - $q.all(promises) - .then(function(){ - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: 'Error!', - msg: 'Call failed. Returned status: ' + status - }); - }); - } - } - }); - } - - callback = function() { - // Make sure the form controller knows there was a change - $scope[form.name + '_form'].$setDirty(); - }; - - function sync_playbook_select2() { - select2LoadDefer.push(CreateSelect2({ - element:'#playbook-select', - addNew: true, - multiple: false, - scope: $scope, - options: 'playbook_options', - model: 'playbook' - })); - } - - function sync_verbosity_select2(newValue) { - if (newValue === 0 || (newValue && typeof newValue !== 'object')) { - $scope.verbosity = { value: newValue }; - return; - } - select2LoadDefer.push(CreateSelect2({ - element:'#job_template_verbosity', - multiple: false, - scope: $scope, - model: 'verbosity', - options: 'verbosity_options', - })); - } - - function sync_job_type_select2(newValue) { - if (newValue === 0 || (newValue && typeof newValue !== 'object')) { - $scope.job_type = { value: newValue }; - return; - } - select2LoadDefer.push(CreateSelect2({ - element:'#job_template_job_type', - multiple: false, - scope: $scope, - model: 'job_type', - options: 'job_type_options', - })); - } - - function sync_webhook_service_select2() { - select2LoadDefer.push(CreateSelect2({ - element:'#webhook-service-select', - addNew: false, - multiple: false, - scope: $scope, - options: 'webhook_service_options', - model: 'webhook_service' - })); - } - - function jobTemplateLoadFinished(){ - select2LoadDefer.push(CreateSelect2({ - element:'#job_template_job_type', - multiple: false - })); - - select2LoadDefer.push(CreateSelect2({ - element:'#job_template_job_tags', - multiple: true, - addNew: true - })); - - select2LoadDefer.push(CreateSelect2({ - element:'#job_template_skip_tags', - multiple: true, - addNew: true - })); - - select2LoadDefer.push(CreateSelect2({ - element: '#job_template_custom_virtualenv', - multiple: false, - opts: $scope.custom_virtualenvs_options - })); - select2LoadDefer.push(CreateSelect2({ - element:'#webhook-service-select', - addNew: false, - multiple: false, - scope: $scope, - options: 'webhook_service_options', - model: 'webhook_service' - })); - - if (!launchHasBeenEnabled) { - $q.all(select2LoadDefer).then(() => { - // updates based on lookups will initially set the form as dirty. - // we need to set it as pristine when it contains the values given by the api - // so that we can enable launching when the two are the same - $scope.job_template_form.$setPristine(); - // this is used to set the overall form as dirty for the values - // that don't actually set this internally (lookups, toggles and code mirrors). - $scope.$watchCollection('multiCredential.selectedCredentials', (val, prevVal) => { - if (!_.isEqual(val, prevVal)) { - $scope.job_template_form.$setDirty(); - } - }); - $scope.$watchGroup([ - 'inventory', - 'project', - 'extra_vars', - 'diff_mode', - 'instance_groups' - ], (val, prevVal) => { - if (!_.isEqual(val, prevVal)) { - $scope.job_template_form.$setDirty(); - } - }); - }); - } - } - - $scope.toggleForm = function(key) { - $scope[key] = !$scope[key]; - }; - - $scope.jobTypeChange = function() { - sync_playbook_select2(); - }; - - $scope.toggleNotification = function(event, notifier_id, column) { - var notifier = this.notification; - try { - $(event.target).tooltip('hide'); - } - catch(e) { - // ignore - } - ToggleNotification({ - scope: $scope, - url: defaultUrl + id, - notifier: notifier, - column: column, - callback: 'NotificationRefresh' - }); - }; - - // Retrieve each related set and populate the playbook list - if ($scope.jobTemplateLoadedRemove) { - $scope.jobTemplateLoadedRemove(); - } - $scope.jobTemplateLoadedRemove = $scope.$on('jobTemplateLoaded', function (e, mainObject) { - var dft; - - main = mainObject; - - dft = ($scope.host_config_key === "" || $scope.host_config_key === null) ? false : true; - hashSetup({ - scope: $scope, - main: main, - check_field: 'allow_callbacks', - default_val: dft - }); - - // set initial vals for webhook checkbox - if (jobTemplateData.webhook_service) { - $scope.enable_webhook = true; - main.enable_webhook = true; - } else { - $scope.enable_webhook = false; - main.enable_webhook = false; - } - - ParseTypeChange({ - scope: $scope, - field_id: 'extra_vars', - variable: 'extra_vars', - onChange: callback, - readOnly: !$scope.job_template_obj.summary_fields.user_capabilities.edit - }); - jobTemplateLoadFinished(); - launchHasBeenEnabled = true; - }); - - Wait('start'); - - if ($scope.removeSurveySaved) { - $scope.removeSurveySaved(); - } - $scope.removeSurveySaved = $scope.$on('SurveySaved', function() { - Wait('stop'); - $scope.survey_exists = true; - $scope.invalid_survey = false; - }); - - if ($scope.removeLoadJobs) { - $scope.rmoveLoadJobs(); - } - $scope.removeLoadJobs = $scope.$on('LoadJobs', function() { - $scope.job_template_obj = jobTemplateData; - $scope.name = jobTemplateData.name; - $scope.breadcrumb.job_template_name = jobTemplateData.name; - var fld, i; - for (fld in form.fields) { - if (fld !== 'extra_vars' && fld !== 'survey' && jobTemplateData[fld] !== null && jobTemplateData[fld] !== undefined) { - if (form.fields[fld].type === 'select') { - if ($scope[fld + '_options'] && $scope[fld + '_options'].length > 0) { - for (i = 0; i < $scope[fld + '_options'].length; i++) { - if (jobTemplateData[fld] === $scope[fld + '_options'][i].value) { - $scope[fld] = $scope[fld + '_options'][i]; - } - } - } else { - $scope[fld] = jobTemplateData[fld]; - } - } else { - $scope[fld] = jobTemplateData[fld]; - if(!Empty(jobTemplateData.summary_fields.survey)) { - $scope.survey_exists = true; - } - } - main[fld] = $scope[fld]; - } - if (fld === 'extra_vars') { - // Parse extra_vars, converting to YAML. - $scope.extra_vars = ParseVariableString(jobTemplateData.extra_vars); - main.extra_vars = $scope.extra_vars; - } - if (form.fields[fld].type === 'lookup' && jobTemplateData.summary_fields[form.fields[fld].sourceModel]) { - $scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - jobTemplateData.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; - main[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = - $scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField]; - } - if (form.fields[fld].type === 'checkbox_group') { - for(var j=0; j ({name: i, label: i, value: i})) : []; - $scope.job_tags = $scope.job_tag_options; - main.job_tags = $scope.job_tags; - - $scope.skip_tag_options = (jobTemplateData.skip_tags) ? jobTemplateData.skip_tags.split(',') - .map((i) => ({name: i, label: i, value: i})) : []; - $scope.skip_tags = $scope.skip_tag_options; - main.skip_tags = $scope.skip_tags; - - $scope.ask_job_type_on_launch = (jobTemplateData.ask_job_type_on_launch) ? true : false; - main.ask_job_type_on_launch = $scope.ask_job_type_on_launch; - - $scope.ask_inventory_on_launch = (jobTemplateData.ask_inventory_on_launch) ? true : false; - main.ask_inventory_on_launch = $scope.ask_inventory_on_launch; - - $scope.ask_credential_on_launch = (jobTemplateData.ask_credential_on_launch) ? true : false; - main.ask_credential_on_launch = $scope.ask_credential_on_launch; - - if (jobTemplateData.host_config_key) { - $scope.example_config_key = jobTemplateData.host_config_key; - } - $scope.example_template_id = id; - $scope.setCallbackHelp(); - - $scope.callback_url = $scope.callback_server_path + ((jobTemplateData.related.callback) ? jobTemplateData.related.callback : - GetBasePath('job_templates') + id + '/callback/'); - main.callback_url = $scope.callback_url; - - $scope.can_edit = jobTemplateData.summary_fields.user_capabilities.edit; - - const multiCredential = {}; - const credentialTypesPromise = MultiCredentialService.getCredentialTypes() - .then(({ data }) => { - multiCredential.credentialTypes = data.results; - }); - const multiCredentialPromises = [credentialTypesPromise]; - - if ($scope.can_edit) { - const selectedCredentialsPromise = MultiCredentialService - .getRelated(jobTemplateData, { permitted: [403] }) - .then(({ data, status }) => { - if (status === 403) { - $scope.canGetAllRelatedResources = false; - multiCredential.selectedCredentials = _.get(jobTemplateData, 'summary_fields.credentials'); - } else { - $scope.canGetAllRelatedResources = !projectGetPermissionDenied && !inventoryGetPermissionDenied; - multiCredential.selectedCredentials = data.results; - } - }); - - multiCredentialPromises.push(selectedCredentialsPromise); - } else { - $scope.canGetAllRelatedResources = false; - multiCredential.selectedCredentials = _.get(jobTemplateData, 'summary_fields.credentials'); - } - - $q.all(multiCredentialPromises) - .then(() => { - $scope.multiCredential = multiCredential; - $scope.$emit('jobTemplateLoaded', main); - }); - }); - - if ($scope.removeChoicesReady) { - $scope.removeChoicesReady(); - } - $scope.removeChoicesReady = $scope.$on('choicesReady', function() { - choicesCount++; - if (choicesCount === 5) { - $scope.$emit('LoadJobs'); - } - }); - - GetChoices({ - scope: $scope, - url: GetBasePath('unified_jobs'), - field: 'status', - variable: 'status_choices', - callback: 'choicesReady' - }); - - GetChoices({ - scope: $scope, - url: GetBasePath('unified_jobs'), - field: 'type', - variable: 'type_choices', - callback: 'choicesReady' - }); - - // setup verbosity options lookup - GetChoices({ - scope: $scope, - url: defaultUrl, - field: 'verbosity', - variable: 'verbosity_options', - callback: 'choicesReady' - }); - - // setup job type options lookup - GetChoices({ - scope: $scope, - url: defaultUrl, - field: 'job_type', - variable: 'job_type_options', - callback: 'choicesReady' - }); - - GetChoices({ - scope: $scope, - url: defaultUrl, - field: 'webhook_service', - variable: 'webhook_service_options', - callback: 'choicesReady' - }); - - $scope.labelOptions = availableLabels - .map((i) => ({label: i.name, value: i.id})); - - var opts = selectedLabels - .map(i => ({id: i.id + "", - test: i.name})); - - select2LoadDefer.push(CreateSelect2({ - element:'#job_template_labels', - multiple: true, - addNew: true, - opts: opts - })); - - $scope.$emit("choicesReady"); - - function saveCompleted() { - $state.go($state.current, {}, {reload: true}); - } - - if ($scope.removeTemplateSaveSuccess) { - $scope.removeTemplateSaveSuccess(); - } - $scope.removeTemplateSaveSuccess = $scope.$on('templateSaveSuccess', function(e, data) { - - if (data.related && - data.related.callback) { - Alert('Callback URL', -`Host callbacks are enabled for this template. The callback URL is: -

- - ${$scope.callback_server_path}${data.related.callback} - -

-

The host configuration key is: - - ${$filter('sanitize')(data.host_config_key)} - -

-`, - 'alert-danger', saveCompleted, null, null, - null, true); - } - - var credDefer = MultiCredentialService - .saveRelated(jobTemplateData, $scope.multiCredential.selectedCredentials); - - const instanceGroupDefer = InstanceGroupsService.editInstanceGroups(instance_group_url, $scope.instance_groups) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to update instance groups. POST returned status: ' + status - }); - }); - - var orgDefer = $q.defer(); - var associationDefer = $q.defer(); - var associatedLabelsDefer = $q.defer(); - - var getNext = function(data, arr, resolve) { - Rest.setUrl(data.next); - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, arr.concat(data.results), resolve); - } else { - resolve.resolve(arr.concat(data.results)); - } - }); - }; - - Rest.setUrl(data.related.labels); - - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, data.results, associatedLabelsDefer); - } else { - associatedLabelsDefer.resolve(data.results); - } - }); - - associatedLabelsDefer.promise.then(function (current) { - current = current.map(data => data.id); - var labelsToAdd = $scope.labels - .map(val => val.value); - var labelsToDisassociate = current - .filter(val => labelsToAdd - .indexOf(val) === -1) - .map(val => ({id: val, disassociate: true})); - var labelsToAssociate = labelsToAdd - .filter(val => current - .indexOf(val) === -1) - .map(val => ({id: val, associate: true})); - var pass = labelsToDisassociate - .concat(labelsToAssociate); - associationDefer.resolve(pass); - }); - - Rest.setUrl(GetBasePath("organizations")); - Rest.get() - .then(({data}) => { - orgDefer.resolve(data.results[0].id); - }); - - orgDefer.promise.then(function(orgId) { - var toPost = []; - $scope.newLabels = $scope.newLabels - .map(function(i, val) { - val.organization = orgId; - return val; - }); - - $scope.newLabels.each(function(i, val) { - toPost.push(val); - }); - - associationDefer.promise.then(function(arr) { - toPost = toPost - .concat(arr); - - Rest.setUrl(data.related.labels); - - var defers = [credDefer, instanceGroupDefer]; - for (var i = 0; i < toPost.length; i++) { - defers.push(Rest.post(toPost[i])); - } - $q.all(defers) - .then(function() { - Wait('stop'); - saveCompleted(); - }); - }); - }); - }); - - - - // Save changes to the parent - // Save - $scope.formSave = function () { - var fld, data = {}; - $scope.invalid_survey = false; - - // Can't have a survey enabled without a survey - if($scope.survey_enabled === true && - $scope.survey_exists!==true){ - $scope.survey_enabled = false; - } - - generator.clearApiErrors($scope); - - Wait('start'); - - try { - for (fld in form.fields) { - if (form.fields[fld].type === 'select' && - fld !== 'playbook' && fld !== 'custom_virtualenv' && $scope[fld]) { - data[fld] = $scope[fld].value; - } - else if(form.fields[fld].type === 'checkbox_group') { - // Loop across the checkboxes - for(var i=0; i option").filter("[data-select2-tag=true]").each(function(optionIndex, option) { - $("#job_template_labels").siblings(".select2").first().find(".select2-selection__choice").each(function(labelIndex, label) { - if($(option).text() === $(label).attr('title')) { - // Mark that the option has a label present so that we can filter by that down below - $(option).attr('data-label-is-present', true); - } - }); - }); - - $scope.newLabels = $("#job_template_labels > option") - .filter("[data-select2-tag=true]") - .filter("[data-label-is-present=true]") - .map((i, val) => ({name: $(val).text()})); - - $scope.job_tags = _.map($scope.job_tags, function(i){return i.value;}); - $("#job_template_job_tags").siblings(".select2").first().find(".select2-selection__choice").each(function(optionIndex, option){ - $scope.job_tags.push(option.title); - }); - - $scope.skip_tags = _.map($scope.skip_tags, function(i){return i.value;}); - $("#job_template_skip_tags").siblings(".select2").first().find(".select2-selection__choice").each(function(optionIndex, option){ - $scope.skip_tags.push(option.title); - }); - - data.job_tags = (Array.isArray($scope.job_tags)) ? _.uniq($scope.job_tags).join() : ""; - data.skip_tags = (Array.isArray($scope.skip_tags)) ? _.uniq($scope.skip_tags).join() : ""; - - delete data.webhook_url; - delete data.webhook_key; - delete data.enable_webhook; - data.webhook_credential = $scope.webhookCredential.id; - - if (!data.webhook_service) { - data.webhook_credential = null; - } - - if (!$scope.enable_webhook) { - data.webhook_service = ''; - data.webhook_credential = null; - } - - Rest.setUrl(defaultUrl + $state.params.job_template_id); - Rest.patch(data) - .then(({data}) => { - $scope.$emit('templateSaveSuccess', data); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { hdr: 'Error!', - msg: 'Failed to update job template. PATCH returned status: ' + status }); - }); - } catch (err) { - Wait('stop'); - Alert("Error", "Error saving job template. " + - "Error: " + err); - } - }; - - $scope.formCancel = function () { - $state.go('templates'); - }; - - let handleLabelCount = () => { - /** - * This block of code specifically handles the client-side validation of the `labels` field. - * Due to it's detached nature in relation to the other job template fields, we must - * validate this field client-side in order to avoid the edge case where a user can make a - * successful POST to the `job_templates` endpoint but however encounter a 200 error from - * the `labels` endpoint due to a character limit. - * - * We leverage two of select2's available events, `select` and `unselect`, to detect when the user - * has either added or removed a label. From there, we set a flag and do simple string length - * checks to make sure a label's chacacter count remains under 512. Otherwise, we disable the "Save" button - * by invalidating the field and inform the user of the error. - */ - - $scope.job_template_labels_isValid = true; - const maxCount = 512; - const jt_label_id = 'job_template_labels'; - - // Detect when a new label is added - $(`#${jt_label_id}`).on('select2:select', (e) => { - const { text } = e.params.data; - - // If the character count of an added label is greater than 512, we set `labels` field as invalid - if (text.length > maxCount) { - $scope.job_template_form.labels.$setValidity(`${jt_label_id}`, false); - $scope.job_template_labels_isValid = false; - } - }); - - // Detect when a label is removed - $(`#${jt_label_id}`).on('select2:unselect', (e) => { - const { text } = e.params.data; - - /* If the character count of a removed label is greater than 512 AND the field is currently marked - as invalid, we set it back to valid */ - if (text.length > maxCount && $scope.job_template_form.labels.$error) { - $scope.job_template_form.labels.$setValidity(`${jt_label_id}`, true); - $scope.job_template_labels_isValid = true; - } - }); - }; - - handleLabelCount(); - } - ]; diff --git a/awx/ui/client/src/templates/job_templates/edit-job-template/main.js b/awx/ui/client/src/templates/job_templates/edit-job-template/main.js deleted file mode 100644 index ede92fbe00..0000000000 --- a/awx/ui/client/src/templates/job_templates/edit-job-template/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import controller from './job-template-edit.controller'; - -export default - angular.module('jobTemplateEdit', []) - .controller('JobTemplateEdit', controller); diff --git a/awx/ui/client/src/templates/job_templates/factories/callback-help-init.factory.js b/awx/ui/client/src/templates/job_templates/factories/callback-help-init.factory.js deleted file mode 100644 index 2a3b0382e5..0000000000 --- a/awx/ui/client/src/templates/job_templates/factories/callback-help-init.factory.js +++ /dev/null @@ -1,47 +0,0 @@ -export default - function CallbackHelpInit($q, $location, GetBasePath, Rest, JobTemplateForm, GenerateForm, $stateParams, ProcessErrors, - ParseVariableString, Empty, Wait, MultiCredentialService, $rootScope) { - return function(params) { - var scope = params.scope; - // checkSCMStatus, getPlaybooks, callback, - // choicesCount = 0; - - // The form uses awPopOverWatch directive to 'watch' scope.callback_help for changes. Each time the - // popover is activated, a function checks the value of scope.callback_help before constructing the content. - scope.setCallbackHelp = function() { - scope.callback_help = "

With a provisioning callback URL and a host config key a host can contact " + $rootScope.BRAND_NAME + " and request a configuration update using this job " + - "template. The request from the host must be a POST. Here is an example using curl:

\n" + - "
curl --data \"host_config_key=" + scope.example_config_key + "\" " +
-                    scope.callback_server_path + GetBasePath('job_templates') + scope.example_template_id + "/callback/
\n" + - "

Note the requesting host must be defined in the inventory associated with the job template. If " + $rootScope.BRAND_NAME + " fails to " + - "locate the host, the request will be denied.

" + - "

Successful requests create an entry on the Jobs page, where results and history can be viewed.

"; - }; - - // The hash helper emits NewHashGenerated whenever a new key is available - if (scope.removeNewHashGenerated) { - scope.removeNewHashGenerated(); - } - scope.removeNewHashGenerated = scope.$on('NewHashGenerated', function() { - scope.configKeyChange(); - }); - - // Fired when user enters a key value - scope.configKeyChange = function() { - scope.example_config_key = scope.host_config_key; - scope.setCallbackHelp(); - }; - - // Set initial values and construct help text - scope.callback_server_path = $location.protocol() + '://' + $location.host() + (($location.port()) ? ':' + $location.port() : ''); - scope.example_config_key = '5a8ec154832b780b9bdef1061764ae5a'; - scope.example_template_id = 'N'; - scope.setCallbackHelp(); - }; - } - -CallbackHelpInit.$inject = - [ '$q', '$location', 'GetBasePath', 'Rest', 'JobTemplateForm', 'GenerateForm', - '$stateParams', 'ProcessErrors', 'ParseVariableString', - 'Empty', 'Wait', 'MultiCredentialService', '$rootScope' - ]; diff --git a/awx/ui/client/src/templates/job_templates/factories/hash-setup.factory.js b/awx/ui/client/src/templates/job_templates/factories/hash-setup.factory.js deleted file mode 100644 index f9636602f8..0000000000 --- a/awx/ui/client/src/templates/job_templates/factories/hash-setup.factory.js +++ /dev/null @@ -1,30 +0,0 @@ -export default - function hashSetup() { - return function(params) { - var scope = params.scope, - main = params.main, - check_field = params.check_field, - default_val = params.default_val; - - scope[check_field] = default_val; - main[check_field] = default_val; - - // Original gist here: https://gist.github.com/jed/982883 - scope.genHash = function (fld) { - scope[fld] = ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => - (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) - ); - scope.$emit('NewHashGenerated'); - }; - - scope.toggleCallback = function (fld) { - if (scope.allow_callbacks === false) { - scope[fld] = ''; - } - }; - - scope.selectAll = function (fld) { - $('input[name="' + fld + '"]').focus().select(); - }; - }; - } diff --git a/awx/ui/client/src/templates/job_templates/job-template.form.js b/awx/ui/client/src/templates/job_templates/job-template.form.js deleted file mode 100644 index 8c8eefa24c..0000000000 --- a/awx/ui/client/src/templates/job_templates/job-template.form.js +++ /dev/null @@ -1,621 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name forms.function:JobTemplate - * @description This form is for adding/editing a Job Template -*/ - - -export default ['NotificationsList', 'i18n', -function(NotificationsList, i18n) { - return function() { - var JobTemplateFormObject = { - - addTitle: i18n._('NEW JOB TEMPLATE'), - editTitle: '{{ name }}', - name: 'job_template', - breadcrumbName: i18n._('JOB TEMPLATE'), - basePath: 'job_templates', - // the top-most node of generated state tree - stateTree: 'templates', - tabs: true, - activeEditState: 'templates.editJobTemplate', - // (optional) array of supporting templates to ng-include inside generated html - include: ['/static/partials/survey-maker-modal.html'], - detailsClick: "$state.go('templates.editJobTemplate')", - - fields: { - name: { - label: i18n._('Name'), - type: 'text', - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)', - required: true, - column: 1 - }, - description: { - label: i18n._('Description'), - type: 'text', - column: 1, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - job_type: { - label: i18n._('Job Type'), - type: 'select', - ngOptions: 'type.label for type in job_type_options track by type.value', - ngChange: 'jobTypeChange()', - "default": 0, - required: true, - column: 1, - awPopOver: i18n._('For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook.'), - dataTitle: i18n._('Job Type'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_job_type_on_launch', - text: i18n._('Prompt on launch'), - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - inventory: { - label: i18n._('Inventory'), - type: 'lookup', - basePath: 'inventory', - list: 'InventoryList', - sourceModel: 'inventory', - sourceField: 'name', - autopopulateLookup: false, - awRequiredWhen: { - reqExpression: '!ask_inventory_on_launch', - alwaysShowAsterisk: true - }, - requiredErrorMsg: i18n._("Please select an Inventory or check the Prompt on launch option."), - column: 1, - awPopOver: "

" + i18n._("Select the inventory containing the hosts you want this job to manage.") + "

", - dataTitle: i18n._('Inventory'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_inventory_on_launch', - ngChange: 'job_template_form.inventory_name.$validate()', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canGetAllRelatedResources' - }, - project: { - label: i18n._('Project'), - type: 'lookup', - list: 'ProjectList', - basePath: 'projects', - sourceModel: 'project', - sourceField: 'name', - required: true, - column: 1, - awPopOver: "

" + i18n._("Select the project containing the playbook you want this job to execute.") + "

", - dataTitle: i18n._('Project'), - dataPlacement: 'right', - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canGetAllRelatedResources', - awLookupWhen: 'canGetAllRelatedResources' - }, - scm_branch: { - label: i18n._('SCM Branch'), - type: 'text', - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)', - ngShow: 'allow_branch_override', - column: 1, - awPopOver: "

" + i18n._("Branch to use in job run. Project default used if blank.") + "

", - dataTitle: i18n._('Project'), - subCheckbox: { - variable: 'ask_scm_branch_on_launch', - text: i18n._('Prompt on launch'), - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - dataPlacement: 'right', - dataContainer: "body" - }, - playbook: { - label: i18n._('Playbook'), - type:'select', - defaultText: i18n._('Choose a playbook'), - ngOptions: 'book for book in playbook_options track by book', - ngShow: 'allow_playbook_selection', - ngDisabled: "!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canGetAllRelatedResources", - id: 'playbook-select', - required: true, - column: 1, - awPopOver: "

" + i18n._("Select the playbook to be executed by this job." + - "You can select from the dropdown or enter a file within the input.") + "

", - dataTitle: i18n._('Playbook'), - dataPlacement: 'right', - dataContainer: "body", - includePlaybookNotFoundError: true - }, - credential: { - label: i18n._('Credentials'), - type: 'custom', - control: ` - - `, - awPopOver: i18n._('Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking "Prompt on launch" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check "Prompt on launch", the selected credential(s) become the defaults that can be updated at run time.'), - dataTitle: i18n._('Credentials'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_credential_on_launch', - text: i18n._('Prompt on launch'), - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - } - }, - forks: { - label: i18n._('Forks'), - type: 'number', - integer: true, - min: 0, - default: 0, - spinner: true, - dataTitle: i18n._('Forks'), - dataPlacement: 'right', - dataContainer: 'body', - awPopOver: "

" + i18n._("The number of parallel or simultaneous processes to use while executing the playbook. An empty value, or a value less than 1 will use the Ansible default which is usually 5. The default number of forks can be overwritten with a change to ") + "ansible.cfg. " + i18n._("Refer to the Ansible documentation for details about the configuration file.") + "

", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - limit: { - label: i18n._('Limit'), - type: 'text', - column: 1, - awPopOver: i18n._('Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns.'), - dataTitle: i18n._('Limit'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_limit_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - verbosity: { - label: i18n._('Verbosity'), - type: 'select', - ngOptions: 'v.label for v in verbosity_options track by v.value', - "default": 1, - required: true, - column: 1, - awPopOver: "

" + i18n._("Control the level of output ansible will produce as the playbook executes.") + "

", - dataTitle: i18n._('Verbosity'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_verbosity_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)', - }, - job_tags: { - label: i18n._('Job Tags'), - type: 'select', - multiSelect: true, - 'elementClass': 'Form-textInput', - ngOptions: 'tag.label for tag in job_tag_options track by tag.value', - column: 2, - awPopOver: i18n._('Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags.'), - dataTitle: i18n._("Job Tags"), - dataPlacement: "right", - dataContainer: "body", - subCheckbox: { - variable: 'ask_tags_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - skip_tags: { - label: i18n._('Skip Tags'), - type: 'select', - multiSelect: true, - 'elementClass': 'Form-textInput', - ngOptions: 'tag.label for tag in skip_tag_options track by tag.value', - column: 2, - awPopOver: i18n._('Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags.'), - dataTitle: i18n._("Skip Tags"), - dataPlacement: "right", - dataContainer: "body", - subCheckbox: { - variable: 'ask_skip_tags_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - labels: { - label: i18n._('Labels'), - type: 'select', - ngOptions: 'label.label for label in labelOptions track by label.value', - multiSelect: true, - dataTitle: i18n._('Labels'), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs.") + "

", - dataContainer: 'body', - onError: { - ngShow: 'job_template_labels_isValid !== true', - text: i18n._('Max 512 characters per label.'), - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - custom_virtualenv: { - label: i18n._('Ansible Environment'), - type: 'select', - defaultText: i18n._('Use Default Environment'), - ngOptions: 'venv for venv in custom_virtualenvs_options track by venv', - - awPopOver: "

" + i18n._("Select the custom Python virtual environment for this job template to run on.") + "

", - dataTitle: i18n._('Ansible Environment'), - dataContainer: 'body', - dataPlacement: 'right', - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)', - ngShow: 'custom_virtualenvs_options.length > 1' - }, - instance_groups: { - label: i18n._('Instance Groups'), - type: 'custom', - awPopOver: "

" + i18n._("Select the Instance Groups for this Job Template to run on.") + "

", - dataTitle: i18n._('Instance Groups'), - dataContainer: 'body', - dataPlacement: 'right', - control: '', - }, - job_slice_count: { - label: i18n._('Job Slicing'), - type: 'number', - integer: true, - min: 1, - default: 1, - spinner: true, - dataTitle: i18n._('Slice Job Count'), - dataPlacement: 'right', - dataContainer: 'body', - awPopOver: "

" + i18n._("Divide the work done by this job template into the specified number of job slices, each running the same tasks against a portion of the inventory.") + "

", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - timeout: { - label: i18n._('Timeout'), - type: 'number', - integer: true, - min: 0, - default: 0, - spinner: true, - dataTitle: i18n._('Timeout'), - dataPlacement: 'right', - dataContainer: 'body', - awPopOver: "

" + i18n._("The amount of time (in seconds) to run before the task is canceled. Defaults to 0 for no job timeout.") + "

", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - diff_mode: { - label: i18n._('Show Changes'), - type: 'toggleSwitch', - toggleSource: 'diff_mode', - dataTitle: i18n._('Show Changes'), - dataPlacement: 'right', - dataContainer: 'body', - awPopOver: "

" + i18n._("If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode.") + "

", - subCheckbox: { - variable: 'ask_diff_mode_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - checkbox_group: { - label: i18n._('Options'), - type: 'checkbox_group', - fields: [{ - name: 'become_enabled', - label: i18n._('Enable Privilege Escalation'), - type: 'checkbox', - column: 2, - awPopOver: i18n._('If enabled, run this playbook as an administrator.'), - dataPlacement: 'right', - dataTitle: i18n._('Enable Privilege Escalation'), - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, { - name: 'allow_callbacks', - label: i18n._('Enable Provisioning Callbacks'), - type: 'checkbox', - ngChange: "toggleCallback('host_config_key')", - column: 2, - awPopOver: "

" + i18n._("Enables creation of a provisioning callback URL. Using the URL a host can contact {{BRAND_NAME}} and request a configuration update " + - "using this job template.") + "

", - dataPlacement: 'right', - dataTitle: i18n._('Enable Provisioning Callbacks'), - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, { - name: 'enable_webhook', - label: i18n._('Enable Webhook'), - type: 'checkbox', - column: 2, - awPopOver: "

" + i18n._("Enable webhook for this job template.") + "

", - dataPlacement: 'right', - dataTitle: i18n._('Enable Webhook'), - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, { - name: 'allow_simultaneous', - label: i18n._('Enable Concurrent Jobs'), - type: 'checkbox', - column: 2, - awPopOver: "

" + i18n._("If enabled, simultaneous runs of this job template will be allowed.") + "

", - dataPlacement: 'right', - dataTitle: i18n._('Enable Concurrent Jobs'), - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, { - name: 'use_fact_cache', - label: i18n._('Enable Fact Cache'), - type: 'checkbox', - column: 2, - awPopOver: "

" + i18n._("If enabled, use cached facts if available and store discovered facts in the cache.") + "

", - dataPlacement: 'right', - dataTitle: i18n._('Enable Fact Cache'), - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }] - }, - callback_url: { - label: i18n._('Provisioning Callback URL'), - type: 'text', - readonly: true, - ngShow: "allow_callbacks && allow_callbacks !== 'false'", - column: 2, - awPopOver: "callback_help", - awPopOverWatch: "callback_help", - dataPlacement: 'top', - dataTitle: i18n._('Provisioning Callback URL'), - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' - }, - host_config_key: { - label: i18n._('Host Config Key'), - type: 'text', - ngShow: "allow_callbacks && allow_callbacks !== 'false'", - ngChange: "configKeyChange()", - genHash: true, - column: 2, - awPopOver: "callback_help", - awPopOverWatch: "callback_help", - dataPlacement: 'right', - dataTitle: i18n._("Host Config Key"), - dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)', - awRequiredWhen: { - reqExpression: 'allow_callbacks', - alwaysShowAsterisk: true - } - }, - webhook_service: { - label: i18n._('Webhook Service'), - type:'select', - defaultText: i18n._('Choose a Webhook Service'), - ngOptions: 'svc.label for svc in webhook_service_options track by svc.value', - ngShow: "enable_webhook && enable_webhook !== 'false'", - ngDisabled: "!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canGetAllRelatedResources", - id: 'webhook-service-select', - column: 1, - awPopOver: "

" + i18n._("Select a webhook service.") + "

", - dataTitle: i18n._('Webhook Service'), - dataPlacement: 'right', - dataContainer: "body", - }, - webhook_url: { - label: i18n._('Webhook URL'), - type: 'text', - ngShow: "job_template_obj && enable_webhook && enable_webhook !== 'false'", - awPopOver: "webhook_url_help", - awPopOverWatch: "webhook_url_help", - dataPlacement: 'top', - dataTitle: i18n._('Webhook URL'), - dataContainer: "body", - readonly: true - }, - webhook_key: { - label: i18n._('Webhook Key'), - type: 'text', - ngShow: "enable_webhook && enable_webhook !== 'false'", - genHash: true, - genHashButtonTemplate: ` - - - - `, - genHashButtonClickHandlerName: "handleWebhookKeyButtonClick", - awPopOver: "webhook_key_help", - awPopOverWatch: "webhook_key_help", - dataPlacement: 'right', - dataTitle: i18n._("Webhook Key"), - dataContainer: "body", - readonly: true, - required: false, - }, - webhook_credential: { - label: i18n._('Webhook Credential'), - type: 'custom', - ngShow: "enable_webhook && enable_webhook !== 'false'", - control: ` - `, - awPopOver: "

" + i18n._("Optionally, select the credential to use to send status updates back to the webhook service") + "

", - dataTitle: i18n._('Webhook Credential'), - dataPlacement: 'right', - dataContainer: "body", - ngDisabled: '!(webhook_service || webhook_service.value)', - required: false, - }, - extra_vars: { - label: i18n._('Extra Variables'), - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - "default": "---", - column: 2, - awPopOver: i18n._('Pass extra command line variables to the playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax.'), - dataTitle: i18n._('Extra Variables'), - dataPlacement: 'right', - dataContainer: "body", - id: 'extra_vars', - subCheckbox: { - variable: 'ask_variables_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' // TODO: get working - } - }, - - buttons: { //for now always generates -
-
- - -
-
-
diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.block.less b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.block.less deleted file mode 100644 index 887cdb0961..0000000000 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.block.less +++ /dev/null @@ -1,165 +0,0 @@ -.MultiCredential-selectedBar { - display: flex; - padding: 5px 10px; - background: @default-no-items-bord; - margin-bottom: 20px; - border: 1px solid @default-icon-hov; - border-radius: 5px; - max-height: 120px; - overflow-y: auto; -} - -.MultiCredential-selectedBarLabel { - align-self: center; - margin-right: 20px; - font-size: 12px; - color: @default-icon; -} - -.MultiCredential-tags { - padding-left: 0px; -} - -.MultiCredential-bar i { - font-size: 16px; - color: @default-icon; -} - -.MultiCredential-flexContainer { - display: flex; - width: 100%; - flex-wrap: wrap; -} - -.MultiCredential-tagContainer { - display: flex; - max-width: 100%; - background-color: @default-link; - color: @default-bg; - border-radius: 5px; - padding: 0px 0px 0px 10px; - margin: 3px 10px 3px 0px; -} - -.MultiCredential-tagContainer--disabled { - background-color: @default-icon; -} - -.MultiCredential-tag { - font-size: 12px; - margin-right: 10px; - max-width: 100%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - padding: 2px 0px 2px 15px; -} - -.MultiCredential-tag--disabled { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - padding-left: 10px; -} - -.MultiCredential-tag--deletable { - margin-right: 0px; - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; - border-right: 0; - max-width: ~"calc(100% - 23px)"; - padding-left: 10px; -} - -.MultiCredential-deleteContainer { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; - padding: 2px 5px; - align-items: center; - display: flex; - cursor: pointer; -} - -.MultiCredential-tagDelete { - font-size: 11px; -} - -.MultiCredential-iconContainer { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - padding: 0px 5px; - margin: 3px 0px; - margin-left: -3px; - align-items: center; - display: flex; -} - -.MultiCredential-iconContainer--disabled { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - padding: 0 5px; - padding-left: 10px; - margin: 3px 0px; - align-items: center; - display: flex; -} - - -.MultiCredential-tagIcon { - margin: 0px 0px; - font-size: 12px; -} - -.MultiCredential-name { - flex: initial; - font-size: 12px; - max-width: 100%; -} - -.MultiCredential-name--label { - color: @default-list-header-bg; - font-size: 12px; - margin-left: -8px; - margin-right: 5px; -} - -.MultiCredential-tag--deletable > .MultiCredential-name { - max-width: ~"calc(100% - 23px)"; -} - -.MultiCredential-deleteContainer:hover { - border-color: @default-err; - background-color: @default-err!important; -} - -.MultiCredential-deleteContainer:hover > .MultiCredential-tagDelete { - color: @default-bg; -} - -.MultiCredential-credentialSubSection { - display: flex; - justify-content: flex-end; - align-items: center; - margin-bottom: 15px; -} - -.MultiCredential-credentialSubSection .select2 { - width: 50% !important; -} - -.MultiCredential-selectLabel { - color: @default-interface-txt; - margin-right: 10px; - line-height: 24px; - text-transform: uppercase; -} - -.MultiCredential-previewTagRevert { - flex: 0 0 60px; - line-height: 29px; - margin-left: auto; - text-align: right; -} - -.MultiCredential-revertLink { - font-size: 12px; -} diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.directive.js b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.directive.js deleted file mode 100644 index bca3e1e292..0000000000 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.directive.js +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************* - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ -const templatePath = 'templates/job_templates/multi-credential/multi-credential'; - -function MultiCredential ($compile, templateUrl) { - return { - templateUrl: templateUrl(templatePath), - require: ['multiCredential'], - restrict: 'E', - controllerAs: 'vm', - scope: { - selectedCredentials: '=', - prompt: '=', - credentialNotPresent: '=', - fieldIsDisabled: '=', - credentialTypes: '=', - }, - link: (scope, element, attrs, controllers) => { - const [controller] = controllers; - - scope.openModal = () => { - const containerElement = $('#content-container'); - const templateFunction = $compile(` - - `); - containerElement.append(templateFunction(scope)); - }; - - controller.init(scope); - }, - controller: multiCredentialController, - }; -} - -function multiCredentialController (MultiCredentialService) { - const vm = this; - const { createTag } = MultiCredentialService; - - let scope; - - vm.init = _scope_ => { - scope = _scope_; - scope.$watchCollection('selectedCredentials', onSelectedCredentialsChanged); - }; - - function onSelectedCredentialsChanged (oldValues, newValues) { - if (oldValues !== newValues) { - scope.fieldDirty = (scope.prompt && scope.selectedCredentials.length > 0); - scope.tags = scope.selectedCredentials.map(c => createTag(c, scope.credentialTypes)); - } - } - - vm.deselectCredential = ({ id }) => { - const index = scope.selectedCredentials.map(c => c.id).indexOf(id); - - if (index > -1) { - scope.selectedCredentials.splice(index, 1); - } - }; -} - -MultiCredential.$inject = ['$compile', 'templateUrl']; -multiCredentialController.$inject = ['MultiCredentialService']; - -export default MultiCredential; diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.partial.html b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.partial.html deleted file mode 100644 index 054d48a29c..0000000000 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.partial.html +++ /dev/null @@ -1,59 +0,0 @@ -
- - - - -
-
-
-
-
- - - - - - - -
-
- - - - - - - -
-
- - {{ tag.name }} - - - {{ tag.name }} | {{ tag.info }} - -
-
- -
-
-
-
-
-
-
diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.service.js b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.service.js deleted file mode 100644 index 5e90fa23a6..0000000000 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.service.js +++ /dev/null @@ -1,137 +0,0 @@ -function MultiCredentialService (Rest, ProcessErrors, $q, GetBasePath) { - - const handleError = (method, resource, permitted = []) => { - return ({ data, status }) => { - if (permitted.indexOf(status) > -1) { - return { data, status }; - } - const hdr = 'Error!'; - const msg = `${resource} request failed. ${method} returned status: ${status}`; - return ProcessErrors(null, data, status, null, { hdr, msg }); - }; - }; - - const associate = ({ related }, id) => { - Rest.setUrl(related.credentials); - return Rest - .post({ id }) - .then(({ data }) => data.results) - .catch(handleError('POST', 'credential association')); - }; - - const disassociate = ({ related }, id) => { - Rest.setUrl(related.credentials); - return Rest - .post({ id, disassociate: true }) - .catch(handleError('POST', 'credential disassociation')); - }; - - this.saveRelated = ({ related }, credentials) => { - Rest.setUrl(related.credentials); - return Rest - .get() - .then(({ data }) => { - const currentlyAssociated = data.results.map(c => c.id); - const selected = credentials.map(c => c.id); - - const disassociationPromises = currentlyAssociated - .filter(id => selected.indexOf(id) < 0) - .map(id => disassociate({ related }, id)); - - return $q.all(disassociationPromises).then(() => { - _.each(selected.filter(id => currentlyAssociated.indexOf(id) < 0), (id) => { - return associate({related}, id); - }); - }); - }); - }; - - this.saveRelatedSequentially = ({ related }, credentials) => { - Rest.setUrl(related.credentials); - return Rest - .get() - .then(res => { - const { data: { results = [] } } = res; - const updatedCredentialIds = (credentials || []).map(({ id }) => id); - const currentCredentialIds = results.map(({ id }) => id); - const credentialIdsToAssociate = []; - const credentialIdsToDisassociate = []; - let disassociateRemainingIds = false; - - currentCredentialIds.forEach((currentId, position) => { - if (!disassociateRemainingIds && updatedCredentialIds[position] !== currentId) { - disassociateRemainingIds = true; - } - - if (disassociateRemainingIds) { - credentialIdsToDisassociate.push(currentId); - } - }); - - updatedCredentialIds.forEach(updatedId => { - if (credentialIdsToDisassociate.includes(updatedId)) { - credentialIdsToAssociate.push(updatedId); - } else if (!currentCredentialIds.includes(updatedId)) { - credentialIdsToAssociate.push(updatedId); - } - }); - - let disassociationPromise = Promise.resolve(); - credentialIdsToDisassociate.forEach(id => { - disassociationPromise = disassociationPromise.then(() => disassociate({ related }, id)); - }); - - return disassociationPromise - .then(() => { - let associationPromise = Promise.resolve(); - credentialIdsToAssociate.forEach(id => { - associationPromise = associationPromise.then(() => associate({ related }, id)); - }); - return associationPromise; - }); - }); - }; - - this.getRelated = ({ related }, params = { permitted: [] }) => { - Rest.setUrl(related.credentials); - return Rest - .get() - .catch(handleError('GET', 'related credentials', params.permitted)); - }; - - this.getCredentials = () => { - Rest.setUrl(GetBasePath('credentials')); - return Rest - .get() - .catch(handleError('GET', 'related credentials')); - }; - - this.getCredentialTypes = () => { - Rest.setUrl(GetBasePath('credential_types')); - return Rest - .get({ params: { page_size: 200 }}) - .catch(handleError('GET', 'credential types')); - }; - - this.createTag = (credential, credential_types) => { - const credentialTypeId = credential.credential_type || credential.credential_type_id; - const credentialType = credential_types.find(t => t.id === credentialTypeId); - - return { - id: credential.id, - name: credential.name, - kind: _.get(credentialType, 'kind'), - typeName: _.get(credentialType, 'name'), - info: _.get(credential, 'inputs.vault_id') - }; - }; -} - -MultiCredentialService.$inject = [ - 'Rest', - 'ProcessErrors', - '$q', - 'GetBasePath', -]; - -export default MultiCredentialService; diff --git a/awx/ui/client/src/templates/job_templates/webhook-credential/index.js b/awx/ui/client/src/templates/job_templates/webhook-credential/index.js deleted file mode 100644 index 97b634463a..0000000000 --- a/awx/ui/client/src/templates/job_templates/webhook-credential/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import webhookCredentialInput from './webhook-credential-input.component'; - -export default angular.module('webhookCredential', []) - .component('webhookCredentialInput', webhookCredentialInput); diff --git a/awx/ui/client/src/templates/job_templates/webhook-credential/main.js b/awx/ui/client/src/templates/job_templates/webhook-credential/main.js deleted file mode 100644 index a91d79dbc6..0000000000 --- a/awx/ui/client/src/templates/job_templates/webhook-credential/main.js +++ /dev/null @@ -1,9 +0,0 @@ -import webhookCredential from './webhook-credential.directive'; -import webhookCredentialModal from './webhook-credential-modal.directive'; -import webhookCredentialService from './webhook-credential.service'; - -export default - angular.module('webhookCredential', []) - .directive('webhookCredential', webhookCredential) - .directive('webhookCredentialModal', webhookCredentialModal) - .service('WebhookCredentialService', webhookCredentialService); diff --git a/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential-input.component.js b/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential-input.component.js deleted file mode 100644 index 8f5d752948..0000000000 --- a/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential-input.component.js +++ /dev/null @@ -1,11 +0,0 @@ -const templateUrl = require('~src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html'); -export default { - templateUrl, - controllerAs: 'vm', - bindings: { - isFieldDisabled: '<', - tagName: '<', - onLookupClick: '<', - onTagDelete: '<', - }, -}; diff --git a/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html b/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html deleted file mode 100644 index 204739766f..0000000000 --- a/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html +++ /dev/null @@ -1,44 +0,0 @@ -
- - - - -
-
-
-
-
- -
-
- -
-
- - {{ vm.tagName }} - -
-
- -
-
-
-
-
-
-
diff --git a/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential.block.less b/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential.block.less deleted file mode 100644 index 24467c7d0f..0000000000 --- a/awx/ui/client/src/templates/job_templates/webhook-credential/webhook-credential.block.less +++ /dev/null @@ -1,113 +0,0 @@ -.WebhookCredential-tags { - padding-left: 0px; -} - -.WebhookCredential-flexContainer { - display: flex; - width: 100%; - flex-wrap: wrap; -} - -.WebhookCredential-tagContainer { - display: flex; - max-width: 100%; - background-color: @default-link; - color: @default-bg; - border-radius: 5px; - padding: 0px 0px 0px 10px; - margin: 3px 10px 3px 0px; -} - -.WebhookCredential-tagContainer--disabled { - background-color: @default-icon; -} - -.WebhookCredential-tag { - font-size: 12px; - margin-right: 10px; - max-width: 100%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - padding: 2px 0px 2px 15px; -} - -.WebhookCredential-tag--disabled { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - padding-left: 10px; -} - -.WebhookCredential-tag--deletable { - margin-right: 0px; - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; - border-right: 0; - max-width: ~"calc(100% - 23px)"; - padding-left: 10px; -} - -.WebhookCredential-deleteContainer { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; - padding: 2px 5px; - align-items: center; - display: flex; - cursor: pointer; -} - -.WebhookCredential-tagDelete { - font-size: 11px; -} - -.WebhookCredential-iconContainer { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - padding: 0px 5px; - margin: 3px 0px; - margin-left: -3px; - align-items: center; - display: flex; -} - -.WebhookCredential-iconContainer--disabled { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - padding: 0 5px; - padding-left: 10px; - margin: 3px 0px; - align-items: center; - display: flex; -} - - -.WebhookCredential-tagIcon { - margin: 0px 0px; - font-size: 12px; -} - -.WebhookCredential-name { - flex: initial; - font-size: 12px; - max-width: 100%; -} - -.WebhookCredential-name--label { - color: @default-list-header-bg; - font-size: 12px; - margin-left: -8px; - margin-right: 5px; -} - -.WebhookCredential-tag--deletable > .WebhookCredential-name { - max-width: ~"calc(100% - 23px)"; -} - -.WebhookCredential-deleteContainer:hover { - border-color: @default-err; - background-color: @default-err!important; -} - -.WebhookCredential-deleteContainer:hover > .WebhookCredential-tagDelete { - color: @default-bg; -} diff --git a/awx/ui/client/src/templates/labels/labelsList.block.less b/awx/ui/client/src/templates/labels/labelsList.block.less deleted file mode 100644 index 661a0545fb..0000000000 --- a/awx/ui/client/src/templates/labels/labelsList.block.less +++ /dev/null @@ -1,110 +0,0 @@ -/** @define LabelList */ - -.LabelList { - display: flex; - flex-wrap: wrap; - align-items: flex-start; -} - -.LabelList-tagContainer { - display: flex; - padding-bottom: 5px; -} - -.LabelList-tagContainer { - max-width: 200px; -} - -.LabelList-tag, .JobSubmission-previewTag { - background-color: @default-list-header-bg; - border-radius: 5px; - color: @default-interface-txt; - display: inline-block; - font-size: 12px; - margin-right: 5px; - max-width: 100%; - padding: 2px 10px; -} - -.LabelList-seeMoreLess { - color: @default-link; - margin: 4px 0px; - text-transform: uppercase; - padding: 2px 0px; - cursor: pointer; - border-radius: 5px; - font-size: 11px; - display: inherit; -} - -.LabelList-seeMoreLess:hover { - color: @default-link-hov; -} - -.LabelList-tag--deletable, .JobSubmission-previewTag--deletable, .Prompt-previewTag--deletable { - color: @default-bg; - background-color: @default-link; - margin-right: 0px; - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; - border-right: 0; - max-width: ~"calc(100% - 23px)"; -} - -.LabelList-deleteContainer, .JobSubmission-previewTagContainerDelete, .Prompt-previewTagContainerDelete { - background-color: @default-link; - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; - color: @default-bg; - padding: 0 5px; - align-items: center; - display: flex; - cursor: pointer; - margin-right: 5px; -} - -.LabelList-tagDelete { - font-size: 13px; - color: @default-bg; -} - -.LabelList-name { - flex: initial; - max-width: 100%; -} - -.LabelList-tag--deletable > .LabelList-name { - max-width: ~"calc(100% - 23px)"; -} - -.LabelList-deleteContainer:hover, .JobSubmission-previewTagContainerDelete:hover, .Prompt-previewTagContainerDelete:hover { - border-color: @default-err; - background-color: @default-err; -} - -.LabelList-deleteContainer:hover > .LabelList-tagDelete, .JobSubmission-previewTagContainerDelete:hover > .JobSubmission-previewTagContainerTagDelete, .Prompt-previewTagContainerDelete:hover > .Prompt-previewTagContainerTagDelete { - color: @default-bg; -} - -.LabelList-lookupTags { - display: flex; - padding: 0 12px; -} - -.LabelList-lookupTags--disabled { - cursor: not-allowed; - background-color: @default-list-header-bg; - .LabelList-tag { - background-color: @default-icon; - color: @default-bg; - margin: 4px 5px 5px 5px; - } -} - -.JobSubmission-previewTagContainer--vault{ - flex: 1 0 auto; -} - -.JobSubmission-previewTag--vault{ - border-radius: 5px; -} diff --git a/awx/ui/client/src/templates/labels/labelsList.directive.js b/awx/ui/client/src/templates/labels/labelsList.directive.js deleted file mode 100644 index 158343babd..0000000000 --- a/awx/ui/client/src/templates/labels/labelsList.directive.js +++ /dev/null @@ -1,121 +0,0 @@ -/* jshint unused: vars */ -export default - [ 'templateUrl', - 'Wait', - 'Rest', - 'GetBasePath', - 'ProcessErrors', - 'Prompt', - '$q', - '$filter', - '$state', - 'i18n', - function(templateUrl, Wait, Rest, GetBasePath, ProcessErrors, Prompt, $q, $filter, $state, i18n) { - return { - restrict: 'E', - scope: { - state: '=' - }, - templateUrl: templateUrl('templates/labels/labelsList'), - link: function(scope, element, attrs) { - scope.showDelete = attrs.showDelete === 'true'; - scope.isRowItem = attrs.isRowItem === 'true'; - scope.seeMoreInactive = true; - - var getNext = function(data, arr, resolve) { - Rest.setUrl(data.next); - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, arr.concat(data.results), resolve); - } else { - resolve.resolve(arr.concat(data.results)); - } - }); - }; - - scope.seeMore = function () { - var seeMoreResolve = $q.defer(); - if (scope.state) { - Rest.setUrl(scope.state.related.labels); - } - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, data.results, seeMoreResolve); - } else { - seeMoreResolve.resolve(data.results); - } - }); - - seeMoreResolve.promise.then(function (labels) { - scope.labels = labels; - scope.seeMoreInactive = false; - }); - }; - - scope.seeLess = function() { - // Trim the labels array back down to 10 items - scope.labels = scope.labels.slice(0, 5); - // Re-set the seeMoreInteractive flag so that the "See More" will be displayed - scope.seeMoreInactive = true; - }; - - scope.deleteLabel = function(template, label) { - var action = function () { - $('#prompt-modal').modal('hide'); - scope.seeMoreInactive = true; - Wait('start'); - let url; - if(template.type === 'job_template') { - url = GetBasePath("job_templates") + template.id + "/labels/"; - } - else if(template.type === 'workflow_job_template') { - url = GetBasePath("workflow_job_templates") + template.id + "/labels/"; - } - - if(url) { - Rest.setUrl(url); - Rest.post({"disassociate": true, "id": label.id}) - .then(() => { - Wait('stop'); - $state.go('.', null, {reload: true}); - }) - .catch(({data, status}) => { - Wait('stop'); - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Could not disassociate label from JT. Call to ' + url + ' failed. DELETE returned status: ' + status }); - }); - } - }; - - Prompt({ - hdr: i18n._('Remove Label from ') + template.name, - body: '
Confirm the removal of the ' + $filter('sanitize')(label.name) + ' label.
', - action: action, - actionText: i18n._('REMOVE') - }); - }; - - if (_.has(scope.state, 'summary_fields.labels.results')) { - scope.labels = scope.state.summary_fields.labels.results.slice(0, 5); - scope.count = scope.state.summary_fields.labels.count; - } else { - scope.$watchCollection(scope.state, function() { - // To keep the array of labels fresh, we need to set up a watcher - otherwise, the - // array will get set initially and then never be updated as labels are removed - if (scope.state.summary_fields.labels){ - scope.labels = scope.state.summary_fields.labels.results.slice(0, 5); - scope.count = scope.state.summary_fields.labels.count; - } - else{ - scope.labels = null; - scope.count = null; - } - }); - } - - } - }; - } - ]; diff --git a/awx/ui/client/src/templates/labels/labelsList.partial.html b/awx/ui/client/src/templates/labels/labelsList.partial.html deleted file mode 100644 index fce351f800..0000000000 --- a/awx/ui/client/src/templates/labels/labelsList.partial.html +++ /dev/null @@ -1,35 +0,0 @@ -
-
- -
-
- {{ label.name }} -
-
-
View More
-
View Less
-
-
- Labels -
-
-
-
- {{ label.name }} -
-
- -
-
-
View More
-
View Less
-
-
diff --git a/awx/ui/client/src/templates/labels/main.js b/awx/ui/client/src/templates/labels/main.js deleted file mode 100644 index 6d325ff42c..0000000000 --- a/awx/ui/client/src/templates/labels/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import labelsList from './labelsList.directive'; - -export default - angular.module('labels', []) - .directive('labelsList', labelsList); diff --git a/awx/ui/client/src/templates/main.js b/awx/ui/client/src/templates/main.js deleted file mode 100644 index fb4dab309a..0000000000 --- a/awx/ui/client/src/templates/main.js +++ /dev/null @@ -1,575 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import templatesService from './templates.service'; -import surveyMaker from './survey-maker/main'; -import jobTemplates from './job_templates/main'; -import workflowAdd from './workflows/add-workflow/main'; -import workflowEdit from './workflows/edit-workflow/main'; -import labels from './labels/main'; -import prompt from './prompt/main'; -import workflowChart from './workflows/workflow-chart/main'; -import workflowKey from './workflows/workflow-key/main'; -import workflowMaker from './workflows/workflow-maker/main'; -import workflowControls from './workflows/workflow-controls/main'; -import WorkflowForm from './workflows.form'; -import InventorySourcesList from './inventory-sources.list'; -import TemplateList from './templates.list'; -import listRoute from '~features/templates/routes/templatesList.route.js'; -import templateCompletedJobsRoute from '~features/jobs/routes/templateCompletedJobs.route.js'; -import workflowJobTemplateCompletedJobsRoute from '~features/jobs/routes/workflowJobTemplateCompletedJobs.route.js'; -import { - jobTemplatesSchedulesListRoute, - jobTemplatesSchedulesAddRoute, - jobTemplatesSchedulesEditRoute, - workflowSchedulesRoute, - workflowSchedulesAddRoute, - workflowSchedulesEditRoute -} from '../scheduler/schedules.route'; - -export default -angular.module('templates', [surveyMaker.name, jobTemplates.name, labels.name, prompt.name, workflowAdd.name, workflowEdit.name, - workflowChart.name, workflowKey.name, workflowMaker.name, workflowControls.name - ]) - .service('TemplatesService', templatesService) - .factory('WorkflowForm', WorkflowForm) - // TODO: currently being kept arround for rbac selection, templates within projects and orgs, etc. - .factory('TemplateList', TemplateList) - .value('InventorySourcesList', InventorySourcesList) - .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', - function($stateProvider, stateDefinitionsProvider, $stateExtenderProvider) { - let stateTree, addJobTemplate, editJobTemplate, addWorkflow, editWorkflow, - workflowMaker, - stateDefinitions = stateDefinitionsProvider.$get(), - stateExtender = $stateExtenderProvider.$get(); - - function generateStateTree() { - - addJobTemplate = stateDefinitions.generateTree({ - name: 'templates.addJobTemplate', - url: '/add_job_template?inventory_id&credential_id&project_id', - modes: ['add'], - form: 'JobTemplateForm', - controllers: { - add: 'JobTemplateAdd' - }, - resolve: { - add: { - Inventory: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', 'i18n', - function($stateParams, Rest, GetBasePath, ProcessErrors, i18n){ - if($stateParams.inventory_id){ - let path = `${GetBasePath('inventory')}${$stateParams.inventory_id}`; - Rest.setUrl(path); - return Rest.get(). - then(function(data){ - return data.data; - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get inventory info. GET returned status: ') + - response.status - }); - }); - } - }], - Project: ['Rest', 'GetBasePath', 'ProcessErrors', '$transition$', 'i18n', - function(Rest, GetBasePath, ProcessErrors, $transition$, i18n){ - if($transition$.params().credential_id){ - let path = `${GetBasePath('projects')}?credential__id=${Number($transition$.params().credential_id)}`; - Rest.setUrl(path); - return Rest.get(). - then(function(data){ - return data.data.results[0]; - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get project info. GET returned status: ') + - response.status - }); - }); - } - else if($transition$.params().project_id){ - let path = `${GetBasePath('projects')}${$transition$.params().project_id}`; - Rest.setUrl(path); - return Rest.get(). - then(function(data){ - return data.data; - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get project info. GET returned status: ') + - response.status - }); - }); - } - }], - availableLabels: ['ProcessErrors', 'TemplatesService', 'i18n', - function(ProcessErrors, TemplatesService, i18n) { - return TemplatesService.getAllLabelOptions() - .then(function(labels){ - return labels; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get labels. GET returned status: ') + - response.status - }); - }); - }], - checkPermissions: ['TemplatesService', 'Alert', 'ProcessErrors', '$state', 'i18n', - function(TemplatesService, Alert, ProcessErrors, $state, i18n) { - return TemplatesService.getJobTemplateOptions() - .then(function(data) { - if (!data.actions.POST) { - $state.go("^"); - Alert(i18n._('Permission Error'), i18n._('You do not have permission to add a job template, or there are no projects available.'), 'alert-info'); - } - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get job template options. OPTIONS returned status: ') + - response.status - }); - }); - }], - ConfigData: ['ConfigService', 'ProcessErrors', 'i18n', (ConfigService, ProcessErrors, i18n) => { - return ConfigService.getConfig() - .then(response => response) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get config. GET returned status: ') + status - }); - }); - }] - } - } - }); - - editJobTemplate = stateDefinitions.generateTree({ - name: 'templates.editJobTemplate', - url: '/job_template/:job_template_id', - modes: ['edit'], - form: 'JobTemplateForm', - controllers: { - edit: 'JobTemplateEdit' - }, - data: { - activityStream: true, - activityStreamTarget: 'job_template', - activityStreamId: 'job_template_id' - }, - breadcrumbs: { - edit: '{{breadcrumb.job_template_name}}' - }, - resolve: { - edit: { - jobTemplateData: ['$stateParams', 'TemplatesService', 'ProcessErrors', 'i18n', - function($stateParams, TemplatesService, ProcessErrors, i18n) { - return TemplatesService.getJobTemplate($stateParams.job_template_id) - .then(function(res) { - return res.data; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get job template. GET returned status: ') + - response.status - }); - }); - }], - projectGetPermissionDenied: ['Rest', 'ProcessErrors', 'jobTemplateData', 'i18n', - function(Rest, ProcessErrors, jobTemplateData, i18n) { - if(jobTemplateData.related.project) { - Rest.setUrl(jobTemplateData.related.project); - return Rest.get() - .then(() => { - return false; - }) - .catch(({data, status}) => { - if (status !== 403) { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get project. GET returned status: ') + status - }); - return false; - } - else { - return true; - } - }); - } - else { - return false; - } - }], - inventoryGetPermissionDenied: ['Rest', 'ProcessErrors', 'jobTemplateData', 'i18n', - function(Rest, ProcessErrors, jobTemplateData, i18n) { - if(jobTemplateData.related.inventory) { - Rest.setUrl(jobTemplateData.related.inventory); - return Rest.get() - .then(() => { - return false; - }) - .catch(({data, status}) => { - if (status !== 403) { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get project. GET returned status: ') + status - }); - return false; - } - else { - return true; - } - }); - } - else { - return false; - } - }], - InstanceGroupsData: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', 'i18n', - function($stateParams, Rest, GetBasePath, ProcessErrors, i18n){ - let path = `${GetBasePath('job_templates')}${$stateParams.job_template_id}/instance_groups/`; - Rest.setUrl(path); - return Rest.get() - .then(({data}) => { - if (data.results.length > 0) { - return data.results; - } - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get instance groups. GET returned status: ') + status - }); - }); - }], - availableLabels: ['ProcessErrors', 'TemplatesService', 'i18n', - function(ProcessErrors, TemplatesService, i18n) { - return TemplatesService.getAllLabelOptions() - .then(function(labels){ - return labels; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get labels. GET returned status: ') + - response.status - }); - }); - }], - selectedLabels: ['$stateParams', 'TemplatesService', 'ProcessErrors', 'i18n', - function($stateParams, TemplatesService, ProcessErrors, i18n) { - return TemplatesService.getAllJobTemplateLabels($stateParams.job_template_id) - .then(function(labels){ - return labels; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get workflow job template labels. GET returned status: ') + - response.status - }); - }); - }], - ConfigData: ['ConfigService', 'ProcessErrors', 'i18n', (ConfigService, ProcessErrors, i18n) => { - return ConfigService.getConfig() - .then(response => response) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get config. GET returned status: ') + status - }); - }); - }], - isNotificationAdmin: ['Rest', 'ProcessErrors', 'GetBasePath', 'i18n', - function(Rest, ProcessErrors, GetBasePath, i18n) { - Rest.setUrl(`${GetBasePath('organizations')}?role_level=notification_admin_role&page_size=1`); - return Rest.get() - .then(({data}) => { - return data.count > 0; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get organizations for which this user is a notification administrator. GET returned ') + status - }); - }); - }], - webhookKey: ['Rest', 'ProcessErrors', 'jobTemplateData', 'i18n', - function(Rest, ProcessErrors, jobTemplateData, i18n) { - Rest.setUrl(jobTemplateData.related.webhook_key); - return Rest.get() - .then(({ data = {} }) => { - return data.webhook_key || ''; - }) - .catch(({data, status}) => { - if (status === 403) { - return; - } - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get webhook key GET returned ') + status - }); - }); - }], - } - } - }); - - addWorkflow = stateDefinitions.generateTree({ - name: 'templates.addWorkflowJobTemplate', - url: '/add_workflow_job_template', - modes: ['add'], - form: 'WorkflowForm', - controllers: { - add: 'WorkflowAdd' - }, - resolve: { - add: { - Inventory: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', 'i18n', - function($stateParams, Rest, GetBasePath, ProcessErrors, i18n){ - if($stateParams.inventory_id){ - let path = `${GetBasePath('inventory')}${$stateParams.inventory_id}`; - Rest.setUrl(path); - return Rest.get(). - then(function(data){ - return data.data; - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get inventory info. GET returned status: ') + - response.status - }); - }); - } - }], - availableLabels: ['ProcessErrors', 'TemplatesService', 'i18n', - function(ProcessErrors, TemplatesService, i18n) { - return TemplatesService.getAllLabelOptions() - .then(function(labels){ - return labels; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get labels. GET returned status: ') + - response.status - }); - }); - }], - checkPermissions: ['TemplatesService', 'Alert', 'ProcessErrors', '$state', 'i18n', - function(TemplatesService, Alert, ProcessErrors, $state, i18n) { - return TemplatesService.getWorkflowJobTemplateOptions() - .then(function(data) { - if (!data.actions.POST) { - $state.go("^"); - Alert(i18n._('Permission Error'), i18n._('You do not have permission to add a workflow job template.'), 'alert-info'); - } - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get workflow job template options. OPTIONS returned status: ') + - response.status - }); - }); - }] - } - } - }); - - editWorkflow = stateDefinitions.generateTree({ - name: 'templates.editWorkflowJobTemplate', - url: '/workflow_job_template/:workflow_job_template_id', - modes: ['edit'], - form: 'WorkflowForm', - controllers: { - edit: 'WorkflowEdit' - }, - data: { - activityStream: true, - activityStreamTarget: 'workflow_job_template', - activityStreamId: 'workflow_job_template_id' - }, - breadcrumbs: { - edit: '{{breadcrumb.workflow_job_template_name}}' - }, - resolve: { - edit: { - Inventory: ['$stateParams', 'Rest', 'GetBasePath', 'ProcessErrors', 'i18n', - function($stateParams, Rest, GetBasePath, ProcessErrors, i18n){ - if($stateParams.inventory_id){ - let path = `${GetBasePath('inventory')}${$stateParams.inventory_id}`; - Rest.setUrl(path); - return Rest.get(). - then(function(data){ - return data.data; - }).catch(function(response) { - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get inventory info. GET returned status: ') + - response.status - }); - }); - } - }], - availableLabels: ['ProcessErrors', 'TemplatesService', 'i18n', - function(ProcessErrors, TemplatesService, i18n) { - return TemplatesService.getAllLabelOptions() - .then(function(labels){ - return labels; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get labels. GET returned status: ') + - response.status - }); - }); - }], - selectedLabels: ['$stateParams', 'TemplatesService', 'ProcessErrors', 'i18n', - function($stateParams, TemplatesService, ProcessErrors, i18n) { - return TemplatesService.getAllWorkflowJobTemplateLabels($stateParams.workflow_job_template_id) - .then(function(labels){ - return labels; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get workflow job template labels. GET returned status: ') + - response.status - }); - }); - }], - workflowJobTemplateData: ['$stateParams', 'TemplatesService', 'ProcessErrors', 'i18n', - function($stateParams, TemplatesService, ProcessErrors, i18n) { - return TemplatesService.getWorkflowJobTemplate($stateParams.workflow_job_template_id) - .then(function(res) { - return res.data; - }).catch(function(response){ - ProcessErrors(null, response.data, response.status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get workflow job template. GET returned status: ') + - response.status - }); - }); - }], - workflowLaunch: ['$stateParams', 'WorkflowJobTemplateModel', - function($stateParams, WorkflowJobTemplate) { - let workflowJobTemplate = new WorkflowJobTemplate(); - - return workflowJobTemplate.getLaunch($stateParams.workflow_job_template_id) - .then(({data}) => { - return data; - }); - }], - isNotificationAdmin: ['Rest', 'ProcessErrors', 'GetBasePath', 'i18n', - function(Rest, ProcessErrors, GetBasePath, i18n) { - Rest.setUrl(`${GetBasePath('organizations')}?role_level=notification_admin_role&page_size=1`); - return Rest.get() - .then(({data}) => { - return data.count > 0; - }) - .catch(({data, status}) => { - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get organizations for which this user is a notification administrator. GET returned ') + status - }); - }); - }], - webhookKey: ['Rest', 'ProcessErrors', 'workflowJobTemplateData', 'i18n', - function(Rest, ProcessErrors, workflowJobTemplateData, i18n) { - Rest.setUrl(workflowJobTemplateData.related.webhook_key); - return Rest.get() - .then(({ data = {} }) => { - return data.webhook_key || ''; - }) - .catch(({data, status}) => { - if (status === 403) { - return; - } - ProcessErrors(null, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n._('Failed to get webhook key GET returned ') + status - }); - }); - }], - } - } - }); - - workflowMaker = { - name: 'templates.editWorkflowJobTemplate.workflowMaker', - url: '/workflow-maker', - data: { - formChildState: true - }, - params: { - wf_maker_template_search: { - value: { - order_by: 'name', - page_size: '10', - role_level: 'execute_role', - type: 'workflow_job_template,job_template' - }, - squash: false, - dynamic: true - }, - wf_maker_project_search: { - value: { - order_by: 'name', - page_size: '10' - }, - squash: true, - dynamic: true - }, - wf_maker_inventory_source_search: { - value: { - not__source: '', - order_by: 'name', - page_size: '10' - }, - squash: true, - dynamic: true - } - }, - views: { - 'modal': { - template: `` - } - } - }; - - return Promise.all([ - addJobTemplate, - editJobTemplate, - addWorkflow, - editWorkflow - ]).then((generated) => { - return { - states: _.reduce(generated, (result, definition) => { - return result.concat(definition.states); - }, [ - stateExtender.buildDefinition(listRoute), - stateExtender.buildDefinition(templateCompletedJobsRoute), - stateExtender.buildDefinition(workflowJobTemplateCompletedJobsRoute), - stateExtender.buildDefinition(workflowMaker), - stateExtender.buildDefinition(jobTemplatesSchedulesListRoute), - stateExtender.buildDefinition(jobTemplatesSchedulesAddRoute), - stateExtender.buildDefinition(jobTemplatesSchedulesEditRoute), - stateExtender.buildDefinition(workflowSchedulesRoute), - stateExtender.buildDefinition(workflowSchedulesAddRoute), - stateExtender.buildDefinition(workflowSchedulesEditRoute) - ]) - }; - }); - } - - stateTree = { - name: 'templates.**', - url: '/templates', - lazyLoad: () => generateStateTree() - }; - - $stateProvider.state(stateTree); - - } - ]); \ No newline at end of file diff --git a/awx/ui/client/src/templates/prompt/main.js b/awx/ui/client/src/templates/prompt/main.js deleted file mode 100644 index dd97c78cf1..0000000000 --- a/awx/ui/client/src/templates/prompt/main.js +++ /dev/null @@ -1,17 +0,0 @@ -import promptDirective from './prompt.directive'; -import promptInventory from './steps/inventory/prompt-inventory.directive'; -import promptCredential from './steps/credential/prompt-credential.directive'; -import promptOtherPrompts from './steps/other-prompts/prompt-other-prompts.directive'; -import promptSurvey from './steps/survey/prompt-survey.directive'; -import promptPreview from './steps/preview/prompt-preview.directive'; -import promptService from './prompt.service'; - -export default - angular.module('prompt', []) - .directive('prompt', promptDirective) - .directive('promptInventory', promptInventory) - .directive('promptCredential', promptCredential) - .directive('promptOtherPrompts', promptOtherPrompts) - .directive('promptSurvey', promptSurvey) - .directive('promptPreview', promptPreview) - .service('PromptService', promptService); diff --git a/awx/ui/client/src/templates/prompt/prompt.block.less b/awx/ui/client/src/templates/prompt/prompt.block.less deleted file mode 100644 index 6dcef1de70..0000000000 --- a/awx/ui/client/src/templates/prompt/prompt.block.less +++ /dev/null @@ -1,185 +0,0 @@ -.Prompt .modal-dialog { - max-width: calc(100vw - 10px); - width: 700px -} -.Prompt-step { - margin-top: 20px; -} -.Prompt-footer { - display: flex; - flex: 0 0 auto; - flex-wrap: wrap; - margin-top: 15px; - justify-content: flex-end; - align-items: flex-end; -} -.Prompt-actionButton { - background-color: @submit-button-bg; - border: 1px solid @submit-button-bg; - color: @submit-button-text; - text-transform: uppercase; - border-radius: 5px; - height: 30px; - padding-left:15px; - padding-right: 15px; - margin: 10px 0; - min-width: 85px; - margin-left: 20px; -} -.Prompt-actionButton:disabled { - background-color: @d7grey; - border-color: @d7grey; - opacity: 0.65; -} -.Prompt-actionButton:enabled:hover, -.Prompt-actionButton:enabled:focus { - background-color: @submit-button-bg-hov; - border: 1px solid @submit-button-bg-hov; -} -.Prompt-defaultButton{ - background-color: @default-bg; - color: @btn-txt; - text-transform: uppercase; - border-radius: 5px; - border: 1px solid @btn-bord; - padding-left:15px; - padding-right: 15px; - margin: 10px 0; - height: 30px; - min-width: 85px; -} -.Prompt-defaultButton:hover{ - background-color: @btn-bg-hov; - color: @btn-txt; -} -.Prompt-revertLink { - font-size: 12px; -} - -.Prompt-selectedItem { - display: flex; - flex: 1 0 auto; - align-items: baseline; -} -.Prompt-selectedItemInfo { - display: flex; - flex: 0 0 100%; - background-color: @default-no-items-bord; - border: 1px solid @default-border; - padding: 10px; - border-radius: 5px; - margin-bottom: 20px; -} -.Prompt-selectedItemRevert { - display: flex; - flex: 0 0 auto; -} -.Prompt-credentialSubSection { - display: flex; - justify-content: flex-end; - align-items: center; - margin-bottom: 15px; -} -.Prompt-selectedItemLabel, .Prompt-label { - color: @default-interface-txt; - margin-right: 10px; -} -.Prompt-label { - line-height: 24px; -} -.Prompt-selectedItemNone { - color: @default-icon; -} -.Prompt-selectedItemContainer { - display: block; - width: 100%; -} -.Prompt-instructions { - color: @default-interface-txt; - margin-top: 25px; - margin-bottom: 15px; -} -.Prompt-passwordButton { - padding: 4px 13px; -} -.Prompt .List-noItems { - margin-top: auto; -} -.Prompt-selectedItemLabel { - flex: 0 0 80px; - line-height: 29px; -} -.Prompt-previewTags--outer { - display: flex; - flex: 1 0 auto; - width: ~"calc(100% - 140px)"; -} -.Prompt-previewTags--inner { - display: flex; - flex-wrap: wrap; - align-items: flex-start; -} -.Prompt-previewTagLabel { - color: @default-interface-txt; -} -.Prompt-previewTagLabel--deletable{ - color: @default-list-header-bg; -} -.Prompt-previewTagRevert { - display: flex; - align-items: center; - justify-content: center; -} -.Prompt-previewTagContainer { - display: flex; - flex-flow: row wrap; -} -.Prompt-previewRow--flex { - display: flex; - margin-bottom: 10px; -} -.Prompt-previewRow--noflex { - margin-bottom: 10px; -} -.Prompt-previewRowTitle { - width: 150px; - color: @default-interface-txt; - text-transform: uppercase; -} -.Prompt-previewRowValue { - max-width: 508px; - display: flex; - flex-wrap: wrap; - align-items: flex-start; -} -.Prompt-noSelectedItem { - height: 30px; - line-height: 30px; - font-style: italic; - color: @default-interface-txt; -} -.Prompt-previewTag { - border-radius: 5px; - padding: 2px 10px; - margin: 3px 0px; - font-size: 12px; - color: @default-bg; - background-color: @default-link; - margin-right: 5px; - max-width: 100%; - display: inline-block; -} -.Prompt-credentialSubSection .select2 { - width: 50% !important; -} -.Prompt-credentialTypeMissing { - margin-bottom: 20px; - color: @default-err; -} -.Prompt-credsWarning { - margin-bottom: 5px; - color: @default-err; -} -.Prompt-credsWarningList { - margin-bottom: 20px; -} diff --git a/awx/ui/client/src/templates/prompt/prompt.controller.js b/awx/ui/client/src/templates/prompt/prompt.controller.js deleted file mode 100644 index f923c8018e..0000000000 --- a/awx/ui/client/src/templates/prompt/prompt.controller.js +++ /dev/null @@ -1,361 +0,0 @@ -export default [ 'ProcessErrors', 'CredentialTypeModel', 'TemplatesStrings', '$filter', - function (ProcessErrors, CredentialType, strings, $filter) { - - const vm = this || {}; - - vm.strings = strings; - - let scope; - let modal; - let activeTab; - - vm.init = (_scope_) => { - scope = _scope_; - ({ modal } = scope[scope.ns]); - - scope.$watch('vm.promptData.triggerModalOpen', () => { - vm.actionButtonClicked = false; - if(vm.promptData && vm.promptData.triggerModalOpen) { - scope.$emit('launchModalOpen', true); - vm.promptDataClone = _.cloneDeep(vm.promptData); - - vm.steps = { - inventory: { - includeStep: false - }, - credential: { - includeStep: false - }, - other_prompts: { - includeStep: false - }, - survey: { - includeStep: false - }, - preview: { - includeStep: true, - tab: { - _active: false, - _disabled: true - } - } - }; - - let order = 1; - - vm.actionText = vm.actionText ? vm.actionText : strings.get('prompt.LAUNCH'); - - vm.forms = {}; - - let credentialType = new CredentialType(); - - credentialType.http.get({ params: { page_size: 200 }}) - .then( (response) => { - vm.promptDataClone.prompts.credentials.credentialTypes = {}; - vm.promptDataClone.prompts.credentials.credentialTypeOptions = []; - response.data.results.forEach((credentialTypeRow => { - vm.promptDataClone.prompts.credentials.credentialTypes[credentialTypeRow.id] = credentialTypeRow.kind; - if(credentialTypeRow.kind.match(/^(cloud|net|ssh|vault|kubernetes)$/)) { - if(credentialTypeRow.kind === 'ssh') { - vm.promptDataClone.prompts.credentials.credentialKind = credentialTypeRow.id.toString(); - } - vm.promptDataClone.prompts.credentials.credentialTypeOptions.push({ - name: credentialTypeRow.name, - value: credentialTypeRow.id - }); - } - })); - - vm.promptDataClone.prompts.credentials.passwords = {}; - - vm.promptDataClone.prompts.credentials.value.forEach((credential) => { - if(credential.inputs) { - if(credential.inputs.password && credential.inputs.password === "ASK") { - vm.promptDataClone.prompts.credentials.passwords.ssh_password = { - id: credential.id, - name: credential.name - }; - } - if(credential.inputs.become_password && credential.inputs.become_password === "ASK") { - vm.promptDataClone.prompts.credentials.passwords.become_password = { - id: credential.id, - name: credential.name - }; - } - if(credential.inputs.ssh_key_unlock && credential.inputs.ssh_key_unlock === "ASK") { - vm.promptDataClone.prompts.credentials.passwords.ssh_key_unlock = { - id: credential.id, - name: credential.name - }; - } - if(credential.inputs.vault_password && credential.inputs.vault_password === "ASK") { - if(!vm.promptDataClone.prompts.credentials.passwords.vault) { - vm.promptDataClone.prompts.credentials.passwords.vault = []; - } - vm.promptDataClone.prompts.credentials.passwords.vault.push({ - id: credential.id, - name: credential.name, - vault_id: credential.inputs.vault_id - }); - } - } else if(credential.passwords_needed && credential.passwords_needed.length > 0) { - credential.passwords_needed.forEach((passwordNeeded) => { - if (passwordNeeded === "ssh_password" || - passwordNeeded === "become_password" || - passwordNeeded === "ssh_key_unlock" - ) { - vm.promptDataClone.prompts.credentials.passwords[passwordNeeded] = { - id: credential.id, - name: credential.name - }; - } else if (passwordNeeded.startsWith("vault_password")) { - let vault_id = null; - if (passwordNeeded.includes('.')) { - vault_id = passwordNeeded.split(/\.(.+)/)[1]; - } - - if (!vm.promptDataClone.prompts.credentials.passwords.vault) { - vm.promptDataClone.prompts.credentials.passwords.vault = []; - } - - vm.promptDataClone.prompts.credentials.passwords.vault.push({ - id: credential.id, - name: credential.name, - vault_id: vault_id - }); - } - }); - } - }); - - vm.promptDataClone.credentialTypeMissing = []; - - vm.promptDataClone.prompts.variables.ignore = vm.promptDataClone.launchConf.ignore_ask_variables; - - if(vm.promptDataClone.launchConf.ask_inventory_on_launch) { - vm.steps.inventory.includeStep = true; - vm.steps.inventory.tab = { - _active: true, - order: order - }; - activeTab = activeTab || vm.steps.inventory.tab; - order++; - } - if (vm.promptDataClone.launchConf.ask_credential_on_launch || - (_.has(vm, 'promptDataClone.prompts.credentials.passwords.vault') && - vm.promptDataClone.prompts.credentials.passwords.vault.length > 0) || - _.has(vm, 'promptDataClone.prompts.credentials.passwords.ssh_key_unlock') || - _.has(vm, 'promptDataClone.prompts.credentials.passwords.become_password') || - _.has(vm, 'promptDataClone.prompts.credentials.passwords.ssh_password') - ) { - vm.steps.credential.includeStep = true; - vm.steps.credential.tab = { - _active: order === 1 ? true : false, - _disabled: (order === 1 || vm.readOnlyPrompts) ? false : true, - order: order - }; - activeTab = activeTab || vm.steps.credential.tab; - order++; - } - if(vm.promptDataClone.launchConf.ask_verbosity_on_launch || vm.promptDataClone.launchConf.ask_job_type_on_launch || vm.promptDataClone.launchConf.ask_limit_on_launch || vm.promptDataClone.launchConf.ask_tags_on_launch || vm.promptDataClone.launchConf.ask_skip_tags_on_launch || (vm.promptDataClone.launchConf.ask_variables_on_launch && !vm.promptDataClone.launchConf.ignore_ask_variables) || vm.promptDataClone.launchConf.ask_diff_mode_on_launch || vm.promptDataClone.launchConf.ask_scm_branch_on_launch) { - vm.steps.other_prompts.includeStep = true; - vm.steps.other_prompts.tab = { - _active: order === 1 ? true : false, - _disabled: (order === 1 || vm.readOnlyPrompts) ? false : true, - order: order - }; - activeTab = activeTab || vm.steps.other_prompts.tab; - order++; - - let codemirror = () => { - return { - validate:{} - }; - }; - vm.codeMirror = new codemirror(); - } - if(vm.promptDataClone.launchConf.survey_enabled) { - vm.steps.survey.includeStep = true; - vm.steps.survey.tab = { - _active: order === 1 ? true : false, - _disabled: (order === 1 || vm.readOnlyPrompts) ? false : true, - order: order - }; - activeTab = activeTab || vm.steps.survey.tab; - order++; - } - vm.steps.preview.tab.order = order; - vm.steps.preview.tab._disabled = vm.readOnlyPrompts ? false : true; - modal.show($filter('sanitize')(vm.promptDataClone.templateName)); - vm.promptData.triggerModalOpen = false; - - vm._savedPromptData = { - 1: _.cloneDeep(vm.promptDataClone) - }; - Object.keys(vm.steps).forEach(step => { - if (!vm.steps[step].tab) { - return; - } - vm.steps[step].tab._onClickActivate = () => { - if (vm._savedPromptData[vm.steps[step].tab.order]) { - vm.promptDataClone = vm._savedPromptData[vm.steps[step].tab.order]; - } - Object.keys(vm.steps).forEach(tabStep => { - if (!vm.steps[tabStep].tab) { - return; - } - if (vm.steps[tabStep].tab.order < vm.steps[step].tab.order) { - vm.steps[tabStep].tab._disabled = false; - vm.steps[tabStep].tab._active = false; - } else if (vm.steps[tabStep].tab.order === vm.steps[step].tab.order) { - vm.steps[tabStep].tab._disabled = false; - vm.steps[tabStep].tab._active = true; - } else { - vm.steps[tabStep].tab._disabled = true; - vm.steps[tabStep].tab._active = false; - } - }); - scope.$broadcast('promptTabChange', { step }); - }; - }); - - modal.onClose = () => { - scope.$emit('launchModalOpen', false); - }; - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { - hdr: 'Error!', - msg: 'Failed to get credential types. GET status: ' + status - }); - }); - } - }, true); - }; - - function getSelectedTags(tagId) { - const selectedTags = []; - const choiceElements = $(tagId).siblings(".select2").first() - .find(".select2-selection__choice"); - choiceElements.each((index, option) => { - selectedTags.push({ - value: option.title, - name: option.title, - label: option.title - }); - }); - return selectedTags; - } - - function consolidateTags (tags, otherTags) { - const seen = []; - const consolidated = []; - tags.forEach(tag => { - if (!seen.includes(tag.value)) { - seen.push(tag.value); - consolidated.push(tag); - } - }); - otherTags.forEach(tag => { - if (!seen.includes(tag.value)) { - seen.push(tag.value); - consolidated.push(tag); - } - }); - return consolidated; - } - - vm.next = (currentTab) => { - if(_.has(vm, 'steps.other_prompts.tab._active') && vm.steps.other_prompts.tab._active === true){ - try { - if (vm.codeMirror.validate) { - vm.codeMirror.validate(); - } - } catch (err) { - event.preventDefault(); - return; - } - - // The current tag input state lives somewhere in the associated select2 - // widgetry and isn't directly tied to the vm, so extract the tag values - // and update the vm to keep it in sync. - if (vm.promptDataClone.launchConf.ask_tags_on_launch) { - vm.promptDataClone.prompts.tags.value = consolidateTags( - angular.copy(vm.promptDataClone.prompts.tags.value), - getSelectedTags("#job_launch_job_tags") - ); - } - if (vm.promptDataClone.launchConf.ask_skip_tags_on_launch) { - vm.promptDataClone.prompts.skipTags.value = consolidateTags( - angular.copy(vm.promptDataClone.prompts.skipTags.value), - getSelectedTags("#job_launch_skip_tags") - ); - } - } - - let nextStep; - Object.keys(vm.steps).forEach(step => { - if (!vm.steps[step].tab) { - return; - } - if (vm.steps[step].tab.order === currentTab.order + 1) { - nextStep = step; - } - }); - - if (!nextStep) { - return; - } - - // Save the current promptData state in case we need to revert - vm._savedPromptData[currentTab.order] = _.cloneDeep(vm.promptDataClone); - Object.keys(vm.steps).forEach(tabStep => { - if (!vm.steps[tabStep].tab) { - return; - } - if (vm.steps[tabStep].tab.order < vm.steps[nextStep].tab.order) { - vm.steps[tabStep].tab._disabled = false; - vm.steps[tabStep].tab._active = false; - } else if (vm.steps[tabStep].tab.order === vm.steps[nextStep].tab.order) { - vm.steps[tabStep].tab._disabled = false; - vm.steps[tabStep].tab._active = true; - } else { - vm.steps[tabStep].tab._disabled = true; - vm.steps[tabStep].tab._active = false; - } - }); - scope.$broadcast('promptTabChange', { step: nextStep }); - }; - - vm.keypress = (event) => { - if (vm.steps.survey.tab && vm.steps.survey.tab._active && !vm.readOnlyPrompts && !vm.forms.survey.$valid) { - return; - } - if (document.activeElement.type === 'textarea') { - return; - } - if (event.key === 'Enter') { - vm.next(activeTab); - } - }; - - vm.finish = () => { - // Disable the action button to prevent double clicking - vm.actionButtonClicked = true; - - _.forEach(vm.promptDataClone, (value, key) => { - vm.promptData[key] = value; - }); - - vm.promptData.triggerModalOpen = false; - if(vm.onFinish) { - vm.onFinish(); - } - modal.hide(); - }; - - vm.cancel = () => { - vm.promptData.triggerModalOpen = false; - modal.hide(); - }; -}]; diff --git a/awx/ui/client/src/templates/prompt/prompt.directive.js b/awx/ui/client/src/templates/prompt/prompt.directive.js deleted file mode 100644 index dcc25fb784..0000000000 --- a/awx/ui/client/src/templates/prompt/prompt.directive.js +++ /dev/null @@ -1,26 +0,0 @@ -import promptController from './prompt.controller'; -export default [ 'templateUrl', - function(templateUrl) { - return { - scope: { - promptData: '=', - onFinish: '&', - actionText: '@', - preventCredsWithPasswords: '<', - readOnlyPrompts: '=' - }, - templateUrl: templateUrl('templates/prompt/prompt'), - replace: true, - transclude: true, - restrict: 'E', - controller: promptController, - controllerAs: 'vm', - bindToController: true, - link: function(scope, el, attrs, promptController) { - scope.ns = 'launch'; - scope[scope.ns] = { modal: {} }; - - promptController.init(scope); - } - }; -}]; diff --git a/awx/ui/client/src/templates/prompt/prompt.partial.html b/awx/ui/client/src/templates/prompt/prompt.partial.html deleted file mode 100644 index ccd1941f41..0000000000 --- a/awx/ui/client/src/templates/prompt/prompt.partial.html +++ /dev/null @@ -1,61 +0,0 @@ -
- - - {{:: vm.strings.get('prompt.INVENTORY') }} - {{:: vm.strings.get('prompt.CREDENTIAL') }} - {{:: vm.strings.get('prompt.OTHER_PROMPTS') }} - {{:: vm.strings.get('prompt.SURVEY') }} - {{:: vm.strings.get('prompt.PREVIEW') }} - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-
diff --git a/awx/ui/client/src/templates/prompt/prompt.service.js b/awx/ui/client/src/templates/prompt/prompt.service.js deleted file mode 100644 index d5e801a573..0000000000 --- a/awx/ui/client/src/templates/prompt/prompt.service.js +++ /dev/null @@ -1,310 +0,0 @@ -function PromptService (Empty, $filter) { - - this.processPromptValues = (params) => { - const prompts = { - credentials: {}, - inventory: {}, - variables: {}, - verbosity: {}, - jobType: {}, - limit: {}, - tags: {}, - skipTags: {}, - diffMode: {}, - scmBranch: {} - }; - - prompts.credentials.value = _.has(params, 'launchConf.defaults.credentials') ? _.cloneDeep(params.launchConf.defaults.credentials) : []; - prompts.inventory.value = _.has(params, 'currentValues.summary_fields.inventory') ? params.currentValues.summary_fields.inventory : (_.has(params, 'launchConf.defaults.inventory') ? params.launchConf.defaults.inventory : null); - - const skipTags = _.has(params, 'currentValues.skip_tags') && params.currentValues.skip_tags ? params.currentValues.skip_tags : (_.has(params, 'launchConf.defaults.skip_tags') ? params.launchConf.defaults.skip_tags : ""); - const jobTags = _.has(params, 'currentValues.job_tags') && params.currentValues.job_tags ? params.currentValues.job_tags : (_.has(params, 'launchConf.defaults.job_tags') ? params.launchConf.defaults.job_tags : ""); - - let extraVars = ''; - - const hasCurrentExtraVars = _.get(params, 'currentValues.extra_data'), - hasDefaultExtraVars = _.get(params, 'launchConf.defaults.extra_vars'); - - if(hasCurrentExtraVars && hasDefaultExtraVars) { - let currentExtraVars = {}; - let defaultExtraVars = {}; - if (typeof params.currentValues.extra_data === 'object') { - currentExtraVars = params.currentValues.extra_data; - } else if (typeof params.currentValues.extra_data === 'string') { - currentExtraVars = jsyaml.safeDump(params.currentValues.extra_data); - } - - if (typeof params.launchConf.defaults.extra_vars === 'object') { - defaultExtraVars = params.launchConf.defaults.extra_vars; - } else if (typeof params.launchConf.defaults.extra_vars === 'string') { - defaultExtraVars = jsyaml.safeLoad(params.launchConf.defaults.extra_vars); - } - extraVars = '---\n' + jsyaml.safeDump(_.merge(defaultExtraVars, currentExtraVars)); - } else if(hasCurrentExtraVars) { - if (typeof params.currentValues.extra_data === 'object') { - extraVars = '---\n' + jsyaml.safeDump(params.currentValues.extra_data); - } else if (typeof params.currentValues.extra_data === 'string') { - extraVars = params.currentValues.extra_data; - } - } else if(hasDefaultExtraVars) { - extraVars = params.launchConf.defaults.extra_vars; - } - - prompts.variables.value = extraVars && extraVars !== '' ? extraVars : '---\n'; - prompts.verbosity.choices = _.get(params, 'launchOptions.actions.POST.verbosity.choices', []).map(c => ({label: c[1], value: c[0]})); - prompts.verbosity.value = _.has(params, 'currentValues.verbosity') && params.currentValues.verbosity ? _.find(prompts.verbosity.choices, item => item.value === params.currentValues.verbosity) : _.find(prompts.verbosity.choices, item => item.value === params.launchConf.defaults.verbosity); - prompts.jobType.choices = _.get(params, 'launchOptions.actions.POST.job_type.choices', []).map(c => ({label: c[1], value: c[0]})); - prompts.jobType.value = _.has(params, 'currentValues.job_type') && params.currentValues.job_type ? _.find(prompts.jobType.choices, item => item.value === params.currentValues.job_type) : _.find(prompts.jobType.choices, item => item.value === params.launchConf.defaults.job_type); - prompts.limit.value = _.has(params, 'currentValues.limit') && params.currentValues.limit ? params.currentValues.limit : (_.has(params, 'launchConf.defaults.limit') ? params.launchConf.defaults.limit : ""); - prompts.tags.value = (jobTags && jobTags !== "") ? jobTags.split(',').map((i) => ({name: i, label: i, value: i})) : []; - prompts.skipTags.value = (skipTags && skipTags !== "") ? skipTags.split(',').map((i) => ({name: i, label: i, value: i})) : []; - prompts.diffMode.value = _.has(params, 'currentValues.diff_mode') && typeof params.currentValues.diff_mode === 'boolean' ? params.currentValues.diff_mode : (_.has(params, 'launchConf.defaults.diff_mode') ? params.launchConf.defaults.diff_mode : null); - prompts.scmBranch.value = _.has(params, 'currentValues.scm_branch') && params.currentValues.scm_branch ? params.currentValues.scm_branch : (_.has(params, 'launchConf.defaults.scm_branch') ? params.launchConf.defaults.scm_branch : ""); - return prompts; - }; - - this.processSurveyQuestions = (params) => { - - let missingSurveyValue = false; - - for(let i=0; i { - const launchData = { - extra_vars: promptData.extraVars - }; - - if (promptData.launchConf.ask_tags_on_launch){ - launchData.job_tags = promptData.prompts.tags.value.map(a => a.value).join(); - } - if (promptData.launchConf.ask_skip_tags_on_launch){ - launchData.skip_tags = promptData.prompts.skipTags.value.map(a => a.value).join(); - } - if (promptData.launchConf.ask_limit_on_launch && _.has(promptData, 'prompts.limit.value')){ - launchData.limit = promptData.prompts.limit.value; - } - if (promptData.launchConf.ask_job_type_on_launch && _.has(promptData, 'prompts.jobType.value.value')) { - launchData.job_type = promptData.prompts.jobType.value.value; - } - if (promptData.launchConf.ask_verbosity_on_launch && _.has(promptData, 'prompts.verbosity.value.value')) { - launchData.verbosity = promptData.prompts.verbosity.value.value; - } - if (promptData.launchConf.ask_inventory_on_launch && _.has(promptData, 'prompts.inventory.value.id')) { - launchData.inventory_id = promptData.prompts.inventory.value.id; - } - if (promptData.launchConf.ask_credential_on_launch){ - launchData.credentials = []; - promptData.prompts.credentials.value.forEach((credential) => { - launchData.credentials.push(credential.id); - }); - } - if (promptData.launchConf.ask_diff_mode_on_launch && _.has(promptData, 'prompts.diffMode.value')) { - launchData.diff_mode = promptData.prompts.diffMode.value; - } - if (promptData.launchConf.ask_scm_branch_on_launch && _.has(promptData, 'prompts.scmBranch.value')) { - launchData.scm_branch = promptData.prompts.scmBranch.value; - } - if (promptData.prompts.credentials.passwords) { - _.forOwn(promptData.prompts.credentials.passwords, (val, key) => { - if (!launchData.credential_passwords) { - launchData.credential_passwords = {}; - } - if (key === "ssh_key_unlock") { - launchData.credential_passwords.ssh_key_unlock = val.value; - } else if (key !== "vault") { - launchData.credential_passwords[`${key}`] = val.value; - } else { - _.each(val, (vaultCred) => { - launchData.credential_passwords[vaultCred.vault_id ? `${key}_password.${vaultCred.vault_id}` : `${key}_password`] = vaultCred.value; - }); - } - }); - } - - if (_.get(promptData, 'templateType') === 'workflow_job_template') { - if (_.get(launchData, 'inventory_id', null) === null) { - // It's possible to get here on a workflow job template with an inventory prompt and no - // default value by selecting an inventory, removing it, selecting a different inventory, - // and then reverting. A null inventory_id may be accepted by the API for prompted workflow - // inventories in the future, but for now they will 400. As such, we intercept that case here - // and remove it from the request data prior to launching. - delete launchData.inventory_id; - } - } - - return launchData; - }; - - this.bundlePromptDataForRelaunch = (promptData) => { - const launchData = {}; - - if(promptData.relaunchHostType) { - launchData.hosts = promptData.relaunchHostType; - } - - if (promptData.prompts.credentials.passwords) { - _.forOwn(promptData.prompts.credentials.passwords, (val, key) => { - if (!launchData.credential_passwords) { - launchData.credential_passwords = {}; - } - if (key === "ssh_key_unlock") { - launchData.credential_passwords.ssh_key_unlock = val.value; - } else if (key !== "vault") { - launchData.credential_passwords[`${key}`] = val.value; - } else { - _.each(val, (vaultCred) => { - launchData.credential_passwords[vaultCred.vault_id ? `${key}_password.${vaultCred.vault_id}` : `${key}_password`] = vaultCred.value; - }); - } - }); - } - - return launchData; - }; - - this.bundlePromptDataForSaving = (params) => { - const promptDataToSave = params.dataToSave ? params.dataToSave : {}; - - if(params.promptData.launchConf.survey_enabled){ - if(!promptDataToSave.extra_data) { - promptDataToSave.extra_data = {}; - } - for (var i=0; i < params.promptData.surveyQuestions.length; i++){ - var fld = params.promptData.surveyQuestions[i].variable; - // grab all survey questions that have answers - if(params.promptData.surveyQuestions[i].required || (params.promptData.surveyQuestions[i].required === false && params.promptData.surveyQuestions[i].model.toString()!=="")) { - promptDataToSave.extra_data[fld] = params.promptData.surveyQuestions[i].model; - } - - if(params.promptData.surveyQuestions[i].required === false && _.isEmpty(params.promptData.surveyQuestions[i].model)) { - switch (params.promptData.surveyQuestions[i].type) { - // for optional text and text-areas, submit a blank string if min length is 0 - // -- this is confusing, for an explanation see: - // http://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html#optional-survey-questions - // - case "text": - case "textarea": - if (params.promptData.surveyQuestions[i].min === 0) { - promptDataToSave.extra_data[fld] = ""; - } - break; - } - } - } - } - - const launchConfDefaults = _.get(params, ['promptData', 'launchConf', 'defaults'], {}); - - if(_.has(params, 'promptData.prompts.jobType.value.value') && _.get(params, 'promptData.launchConf.ask_job_type_on_launch')) { - promptDataToSave.job_type = launchConfDefaults.job_type && launchConfDefaults.job_type === params.promptData.prompts.jobType.value.value ? null : params.promptData.prompts.jobType.value.value; - } - if(_.has(params, 'promptData.prompts.tags.value') && _.get(params, 'promptData.launchConf.ask_tags_on_launch')){ - const templateDefaultJobTags = launchConfDefaults.job_tags.split(','); - promptDataToSave.job_tags = (_.isEqual(templateDefaultJobTags.sort(), params.promptData.prompts.tags.value.map(a => a.value).sort())) ? null : params.promptData.prompts.tags.value.map(a => a.value).join(); - } - if(_.has(params, 'promptData.prompts.skipTags.value') && _.get(params, 'promptData.launchConf.ask_skip_tags_on_launch')){ - const templateDefaultSkipTags = launchConfDefaults.skip_tags.split(','); - promptDataToSave.skip_tags = (_.isEqual(templateDefaultSkipTags.sort(), params.promptData.prompts.skipTags.value.map(a => a.value).sort())) ? null : params.promptData.prompts.skipTags.value.map(a => a.value).join(); - } - if(_.has(params, 'promptData.prompts.limit.value') && _.get(params, 'promptData.launchConf.ask_limit_on_launch')){ - promptDataToSave.limit = launchConfDefaults.limit && launchConfDefaults.limit === params.promptData.prompts.limit.value ? null : params.promptData.prompts.limit.value; - } - if(_.has(params, 'promptData.prompts.verbosity.value.value') && _.get(params, 'promptData.launchConf.ask_verbosity_on_launch')){ - promptDataToSave.verbosity = launchConfDefaults.verbosity && launchConfDefaults.verbosity === params.promptData.prompts.verbosity.value.value ? null : params.promptData.prompts.verbosity.value.value; - } - if(_.has(params, 'promptData.prompts.inventory.value') && _.get(params, 'promptData.launchConf.ask_inventory_on_launch')){ - promptDataToSave.inventory = launchConfDefaults.inventory && launchConfDefaults.inventory.id === params.promptData.prompts.inventory.value.id ? null : params.promptData.prompts.inventory.value.id; - } - if(_.has(params, 'promptData.prompts.diffMode.value') && _.get(params, 'promptData.launchConf.ask_diff_mode_on_launch')){ - promptDataToSave.diff_mode = launchConfDefaults.diff_mode && launchConfDefaults.diff_mode === params.promptData.prompts.diffMode.value ? null : params.promptData.prompts.diffMode.value; - } - if(_.has(params, 'promptData.prompts.scmBranch.value') && _.get(params, 'promptData.launchConf.ask_scm_branch_on_launch')){ - promptDataToSave.scm_branch = launchConfDefaults.scm_branch && launchConfDefaults.scm_branch === params.promptData.prompts.scmBranch.value ? null : params.promptData.prompts.scmBranch.value; - } - return promptDataToSave; - }; -} - -PromptService.$inject = ['Empty', '$filter']; - -export default PromptService; diff --git a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.controller.js b/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.controller.js deleted file mode 100644 index 9258ecdbec..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.controller.js +++ /dev/null @@ -1,352 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - [ 'CredentialList', 'QuerySet', 'GetBasePath', 'CreateSelect2', 'TemplatesStrings', - function(CredentialList, qs, GetBasePath, CreateSelect2, strings) { - const vm = this; - - vm.strings = strings; - - let scope; - let launch; - - let updateSelectedRow = () => { - if(scope.credentials && scope.credentials.length > 0) { - scope.credentials.forEach((credential, i) => { - scope.credentials[i].checked = 0; - - }); - scope.promptData.prompts.credentials.value.forEach((selectedCredential) => { - if (_.get(selectedCredential, 'inputs.vault_id') || _.get(selectedCredential, 'vault_id')) { - const vaultId = selectedCredential.vault_id ? selectedCredential.vault_id : _.get(selectedCredential, 'inputs.vault_id'); - selectedCredential.tag = `${selectedCredential.name } | ${vaultId}`; - } else { - selectedCredential.tag = selectedCredential.name; - } - if (selectedCredential.credential_type === parseInt(scope.promptData.prompts.credentials.credentialKind)) { - scope.credentials.forEach((credential, i) => { - if(scope.credentials[i].id === selectedCredential.id) { - scope.credentials[i].checked = 1; - } - }); - } - }); - } - }; - - let wipePasswords = (cred) => { - if(cred.passwords_needed) { - cred.passwords_needed.forEach((passwordNeeded => { - if(passwordNeeded === 'ssh_password') { - delete scope.promptData.prompts.credentials.passwords.ssh_password; - } else if(passwordNeeded === 'become_password') { - delete scope.promptData.prompts.credentials.passwords.become_password; - } else if(passwordNeeded === 'ssh_key_unlock') { - delete scope.promptData.prompts.credentials.passwords.ssh_key_unlock; - } else if(passwordNeeded.startsWith("vault_password")) { - for (let i = scope.promptData.prompts.credentials.passwords.vault.length - 1; i >= 0; i--) { - if(cred.id === scope.promptData.prompts.credentials.passwords.vault[i].id) { - scope.promptData.prompts.credentials.passwords.vault.splice(i, 1); - } - } - } - })); - } else if(cred.inputs && !_.isEmpty(cred.inputs)) { - if(cred.inputs.password && cred.inputs.password === "ASK") { - delete scope.promptData.prompts.credentials.passwords.ssh_password; - } - if(cred.inputs.become_password && cred.inputs.become_password === "ASK") { - delete scope.promptData.prompts.credentials.passwords.become_password; - } - if(cred.inputs.ssh_key_unlock && cred.inputs.ssh_key_unlock === "ASK") { - delete scope.promptData.prompts.credentials.passwords.ssh_key_unlock; - } - if(cred.inputs.vault_password && cred.inputs.vault_password === "ASK") { - for (let i = scope.promptData.prompts.credentials.passwords.vault.length - 1; i >= 0; i--) { - if(cred.id === scope.promptData.prompts.credentials.passwords.vault[i].id) { - scope.promptData.prompts.credentials.passwords.vault.splice(i, 1); - } - } - } - } - - }; - - let updateNeededPasswords = (cred) => { - if(cred.inputs) { - if(cred.inputs.password && cred.inputs.password === "ASK") { - scope.promptData.prompts.credentials.passwords.ssh_password = { - id: cred.id, - name: cred.name - }; - } - if(cred.inputs.become_password && cred.inputs.become_password === "ASK") { - scope.promptData.prompts.credentials.passwords.become_password = { - id: cred.id, - name: cred.name - }; - } - if(cred.inputs.ssh_key_unlock && cred.inputs.ssh_key_unlock === "ASK") { - scope.promptData.prompts.credentials.passwords.ssh_key_unlock = { - id: cred.id, - name: cred.name - }; - } - if(cred.inputs.vault_password && cred.inputs.vault_password === "ASK") { - if(!scope.promptData.prompts.credentials.passwords.vault) { - scope.promptData.prompts.credentials.passwords.vault = []; - } - scope.promptData.prompts.credentials.passwords.vault.push({ - id: cred.id, - name: cred.name, - vault_id: cred.inputs.vault_id - }); - } - } - }; - - let checkMissingCredType = (cred) => { - scope.promptData.launchConf.defaults.credentials.forEach((defaultCred) => { - if(cred.credential_type === defaultCred.credential_type) { - let credTypeLabel = ""; - scope.promptData.prompts.credentials.credentialTypeOptions.forEach((credTypeOption) => { - if(credTypeOption.value === defaultCred.credential_type) { - credTypeLabel = credTypeOption.name; - } - }); - - if(scope.promptData.prompts.credentials.credentialTypes[cred.credential_type] === "vault") { - if((_.get(cred, 'inputs.vault_id') ? _.get(cred, 'inputs.vault_id') : _.get(cred, 'vault_id')) === _.get(defaultCred, 'vault_id')) { - scope.promptData.credentialTypeMissing.push({ - credential_type: defaultCred.credential_type, - vault_id: defaultCred.vault_id, - label: defaultCred.vault_id ? `${credTypeLabel} (id: ${defaultCred.vault_id})` : credTypeLabel - }); - } - } else { - scope.promptData.credentialTypeMissing.push({ - credential_type: defaultCred.credential_type, - label: credTypeLabel - }); - } - } - }); - }; - - vm.init = (_scope_, _launch_) => { - scope = _scope_; - launch = _launch_; - - scope.toggle_row = (selectedRow) => { - if (!scope.readOnlyPrompts) { - let selectedCred = _.cloneDeep(selectedRow); - - for (let i = scope.promptData.prompts.credentials.value.length - 1; i >= 0; i--) { - if(scope.promptData.prompts.credentials.value[i].credential_type === parseInt(scope.promptData.prompts.credentials.credentialKind)) { - wipePasswords(scope.promptData.prompts.credentials.value[i]); - scope.promptData.prompts.credentials.value.splice(i, 1); - } - } - - scope.promptData.prompts.credentials.value.push(selectedCred); - updateNeededPasswords(selectedRow); - - for (let i = scope.promptData.credentialTypeMissing.length - 1; i >= 0; i--) { - if(scope.promptData.credentialTypeMissing[i].credential_type === selectedRow.credential_type) { - scope.promptData.credentialTypeMissing.splice(i,1); - i = -1; - } - } - } - }; - - scope.toggle_credential = (cred) => { - if (!scope.readOnlyPrompts) { - // This is a checkbox click. At the time of writing this the only - // multi-select credentials on launch are vault credentials so this - // logic should only get executed when a vault credential checkbox - // is clicked. - - let uncheck = false; - - let removeCredential = (credentialToRemove, index) => { - wipePasswords(credentialToRemove); - scope.promptData.prompts.credentials.value.splice(index, 1); - }; - - // Only one vault credential per vault_id is allowed so we need to check - // to see if one has already been selected and if so replace it. - for (let i = scope.promptData.prompts.credentials.value.length - 1; i >= 0; i--) { - if(cred.credential_type === scope.promptData.prompts.credentials.value[i].credential_type) { - if(scope.promptData.prompts.credentials.value[i].id === cred.id) { - removeCredential(scope.promptData.prompts.credentials.value[i], i); - i = -1; - uncheck = true; - } - else if(scope.promptData.prompts.credentials.value[i].inputs) { - if(cred.inputs.vault_id === scope.promptData.prompts.credentials.value[i].inputs.vault_id) { - removeCredential(scope.promptData.prompts.credentials.value[i], i); - } - } else if(scope.promptData.prompts.credentials.value[i].vault_id) { - if(cred.inputs.vault_id === scope.promptData.prompts.credentials.value[i].vault_id) { - removeCredential(scope.promptData.prompts.credentials.value[i], i); - } - } else { - // The currently selected vault credential does not have a vault_id - if(!cred.inputs.vault_id || cred.inputs.vault_id === "") { - removeCredential(scope.promptData.prompts.credentials.value[i], i); - } - } - } - } - - if(!uncheck) { - scope.promptData.prompts.credentials.value.push(cred); - updateNeededPasswords(cred); - - _.remove(scope.promptData.credentialTypeMissing, (missingCredType) => { - return ( - missingCredType.credential_type === cred.credential_type && - _.get(cred, 'inputs.vault_id') === _.get(missingCredType, 'vault_id') - ); - }); - } else { - if(scope.promptData.launchConf.defaults.credentials && scope.promptData.launchConf.defaults.credentials.length > 0) { - checkMissingCredType(cred); - } - } - } - }; - - scope.credential_dataset = []; - scope.credentials = []; - - let credList = _.cloneDeep(CredentialList); - credList.emptyListText = strings.get('prompt.NO_CREDS_MATCHING_TYPE'); - scope.list = credList; - scope.generateCredentialList(scope.promptData.prompts.credentials.credentialKind); - - scope.credential_default_params = { - order_by: 'name', - page_size: 5 - }; - - scope.credential_queryset = { - order_by: 'name', - page_size: 5 - }; - - scope.$watch('promptData.prompts.credentials.credentialKind', (oldKind, newKind) => { - if (scope.promptData.prompts.credentials && scope.promptData.prompts.credentials.credentialKind) { - if(scope.promptData.prompts.credentials.credentialTypes[oldKind] === "vault" || scope.promptData.prompts.credentials.credentialTypes[newKind] === "vault") { - scope.generateCredentialList(scope.promptData.prompts.credentials.credentialKind); - } - scope.credential_queryset.page = 1; - scope.credential_default_params.credential_type = scope.credential_queryset.credential_type = parseInt(scope.promptData.prompts.credentials.credentialKind); - - qs.search(GetBasePath('credentials'), scope.credential_default_params) - .then(res => { - scope.credential_dataset = res.data; - scope.credentials = scope.credential_dataset.results; - }); - } - }); - - scope.$watchCollection('promptData.prompts.credentials.value', () => { - updateSelectedRow(); - }); - - scope.$watchCollection('credentials', () => { - updateSelectedRow(); - }); - - CreateSelect2({ - element: '#launch-kind-select', - multiple: false - }); - }; - - vm.deleteSelectedCredential = (index) => { - const credentialToDelete = scope.promptData.prompts.credentials.value[index]; - for (let i = scope.promptData.prompts.credentials.value.length - 1; i >= 0; i--) { - if(scope.promptData.prompts.credentials.value[i].id === credentialToDelete.id) { - if(scope.promptData.launchConf.defaults.credentials && scope.promptData.launchConf.defaults.credentials.length > 0) { - checkMissingCredType(credentialToDelete); - } - wipePasswords(credentialToDelete); - scope.promptData.prompts.credentials.value.splice(i, 1); - } - } - - scope.credentials.forEach((credential, i) => { - if(credential.id === credentialToDelete.id) { - scope.credentials[i].checked = 0; - } - }); - }; - - vm.revert = () => { - scope.promptData.prompts.credentials.value = _.has(scope, 'promptData.launchConf.defaults.credentials') ? _.cloneDeep(scope.promptData.launchConf.defaults.credentials) : []; - scope.promptData.prompts.credentials.passwords = { - vault: [] - }; - scope.promptData.prompts.credentials.value.forEach((credential) => { - if (credential.passwords_needed && credential.passwords_needed.length > 0) { - credential.passwords_needed.forEach(passwordNeeded => { - let credPassObj = { - id: credential.id, - name: credential.name - }; - - if(passwordNeeded === "ssh_password") { - scope.promptData.prompts.credentials.passwords.ssh_password = credPassObj; - } - if(passwordNeeded === "become_password") { - scope.promptData.prompts.credentials.passwords.become_password = credPassObj; - } - if(passwordNeeded === "ssh_key_unlock") { - scope.promptData.prompts.credentials.passwords.ssh_key_unlock = credPassObj; - } - if(passwordNeeded.startsWith("vault_password")) { - credPassObj.vault_id = credential.vault_id; - scope.promptData.prompts.credentials.passwords.vault.push(credPassObj); - } - }); - - } - }); - - scope.promptData.credentialTypeMissing = []; - }; - - vm.showRevertCredentials = () => { - if(!scope.readOnlyPrompts && scope.promptData.launchConf.ask_credential_on_launch) { - if(scope.promptData.prompts.credentials.value && _.has(scope, 'promptData.launchConf.defaults.credentials') && (scope.promptData.prompts.credentials.value.length === scope.promptData.launchConf.defaults.credentials.length)) { - let selectedIds = scope.promptData.prompts.credentials.value.map((x) => { return x.id; }).sort(); - let defaultIds = _.has(scope, 'promptData.launchConf.defaults.credentials') ? scope.promptData.launchConf.defaults.credentials.map((x) => { return x.id; }).sort() : []; - return !selectedIds.every((e, i) => { return defaultIds.indexOf(e) === i; }); - } else { - return true; - } - } else { - return false; - } - }; - - vm.togglePassword = (id) => { - var buttonId = id + "_show_input_button", - inputId = id; - if ($(inputId).attr("type") === "password") { - $(buttonId).html(strings.get('HIDE')); - $(inputId).attr("type", "text"); - } else { - $(buttonId).html(strings.get('SHOW')); - $(inputId).attr("type", "password"); - } - }; - } - ]; diff --git a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.directive.js b/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.directive.js deleted file mode 100644 index d629d4a984..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.directive.js +++ /dev/null @@ -1,61 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import promptCredentialController from './prompt-credential.controller'; - -export default [ 'templateUrl', '$compile', 'generateList', 'i18n', - (templateUrl, $compile, GenerateList, i18n) => { - return { - scope: { - promptData: '=', - credentialPasswordsForm: '=', - preventCredsWithPasswords: '<', - readOnlyPrompts: '<' - }, - templateUrl: templateUrl('templates/prompt/steps/credential/prompt-credential'), - controller: promptCredentialController, - controllerAs: 'vm', - require: ['^^prompt', 'promptCredential'], - restrict: 'E', - replace: true, - transclude: true, - link: (scope, el, attrs, controllers) => { - - const launchController = controllers[0]; - const promptCredentialController = controllers[1]; - - scope.generateCredentialList = (credKind) => { - let inputType = (credKind && scope.promptData.prompts.credentials.credentialTypes[credKind] === "vault") ? null : 'radio'; - let list = _.cloneDeep(scope.list); - - if(credKind && scope.promptData.prompts.credentials.credentialTypes[credKind] === "vault") { - list.fields.name.modalColumnClass = 'col-md-6'; - list.fields.info = { - label: i18n._('Vault ID'), - ngBind: 'credential.inputs.vault_id', - key: false, - nosort: true, - modalColumnClass: 'col-md-6', - infoHeaderClass: '', - dataPlacement: 'top', - }; - } - - list.disableRow = "{{ readOnlyPrompts }}"; - list.disableRowValue = "readOnlyPrompts"; - - let html = GenerateList.build({ - list: list, - input_type: inputType, - mode: 'lookup' - }); - $('#prompt-credential').empty().append($compile(html)(scope)); - }; - - promptCredentialController.init(scope, launchController); - } - }; -}]; diff --git a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.partial.html b/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.partial.html deleted file mode 100644 index 4986cda868..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.partial.html +++ /dev/null @@ -1,118 +0,0 @@ -
-
-
-
- {{:: vm.strings.get('prompt.SELECTED') }} -
-
-
{{:: vm.strings.get('prompt.NO_CREDENTIALS_SELECTED') }}
-
- - - - - - -
-
- -
-
-
-
-  {{:: vm.strings.get('prompt.CREDENTIAL_TYPE_MISSING', missingCred.label) }} -
-
- -
-
- - {{ vm.strings.get('prompt.CREDENTIAL_PASSWORD_WARNING')}} -
-
-
{{promptData.prompts.credentials.passwords.ssh_password.name || promptData.prompts.credentials.passwords.become_password.name || promptData.prompts.credentials.passwords.ssh_key_unlock.name}}
-
{{vaultCred.name}}
-
-
-
- -
- {{:: vm.strings.get('prompt.CREDENTIAL_TYPE') }}: - -
-
-
-
-
{{:: vm.strings.get('prompt.PASSWORDS_REQUIRED_HELP') }}
-
-
- -
- - - - -
-
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}
-
-
-
- -
- - - - -
-
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}
-
-
-
- -
- - - - -
-
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}
-
-
- -
- -
- - - - -
-
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}
-
-
- -
-
diff --git a/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.controller.js b/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.controller.js deleted file mode 100644 index 658626906f..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.controller.js +++ /dev/null @@ -1,52 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - [ 'TemplatesStrings', function(strings) { - const vm = this; - - vm.strings = strings; - - let scope; - let launch; - - vm.init = (_scope_, _launch_) => { - scope = _scope_; - launch = _launch_; - - scope.toggle_row = (row) => { - if (!scope.readOnlyPrompts) { - scope.promptData.prompts.inventory.value = row; - } - }; - - scope.$watchCollection('inventories', () => { - if(scope.inventories && scope.inventories.length > 0) { - scope.inventories.forEach((credential, i) => { - if (_.has(scope, 'promptData.prompts.inventory.value.id') && scope.promptData.prompts.inventory.value.id === scope.inventories[i].id) { - scope.inventories[i].checked = 1; - } else { - scope.inventories[i].checked = 0; - } - - }); - } - }); - }; - - vm.deleteSelectedInventory = () => { - scope.promptData.prompts.inventory.value = null; - - scope.inventories.forEach((inventory) => { - inventory.checked = 0; - }); - }; - - vm.revert = () => { - scope.promptData.prompts.inventory.value = scope.promptData.launchConf.defaults.inventory; - }; - } - ]; diff --git a/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js b/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js deleted file mode 100644 index ab633cd6d7..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js +++ /dev/null @@ -1,98 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import promptInventoryController from './prompt-inventory.controller'; - -export default [ 'templateUrl', 'QuerySet', 'GetBasePath', 'generateList', '$compile', 'InventoryList', 'i18n', - (templateUrl, qs, GetBasePath, GenerateList, $compile, InventoryList, i18n) => { - return { - scope: { - promptData: '=', - readOnlyPrompts: '<' - }, - templateUrl: templateUrl('templates/prompt/steps/inventory/prompt-inventory'), - controller: promptInventoryController, - controllerAs: 'vm', - require: ['^^prompt', 'promptInventory'], - restrict: 'E', - replace: true, - transclude: true, - link: (scope, el, attrs, controllers) => { - - const launchController = controllers[0]; - const promptInventoryController = controllers[1]; - - promptInventoryController.init(scope, launchController); - - scope.inventory_default_params = { - order_by: 'name', - page_size: 5 - }; - - scope.inventory_queryset = { - order_by: 'name', - page_size: 5 - }; - - // Fire off the initial search - qs.search(GetBasePath('inventory'), scope.inventory_default_params) - .then(res => { - scope.inventory_dataset = res.data; - scope.inventories = scope.inventory_dataset.results; - - let invList = _.cloneDeep(InventoryList); - invList.disableRow = "{{ readOnlyPrompts }}"; - invList.disableRowValue = "readOnlyPrompts"; - - const defaultWarning = i18n._("This inventory is applied to all job template nodes that prompt for an inventory."); - const missingWarning = i18n._("This workflow job template has a default inventory which must be included or replaced before proceeding."); - - const updateInventoryWarning = () => { - scope.inventoryWarning = null; - if (scope.promptData.templateType === "workflow_job_template") { - scope.inventoryWarning = defaultWarning; - - const isPrompted = _.get(scope.promptData, 'launchConf.ask_inventory_on_launch'); - const isDefault = _.get(scope.promptData, 'launchConf.defaults.inventory.id'); - const isSelected = _.get(scope.promptData, 'prompts.inventory.value.id', null) !== null; - - if (isPrompted && isDefault && !isSelected) { - scope.inventoryWarning = missingWarning; - } - } - }; - - updateInventoryWarning(); - - let html = GenerateList.build({ - list: invList, - input_type: 'radio', - mode: 'lookup', - }); - - scope.list = invList; - - $('#prompt-inventory').append($compile(html)(scope)); - - scope.$watch('promptData.prompts.inventory.value', () => { - scope.inventories.forEach((row, i) => { - if ( - _.has(scope, 'promptData.prompts.inventory.value.id') && - row.id === scope.promptData.prompts.inventory.value.id - ) { - scope.inventories[i].checked = 1; - } - else { - scope.inventories[i].checked = 0; - } - - updateInventoryWarning(); - }); - }); - }); - } - }; -}]; diff --git a/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.partial.html b/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.partial.html deleted file mode 100644 index b4c1d88e39..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/inventory/prompt-inventory.partial.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
-
- {{:: vm.strings.get('prompt.SELECTED') }} -
-
-
{{:: vm.strings.get('prompt.NO_INVENTORY_SELECTED') }}
- - -
- -
-
-
-   {{ inventoryWarning }} -
-
-
diff --git a/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.controller.js b/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.controller.js deleted file mode 100644 index 35083e0dbe..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.controller.js +++ /dev/null @@ -1,136 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - ['ParseTypeChange', 'CreateSelect2', 'TemplatesStrings', '$timeout', 'ToJSON', function(ParseTypeChange, CreateSelect2, strings, $timeout, ToJSON) { - const vm = this; - - vm.strings = strings; - - let scope; - - vm.init = (_scope_, controller, el) => { - scope = _scope_; - - scope.parseType = 'yaml'; - - // Can't pass otherPrompts.variables.value into ParseTypeChange - // due to the fact that Angular CodeMirror uses scope[string] - // notation. - scope.extraVariables = scope.promptData.prompts.variables.value; - - scope.$watch('extraVariables', () => { - scope.promptData.prompts.variables.value = scope.extraVariables; - }); - - let codemirrorExtraVars = () => { - if(scope.promptData.launchConf.ask_variables_on_launch && !scope.promptData.prompts.variables.ignore) { - $timeout(() => { - ParseTypeChange({ - scope: scope, - variable: 'extraVariables', - field_id: 'job_launch_variables' - }); - }); - } - }; - - if(scope.promptData.launchConf.ask_job_type_on_launch) { - CreateSelect2({ - element: '#job_launch_job_type', - multiple: false - }); - } - - if(scope.promptData.launchConf.ask_verbosity_on_launch) { - CreateSelect2({ - element: '#job_launch_verbosity', - multiple: false - }); - } - - if(scope.promptData.launchConf.ask_tags_on_launch) { - // Ensure that the options match the currently selected tags. These two things - // might get out of sync if the user re-opens the prompts before saving the - // schedule/wf node - scope.promptData.prompts.tags.options = _.map(scope.promptData.prompts.tags.value, function(tag){ - return { - value: tag.value, - name: tag.name, - label: tag.label - }; - }); - CreateSelect2({ - element: '#job_launch_job_tags', - multiple: true, - addNew: true - }); - } - - if(scope.promptData.launchConf.ask_skip_tags_on_launch) { - // Ensure that the options match the currently selected tags. These two things - // might get out of sync if the user re-opens the prompts before saving the - // schedule/wf node - scope.promptData.prompts.skipTags.options = _.map(scope.promptData.prompts.skipTags.value, function(tag){ - return { - value: tag.value, - name: tag.name, - label: tag.label - }; - }); - CreateSelect2({ - element: '#job_launch_skip_tags', - multiple: true, - addNew: true - }); - } - - if(scope.isActiveStep) { - codemirrorExtraVars(); - } - - scope.$watch('isActiveStep', () => { - if(scope.isActiveStep) { - codemirrorExtraVars(); - } - }); - - function validate () { - return ToJSON(scope.parseType, scope.extraVariables, true); - } - scope.validate = validate; - - function focusFirstInput () { - const inputs = el.find('input[type=text], select, textarea:visible, .CodeMirror textarea'); - if (inputs.length) { - inputs.get(0).focus(); - } - } - - angular.element(el).ready(() => { - focusFirstInput(); - }); - - scope.$on('promptTabChange', (event, args) => { - if (args.step === 'other_prompts') { - angular.element(el).ready(() => { - focusFirstInput(); - }); - } - }); - }; - - vm.toggleDiff = () => { - scope.promptData.prompts.diffMode.value = !scope.promptData.prompts.diffMode.value; - }; - - vm.updateParseType = (parseType) => { - scope.parseType = parseType; - // This function gets added to scope by the ParseTypeChange factory - scope.parseTypeChange('parseType', 'extraVariables'); - }; - } - ]; diff --git a/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.directive.js b/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.directive.js deleted file mode 100644 index 38ac48ef6b..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.directive.js +++ /dev/null @@ -1,34 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import promptOtherPrompts from './prompt-other-prompts.controller'; - -export default [ 'templateUrl', - (templateUrl) => { - return { - scope: { - promptData: '=', - otherPromptsForm: '=', - isActiveStep: '=', - validate: '=', - readOnlyPrompts: '<' - }, - templateUrl: templateUrl('templates/prompt/steps/other-prompts/prompt-other-prompts'), - controller: promptOtherPrompts, - controllerAs: 'vm', - require: ['^^prompt', 'promptOtherPrompts'], - restrict: 'E', - replace: true, - transclude: true, - link: (scope, el, attrs, controllers) => { - - const launchController = controllers[0]; - const promptOtherPromptsController = controllers[1]; - - promptOtherPromptsController.init(scope, launchController, el); - } - }; -}]; diff --git a/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html b/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html deleted file mode 100644 index 69ea40d714..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html +++ /dev/null @@ -1,150 +0,0 @@ -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
diff --git a/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.controller.js b/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.controller.js deleted file mode 100644 index 94c5dd8b9f..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.controller.js +++ /dev/null @@ -1,75 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - [ 'ParseTypeChange', 'ToJSON', 'TemplatesStrings', function(ParseTypeChange, ToJSON, strings) { - const vm = this; - - vm.strings = strings; - - let scope; - - vm.init = (_scope_) => { - scope = _scope_; - - vm.showJobTags = true; - vm.showSkipTags = true; - - scope.parseType = 'yaml'; - - const surveyPasswords = {}; - - if (scope.promptData.launchConf.survey_enabled){ - scope.promptData.extraVars = ToJSON(scope.parseType, scope.promptData.prompts.variables.value, false); - scope.promptData.surveyQuestions.forEach(surveyQuestion => { - if (!scope.promptData.extraVars) { - scope.promptData.extraVars = {}; - } - // grab all survey questions that have answers - if (surveyQuestion.required || (surveyQuestion.required === false && surveyQuestion.model.toString()!=="")) { - scope.promptData.extraVars[surveyQuestion.variable] = surveyQuestion.model; - } - - if (surveyQuestion.required === false && _.isEmpty(surveyQuestion.model)) { - switch (surveyQuestion.type) { - // for optional text and text-areas, submit a blank string if min length is 0 - // -- this is confusing, for an explanation see: - // http://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html#optional-survey-questions - // - case "text": - case "textarea": - if (surveyQuestion.min === 0) { - scope.promptData.extraVars[surveyQuestion.variable] = ""; - } - break; - } - } - - if (surveyQuestion.type === 'password' && surveyQuestion.model.toString()!=="") { - surveyPasswords[surveyQuestion.variable] = '$encrypted$'; - } - }); - // We don't want to modify the extra vars when we merge them with the survey - // password $encrypted$ strings so we clone it - const extraVarsClone = _.cloneDeep(scope.promptData.extraVars); - // Replace the survey passwords with $encrypted$ to display to the user - const cleansedExtraVars = extraVarsClone ? Object.assign(extraVarsClone, surveyPasswords) : {}; - - scope.promptExtraVars = $.isEmptyObject(scope.promptData.extraVars) ? '---' : '---\n' + jsyaml.safeDump(cleansedExtraVars); - } else { - scope.promptData.extraVars = scope.promptData.prompts.variables.value; - scope.promptExtraVars = scope.promptData.prompts.variables.value && scope.promptData.prompts.variables.value !== '' ? scope.promptData.prompts.variables.value : '---\n'; - } - - ParseTypeChange({ - scope: scope, - variable: 'promptExtraVars', - field_id: 'job_launch_preview_variables', - readOnly: true - }); - }; - } - ]; diff --git a/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.directive.js b/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.directive.js deleted file mode 100644 index 034236cc43..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.directive.js +++ /dev/null @@ -1,30 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import promptPreview from './prompt-preview.controller'; - -export default [ 'templateUrl', - (templateUrl) => { - return { - scope: { - promptData: '=' - }, - templateUrl: templateUrl('templates/prompt/steps/preview/prompt-preview'), - controller: promptPreview, - controllerAs: 'vm', - require: ['^^prompt', 'promptPreview'], - restrict: 'E', - replace: true, - transclude: true, - link: (scope, el, attrs, controllers) => { - - const launchController = controllers[0]; - const promptPreviewController = controllers[1]; - - promptPreviewController.init(scope, launchController); - } - }; -}]; diff --git a/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.partial.html b/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.partial.html deleted file mode 100644 index dea1de6351..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/preview/prompt-preview.partial.html +++ /dev/null @@ -1,80 +0,0 @@ -
-
-
{{:: vm.strings.get('prompt.JOB_TYPE') }}
-
- {{:: vm.strings.get('prompt.PLAYBOOK_RUN') }} - {{:: vm.strings.get('prompt.CHECK') }} -
-
-
-
{{:: vm.strings.get('prompt.CREDENTIAL') }}
-
- - -
-
-
-
{{:: vm.strings.get('prompt.INVENTORY') }}
-
-
-
-
{{:: vm.strings.get('prompt.SCM_BRANCH') }}
-
-
-
-
{{:: vm.strings.get('prompt.LIMIT') }}
-
-
-
-
{{:: vm.strings.get('prompt.VERBOSITY') }}
-
-
-
-
- {{:: vm.strings.get('prompt.JOB_TAGS') }}  - - - - -
-
-
-
- {{tag.name}} -
-
-
-
-
-
- {{:: vm.strings.get('prompt.SKIP_TAGS') }}  - - - - -
-
-
-
- {{tag.name}} -
-
-
-
-
-
{{:: vm.strings.get('prompt.SHOW_CHANGES') }}
-
- {{:: vm.strings.get('ON') }} - {{:: vm.strings.get('OFF') }} -
-
-
-
{{:: vm.strings.get('prompt.EXTRA_VARIABLES') }}
-
- -
-
-
diff --git a/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.controller.js b/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.controller.js deleted file mode 100644 index e37afa49fb..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.controller.js +++ /dev/null @@ -1,35 +0,0 @@ -/************************************************* - * Copyright (c) 2017 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default - [ 'TemplatesStrings', function(strings) { - const vm = this; - - vm.strings = strings; - - let scope; - let launch; - - vm.init = (_scope_, _launch_) => { - scope = _scope_; - launch = _launch_; - }; - - // This function is used to hide/show the contents of a password - // within a form - vm.togglePassword = (id) => { - var buttonId = id + "_show_input_button", - inputId = id; - if ($(inputId).attr("type") === "password") { - $(buttonId).html(strings.get('HIDE')); - $(inputId).attr("type", "text"); - } else { - $(buttonId).html(strings.get('SHOW')); - $(inputId).attr("type", "password"); - } - }; - } - ]; diff --git a/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.directive.js b/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.directive.js deleted file mode 100644 index eb1ae7169f..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.directive.js +++ /dev/null @@ -1,32 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import promptSurvey from './prompt-survey.controller'; - -export default [ 'templateUrl', - (templateUrl) => { - return { - scope: { - promptData: '=', - surveyForm: '=', - readOnlyPrompts: '<' - }, - templateUrl: templateUrl('templates/prompt/steps/survey/prompt-survey'), - controller: promptSurvey, - controllerAs: 'vm', - require: ['^^prompt', 'promptSurvey'], - restrict: 'E', - replace: true, - transclude: true, - link: (scope, el, attrs, controllers) => { - - const launchController = controllers[0]; - const promptSurveyController = controllers[1]; - - promptSurveyController.init(scope, launchController); - } - }; -}]; diff --git a/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.partial.html b/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.partial.html deleted file mode 100644 index 63ccea473c..0000000000 --- a/awx/ui/client/src/templates/prompt/steps/survey/prompt-survey.partial.html +++ /dev/null @@ -1,71 +0,0 @@ -
-
- - -
- -
-
- -
{{:: vm.strings.get('prompt.PLEASE_ENTER_ANSWER') }}
-
Please enter an answer between {{question.minlength}} to {{question.maxlength}} characters long.
-
-
- -
{{:: vm.strings.get('prompt.PLEASE_ENTER_ANSWER') }}
-
Please enter an answer between {{question.minlength}} to {{question.maxlength}} characters long.
-
-
-
- - - - - -
-
{{:: vm.strings.get('prompt.PLEASE_ENTER_ANSWER') }}
-
Please enter an answer between {{question.minlength}} to {{question.maxlength}} characters long.
-
-
- -
{{:: vm.strings.get('prompt.PLEASE_ENTER_ANSWER') }}
-
{{:: vm.strings.get('prompt.VALID_INTEGER') }}
-
Please enter an answer between {{question.minValue}} and {{question.maxValue}}.
-
-
- -
{{:: vm.strings.get('prompt.PLEASE_ENTER_ANSWER') }}
-
{{:: vm.strings.get('prompt.VALID_DECIMAL') }}
-
Please enter an answer between {{question.minValue}} and {{question.maxValue}}.
-
-
-
- - -
-
{{:: vm.strings.get('prompt.PLEASE_SELECT_VALUE') }}
-
-
- - -
{{:: vm.strings.get('prompt.PLEASE_SELECT_VALUE') }}
-
-
-
diff --git a/awx/ui/client/src/templates/survey-maker/main.js b/awx/ui/client/src/templates/survey-maker/main.js deleted file mode 100644 index 1d41e63aef..0000000000 --- a/awx/ui/client/src/templates/survey-maker/main.js +++ /dev/null @@ -1,14 +0,0 @@ -import listGenerator from '../../shared/list-generator/main'; -import questions from './questions/main'; -import surveys from './surveys/main'; -import render from './render/main'; -import shared from './shared/main'; - -export default - angular.module('templates.surveyMaker', - [ listGenerator.name, - questions.name, - surveys.name, - render.name, - shared.name - ]); diff --git a/awx/ui/client/src/templates/survey-maker/questions/edit.factory.js b/awx/ui/client/src/templates/survey-maker/questions/edit.factory.js deleted file mode 100644 index 4aec1a5c6f..0000000000 --- a/awx/ui/client/src/templates/survey-maker/questions/edit.factory.js +++ /dev/null @@ -1,100 +0,0 @@ -export default - function EditQuestion(GenerateForm, CreateSelect2, SurveyQuestionForm) { - return function(params) { - - var scope = params.scope, - index = params.index, - tmpVar, - i, - question = params.question, - form = SurveyQuestionForm; - - // Update the index so that we know which question is being edited. - scope.editQuestionIndex = index; - - scope.text_min = null; - scope.text_max = null; - scope.int_min = null; - scope.int_max = null; - scope.float_min = null; - scope.float_max = null; - scope.password_min = null; - scope.password_max = null; - scope.pwcheckbox = false; - - if (scope.removeFillQuestionForm) { - scope.removeFillQuestionForm(); - } - scope.removeFillQuestionForm = scope.$on('FillQuestionForm', function() { - for( var fld in form.fields){ - scope[fld] = question[fld]; - if(form.fields[fld].type === 'select'){ - for (i = 0; i < scope.answer_types.length; i++) { - if (question[fld] === scope.answer_types[i].type) { - scope[fld] = scope.answer_types[i]; - } - } - } - } - if( question.type === 'text'){ - scope.text_min = question.min; - scope.text_max = question.max; - scope.default_text = question.default; - } - if( question.type === 'textarea'){ - scope.textarea_min = question.min; - scope.textarea_max = question.max; - scope.default_textarea= question.default; - } - if(question.type === 'password'){ - scope.password_min = question.min; - scope.password_max = question.max; - scope.default_password = question.default; - } - if( question.type === 'integer'){ - scope.int_min = question.min; - scope.int_max = question.max; - scope.default_int = question.default; - } - else if( question.type === 'float' ) { - scope.float_min = question.min; - scope.float_max = question.max; - scope.default_float = question.default; - - } - else if ( question.type === 'multiselect'){ - scope.default_multiselect = question.default; - } - - // After we populate the form with data, need to call CreateSelect2 again - // to get the dropdown to show the selected item. - CreateSelect2({ - element:'#survey_question_type', - multiple: false - }); - - // Set the form to dirty. This lets the cancel button know that it should become enabled. - scope.survey_question_form.$setDirty(); - }); - - if (scope.removeGenerateForm) { - scope.removeGenerateForm(); - } - scope.removeGenerateForm = scope.$on('GenerateForm', function() { - tmpVar = scope.mode; - GenerateForm.inject(form, { id: 'survey_maker_question_form', mode: 'edit', related: false, scope:scope, noPanel: true }); - scope.mode = tmpVar; - scope.$emit('FillQuestionForm'); - }); - - - scope.$emit('GenerateForm'); - - }; - } - -EditQuestion.$inject = - [ 'GenerateForm', - 'CreateSelect2', - 'questionDefinitionForm' - ]; diff --git a/awx/ui/client/src/templates/survey-maker/questions/main.js b/awx/ui/client/src/templates/survey-maker/questions/main.js deleted file mode 100644 index 957c066386..0000000000 --- a/awx/ui/client/src/templates/survey-maker/questions/main.js +++ /dev/null @@ -1,7 +0,0 @@ -import questionScope from './question-scope.factory'; -import edit from './edit.factory'; - -export default - angular.module('jobTemplates.surveyMaker.questions', []) - .factory('questionScope', questionScope) - .factory('editQuestion', edit); diff --git a/awx/ui/client/src/templates/survey-maker/questions/question-scope.factory.js b/awx/ui/client/src/templates/survey-maker/questions/question-scope.factory.js deleted file mode 100644 index 31af0902a5..0000000000 --- a/awx/ui/client/src/templates/survey-maker/questions/question-scope.factory.js +++ /dev/null @@ -1,25 +0,0 @@ -var typesSupportingIsolatedScope = - [ 'multiselect', - 'multiplechoice' - ]; - -function typeSupportsIsolatedScope(type) { - return _.include(typesSupportingIsolatedScope, type); -} - -function getIsolatedScope(question, oldScope) { - var newScope = oldScope.$new(); - newScope.question = question; - return newScope; -} - -export default - function() { - return function(question, oldScope) { - if (typeSupportsIsolatedScope(question.type)) { - return getIsolatedScope(question, oldScope); - } else { - return oldScope; - } - }; - } diff --git a/awx/ui/client/src/templates/survey-maker/render/main.js b/awx/ui/client/src/templates/survey-maker/render/main.js deleted file mode 100644 index 90390c74e1..0000000000 --- a/awx/ui/client/src/templates/survey-maker/render/main.js +++ /dev/null @@ -1,9 +0,0 @@ -import surveyQuestion from './survey-question.directive'; -import multipleChoice from './multiple-choice.directive'; -import multiSelect from './multiselect.directive'; - -export default - angular.module('jobTemplates.surveyMaker.render', []) - .directive('surveyQuestion', surveyQuestion) - .directive('multipleChoice', multipleChoice) - .directive('multiSelect', multiSelect); diff --git a/awx/ui/client/src/templates/survey-maker/render/multiple-choice.directive.js b/awx/ui/client/src/templates/survey-maker/render/multiple-choice.directive.js deleted file mode 100644 index c55231f24e..0000000000 --- a/awx/ui/client/src/templates/survey-maker/render/multiple-choice.directive.js +++ /dev/null @@ -1,47 +0,0 @@ -/* jshint unused: vars */ -import {templateUrl} from '../../../shared/template-url/template-url.factory'; - -function link($timeout, CreateSelect2, scope, element, attrs, ngModel) { - $timeout(function() { - - // select2-ify the dropdown. If the preview flag is passed here - // and it's true then we don't want to use a custom dropdown adapter. - // The reason for this is that the custom dropdown adapter breaks - // the draggability of this element. We're able to get away with this - // in preview mode (survey create/edit) because the element is disabled - // and we don't actually need the dropdown portion. Note that the custom - // dropdown adapter is used to get the dropdown contents to show up in - // a modal. - - CreateSelect2({ - element: element.find('select'), - multiple: scope.isMultipleSelect(), - minimumResultsForSearch: scope.isMultipleSelect() ? Infinity : 10, - customDropdownAdapter: scope.preview ? false : true - }); - }); - -} - -export default - [ '$timeout', 'CreateSelect2', - function($timeout, CreateSelect2) { - var directive = - { restrict: 'E', - require: 'ngModel', - scope: { - isMultipleSelect: '&multiSelect', - choices: '=', - question: '=', - isRequired: '=ngRequired', - selectedValue: '=ngModel', - isDisabled: '=ngDisabled', - preview: '=', - formElementName: '@' - }, - templateUrl: templateUrl('templates/survey-maker/render/multiple-choice'), - link: _.partial(link, $timeout, CreateSelect2) - }; - return directive; - } - ]; diff --git a/awx/ui/client/src/templates/survey-maker/render/multiple-choice.partial.html b/awx/ui/client/src/templates/survey-maker/render/multiple-choice.partial.html deleted file mode 100644 index a29362e7ec..0000000000 --- a/awx/ui/client/src/templates/survey-maker/render/multiple-choice.partial.html +++ /dev/null @@ -1,5 +0,0 @@ -
- -
diff --git a/awx/ui/client/src/templates/survey-maker/render/multiselect.directive.js b/awx/ui/client/src/templates/survey-maker/render/multiselect.directive.js deleted file mode 100644 index 82a39bbd54..0000000000 --- a/awx/ui/client/src/templates/survey-maker/render/multiselect.directive.js +++ /dev/null @@ -1,49 +0,0 @@ -/* jshint unused: vars */ - -/** - * @ngdoc directive - * - * @name jobTemplates.surveyMaker.render.multiSelect - * @description - * Angular provides no method of binding to "multiple" for - * select lists. This is because under normal circumstances, - * the structure of `ng-model` changes based on whether `multiple` - * is true or false. We're not needing to "bind" to "multiple", - * but we do need to pass in the value dynamically. This allows - * us to do that. - */ - -var directive = - { require: 'ngModel', - controller: function($scope) { - $('select').on('select2:unselecting', (event) => { - if (_.has($scope.$parent, 'preview')) { - event.preventDefault(); - } - }); - }, - compile: function() { - return { - pre: function(scope, element, attrs, ngModel) { - if (_.isUndefined(scope.isMultipleSelect)) { - return; - } - - if (!scope.isMultipleSelect()) { - return; - } - - element.attr('multiple', true); - attrs.multiple = true; - - - } - }; - }, - priority: 1000 - }; - -export default - function() { - return directive; - } diff --git a/awx/ui/client/src/templates/survey-maker/render/survey-question.directive.js b/awx/ui/client/src/templates/survey-maker/render/survey-question.directive.js deleted file mode 100644 index 97df8d1872..0000000000 --- a/awx/ui/client/src/templates/survey-maker/render/survey-question.directive.js +++ /dev/null @@ -1,128 +0,0 @@ -/* jshint unused: vars */ -import {templateUrl} from '../../../shared/template-url/template-url.factory'; - -/** - * @ngdoc directive - * @name jobTemplates.surveyMaker.render.surveyQuestion - * @description - * Directive that will eventually hold all logic - * for rendering different form controls based on - * the question type for a survey. - */ - -// Since we're generating HTML for the entire survey, and _then_ -// calling $compile, this directive never actually gets compiled -// with the question object we need. Therefore, we give it the index -// of the question as an attribute (not scope) and then look it up -// in the `survey_questions` by that index when it the directive gets -// compiled. -// -function findQuestionByIndex(questions, index) { - return _.find(questions, function(question) { - return question.index === index; - }); -} - -function link($sce, $filter, Empty, scope, element, attrs) { - - function serialize(expression) { - return $sce.getTrustedHtml(expression); - } - - function sanitizeDefault() { - - var defaultValue = "", - min, - max; - - if(scope.question.type === 'text'|| scope.question.type === "password" ){ - defaultValue = (scope.question.default) ? scope.question.default : ""; - defaultValue = $filter('sanitize')(defaultValue); - defaultValue = serialize(defaultValue); - } - - if(scope.question.type === "textarea"){ - defaultValue = (scope.question.default) ? scope.question.default : (scope.question.default_textarea) ? scope.question.default_textarea: "" ; - defaultValue = $filter('sanitize')(defaultValue); - defaultValue = serialize(defaultValue); - } - - if(scope.question.type === 'multiplechoice' || scope.question.type === "multiselect"){ - - scope.question.default = scope.question.default_multiselect || scope.question.default; - - if (scope.question.default) { - if (scope.question.type === 'multiselect' && typeof scope.question.default.split === 'function') { - defaultValue = scope.question.default.split('\n'); - } else if (scope.question.type !== 'multiselect') { - defaultValue = scope.question.default; - } - } else { - defaultValue = ''; - } - } - - if(scope.question.type === 'integer'){ - min = (!Empty(scope.question.min)) ? scope.question.min : ""; - max = (!Empty(scope.question.max)) ? scope.question.max : "" ; - defaultValue = (!Empty(scope.question.default)) ? scope.question.default : (!Empty(scope.question.default_int)) ? scope.question.default_int : "" ; - - } - if(scope.question.type === "float"){ - min = (!Empty(scope.question.min)) ? scope.question.min : ""; - max = (!Empty(scope.question.max)) ? scope.question.max : "" ; - defaultValue = (!Empty(scope.question.default)) ? scope.question.default : (!Empty(scope.question.default_float)) ? scope.question.default_float : "" ; - - } - - scope.defaultValue = defaultValue; - - } - - //for toggling the input on password inputs - scope.toggleInput = function(id) { - var buttonId = id + "_show_input_button", - inputId = id, - buttonInnerHTML = $(buttonId).html(); - if (buttonInnerHTML.indexOf("SHOW") > -1) { - $(buttonId).html("HIDE"); - $(inputId).attr("type", "text"); - } else { - $(buttonId).html("SHOW"); - $(inputId).attr("type", "password"); - } - }; - - if (!scope.question) { - scope.question = findQuestionByIndex(scope.surveyQuestions, Number(attrs.index)); - } - - // Split out choices to be consumed by the multiple-choice directive - if (!_.isUndefined(scope.question.choices)) { - scope.choices = typeof scope.question.choices.split === 'function' ? scope.question.choices.split('\n') : scope.question.choices; - } - - sanitizeDefault(); - -} - -export default - [ - '$sce', '$filter', 'Empty', - function($sce, $filter, Empty) { - var directive = - { restrict: 'E', - scope: - { question: '=', - surveyQuestions: '=', - isRequired: '@ngRequired', - isDisabled: '@ngDisabled', - preview: '=' - }, - templateUrl: templateUrl('templates/survey-maker/render/survey-question'), - link: _.partial(link, $sce, $filter, Empty) - }; - - return directive; - } - ]; diff --git a/awx/ui/client/src/templates/survey-maker/render/survey-question.partial.html b/awx/ui/client/src/templates/survey-maker/render/survey-question.partial.html deleted file mode 100644 index b90631898c..0000000000 --- a/awx/ui/client/src/templates/survey-maker/render/survey-question.partial.html +++ /dev/null @@ -1,30 +0,0 @@ -
- -
-
- -
-
- - -
-
- - - - -
- -
- -
-
- -
diff --git a/awx/ui/client/src/templates/survey-maker/shared/main.js b/awx/ui/client/src/templates/survey-maker/shared/main.js deleted file mode 100644 index 4b92e376b6..0000000000 --- a/awx/ui/client/src/templates/survey-maker/shared/main.js +++ /dev/null @@ -1,5 +0,0 @@ -import form from './question-definition.form'; - -export default - angular.module('jobTemplates.surveyMaker.shared', []) - .factory('questionDefinitionForm', form); diff --git a/awx/ui/client/src/templates/survey-maker/shared/question-definition.form.js b/awx/ui/client/src/templates/survey-maker/shared/question-definition.form.js deleted file mode 100644 index 2cfc932c71..0000000000 --- a/awx/ui/client/src/templates/survey-maker/shared/question-definition.form.js +++ /dev/null @@ -1,312 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Questions - * @description This form is for adding a question -*/ - -export default ['i18n', function(i18n){ - return { - - addTitle: i18n._('ADD SURVEY PROMPT'), - editTitle: i18n._('EDIT SURVEY PROMPT'), - titleClass: 'Form-secondaryTitle', - base: 'survey_question', - name: 'survey_question', - well: true, - cancelButton: false, - - fields: { - question_name: { - realName: 'question_text', - label: i18n._('Prompt'), - type: 'text', - required: true, - column: 1, - awSurveyQuestion: true, - class: 'Form-formGroup--singleColumn' - }, - question_description: { - realName: 'question_description', - label: i18n._('Description'), - type: 'text', - column: 1, - class: 'Form-formGroup--singleColumn' - }, - variable: { - realName: 'variable', - type: 'custom', - label: i18n._('Answer Variable Name'), - control: - '
'+ - '
' + i18n._('Please enter an answer variable name.') + '
'+ - '
' + i18n._('Please remove the illegal character from the survey question variable name.') + '
'+ - '
' + i18n._('This question variable is already in use. Please enter a different variable name.') + '
' + - '
'+ - '
', - awPopOver: i18n._("The suggested format for variable names is lowercase and underscore-separated (for example, foo_bar, user_id, host_name, etc.). Variable names with spaces are not allowed."), - dataTitle: i18n._('Answer Variable Name'), - dataPlacement: 'right', - dataContainer: "body", - required: true, - column: 1, - class: 'Form-formGroup--singleColumn' - }, - type: { - realName: 'answer_type', - label: i18n._('Answer Type'), - type: 'select', - defaultText: i18n._('Choose an answer type'), - ngOptions: 'answer_types.name for answer_types in answer_types track by answer_types.type', - required: true, - awPopOver: i18n._('Choose an answer type or format you want as the prompt for the user. Refer to the Ansible Tower Documentation for more additional information about each option.'), - dataTitle: i18n._('Answer Type'), - dataPlacement: 'right', - dataContainer: "body", - column: 2, - ngChange: 'typeChange()', - class: 'Form-formGroup--singleColumn' - }, - choices: { - realName: 'answer_options', - label: i18n._('Multiple Choice Options'), - type: 'textarea', - rows: 3, - required: true, - - ngRequired: "type.type=== 'multiselect' || type.type=== 'multiplechoice' " , - ngShow: 'type.type=== "multiselect" || type.type=== "multiplechoice" ', - column: 2, - class: 'Form-formGroup--singleColumn' - }, - text_options: { - realName: 'answer_options', - type: 'custom', - control:'
'+ - '
'+ - ''+ - '
' + i18n._('The minimum length you entered is not a valid number. Please enter a whole number.') + '
'+ - '
' + i18n._('The minimium length is too high. Please enter a lower number.') + '
'+ - '
' + i18n._('The minimum length is too low. Please enter a positive number.') + '
'+ - '
'+ - '
'+ - ''+ - '
' + i18n._('The maximum length you entered is not a valid number. Please enter a whole number.') + '
'+ - '
' + i18n._('The maximum length is too low. Please enter a number larger than the minimum length you set.') + '
'+ - '
'+ - '
', - ngShow: 'type.type==="text" ', - required: true, - column: 2, - class: 'Form-formGroup--singleColumn' - }, - textarea_options: { - realName: 'answer_options', - type: 'custom', - control:'
'+ - '
'+ - ''+ - '
' + i18n._('The minimum length you entered is not a valid number. Please enter a whole number.') + '
'+ - '
' + i18n._('The minimium length is too high. Please enter a lower number.') + '
'+ - '
' + i18n._('The minimum length is too low. Please enter a positive number.') + '
'+ - '
'+ - '
'+ - ''+ - '
' + i18n._('The maximum length you entered is not a valid number. Please enter a whole number.') + '
'+ - '
' + i18n._('The maximum length is too low. Please enter a number larger than the minimum length you set.') + '
'+ - '
'+ - '
', - ngShow: 'type.type==="textarea" ', - required: true, - column: 2, - class: 'Form-formGroup--singleColumn' - }, - password_options: { - realName: 'answer_options', - type: 'custom', - control:'
'+ - '
'+ - ''+ - '
' + i18n._('The minimum length you entered is not a valid number. Please enter a whole number.') + '
'+ - '
' + i18n._('The minimium length is too high. Please enter a lower number.') + '
'+ - '
' + i18n._('The minimum length is too low. Please enter a positive number.') + '
'+ - '
'+ - '
'+ - ''+ - '
' + i18n._('The maximum length you entered is not a valid number. Please enter a whole number.') + '
'+ - '
' + i18n._('The maximum length is too low. Please enter a number larger than the minimum length you set.') + '
'+ - '
'+ - '
', - ngShow: 'type.type==="password" ', - required: true, - - column: 2, - class: 'Form-formGroup--singleColumn' - }, - int_options: { - realName: 'answer_options', - type: 'custom', - control:'
'+ - '
'+ - ''+ - '
' + i18n._('Please enter a valid integer.') + '
'+ - '
' + i18n._('Please enter a smaller integer.') + '
'+ - '
'+ - '
'+ - ''+ - '
' + i18n._('Please enter a valid integer.') + '
'+ - '
' + i18n._('Please enter a larger integer.') + '
'+ - '
'+ - '
', - ngShow: 'type.type==="integer" ', - required: true, - column: 2, - class: 'Form-formGroup--singleColumn' - }, - float_options: { - realName: 'answer_options', - type: 'custom', - control: '
'+ - '
'+ - ''+ - '
' + i18n._('Please enter a valid float.') + '
'+ - '
' + i18n._('Please enter a smaller float.') + '
'+ - '
'+ - '
'+ - ''+ - '
' + i18n._('Please enter a valid float.') + '
'+ - '
' + i18n._('Please enter a larger float.') + '
'+ - - '
'+ - '
', - ngShow: 'type.type==="float" ', - required: true, - column: 2, - class: 'Form-formGroup--singleColumn' - }, - default:{ - realName: 'default_answer', - type: 'custom' , - control: '
'+ - ''+ - '
'+ - ''+ - '
' + i18n._('Please enter an answer from the choices listed.') + '
' + - '
' + i18n._('The answer is shorter than the minimium length. Please make the answer longer.') + '
' + - '
' + i18n._('The answer is longer than the maximum length. Please make the answer shorter.') + '
' + - '
'+ - '
'+ - '
', - column: 2, - ngShow: 'type.type === "text" || type.type === "multiplechoice" ', - class: 'Form-formGroup--singleColumn' - }, - default_multiselect: { - realName: 'default_answer' , - type: 'custom', - control: '
'+ - ''+ - '
'+ - ''+ - '
' + i18n._('Please enter an answer/answers from the choices listed.') + '
' + - '
'+ - '
'+ - '
', - column: 2, - ngShow: 'type.type==="multiselect" ', - class: 'Form-formGroup--singleColumn' - }, - default_int: { - realName: 'default_answer', - type: 'custom', - control: '
'+ - ''+ - ''+ - '
' + i18n._('Please enter a valid integer.') + '
'+ - '
' + i18n._('Please enter a minimum default of {{int_min}}.') + '
'+ - '
' + i18n._('Please enter a maximum default of {{int_max}}.') + '
'+ - '
', - column: 2, - ngShow: 'type.type === "integer" ', - class: 'Form-formGroup--singleColumn' - }, - default_float: { - realName: 'default_answer', - type: 'custom', - control: '
'+ - ''+ - ''+ - '
' + i18n._('Please enter a valid float.') + '
'+ - '
' + i18n._('Please enter a minimum default of {{float_min}}.') + '
'+ - '
' + i18n._('Please enter a maximum default of {{float_max}}.') + '
'+ - '
', - column: 2, - ngShow: 'type.type=== "float" ', - class: 'Form-formGroup--singleColumn' - }, - default_textarea: { - realName: "default_answer" , - type: 'custom', - control: '
'+ - ''+ - '
'+ - ''+ - '
' + i18n._('The answer is shorter than the minimium length. Please make the answer longer.') + '
' + - '
' + i18n._('The answer is longer than the maximum length. Please make the answer shorter.') + '
' + - '
'+ - '
'+ - '
', - column : 2, - ngShow: 'type.type === "textarea" ', - class: 'Form-formGroup--singleColumn' - }, - default_password: { - realName: 'default_answer' , - type: 'custom' , - control: '
'+ - ''+ - '
'+ - '
'+ - ''+ - ''+ - ''+ - ''+ - '
'+ - '
' + i18n._('The answer is shorter than the minimium length. Please make the answer longer.') + '
' + - '
' + i18n._('The answer is longer than the maximum length. Please make the answer shorter.') + '
' + - '
'+ - '
'+ - '
', - column: 2, - ngShow: 'type.type === "password" ', - class: 'Form-formGroup--singleColumn' - }, - required: { - realName: 'required_answer', - label: i18n._('Required'), - type: 'checkbox', - column: 2, - class: 'Form-formGroup--singleColumn' - } - }, - buttons: { - question_cancel : { - label: i18n._('Clear'), - 'class' : 'btn btn-default Form-cancelButton', - ngClick: 'generateAddQuestionForm()', - ngDisabled: 'survey_question_form.$pristine' - }, - submit_question: { - ngClick: 'submitQuestion($event)', - ngDisabled: true, - 'class': 'btn btn-sm Form-saveButton', - label: '{{editQuestionIndex === null ? "+ ADD" : "UPDATE"}}' - } - } -}; -}]; diff --git a/awx/ui/client/src/templates/survey-maker/shared/survey-controls.block.less b/awx/ui/client/src/templates/survey-maker/shared/survey-controls.block.less deleted file mode 100644 index 74b3af4967..0000000000 --- a/awx/ui/client/src/templates/survey-maker/shared/survey-controls.block.less +++ /dev/null @@ -1,11 +0,0 @@ -/** @define SurveyControls */ - -.SurveyControls { - &-selectWrapper { - margin-left: 15px; - } - &--dropdown { - z-index: 10000; - opacity: 1; - } -} diff --git a/awx/ui/client/src/templates/survey-maker/survey-maker.block.less b/awx/ui/client/src/templates/survey-maker/survey-maker.block.less deleted file mode 100644 index 8f5e036be3..0000000000 --- a/awx/ui/client/src/templates/survey-maker/survey-maker.block.less +++ /dev/null @@ -1,258 +0,0 @@ -.position-center { - left: 0; - right: 0; - margin: auto; -} - -.SurveyMaker-dialog { - max-width: 1200px; - padding: 0px; - .position-center; - - .ui-dialog-buttonpane, .ui-dialog-titlebar { - display:none; - } -} -.SurveyMaker-header { - display: flex; -} -.SurveyMaker-title { - align-items: center; - flex: 1 0 auto; - display: flex; - word-wrap: break-word; - word-break: break-all; - max-width: 98%; -} -.SurveyMaker-titleText { - color: @list-title-txt; - font-size: 14px; - font-weight: bold; - margin-right: 10px; - max-width: 75%; -} -.SurveyMaker-titleLockup { - margin-left: 4px; - margin-right: 6px; - display: inline-block; - margin-top: 0px; - padding-bottom: 2px; - vertical-align: bottom; -} -.SurveyMaker-titleLockup:before { - content: "\007C"; - color: @default-icon-hov; - display: block; - font-size: 13px; -} -.SurveyMaker-close { - justify-content: flex-end; - display: flex; -} -.SurveyMaker-exit{ - cursor:pointer; - padding:0px; - border: none; - height:20px; - font-size: 20px; - background-color:@default-bg; - color:@d7grey; - transition: color 0.2s; - line-height:1; -} -.SurveyMaker-exit:hover{ - color:@default-icon; -} -.SurveyMaker-content { - display: flex; - margin-top: 25px; - min-height: 560px; - flex-flow: row nowrap; - justify-content: space-around; -} -.SurveyMaker-questionPanel, -.SurveyMaker-previewPanel { - display: flex; - flex: 0 0 90%; - max-width: 500px; -} -.SurveyMaker-separatorPanel { - display: flex; - flex: 0 0 51px; -} -.SurveyMaker-contentSeparator { - width: 1px; - background-color: @default-list-header-bg; - margin: 0px 25px; -} -.SurveyMaker-panelHeader { - color: @default-icon; - padding-bottom: 20px; - min-height: 40px; - flex: 0 0 auto; - text-transform: uppercase; - font-size: 14px; - font-weight: bold; - white-space: nowrap; -} -.SurveyMaker-panelBody { - flex: 1 0 auto; - padding-bottom: 20px; -} -.SurveyMaker-panelFooter { - flex: 0 0 auto; -} -.SurveyMaker-noQuestions { - color: @default-icon; -} -.SurveyMaker-deleteButton { - color: @default-bg; - background-color: @default-err; - text-transform: uppercase; - padding-left:15px; - padding-right: 15px; - margin-right: 20px; -} -.SurveyMaker-deleteButton:hover { - background-color: @default-err-hov; - color: @default-bg; -} -.SurveyMaker-previewLabel { - text-transform: uppercase; - color: @default-interface-txt; - font-weight: normal; - font-size: small; - width: 100%; - word-break: break-word; -} -.SurveyMaker-deleteOverlay { - height: 100%; - width: 100%; - position: absolute; - top: 0; - left: 0; - background: rgba(0,0,0,0.3); - z-index: 3; - display: flex; - align-items: center; - justify-content: center; - border-radius: 4px; - - .Modal-content { - position: fixed; - top: ~"calc(50% - 100px)"; - width: 600px; - .position-center; - } -} -.SurveyMaker-previewInputRow { - display: flex; - margin-bottom: 20px; -} -.SurveyMaker-previewInput { - width: 100%; -} -.SurveyMaker-previewActions { - display: flex; - align-items: center; - margin-left: 20px; -} -.SurveyMaker-previewActions--selected { - background-color: @default-link !important; - color: @default-bg; -} -.SurveyMaker-previewRows { - position: relative; - min-height: 42px; - padding-left: 0px; - margin-bottom: 0px; - padding-bottom: 10px; - - /* These classes are dynamically added via the angular-drag-and-drop-lists directive */ - .dndPlaceholder { - display: block; - background-color: @default-tertiary-bg; - border: 1px solid @d7grey; - padding: 10px 15px; - min-height: 42px; - margin-bottom: 20px; - border-radius: 4px; - color: @default-interface-txt; - } - - .dndDraggingSource { - display: none; - } -} -.SurveyMaker-previewRow { - position: relative; - display: block; - - /* Disable text selection if item is not draggable */ - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.SurveyMaker-reorderButton { - color: @default-icon; - margin-right: 10px; - display: flex; - align-items: center; - cursor: -moz-grab; - cursor: -webkit-grab; - cursor: grab; -} -.SurveyMaker-reorderButton:hover { - color: @default-interface-txt; -} -.SurveyMaker-previewPasswordButton { - padding: 7px 15px!important; -} -.SurveyMaker-previewInput { - .select2-container--disabled { - opacity: inherit!important; - } -} -.SurveyMaker-previewMultiSelect { - background-color: #EEEEEE!important; - cursor: not-allowed!important; -} -.SurveyMaker-previewDescription { - margin-bottom: 5px; -} - -.SurveyMaker-questionPanel { - #survey_question_default_password { - button { - height: 30px; /* show/hide button should match our input height */ - } - } -} - -@media screen and (max-width: 1200px) { - .SurveyMaker-content { - flex-wrap: wrap; - justify-content: center; - } - .SurveyMaker-separatorPanel { - flex: 0 0 90%; - .SurveyMaker-contentSeparator { - width: 100%; - margin: 25px 0; - height: 1px; - } - } -} - -@media screen and (max-width: 600px) { - .SurveyMaker-dialog { - max-width: 100vw; - - .Modal-content { - max-width: ~"calc(100vw - 50px)"; - } - } -} diff --git a/awx/ui/client/src/templates/survey-maker/surveys/add.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/add.factory.js deleted file mode 100644 index eef26fa5d6..0000000000 --- a/awx/ui/client/src/templates/survey-maker/surveys/add.factory.js +++ /dev/null @@ -1,27 +0,0 @@ -export default - function AddFactory(ShowSurveyModal, Wait) { - return function(params) { - var scope = params.scope; - - // This variable controls the survey on/off toggle beside the create survey - // modal title. We want this toggle to be on by default - scope.survey_enabled = true; - - scope.isEditSurvey = false; - - if (scope.removeDialogReady) { - scope.removeDialogReady(); - } - scope.removeDialogReady = scope.$on('DialogReady', function() { - $('#survey-modal-dialog').dialog('open'); - scope.generateAddQuestionForm(); - }); - Wait('start'); - ShowSurveyModal({ scope: scope, callback: 'DialogReady' }); - }; - } - -AddFactory.$inject = - [ 'showSurvey', - 'Wait' - ]; diff --git a/awx/ui/client/src/templates/survey-maker/surveys/delete.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/delete.factory.js deleted file mode 100644 index a1ee5d3660..0000000000 --- a/awx/ui/client/src/templates/survey-maker/surveys/delete.factory.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Delete a survey. Prompts user to confirm delete - * - * DeleteSurvey({ - * scope: $scope containing list of survey form fields - * id: id of job template that survey is attached to - * }) - * - */ -export default - function DeleteSurvey(GetBasePath, Rest, Wait, ProcessErrors) { - return function(params) { - - var scope = params.scope, - id = params.id, - templateType = params.templateType, - url; - - - if (scope.removeSurveyDeleted) { - scope.removeSurveyDeleted(); - } - scope.$on('SurveyDeleted', function(){ - scope.survey_name = ""; - scope.survey_description = ""; - scope.survey_questions = []; - scope.closeSurvey('survey-modal-dialog'); - Wait('stop'); - scope.survey_exists = false; - }); - - - Wait('start'); - - if(scope.mode==="add"){ - scope.$emit("SurveyDeleted"); - - } else { - let basePath = templateType === 'workflow_job_template' ? GetBasePath('workflow_job_templates') : GetBasePath('job_templates'); - url = basePath + id + '/survey_spec/'; - - Rest.setUrl(url); - Rest.destroy() - .then(() => { - scope.$emit("SurveyDeleted"); - - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, { hdr: 'Error!', - msg: 'Failed to delete survey. DELETE returned status: ' + status }); - }); - } - }; - } - -DeleteSurvey.$inject = - [ 'GetBasePath', - 'Rest', - 'Wait', - 'ProcessErrors' - ]; diff --git a/awx/ui/client/src/templates/survey-maker/surveys/edit.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/edit.factory.js deleted file mode 100644 index 90d2c734ce..0000000000 --- a/awx/ui/client/src/templates/survey-maker/surveys/edit.factory.js +++ /dev/null @@ -1,67 +0,0 @@ -export default - function EditFactory(ShowSurveyModal, Wait, Rest, ProcessErrors, GetBasePath, Empty, AddSurvey) { - return function(params) { - var scope = params.scope, - id = params.id, - templateType = params.templateType, - url; - - if(templateType === 'job_template'){ - url = GetBasePath('job_templates') + id + '/survey_spec/'; - } - else if(templateType === 'workflow_job_template') { - url = GetBasePath('workflow_job_templates') + id + '/survey_spec/'; - } - - if (scope.removeDialogReady) { - scope.removeDialogReady(); - } - scope.removeDialogReady = scope.$on('DialogReady', function() { - $('#survey-modal-dialog').dialog('open'); - scope.generateAddQuestionForm(); - }); - - Wait('start'); - //for adding a job template: - if(scope.mode === 'add'){ - ShowSurveyModal({ title: "Edit Survey", scope: scope, callback: 'DialogReady' }); - } - //editing an existing job template: - else{ - // Get the existing record - Rest.setUrl(url); - Rest.get() - .then(({data}) => { - if(!Empty(data)){ - ShowSurveyModal({ title: "Edit Survey", scope: scope, callback: 'DialogReady' }); - scope.survey_name = data.name; - scope.survey_description = data.description; - scope.survey_questions = data.spec; - scope.isEditSurvey = true; - Wait('stop'); - } else { - AddSurvey({ - scope: scope - }); - } - - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed to retrieve survey. GET returned status: ' + status }); - }); - - } - }; - } - - -EditFactory.$inject = - [ 'showSurvey', - 'Wait', - 'Rest', - 'ProcessErrors', - 'GetBasePath', - 'Empty', - 'addSurvey' - ]; diff --git a/awx/ui/client/src/templates/survey-maker/surveys/init.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/init.factory.js deleted file mode 100644 index d47be4a5c0..0000000000 --- a/awx/ui/client/src/templates/survey-maker/surveys/init.factory.js +++ /dev/null @@ -1,554 +0,0 @@ -export default - function Init(DeleteSurvey, EditSurvey, AddSurvey, GenerateForm, SurveyQuestionForm, Wait, Alert, - GetBasePath, Rest, ProcessErrors, EditQuestion, CreateSelect2, i18n) { - return function(params) { - var scope = params.scope, - id = params.id, - form = SurveyQuestionForm, - sce = params.sce, - templateType = params.templateType; - scope.sce = sce; - scope.survey_questions = []; - scope.answer_types=[ - {name: i18n._('Text'), type: 'text'}, - {name: i18n._('Textarea'), type: 'textarea'}, - {name: i18n._('Password'), type: 'password'}, - {name: i18n._('Multiple Choice (single select)'), type: 'multiplechoice'}, - {name: i18n._('Multiple Choice (multiple select)'), type: 'multiselect'}, - {name: i18n._('Integer'), type: 'integer'}, - {name: i18n._('Float'), type: 'float'} - ]; - scope.disableSurveyTooltip = i18n._('Disable Survey'); - scope.editQuestionTooltip = i18n._('Edit Question'); - scope.deleteQuestionTooltip = i18n._('Delete Question'); - scope.dragQuestionTooltip = i18n._('Drag to reorder question'); - - /* SURVEY RELATED FUNCTIONS */ - - // Called when a job template does not have a saved survey. This simply sets some - // default variables and fills the add question form via form generator. - scope.addSurvey = function() { - AddSurvey({ - scope: scope - }); - }; - - // Called when a job template (new or existing) already has a "saved" survey - // In the case where a job template has not yet been created but a survey has - // been the data is just pulled out of the scope rather than from the server. - // (this is dictated by scope.mode) - scope.editSurvey = function() { - // Goes out and fetches the existing survey and populates the preview - EditSurvey({ - scope: scope, - id: id, - templateType: templateType - }); - }; - - // This gets called after a user confirms survey deletion - scope.deleteSurvey = function() { - // Hide the delete overlay - scope.hideDeleteOverlay(); - // Show the loading spinner - Wait('start'); - // Call the delete survey factory which handles making the rest call - // and closing the modal after success - DeleteSurvey({ - scope: scope, - id: id, - templateType: templateType - }); - }; - - // Called when the user hits cancel/close on the survey modal. This function - // goes out and cleans up the survey_questions on scope before destroying - // the modal. - scope.closeSurvey = function(id) { - // Clear out the whole array, this data gets pulled in each time the modal is opened - scope.survey_questions = []; - - $('#' + id).dialog('destroy'); - }; - - scope.saveSurvey = function() { - Wait('start'); - - scope.survey_name = ""; - scope.survey_description = ""; - - var updateSurveyQuestions = function() { - if(templateType === 'job_template') { - Rest.setUrl(GetBasePath('job_templates') + id + '/survey_spec/'); - } - else if(templateType === 'workflow_job_template') { - Rest.setUrl(GetBasePath('workflow_job_templates') + id + '/survey_spec/'); - } - return Rest.post({name: scope.survey_name, description: scope.survey_description, spec: scope.survey_questions }) - .then(() => { - - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed to add new survey. POST returned status: ' + status }); - }); - }; - - var updateSurveyEnabled = function() { - if(templateType === 'job_template') { - Rest.setUrl(GetBasePath('job_templates') + id+ '/'); - } - else if(templateType === 'workflow_job_template') { - Rest.setUrl(GetBasePath('workflow_job_templates') + id+ '/'); - } - return Rest.patch({"survey_enabled": scope.survey_enabled}) - .then(() => { - - }) - .catch(({data, status}) => { - ProcessErrors(scope, data, status, form, { - hdr: 'Error!', - msg: 'Failed to save survey_enabled: GET status: ' + status - }); - }); - }; - - if (!scope.survey_questions || scope.survey_questions.length === 0) { - scope.deleteSurvey(); - } else { - updateSurveyQuestions() - .then(function() { - return updateSurveyEnabled(); - }) - .then(function() { - scope.closeSurvey('survey-modal-dialog'); - scope.$emit('SurveySaved'); - }); - } - }; - - // Gets called when the user clicks the on/off toggle beside the survey modal title. - scope.toggleSurveyEnabled = function() { - scope.survey_enabled = !scope.survey_enabled; - }; - - /* END SURVEY RELATED FUNCTIONS */ - - /* QUESTION RELATED FUNCTIONS */ - - // This injects the Add Question form into survey_maker_question_form - scope.generateAddQuestionForm = function(){ - // This tmpMode logic is necessary because form generator seems to set scope.mode to match the mode that you pass it. - // So if a user is editing a job template (scope.mode='edit') but the JT doesn't have a survey then when we open the - // modal we need to make sure that scope.mode is still 'edit' after the Add Question form is injected. - // To avoid having to do this we'd need to track the job template mode in a variable other than scope.mode. - var tmpMode = scope.mode; - GenerateForm.inject(form, { id:'survey_maker_question_form', mode: 'add' , scope: scope, related: false, noPanel: true}); - scope.mode = tmpMode; - scope.clearQuestion(); - }; - - // This gets called when a users clicks the pencil icon beside a question preview in order to edit it. - scope.editQuestion = function(index){ - scope.duplicate = false; - // The edit question factory injects the edit form and fills the form with the question data from memory. - EditQuestion({ - index: index, - scope: scope, - question: scope.survey_questions[index] - }); - }; - - // Gets called when a user clicks the delete icon on a question in the survey preview - scope.showDeleteQuestion = function(deleteIndex) { - // Keep track of the question to be deleted on scope - scope.questionToBeDeleted = deleteIndex; - // Show the delete overlay with mode='question' - scope.showDeleteOverlay('question'); - }; - - // Called after a user confirms question deletion (hitting the DELETE button on the delete question overlay). - scope.deleteQuestion = function(index){ - // Move the edit question index down by one if this question came before the - // one being edited in the array. This makes sure that our pointer to the question - // currently being edited gets updated independently from a deleted question. - if(GenerateForm.mode === 'edit' && !isNaN(scope.editQuestionIndex)){ - if(scope.editQuestionIndex === index) { - // The user is deleting the question being edited - need to roll back to Add Question mode - scope.editQuestionIndex = null; - scope.generateAddQuestionForm(); - } - else if(scope.editQuestionIndex > index) { - scope.editQuestionIndex--; - } - } - // Remove the question from the array - scope.survey_questions.splice(index, 1); - // Hide the delete overlay - scope.hideDeleteOverlay(); - }; - - function clearTypeSpecificFields() { - scope.minTextError = false; - scope.maxTextError = false; - scope.default = ""; - scope.default_multiselect = ""; - scope.default_float = ""; - scope.default_int = ""; - scope.default_textarea = ""; - scope.default_password = "" ; - scope.choices = ""; - scope.text_min = 0; - scope.text_max = 1024 ; - scope.textarea_min = 0; - scope.textarea_max = 4096; - scope.password_min = 0; - scope.password_max = 32; - scope.int_min = 0; - scope.int_max = 100; - scope.float_min = 0.0; - scope.float_max = 100.0; - } - - // Sets all of our scope variables used for adding/editing a question back to a clean state - scope.clearQuestion = function(){ - clearTypeSpecificFields(); - scope.editQuestionIndex = null; - scope.question_name = null; - scope.question_description = null; - scope.variable = null; - scope.required = true; //set the required checkbox to true via the ngmodel attached to scope.required. - scope.duplicate = false; - scope.invalidChoice = false; - scope.type = ""; - - // Make sure that the select2 dropdown for question type is clean - CreateSelect2({ - element:'#survey_question_type', - multiple: false - }); - - // Set the whole form to pristine - scope.survey_question_form.$setPristine(); - }; - - // Gets called when the "type" dropdown value changes. In that case, we want to clear out - // all the "type" specific fields/errors and start fresh. - scope.typeChange = function() { - clearTypeSpecificFields(); - scope.survey_question_form.default.$setPristine(); - scope.survey_question_form.default_multiselect.$setPristine(); - scope.survey_question_form.default_float.$setPristine(); - scope.survey_question_form.default_int.$setPristine(); - scope.survey_question_form.default_textarea.$setPristine(); - scope.survey_question_form.default_password.$setPristine(); - scope.survey_question_form.choices.$setPristine(); - scope.survey_question_form.int_min.$setPristine(); - scope.survey_question_form.int_max.$setPristine(); - }; - - // Function that gets called when a user hits ADD/UPDATE on the survey question form. This - // function handles some validation as well as eventually adding the question to the - // scope.survey_questions array. - scope.submitQuestion = function(){ - var data = {}, - fld, i, - choiceArray, - answerArray; - scope.invalidChoice = false; - scope.duplicate = false; - scope.minTextError = false; - scope.maxTextError = false; - - if(scope.type.type==="text"){ - if(scope.default && scope.default.trim() !== ""){ - if(scope.default.trim().length < scope.text_min && - scope.text_min !== "" && - scope.text_min !== null ){ - scope.minTextError = true; - } - if(scope.text_max < scope.default.trim().length && - scope.text_max !== "" && - scope.text_max !== null ){ - scope.maxTextError = true; - } - } - } - - if(scope.type.type==="textarea"){ - if(scope.default_textarea && scope.default_textarea.trim() !== ""){ - if(scope.default_textarea.trim().length < scope.textarea_min && - scope.textarea_min !== "" && - scope.textarea_min !== null ){ - scope.minTextError = true; - } - if(scope.textarea_max < scope.default_textarea.trim().length && - scope.textarea_max !== "" && - scope.textarea_max !== null ){ - scope.maxTextError = true; - } - } - } - - if(scope.type.type==="password"){ - if(scope.default_password && scope.default_password.trim() !== ""){ - if(scope.default_password.trim().length < scope.password_min && - scope.password_min !== "" && - scope.password_min !== null ){ - scope.minTextError = true; - } - if(scope.password_max < scope.default_password.trim().length && - scope.password_max !== "" && - scope.password_max !== null ){ - scope.maxTextError = true; - } - } - } - - if(scope.type.type==="multiselect" && scope.default_multiselect && scope.default_multiselect.trim() !== ""){ - choiceArray = scope.choices.split(/\n/); - answerArray = scope.default_multiselect.split(/\n/); - - if(answerArray.length>0){ - for(i=0; i i && dropIndex >= scope.editQuestionIndex) { - // An element that was ahead of the edit question is now behind it - scope.editQuestionIndex--; - } - } - } - - // Break out of the for loop - break; - } - - } - - // return true here signals that the drop is allowed, but that we've already taken care of inserting the element - return true; - }; - - // Gets called when a user is creating/editing a question that has a password - // field. The password field in the form has a SHOW/HIDE button that calls this. - scope.toggleInput = function(id) { - // Note that the id string passed into this function will have a "#" prepended - var buttonId = id + "_show_input_button", - inputId = id, - buttonInnerHTML = $(buttonId).html(); - if (buttonInnerHTML.indexOf("SHOW") > -1) { - $(buttonId).html(i18n._("HIDE")); - $(inputId).attr("type", "text"); - } else { - $(buttonId).html(i18n._("SHOW")); - $(inputId).attr("type", "password"); - } - }; - - /* END QUESTION RELATED FUNCTIONS */ - - /* DELETE OVERLAY RELATED FUNCTIONS */ - - // This handles setting the delete mode and flipping the boolean used to show the delete overlay - scope.showDeleteOverlay = function(mode) { - // Set the delete mode (question or survey) so that the overlay knows - // how to phrase the prompt - scope.deleteMode = mode; - // Flip the deleteOverlayVisible flag so that the overlay becomes visible via ng-show - scope.deleteOverlayVisible = true; - }; - - // Called by the cancel/close buttons on the delete overlay. Also called after deletion has been confirmed. - scope.hideDeleteOverlay = function() { - // Clear out the delete mode for next time - scope.deleteMode = null; - // Clear out the index variable for next time - scope.questionToBeDeleted = null; - // Hide the delete overlay - scope.deleteOverlayVisible = false; - }; - - /* END DELETE OVERLAY RELATED FUNCTIONS */ - - // Watcher that updates the survey enabled/disabled tooltip based on scope.survey_enabled - scope.$watch('survey_enabled', function(newVal) { - scope.surveyEnabledTooltip = (newVal) ? i18n._("Disable survey") : i18n._("Enable survey"); - }); - - }; - } - -Init.$inject = - [ 'deleteSurvey', - 'editSurvey', - 'addSurvey', - 'GenerateForm', - 'questionDefinitionForm', - 'Wait', - 'Alert', - 'GetBasePath', - 'Rest', - 'ProcessErrors', - 'editQuestion', - 'CreateSelect2', - 'i18n' - ]; diff --git a/awx/ui/client/src/templates/survey-maker/surveys/main.js b/awx/ui/client/src/templates/survey-maker/surveys/main.js deleted file mode 100644 index a16c10073c..0000000000 --- a/awx/ui/client/src/templates/survey-maker/surveys/main.js +++ /dev/null @@ -1,13 +0,0 @@ -import add from './add.factory'; -import edit from './edit.factory'; -import _delete from './delete.factory'; -import init from './init.factory'; -import show from './show.factory'; - -export default - angular.module('jobTemplates.surveyMaker.surveys', []) - .factory('showSurvey', show) - .factory('addSurvey', add) - .factory('editSurvey', edit) - .factory('deleteSurvey', _delete) - .factory('initSurvey', init); diff --git a/awx/ui/client/src/templates/survey-maker/surveys/show.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/show.factory.js deleted file mode 100644 index 12faa2f401..0000000000 --- a/awx/ui/client/src/templates/survey-maker/surveys/show.factory.js +++ /dev/null @@ -1,53 +0,0 @@ -export default - function ShowFactory(Wait, CreateDialog, $compile) { - return function(params) { - // Set modal dimensions based on viewport width - - let scope = params.scope, - callback = params.callback, - mode = (params.mode) ? params.mode : "survey-maker", - title = params.title, - element, - target = (mode==='survey-taker') ? 'password-modal' : "survey-modal-dialog", - width = params.scope.can_edit ? 'calc(100vw - 50px)' : 600; - - - CreateDialog({ - id: target, - title: title, - scope: scope, - width: width, - minWidth: 400, - draggable: false, - dialogClass: 'SurveyMaker-dialog', - onClose: function() { - $('#'+target).empty(); - }, - onOpen: function() { - Wait('stop'); - - // Let the modal height be variable based on the content - // and set a uniform padding - $('#'+target).css({'height': 'auto', 'padding': '20px'}); - - if(mode==="survey-taker"){ - $('#survey-save-button').attr('ng-disabled', "survey_taker_form.$invalid"); - element = angular.element(document.getElementById('survey-save-button')); - $compile(element)(scope); - - } - - }, - _allowInteraction: function(e) { - return !!$(e.target).is('.select2-input') || this._super(e); - }, - callback: callback - }); - }; - } - -ShowFactory.$inject = - [ 'Wait', - 'CreateDialog', - '$compile' - ]; diff --git a/awx/ui/client/src/templates/templates.list.js b/awx/ui/client/src/templates/templates.list.js deleted file mode 100644 index 13c82763df..0000000000 --- a/awx/ui/client/src/templates/templates.list.js +++ /dev/null @@ -1,117 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default ['i18n', function(i18n) { - return { - - name: 'templates', - iterator: 'template', - basePath: 'unified_job_templates', - selectTitle: i18n._('Template'), - editTitle: i18n._('TEMPLATES'), - listTitle: i18n._('TEMPLATES'), - selectInstructions: i18n.sprintf(i18n._("Click on a row to select it, and click Finished when done. Use the %s button to create a new job template."), " "), - index: false, - hover: true, - - fields: { - name: { - key: true, - label: i18n._('Name'), - columnClass: 'col-lg-2 col-md-2 col-sm-4 col-xs-9', - ngHref: '#/templates/{{template.type}}/{{template.id}}', - awToolTip: '{{template.description | sanitize}}', - dataPlacement: 'top' - }, - type: { - label: i18n._('Type'), - ngBind: 'template.type_label', - columnClass: 'd-none d-sm-flex col-lg-2 col-md-2 col-sm-4' - }, - smart_status: { - label: i18n._('Activity'), - columnClass: 'd-none d-md-flex List-tableCell col-lg-2 col-md-3', - nosort: true, - ngInclude: "'/static/partials/job-template-smart-status.html'", - type: 'template' - }, - labels: { - label: i18n._('Labels'), - type: 'labels', - nosort: true, - showDelete: true, - columnClass: 'd-none d-md-flex List-tableCell col-lg-2 col-md-3' - } - }, - - actions: { - add: { - mode: 'all', // One of: edit, select, all - type: 'buttonDropdown', - basePaths: ['templates'], - awToolTip: i18n._('Create a new template'), - actionClass: 'at-Button--add', - actionId: 'button-add', - options: [ - { - optionContent: i18n._('Job Template'), - optionSref: 'templates.addJobTemplate', - ngShow: 'canAddJobTemplate' - }, - { - optionContent: i18n._('Workflow Template'), - optionSref: 'templates.addWorkflowJobTemplate', - ngShow: 'canAddWorkflowJobTemplate' - } - ], - ngShow: 'canAddJobTemplate || canAddWorkflowJobTemplate' - } - }, - - fieldActions: { - - columnClass: 'col-lg-2 col-md-3 col-sm-4 col-xs-3', - - edit: { - label: i18n._('Edit'), - ngClick: "editJobTemplate(template)", - awToolTip: i18n._('Edit template'), - "class": 'btn-default btn-xs', - dataPlacement: 'top', - ngShow: 'template.summary_fields.user_capabilities.edit', - editStateParams: ['job_template_id', 'workflow_job_template_id'] - }, - submit: { - // The submit key lets the list generator know that we want to use the - // at-launch-template directive - }, - copy: { - label: i18n._('Copy'), - ngClick: 'copyTemplate(template)', - "class": 'btn-danger btn-xs', - awToolTip: i18n._('Copy template'), - dataPlacement: 'top', - ngShow: 'template.summary_fields.user_capabilities.copy' - }, - view: { - label: i18n._('View'), - ngClick: "editJobTemplate(template)", - awToolTip: i18n._('View template'), - "class": 'btn-default btn-xs', - dataPlacement: 'top', - ngShow: '!template.summary_fields.user_capabilities.edit' - }, - "delete": { - label: i18n._('Delete'), - ngClick: "deleteJobTemplate(template)", - "class": 'btn-danger btn-xs', - awToolTip: i18n._('Delete template'), - dataPlacement: 'top', - ngShow: 'template.summary_fields.user_capabilities.delete' - } - } - };}]; diff --git a/awx/ui/client/src/templates/templates.service.js b/awx/ui/client/src/templates/templates.service.js deleted file mode 100644 index e293d03ebe..0000000000 --- a/awx/ui/client/src/templates/templates.service.js +++ /dev/null @@ -1,295 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['Rest', 'GetBasePath', '$q', 'NextPage', function(Rest, GetBasePath, $q, NextPage){ - return { - deleteJobTemplate: function(id){ - var url = GetBasePath('job_templates'); - - url = url + id; - - Rest.setUrl(url); - return Rest.destroy(); - }, - deleteWorkflowJobTemplate: function(id) { - var url = GetBasePath('workflow_job_templates'); - - url = url + id; - - Rest.setUrl(url); - return Rest.destroy(); - }, - createJobTemplate: function(data){ - var url = GetBasePath('job_templates'); - - Rest.setUrl(url); - return Rest.post(data); - }, - createWorkflowJobTemplate: function(data) { - var url = GetBasePath('workflow_job_templates'); - - Rest.setUrl(url); - return Rest.post(data); - }, - getAllLabelOptions: function() { - Rest.setUrl(GetBasePath('labels') + '?page_size=200'); - return Rest.get() - .then(function(res) { - if (res.data.next) { - return NextPage({ - url: res.data.next, - arrayOfValues: res.data.results - }).then(function(labels) { - return labels; - }).catch(function(response){ - return $q.reject( response ); - }); - } - else { - return $q.resolve( res.data.results ); - } - }).catch(function(response){ - return $q.reject( response ); - }); - }, - getAllJobTemplateLabels: function(id) { - Rest.setUrl(GetBasePath('job_templates') + id + "/labels?page_size=20"); - return Rest.get() - .then(function(res) { - if (res.data.next) { - return NextPage({ - url: res.data.next, - arrayOfValues: res.data.results - }).then(function(labels) { - return labels; - }).catch(function(response){ - return $q.reject( response ); - }); - } - else { - return $q.resolve( res.data.results ); - } - }).catch(function(response){ - return $q.reject( response ); - }); - }, - - getAllWorkflowJobTemplateLabels: function(id) { - Rest.setUrl(GetBasePath('workflow_job_templates') + id + "/labels?page_size=200"); - return Rest.get() - .then(function(res) { - if (res.data.next) { - return NextPage({ - url: res.data.next, - arrayOfValues: res.data.results - }).then(function(labels) { - return labels; - }).catch(function(response){ - return $q.reject( response ); - }); - } - else { - return $q.resolve( res.data.results ); - } - }).catch(function(response){ - return $q.reject( response ); - }); - }, - getJobTemplate: function(id) { - var url = GetBasePath('job_templates'); - - url = url + id; - - Rest.setUrl(url); - return Rest.get(); - }, - addWorkflowNode: function(params) { - // params.url - // params.data - - Rest.setUrl(params.url); - return Rest.post(params.data); - }, - editWorkflowNode: function(params) { - // params.id - // params.data - - var url = GetBasePath('workflow_job_template_nodes') + params.id; - - Rest.setUrl(url); - return Rest.put(params.data); - }, - getJobTemplateLaunchInfo: function(id) { - var url = GetBasePath('job_templates'); - - url = url + id + '/launch'; - - Rest.setUrl(url); - return Rest.get(); - }, - getWorkflowJobTemplateNodes: function(id, page) { - var url = GetBasePath('workflow_job_templates'); - - url = url + id + '/workflow_nodes?page_size=200'; - - if(page) { - url += '&page=' + page; - } - - Rest.setUrl(url); - return Rest.get(); - }, - updateWorkflowJobTemplate: function(params) { - // params.id - // params.data - - var url = GetBasePath('workflow_job_templates'); - - url = url + params.id; - - Rest.setUrl(url); - return Rest.patch(params.data); - }, - getWorkflowJobTemplate: function(id) { - var url = GetBasePath('workflow_job_templates'); - - url = url + id; - - Rest.setUrl(url); - return Rest.get(); - }, - deleteWorkflowJobTemplateNode: function(id) { - var url = GetBasePath('workflow_job_template_nodes') + id; - - Rest.setUrl(url); - return Rest.destroy(); - }, - disassociateWorkflowNode: function(params) { - //params.parentId - //params.nodeId - //params.edge - - var url = GetBasePath('workflow_job_template_nodes') + params.parentId; - - if(params.edge === 'success') { - url = url + '/success_nodes'; - } - else if(params.edge === 'failure') { - url = url + '/failure_nodes'; - } - else if(params.edge === 'always') { - url = url + '/always_nodes'; - } - - Rest.setUrl(url); - return Rest.post({ - "id": params.nodeId, - "disassociate": true - }); - }, - associateWorkflowNode: function(params) { - //params.parentId - //params.nodeId - //params.edge - - var url = GetBasePath('workflow_job_template_nodes') + params.parentId; - - if(params.edge === 'success') { - url = url + '/success_nodes'; - } - else if(params.edge === 'failure') { - url = url + '/failure_nodes'; - } - else if(params.edge === 'always') { - url = url + '/always_nodes'; - } - - Rest.setUrl(url); - return Rest.post({ - id: params.nodeId - }); - }, - getUnifiedJobTemplate: function(id) { - var url = GetBasePath('unified_job_templates'); - - url = url + "?id=" + id; - - Rest.setUrl(url); - return Rest.get(); - }, - getCredential: function(id) { - var url = GetBasePath('credentials'); - - url = url + id; - - Rest.setUrl(url); - return Rest.get(); - }, - getInventory: function(id) { - var url = GetBasePath('inventory'); - - url = url + id; - - Rest.setUrl(url); - return Rest.get(); - }, - getWorkflowCopy: function(id) { - let url = GetBasePath('workflow_job_templates'); - - url = url + id + '/copy'; - - Rest.setUrl(url); - return Rest.get(); - }, - copyWorkflow: function(id) { - let url = GetBasePath('workflow_job_templates'); - - url = url + id + '/copy'; - - Rest.setUrl(url); - return Rest.post(); - }, - getWorkflowJobTemplateOptions: function() { - var deferred = $q.defer(); - - let url = GetBasePath('workflow_job_templates'); - - Rest.setUrl(url); - Rest.options() - .then(({data}) => { - deferred.resolve(data); - }).catch(({msg, code}) => { - deferred.reject(msg, code); - }); - - return deferred.promise; - }, - getJobTemplateOptions: function() { - var deferred = $q.defer(); - - let url = GetBasePath('job_templates'); - - Rest.setUrl(url); - Rest.options() - .then(({data}) => { - deferred.resolve(data); - }).catch(({msg, code}) => { - deferred.reject(msg, code); - }); - - return deferred.promise; - }, - postWorkflowNodeCredential: function(params) { - // params.id - // params.data - - var url = GetBasePath('workflow_job_template_nodes') + params.id + '/credentials'; - - Rest.setUrl(url); - return Rest.post(params.data); - } - }; -}]; diff --git a/awx/ui/client/src/templates/workflows.form.js b/awx/ui/client/src/templates/workflows.form.js deleted file mode 100644 index f65f08f353..0000000000 --- a/awx/ui/client/src/templates/workflows.form.js +++ /dev/null @@ -1,385 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name forms.function:Workflow - * @description This form is for adding/editing a Workflow -*/ - -export default ['NotificationsList', 'i18n', function(NotificationsList, i18n) { - return function() { - var WorkflowFormObject = { - - addTitle: i18n._('NEW WORKFLOW JOB TEMPLATE'), - editTitle: '{{ name }}', - name: 'workflow_job_template', - breadcrumbName: i18n._('WORKFLOW'), - base: 'workflow', - basePath: 'workflow_job_templates', - // the top-most node of generated state tree - stateTree: 'templates', - activeEditState: 'templates.editWorkflowJobTemplate', - tabs: true, - detailsClick: "$state.go('templates.editWorkflowJobTemplate')", - include: ['/static/partials/survey-maker-modal.html'], - - headerFields: { - missingTemplates: { - type: 'html', - html: `
- ` + - i18n._("Missing Job Templates found in the Workflow Editor") + - `
` - } - }, - - fields: { - name: { - label: i18n._('Name'), - type: 'text', - required: true, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)', - column: 1 - }, - description: { - label: i18n._('Description'), - type: 'text', - column: 1, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)' - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - sourceModel: 'organization', - basePath: 'organizations', - list: 'OrganizationList', - sourceField: 'name', - dataTitle: i18n._('Organization'), - dataContainer: 'body', - dataPlacement: 'right', - awRequiredWhen: { - reqExpression: '!current_user.is_superuser' - }, - column: 1, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit) || !canEditOrg', - awLookupWhen: '(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit) && canEditOrg' - }, - inventory: { - label: i18n._('Inventory'), - type: 'lookup', - lookupMessage: i18n._("This inventory is applied to all job template nodes that prompt for an inventory."), - basePath: 'inventory', - list: 'InventoryList', - sourceModel: 'inventory', - sourceField: 'name', - autopopulateLookup: false, - column: 1, - awPopOver: "

" + i18n._("Select an inventory for the workflow. This inventory is applied to all job template nodes that prompt for an inventory.") + "

", - dataTitle: i18n._('Inventory'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_inventory_on_launch', - ngChange: 'workflow_job_template_form.inventory_name.$validate()', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit) || !canEditInventory', - }, - limit: { - label: i18n._('Limit'), - type: 'text', - column: 1, - awPopOver: "

" + i18n._("Provide a host pattern to further constrain the list of hosts that will be managed or affected by the workflow. This limit is applied to all job template nodes that prompt for a limit. Refer to Ansible documentation for more information and examples on patterns.") + "

", - dataTitle: i18n._('Limit'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_limit_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit) || !canEditInventory', - }, - scm_branch: { - label: i18n._('SCM Branch'), - type: 'text', - column: 1, - awPopOver: "

" + i18n._("Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch.") + "

", - dataTitle: i18n._('SCM Branch'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_scm_branch_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)', - }, - labels: { - label: i18n._('Labels'), - type: 'select', - ngOptions: 'label.label for label in labelOptions track by label.value', - multiSelect: true, - dataTitle: i18n._('Labels'), - dataPlacement: 'right', - awPopOver: "

" + i18n._("Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs.") + "

", - dataContainer: 'body', - onError: { - ngShow: 'workflow_job_template_labels_isValid !== true', - text: i18n._('Max 512 characters per label.'), - }, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)' - }, - variables: { - label: i18n._('Extra Variables'), - type: 'textarea', - class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 6, - "default": "---", - column: 2, - awPopOver:i18n._('Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax.'), - dataTitle: i18n._('Extra Variables'), - dataPlacement: 'right', - dataContainer: "body", - subCheckbox: { - variable: 'ask_variables_on_launch', - text: i18n._('Prompt on launch') - }, - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)' // TODO: get working - }, - checkbox_group: { - label: i18n._('Options'), - type: 'checkbox_group', - fields: [{ - name: 'allow_simultaneous', - label: i18n._('Enable Concurrent Jobs'), - type: 'checkbox', - column: 2, - awPopOver: "

" + i18n._("If enabled, simultaneous runs of this workflow job template will be allowed.") + "

", - dataPlacement: 'right', - dataTitle: i18n._('Enable Concurrent Jobs'), - dataContainer: "body", - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)' - }, { - name: 'enable_webhook', - label: i18n._('Enable Webhook'), - type: 'checkbox', - column: 2, - awPopOver: "

" + i18n._("Enable webhook for this workflow job template.") + "

", - dataPlacement: 'right', - dataTitle: i18n._('Enable Webhook'), - dataContainer: "body", - ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)' - }] - }, - webhook_service: { - label: i18n._('Webhook Service'), - type:'select', - defaultText: i18n._('Choose a Webhook Service'), - ngOptions: 'svc.label for svc in webhook_service_options track by svc.value', - ngShow: "enable_webhook && enable_webhook !== 'false'", - ngDisabled: "!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddOrEdit)", - id: 'webhook-service-select', - column: 1, - awPopOver: "

" + i18n._("Select a webhook service.") + "

", - dataTitle: i18n._('Webhook Service'), - dataPlacement: 'right', - dataContainer: "body", - }, - webhook_url: { - label: i18n._('Webhook URL'), - type: 'text', - ngShow: "workflow_job_template_obj && enable_webhook && enable_webhook !== 'false'", - awPopOver: "webhook_url_help", - awPopOverWatch: "webhook_url_help", - dataPlacement: 'top', - dataTitle: i18n._('Webhook URL'), - dataContainer: "body", - readonly: true - }, - webhook_key: { - label: i18n._('Webhook Key'), - type: 'text', - ngShow: "enable_webhook && enable_webhook !== 'false'", - genHash: true, - genHashButtonTemplate: ` - - - - `, - genHashButtonClickHandlerName: "handleWebhookKeyButtonClick", - awPopOver: "webhook_key_help", - awPopOverWatch: "webhook_key_help", - dataPlacement: 'right', - dataTitle: i18n._("Webhook Key"), - dataContainer: "body", - readonly: true, - required: false, - }, - webhook_credential: { - label: i18n._('Webhook Credential'), - type: 'custom', - ngShow: "enable_webhook && enable_webhook !== 'false'", - control: ` - `, - awPopOver: "

" + i18n._("Optionally, select the credential to use to send status updates back to the webhook service.") + "

", - dataTitle: i18n._('Webhook Credential'), - dataPlacement: 'right', - dataContainer: "body", - ngDisabled: '!webhook_service.value', - required: false, - }, - }, - - buttons: { //for now always generates - - - -
- diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js b/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js deleted file mode 100644 index df75b083dd..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js +++ /dev/null @@ -1,821 +0,0 @@ -/************************************************* - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', 'TemplatesService', 'JobTemplateModel', 'PromptService', 'Rest', '$q', - 'TemplatesStrings', 'CreateSelect2', 'Empty', 'QuerySet', '$filter', - 'GetBasePath', 'WorkflowNodeFormService', 'ProcessErrors', - 'i18n', 'ParseTypeChange', 'WorkflowJobTemplateModel', - function($scope, TemplatesService, JobTemplate, PromptService, Rest, $q, - TemplatesStrings, CreateSelect2, Empty, qs, $filter, - GetBasePath, WorkflowNodeFormService, ProcessErrors, - i18n, ParseTypeChange, WorkflowJobTemplate - ) { - - let promptWatcher, credentialsWatcher, surveyQuestionWatcher, listPromises = []; - - const shouldShowPromptButton = (launchConf) => launchConf.survey_enabled || - launchConf.ask_inventory_on_launch || - launchConf.ask_credential_on_launch || - launchConf.ask_verbosity_on_launch || - launchConf.ask_job_type_on_launch || - launchConf.ask_limit_on_launch || - launchConf.ask_tags_on_launch || - launchConf.ask_skip_tags_on_launch || - launchConf.ask_diff_mode_on_launch || - launchConf.credential_needed_to_start || - launchConf.ask_variables_on_launch || - launchConf.ask_scm_branch_on_launch || - launchConf.variables_needed_to_start.length !== 0; - - $scope.strings = TemplatesStrings; - $scope.editNodeHelpMessage = null; - - $scope.templateList = WorkflowNodeFormService.templateListDefinition(); - $scope.inventorySourceList = WorkflowNodeFormService.inventorySourceListDefinition(); - $scope.projectList = WorkflowNodeFormService.projectListDefinition(); - - const checkCredentialsForRequiredPasswords = () => { - let credentialRequiresPassword = false; - $scope.jobNodeState.promptData.prompts.credentials.value.forEach((credential) => { - if ((credential.passwords_needed && - credential.passwords_needed.length > 0) || - (_.has(credential, 'inputs.vault_password') && - credential.inputs.vault_password === "ASK") - ) { - credentialRequiresPassword = true; - } - }); - - $scope.jobNodeState.credentialRequiresPassword = credentialRequiresPassword; - }; - - const watchForPromptChanges = () => { - let promptDataToWatch = [ - 'jobNodeState.promptData.prompts.inventory.value', - 'jobNodeState.promptData.prompts.verbosity.value', - 'jobNodeState.missingSurveyValue' - ]; - - promptWatcher = $scope.$watchGroup(promptDataToWatch, () => { - const templateType = _.get($scope, 'jobNodeState.promptData.templateType'); - let missingPromptValue = false; - - if ($scope.jobNodeState.missingSurveyValue) { - missingPromptValue = true; - } - - if (templateType !== "workflow_job_template") { - if (!$scope.jobNodeState.promptData.prompts.inventory.value || !$scope.jobNodeState.promptData.prompts.inventory.value.id) { - missingPromptValue = true; - } - } - - $scope.jobNodeState.promptModalMissingReqFields = missingPromptValue; - }); - - if ($scope.jobNodeState.promptData.launchConf.ask_credential_on_launch && $scope.jobNodeState.credentialRequiresPassword) { - credentialsWatcher = $scope.$watch('jobNodeState.promptData.prompts.credentials', () => { - checkCredentialsForRequiredPasswords(); - }); - } - }; - - const clearWatchers = () => { - if (promptWatcher) { - promptWatcher(); - } - - if (surveyQuestionWatcher) { - surveyQuestionWatcher(); - } - - if (credentialsWatcher) { - credentialsWatcher(); - } - }; - - const select2ifyDropdowns = () => { - CreateSelect2({ - element: '#workflow-node-types', - multiple: false - }); - CreateSelect2({ - element: '#workflow_node_edge', - multiple: false - }); - CreateSelect2({ - element: '#workflow_node_convergence', - multiple: false - }); - }; - - const formatPopOverDetails = (model) => { - const popOverDetails = {}; - popOverDetails.playbook = model.playbook || i18n._('NONE SELECTED'); - Object.keys(model.summary_fields).forEach(field => { - if (field === 'project') { - popOverDetails.project = model.summary_fields[field].name || i18n._('NONE SELECTED'); - } - if (field === 'inventory') { - popOverDetails.inventory = model.summary_fields[field].name || i18n._('NONE SELECTED'); - } - if (field === 'credentials') { - if (model.summary_fields[field].length <= 0) { - popOverDetails.credentials = i18n._('NONE SELECTED'); - } - else { - const credentialNames = model.summary_fields[field].map(({name}) => name); - popOverDetails.credentials = credentialNames.join('
'); - } - } - }); - model.popOver = ` - - - - - - - - - - - - - - - - - -
${i18n._('INVENTORY')} ${$filter('sanitize')(popOverDetails.inventory)}
${i18n._('PROJECT')} ${$filter('sanitize')(popOverDetails.project)}
${i18n._('PLAYBOOK')} ${$filter('sanitize')(popOverDetails.playbook)}
${i18n._('CREDENTIAL')} ${$filter('sanitize')(popOverDetails.credentials)}
- `; - }; - - const updateSelectedRow = () => { - let unifiedJobTemplateId; - switch($scope.activeTab) { - case 'templates': - unifiedJobTemplateId = _.get($scope, 'jobNodeState.selectedTemplate.id') || null; - $scope.wf_maker_templates.forEach((row, i) => { - if (row.type === 'job_template') { - formatPopOverDetails(row); - } - $scope.wf_maker_templates[i].checked = (row.id === unifiedJobTemplateId) ? 1 : 0; - }); - break; - case 'project_syncs': - unifiedJobTemplateId = _.get($scope, 'projectNodeState.selectedTemplate.id') || null; - $scope.wf_maker_projects.forEach((row, i) => { - $scope.wf_maker_projects[i].checked = (row.id === unifiedJobTemplateId) ? 1 : 0; - }); - break; - case 'inventory_syncs': - unifiedJobTemplateId = _.get($scope, 'inventoryNodeState.selectedTemplate.id') || null; - $scope.wf_maker_inventory_sources.forEach((row, i) => { - $scope.wf_maker_inventory_sources[i].checked = (row.id === unifiedJobTemplateId) ? 1 : 0; - }); - break; - } - }; - - const getEditNodeHelpMessage = (selectedTemplate, workflowJobTemplateObj) => { - if (selectedTemplate) { - if (selectedTemplate.type === "workflow_job_template") { - if (workflowJobTemplateObj.inventory && selectedTemplate.ask_inventory_on_launch) { - return $scope.strings.get('workflow_maker.INVENTORY_WILL_OVERRIDE'); - } - - if (workflowJobTemplateObj.ask_inventory_on_launch && selectedTemplate.ask_inventory_on_launch) { - return $scope.strings.get('workflow_maker.INVENTORY_PROMPT_WILL_OVERRIDE'); - } - } - - if (selectedTemplate.type === "job_template") { - if (workflowJobTemplateObj.inventory) { - if (selectedTemplate.ask_inventory_on_launch) { - return $scope.strings.get('workflow_maker.INVENTORY_WILL_OVERRIDE'); - } - - return $scope.strings.get('workflow_maker.INVENTORY_WILL_NOT_OVERRIDE'); - } - - if (workflowJobTemplateObj.ask_inventory_on_launch) { - if (selectedTemplate.ask_inventory_on_launch) { - return $scope.strings.get('workflow_maker.INVENTORY_PROMPT_WILL_OVERRIDE'); - } - - return $scope.strings.get('workflow_maker.INVENTORY_PROMPT_WILL_NOT_OVERRIDE'); - } - } - } - - return null; - }; - - const finishConfiguringEdit = () => { - const ujt = _.get($scope, 'nodeConfig.node.fullUnifiedJobTemplateObject'); - const templateType = _.get(ujt, 'type'); - - $scope.editNodeHelpMessage = getEditNodeHelpMessage(ujt, $scope.workflowJobTemplateObj); - - if (!$scope.readOnly) { - let jobTemplate = templateType === "workflow_job_template" ? new WorkflowJobTemplate() : new JobTemplate(); - - if (_.get($scope, 'nodeConfig.node.promptData') && !_.isEmpty($scope.nodeConfig.node.promptData)) { - $scope.jobNodeState.promptData = _.cloneDeep($scope.nodeConfig.node.promptData); - const launchConf = $scope.jobNodeState.promptData.launchConf; - - if (!shouldShowPromptButton(launchConf)) { - $scope.jobNodeState.showPromptButton = false; - $scope.jobNodeState.promptModalMissingReqFields = false; - } else { - $scope.jobNodeState.showPromptButton = true; - - if (templateType !== "workflow_job_template" && launchConf.ask_inventory_on_launch && !_.has(launchConf, 'defaults.inventory') && !_.has($scope, 'nodeConfig.node.originalNodeObject.summary_fields.inventory')) { - $scope.jobNodeState.promptModalMissingReqFields = true; - } else { - $scope.jobNodeState.promptModalMissingReqFields = false; - } - } - watchForPromptChanges(); - $scope.nodeFormDataLoaded = true; - } else if ( - _.get($scope, 'nodeConfig.node.fullUnifiedJobTemplateObject.unified_job_type') === 'job_template' || - _.get($scope, 'nodeConfig.node.fullUnifiedJobTemplateObject.type') === 'job_template' || - _.get($scope, 'nodeConfig.node.fullUnifiedJobTemplateObject.type') === 'workflow_job_template' - ) { - let promises = [jobTemplate.optionsLaunch($scope.nodeConfig.node.fullUnifiedJobTemplateObject.id), jobTemplate.getLaunch($scope.nodeConfig.node.fullUnifiedJobTemplateObject.id)]; - - if (_.has($scope, 'nodeConfig.node.originalNodeObject.related.credentials')) { - Rest.setUrl($scope.nodeConfig.node.originalNodeObject.related.credentials); - promises.push(Rest.get()); - } - - $q.all(promises) - .then((responses) => { - let launchOptions = responses[0].data, - launchConf = responses[1].data, - workflowNodeCredentials = responses[2] ? responses[2].data.results : []; - - let prompts = PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data, - currentValues: $scope.nodeConfig.node.originalNodeObject - }); - - let defaultCredsWithoutOverrides = []; - - prompts.credentials.previousOverrides = _.cloneDeep(workflowNodeCredentials); - - const credentialHasScheduleOverride = (templateDefaultCred) => { - let credentialHasOverride = false; - workflowNodeCredentials.forEach((scheduleCred) => { - if (templateDefaultCred.credential_type === scheduleCred.credential_type) { - if ( - (!templateDefaultCred.vault_id && !scheduleCred.inputs.vault_id) || - (templateDefaultCred.vault_id && scheduleCred.inputs.vault_id && templateDefaultCred.vault_id === scheduleCred.inputs.vault_id) - ) { - credentialHasOverride = true; - } - } - }); - - return credentialHasOverride; - }; - - if (_.has(launchConf, 'defaults.credentials')) { - launchConf.defaults.credentials.forEach((defaultCred) => { - if (!credentialHasScheduleOverride(defaultCred)) { - defaultCredsWithoutOverrides.push(defaultCred); - } - }); - } - - prompts.credentials.value = workflowNodeCredentials.concat(defaultCredsWithoutOverrides); - - if ( - $scope.nodeConfig.node.fullUnifiedJobTemplateObject.type === "job_template" && - ((!$scope.nodeConfig.node.fullUnifiedJobTemplateObject.inventory && !launchConf.ask_inventory_on_launch) || - !$scope.nodeConfig.node.fullUnifiedJobTemplateObject.project) - ) { - $scope.jobNodeState.selectedTemplateInvalid = true; - } else { - $scope.jobNodeState.selectedTemplateInvalid = false; - } - - let credentialRequiresPassword = false; - - prompts.credentials.value.forEach((credential) => { - if(credential.inputs) { - if ((credential.inputs.password && credential.inputs.password === "ASK") || - (credential.inputs.become_password && credential.inputs.become_password === "ASK") || - (credential.inputs.ssh_key_unlock && credential.inputs.ssh_key_unlock === "ASK") || - (credential.inputs.vault_password && credential.inputs.vault_password === "ASK") - ) { - credentialRequiresPassword = true; - } - } else if (credential.passwords_needed && credential.passwords_needed.length > 0) { - credentialRequiresPassword = true; - } - }); - - $scope.jobNodeState.credentialRequiresPassword = credentialRequiresPassword; - - if (!shouldShowPromptButton(launchConf)) { - $scope.jobNodeState.showPromptButton = false; - $scope.jobNodeState.promptModalMissingReqFields = false; - $scope.nodeFormDataLoaded = true; - } else { - $scope.jobNodeState.showPromptButton = true; - - if (launchConf.ask_inventory_on_launch && !_.has(launchConf, 'defaults.inventory') && !_.has($scope, 'nodeConfig.node.originalNodeObject.summary_fields.inventory')) { - $scope.jobNodeState.promptModalMissingReqFields = true; - } else { - $scope.jobNodeState.promptModalMissingReqFields = false; - } - - if (responses[1].data.survey_enabled) { - // go out and get the survey questions - jobTemplate.getSurveyQuestions($scope.nodeConfig.node.fullUnifiedJobTemplateObject.id) - .then((surveyQuestionRes) => { - - let processed = PromptService.processSurveyQuestions({ - surveyQuestions: surveyQuestionRes.data.spec, - extra_data: jsyaml.safeLoad(prompts.variables.value) - }); - - $scope.jobNodeState.missingSurveyValue = processed.missingSurveyValue; - - $scope.extraVars = (processed.extra_data === '' || _.isEmpty(processed.extra_data)) ? '---' : '---\n' + jsyaml.safeDump(processed.extra_data); - - // PromptService.processSurveyQuestions will strip the survey answers out of the extra - // vars so we should update the prompt value - prompts.variables = { - value: $scope.extraVars - }; - - $scope.nodeConfig.node.promptData = $scope.jobNodeState.promptData = { - launchConf: launchConf, - launchOptions: launchOptions, - prompts: prompts, - surveyQuestions: surveyQuestionRes.data.spec, - templateType: $scope.nodeConfig.node.fullUnifiedJobTemplateObject.type, - template: $scope.nodeConfig.node.fullUnifiedJobTemplateObject.id - }; - - surveyQuestionWatcher = $scope.$watch('jobNodeState.promptData.surveyQuestions', () => { - let missingSurveyValue = false; - _.each($scope.jobNodeState.promptData.surveyQuestions, (question) => { - if (question.required && (Empty(question.model) || question.model === [])) { - missingSurveyValue = true; - } - }); - $scope.jobNodeState.missingSurveyValue = missingSurveyValue; - }, true); - - checkCredentialsForRequiredPasswords(); - - watchForPromptChanges(); - - $scope.nodeFormDataLoaded = true; - }); - } else { - $scope.nodeConfig.node.promptData = $scope.jobNodeState.promptData = { - launchConf: launchConf, - launchOptions: launchOptions, - prompts: prompts, - templateType: $scope.nodeConfig.node.fullUnifiedJobTemplateObject.type, - template: $scope.nodeConfig.node.fullUnifiedJobTemplateObject.id - }; - - checkCredentialsForRequiredPasswords(); - - watchForPromptChanges(); - - $scope.nodeFormDataLoaded = true; - } - } - }); - } else { - $scope.nodeFormDataLoaded = true; - } - - if (_.get($scope, 'nodeConfig.node.fullUnifiedJobTemplateObject')) { - const selectedTemplate = $scope.nodeConfig.node.fullUnifiedJobTemplateObject; - - if (selectedTemplate.unified_job_type) { - switch (selectedTemplate.unified_job_type) { - case "job": - $scope.activeTab = "templates"; - $scope.jobNodeState.selectedTemplate = selectedTemplate; - break; - case "project_update": - $scope.activeTab = "project_syncs"; - $scope.projectNodeState.selectedTemplate = selectedTemplate; - break; - case "inventory_update": - $scope.activeTab = "inventory_syncs"; - $scope.inventoryNodeState.selectedTemplate = selectedTemplate; - break; - } - } else if (selectedTemplate.type) { - switch (selectedTemplate.type) { - case "job_template": - case "workflow_job_template": - $scope.activeTab = "templates"; - $scope.jobNodeState.selectedTemplate = selectedTemplate; - break; - case "project": - $scope.activeTab = "project_syncs"; - $scope.projectNodeState.selectedTemplate = selectedTemplate; - break; - case "inventory_source": - $scope.activeTab = "inventory_syncs"; - $scope.inventoryNodeState.selectedTemplate = selectedTemplate; - break; - } - } - updateSelectedRow(); - } else { - $scope.activeTab = "templates"; - } - - select2ifyDropdowns(); - } else { - $scope.jobTags = $scope.nodeConfig.node.originalNodeObject.job_tags ? $scope.nodeConfig.node.originalNodeObject.job_tags.split(',').map((tag) => (tag)) : []; - $scope.skipTags = $scope.nodeConfig.node.originalNodeObject.skip_tags ? $scope.nodeConfig.node.originalNodeObject.skip_tags.split(',').map((tag) => (tag)) : []; - $scope.showJobTags = true; - $scope.showSkipTags = true; - - if (!$.isEmptyObject($scope.nodeConfig.node.originalNodeObject.extra_data)) { - $scope.extraVars = '---\n' + jsyaml.safeDump($scope.nodeConfig.node.originalNodeObject.extra_data); - $scope.showExtraVars = true; - $scope.parseType = 'yaml'; - - ParseTypeChange({ - scope: $scope, - variable: 'extraVars', - field_id: 'workflow_node_form_extra_vars', - readOnly: true - }); - } else { - $scope.extraVars = null; - $scope.showExtraVars = false; - } - - $scope.nodeFormDataLoaded = true; - } - - }; - - const setupNodeForm = () => { - $scope.jobNodeState = { - credentialRequiresPassword: false, - missingSurveyValue: false, - promptData: null, - promptModalMissingReqFields: false, - searchTags: [], - selectedTemplate: null, - selectedTemplateInvalid: false, - showPromptButton: false - }; - $scope.projectNodeState = { - searchTags: [], - selectedTemplate: null - }; - $scope.inventoryNodeState = { - searchTags: [], - selectedTemplate: null, - }; - $scope.approvalNodeState = { - name: null, - description: null, - timeoutMinutes: 0, - timeoutSeconds: 0 - }; - $scope.nodeFormDataLoaded = false; - $scope.wf_maker_template_queryset = { - page_size: '10', - order_by: 'name', - role_level: 'execute_role', - type: 'workflow_job_template,job_template' - }; - - const all_parents_must_converge = _.get( - $scope, ['nodeConfig', 'node', 'all_parents_must_converge'], - _.get($scope, ['nodeConfig', 'node', 'originalNodeObject', 'all_parents_must_converge'], false) - ); - $scope.convergenceOptions = [ - { - label: $scope.strings.get('workflow_maker.ALL'), - value: true, - }, - { - label: $scope.strings.get('workflow_maker.ANY'), - value: false, - }, - ]; - $scope.convergenceChoice = $scope.convergenceOptions.find(({ value }) => value === all_parents_must_converge); - - $scope.wf_maker_templates = []; - $scope.wf_maker_template_dataset = {}; - - // Go out and GET the list contents for each of the tabs - - listPromises.push( - qs.search(GetBasePath('unified_job_templates'), $scope.wf_maker_template_queryset) - .then((res) => { - $scope.wf_maker_template_dataset = res.data; - $scope.wf_maker_templates = $scope.wf_maker_template_dataset.results; - }) - ); - - $scope.wf_maker_project_queryset = { - page_size: '10', - order_by: 'name' - }; - - $scope.wf_maker_projects = []; - $scope.wf_maker_project_dataset = {}; - - listPromises.push( - qs.search(GetBasePath('projects'), $scope.wf_maker_project_queryset) - .then((res) => { - $scope.wf_maker_project_dataset = res.data; - $scope.wf_maker_projects = $scope.wf_maker_project_dataset.results; - }) - ); - - $scope.wf_maker_inventory_source_dataset = { - page_size: '10', - order_by: 'name', - not__source: '' - }; - - $scope.wf_maker_inventory_sources = []; - $scope.wf_maker_inventory_source_dataset = {}; - - listPromises.push( - qs.search(GetBasePath('inventory_sources'), $scope.wf_maker_inventory_source_dataset) - .then((res) => { - $scope.wf_maker_inventory_source_dataset = res.data; - $scope.wf_maker_inventory_sources = $scope.wf_maker_inventory_source_dataset.results; - }) - ); - - $q.all(listPromises) - .then(() => { - if ($scope.nodeConfig.mode === "edit") { - if ($scope.nodeConfig.node.unifiedJobTemplate && $scope.nodeConfig.node.unifiedJobTemplate.unified_job_type === "workflow_approval") { - $scope.activeTab = "approval"; - select2ifyDropdowns(); - - const timeoutMinutes = Math.floor($scope.nodeConfig.node.unifiedJobTemplate.timeout / 60); - const timeoutSeconds = $scope.nodeConfig.node.unifiedJobTemplate.timeout - timeoutMinutes * 60; - - $scope.approvalNodeState = { - name: $scope.nodeConfig.node.unifiedJobTemplate.name, - description: $scope.nodeConfig.node.unifiedJobTemplate.description, - timeoutMinutes, - timeoutSeconds - }; - - $scope.nodeFormDataLoaded = true; - } else { - // Make sure that we have the full unified job template object - if (!$scope.nodeConfig.node.fullUnifiedJobTemplateObject && _.has($scope, 'nodeConfig.node.originalNodeObject.summary_fields.unified_job_template')) { - // This is a node that we got back from the api with an incomplete - // unified job template so we're going to pull down the whole object - TemplatesService.getUnifiedJobTemplate($scope.nodeConfig.node.originalNodeObject.summary_fields.unified_job_template.id) - .then(({data}) => { - $scope.nodeConfig.node.fullUnifiedJobTemplateObject = data.results[0]; - finishConfiguringEdit(); - }, (error) => { - ProcessErrors($scope, error.data, error.status, null, { - hdr: 'Error!', - msg: 'Failed to get unified job template. GET returned ' + - 'status: ' + error.status - }); - }); - } else { - finishConfiguringEdit(); - } - } - } else { - $scope.activeTab = "templates"; - const alwaysOption = { - label: $scope.strings.get('workflow_maker.ALWAYS'), - value: 'always' - }; - const successOption = { - label: $scope.strings.get('workflow_maker.ON_SUCCESS'), - value: 'success' - }; - const failureOption = { - label: $scope.strings.get('workflow_maker.ON_FAILURE'), - value: 'failure' - }; - $scope.edgeTypeOptions = [alwaysOption]; - switch($scope.nodeConfig.newNodeIsRoot) { - case true: - $scope.edgeType = alwaysOption; - break; - case false: - $scope.edgeType = successOption; - $scope.edgeTypeOptions.push(successOption, failureOption); - break; - } - select2ifyDropdowns(); - - $scope.nodeFormDataLoaded = true; - } - }); - }; - - $scope.confirmNodeForm = () => { - const nodeFormData = { - edgeType: $scope.edgeType, - all_parents_must_converge: $scope.convergenceChoice.value, - }; - - if ($scope.activeTab === "approval") { - const timeout = $scope.approvalNodeState.timeoutMinutes * 60 + $scope.approvalNodeState.timeoutSeconds; - - nodeFormData.selectedTemplate = { - name: $scope.approvalNodeState.name, - description: $scope.approvalNodeState.description, - timeout, - unified_job_type: "workflow_approval" - }; - } else if($scope.activeTab === "templates") { - nodeFormData.selectedTemplate = $scope.jobNodeState.selectedTemplate; - nodeFormData.promptData = $scope.jobNodeState.promptData; - } else if($scope.activeTab === "project_syncs") { - nodeFormData.selectedTemplate = $scope.projectNodeState.selectedTemplate; - } else if($scope.activeTab === "inventory_syncs") { - nodeFormData.selectedTemplate = $scope.inventoryNodeState.selectedTemplate; - } - - $scope.select({ nodeFormData }); - }; - - $scope.openPromptModal = () => { - $scope.jobNodeState.promptData.triggerModalOpen = true; - }; - - $scope.selectIsDisabled = () => { - if($scope.activeTab === "templates") { - return !($scope.jobNodeState.selectedTemplate) || - $scope.jobNodeState.promptModalMissingReqFields || - $scope.jobNodeState.credentialRequiresPassword || - $scope.jobNodeState.selectedTemplateInvalid; - } else if($scope.activeTab === "project_syncs") { - return !$scope.projectNodeState.selectedTemplate; - } else if($scope.activeTab === "inventory_syncs") { - return !$scope.inventoryNodeState.selectedTemplate; - } else if ($scope.activeTab === "approval") { - return !($scope.approvalNodeState.name && $scope.approvalNodeState.name !== "") || $scope.workflow_approval.pauseTimeoutMinutes.$error.min || $scope.workflow_approval.pauseTimeoutSeconds.$error.min; - } - }; - - $scope.selectTemplate = (selectedTemplate) => { - if (!$scope.readOnly) { - clearWatchers(); - - $scope.approvalNodeState = { - name: null, - description: null, - timeoutMinutes: 0, - timeoutSeconds: 0 - }; - $scope.editNodeHelpMessage = getEditNodeHelpMessage(selectedTemplate, $scope.workflowJobTemplateObj); - - if (selectedTemplate.type === "job_template" || selectedTemplate.type === "workflow_job_template") { - let jobTemplate = selectedTemplate.type === "workflow_job_template" ? new WorkflowJobTemplate() : new JobTemplate(); - $scope.jobNodeState.promptData = null; - - $q.all([jobTemplate.optionsLaunch(selectedTemplate.id), jobTemplate.getLaunch(selectedTemplate.id)]) - .then((responses) => { - let launchConf = responses[1].data; - - let credentialRequiresPassword = false; - let selectedTemplateInvalid = false; - - if (selectedTemplate.type !== "workflow_job_template") { - if ((!selectedTemplate.inventory && !launchConf.ask_inventory_on_launch) || !selectedTemplate.project) { - selectedTemplateInvalid = true; - } - - if (launchConf.passwords_needed_to_start && launchConf.passwords_needed_to_start.length > 0) { - credentialRequiresPassword = true; - } - } - - $scope.jobNodeState.credentialRequiresPassword = credentialRequiresPassword; - $scope.jobNodeState.selectedTemplateInvalid = selectedTemplateInvalid; - $scope.jobNodeState.selectedTemplate = angular.copy(selectedTemplate); - updateSelectedRow(); - - if (!launchConf.survey_enabled && - !launchConf.ask_inventory_on_launch && - !launchConf.ask_credential_on_launch && - !launchConf.ask_verbosity_on_launch && - !launchConf.ask_job_type_on_launch && - !launchConf.ask_limit_on_launch && - !launchConf.ask_tags_on_launch && - !launchConf.ask_skip_tags_on_launch && - !launchConf.ask_diff_mode_on_launch && - !launchConf.credential_needed_to_start && - !launchConf.ask_variables_on_launch && - launchConf.variables_needed_to_start.length === 0) { - $scope.jobNodeState.showPromptButton = false; - $scope.jobNodeState.promptModalMissingReqFields = false; - } else { - $scope.jobNodeState.showPromptButton = true; - $scope.jobNodeState.promptModalMissingReqFields = false; - - if (selectedTemplate.type !== "workflow_job_template") { - if (launchConf.ask_inventory_on_launch && !_.has(launchConf, 'defaults.inventory')) { - $scope.jobNodeState.promptModalMissingReqFields = true; - } - } - - if (launchConf.survey_enabled) { - // go out and get the survey questions - jobTemplate.getSurveyQuestions(selectedTemplate.id) - .then((surveyQuestionRes) => { - - let processed = PromptService.processSurveyQuestions({ - surveyQuestions: surveyQuestionRes.data.spec - }); - - $scope.jobNodeState.missingSurveyValue = processed.missingSurveyValue; - - $scope.jobNodeState.promptData = { - launchConf: responses[1].data, - launchOptions: responses[0].data, - surveyQuestions: processed.surveyQuestions, - template: selectedTemplate.id, - templateType: selectedTemplate.type, - prompts: PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data - }), - }; - - surveyQuestionWatcher = $scope.$watch('jobNodeState.promptData.surveyQuestions', () => { - let missingSurveyValue = false; - _.each($scope.jobNodeState.promptData.surveyQuestions, (question) => { - if (question.required && (Empty(question.model) || question.model === [])) { - missingSurveyValue = true; - } - }); - $scope.jobNodeState.missingSurveyValue = missingSurveyValue; - }, true); - - watchForPromptChanges(); - }); - } else { - $scope.jobNodeState.promptData = { - launchConf: responses[1].data, - launchOptions: responses[0].data, - template: selectedTemplate.id, - templateType: selectedTemplate.type, - prompts: PromptService.processPromptValues({ - launchConf: responses[1].data, - launchOptions: responses[0].data - }), - }; - - watchForPromptChanges(); - } - } - }); - } else { - if (selectedTemplate.type === "project") { - $scope.projectNodeState.selectedTemplate = angular.copy(selectedTemplate); - } else if (selectedTemplate.type === "inventory_source") { - $scope.inventoryNodeState.selectedTemplate = angular.copy(selectedTemplate); - } - updateSelectedRow(); - } - } - }; - - $scope.$watch('nodeConfig.nodeId', (newNodeId, oldNodeId) => { - if (newNodeId !== oldNodeId) { - clearWatchers(); - setupNodeForm(); - } - }); - - $scope.$watchGroup(['wf_maker_templates', 'wf_maker_projects', 'wf_maker_inventory_sources', 'activeTab'], () => { - updateSelectedRow(); - }); - - setupNodeForm(); - } -]; diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.directive.js b/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.directive.js deleted file mode 100644 index ff16c0b2cc..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.directive.js +++ /dev/null @@ -1,24 +0,0 @@ -/************************************************* - * Copyright (c) 2018 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import workflowNodeFormController from './workflow-node-form.controller'; - -export default ['templateUrl', - function(templateUrl) { - return { - scope: { - nodeConfig: '<', - workflowJobTemplateObj: '<', - cancel: '&', - select: '&', - readOnly: '<' - }, - restrict: 'E', - templateUrl: templateUrl('templates/workflows/workflow-maker/forms/workflow-node-form'), - controller: workflowNodeFormController - }; - } -]; diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html b/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html deleted file mode 100644 index b053d6e0d0..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html +++ /dev/null @@ -1,309 +0,0 @@ -
-
{{nodeConfig.mode === 'edit' ? nodeConfig.node.fullUnifiedJobTemplateObject.name || nodeConfig.node.unifiedJobTemplate.name : strings.get('workflow_maker.ADD_A_NODE')}}
-
- -
-
-
-
- - -
- -
-
No records matched your search.
-
-
PLEASE ADD ITEMS TO THIS LIST
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
- {{wf_maker_template.name}} - - {{:: strings.get('workflow_maker.WORKFLOW') }} - -
-
-
-
-
-
- -
-
-
- - -
- -
-
No records matched your search.
-
-
No Projects Have Been Created
-
-
-
-
-
-
-
-
-
-
- -
-
-
{{ wf_maker_project.name }}
-
-
-
-
- -
-
-
- - -
- -
-
No records matched your search.
-
-
PLEASE ADD ITEMS TO THIS LIST
-
-
-
-
-
-
-
-
-
-
- -
-
-
{{ wf_maker_inventory_source.name }}
-
-
-
-
- -
-
-
- -
- -
- -
-
- -
- -
- -
-
- -
- - - - min - - - - sec -
Please enter a number greater than or equal to 0.
-
-
-
-
-
-
- - {{:: strings.get('workflows.INVALID_JOB_TEMPLATE') }} -
-
-
-
- - {{:: strings.get('workflows.CREDENTIAL_WITH_PASS') }} -
-
-
- -
- -
-
-
- -
- -
-
-
-
- {{:: strings.get('workflow_maker.READ_ONLY_PROMPT_VALUES')}} -
-
- {{:: strings.get('workflow_maker.READ_ONLY_NO_PROMPT_VALUES')}} -
-
-
{{:: strings.get('prompt.JOB_TYPE') }}
-
- {{:: strings.get('prompt.PLAYBOOK_RUN') }} - {{:: strings.get('prompt.CHECK') }} -
-
-
-
{{:: strings.get('prompt.INVENTORY') }}
-
-
-
-
{{:: strings.get('prompt.LIMIT') }}
-
-
-
-
{{:: strings.get('prompt.VERBOSITY') }}
-
-
-
-
- {{:: strings.get('prompt.JOB_TAGS') }}  - - - - -
-
-
-
- {{tag}} -
-
-
-
-
-
- {{:: strings.get('prompt.SKIP_TAGS') }}  - - - - -
-
-
-
- {{tag}} -
-
-
-
-
-
{{:: strings.get('prompt.SHOW_CHANGES') }}
-
- {{:: strings.get('ON') }} - {{:: strings.get('OFF') }} -
-
-
-
{{:: strings.get('prompt.SCM_BRANCH') }}
-
-
-
-
{{:: strings.get('prompt.EXTRA_VARIABLES') }}
-
- -
-
-
-
-
-
- - - - -
- -
\ No newline at end of file diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js b/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js deleted file mode 100644 index 460f6ccfa0..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js +++ /dev/null @@ -1,67 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['TemplateList', 'ProjectList', 'InventorySourcesList', 'i18n', - function(TemplateList, ProjectList, InventorySourcesList, i18n){ - return { - inventorySourceListDefinition: function() { - const inventorySourceList = _.cloneDeep(InventorySourcesList); - inventorySourceList.name = 'wf_maker_inventory_sources'; - inventorySourceList.iterator = 'wf_maker_inventory_source'; - inventorySourceList.maxVisiblePages = 5; - inventorySourceList.searchBarFullWidth = true; - inventorySourceList.disableRow = "{{ readOnly }}"; - inventorySourceList.disableRowValue = 'readOnly'; - - return inventorySourceList; - }, - projectListDefinition: function(){ - const projectList = _.cloneDeep(ProjectList); - delete projectList.fields.status; - delete projectList.fields.scm_type; - delete projectList.fields.last_updated; - projectList.name = 'wf_maker_projects'; - projectList.iterator = 'wf_maker_project'; - projectList.fields.name.columnClass = "col-md-11"; - projectList.maxVisiblePages = 5; - projectList.searchBarFullWidth = true; - projectList.disableRow = "{{ readOnly }}"; - projectList.disableRowValue = 'readOnly'; - - return projectList; - }, - templateListDefinition: function(){ - const templateList = _.cloneDeep(TemplateList); - delete templateList.actions; - delete templateList.fields.type; - delete templateList.fields.description; - delete templateList.fields.smart_status; - delete templateList.fields.labels; - delete templateList.fieldActions; - templateList.name = 'wf_maker_templates'; - templateList.iterator = 'wf_maker_template'; - templateList.fields.name.columnClass = "col-md-8"; - templateList.fields.name.tag = i18n._('WORKFLOW'); - templateList.fields.name.showTag = "{{wf_maker_template.type === 'workflow_job_template'}}"; - templateList.disableRow = "{{ readOnly }}"; - templateList.disableRowValue = 'readOnly'; - templateList.basePath = 'unified_job_templates'; - templateList.fields.info = { - ngInclude: "'/static/partials/job-template-details.html'", - type: 'template', - columnClass: 'col-md-3', - infoHeaderClass: 'col-md-3', - label: '', - nosort: true - }; - templateList.maxVisiblePages = 5; - templateList.searchBarFullWidth = true; - - return templateList; - } - }; - } -]; diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/main.js b/awx/ui/client/src/templates/workflows/workflow-maker/main.js deleted file mode 100644 index f93a952b82..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/main.js +++ /dev/null @@ -1,10 +0,0 @@ -import workflowMaker from './workflow-maker.directive'; -import WorkflowMakerController from './workflow-maker.controller'; -import workflowMakerForms from './forms/main'; - -export default - angular.module('templates.workflowMaker', [workflowMakerForms.name]) - // In order to test this controller I had to expose it at the module level - // like so. Is this correct? Is there a better pattern for doing this? - .controller('WorkflowMakerController', WorkflowMakerController) - .directive('workflowMaker', workflowMaker); diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.block.less b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.block.less deleted file mode 100644 index bb17089dc9..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.block.less +++ /dev/null @@ -1,414 +0,0 @@ -.WorkflowMaker-dialog { - padding: 0px; - margin-bottom: 20px; - width: 100vw !important; - height: 100vh !important; - overflow: scroll; - .ui-dialog-buttonpane, .ui-dialog-titlebar { - display:none; - } - - input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - - input[type="number"] { - -moz-appearance: textfield; - } -} - -.WorkflowMaker-header { - display: flex; - height: 34px; -} - -.WorkflowMaker-title { - align-items: center; - flex: 1 0 auto; - display: flex; - height: 34px; -} - -.WorkflowMaker-titleText { - color: @list-title-txt; - font-size: 14px; - font-weight: bold; - margin-right: 10px; -} - -.WorkflowMaker-exitHolder { - justify-content: flex-end; - display: flex; -} - -.WorkflowMaker-exit{ - cursor:pointer; - padding:0px; - border: none; - height:20px; - font-size: 20px; - background-color:@default-bg; - color:@d7grey; - transition: color 0.2s; - line-height:1; -} - -.WorkflowMaker-exit:hover{ - color:@default-icon; -} - -.WorkflowMaker-contentHolder { - display: flex; - border: 1px solid @b7grey; - border-radius: 5px; - height: ~"calc(100% - 85px)"; - overflow: hidden; -} - -.WorkflowMaker-contentLeft { - flex: 1; - flex-direction: column; - height: 100%; -} - -.WorkflowMaker-contentRight { - flex: 0 0 400px; - border-left: 1px solid @b7grey; - background: @default-bg; - padding: 20px; - height: 100%; - overflow-y: scroll; -} - -.WorkflowMaker-buttonHolder { - height: 30px; - display: flex; - justify-content: flex-end; - margin-top: 20px; -} - -.WorkflowMaker-saveButton{ - background-color: @submit-button-bg; - color: @submit-button-text; - text-transform: uppercase; - transition: background-color 0.2s; - padding-left:15px; - padding-right: 15px; - margin-left: 20px; -} - -.WorkflowMaker-saveButton:disabled{ - background-color: @submit-button-bg-dis; -} - -.WorkflowMaker-saveButton:hover{ - background-color: @submit-button-bg-hov; - color: @submit-button-text; -} - -.WorkflowMaker-cancelButton{ - background-color: @default-bg; - color: @btn-txt; - text-transform: uppercase; - border-radius: 5px; - border: 1px solid @b7grey; - transition: background-color 0.2s; - padding-left:15px; - padding-right: 15px; -} - -.WorkflowMaker-cancelButton:hover{ - background-color: @btn-bg-hov; - color: @btn-txt; -} - -.WorkflowMaker-deleteOverlay, -.WorkflowMaker-unsavedChangesOverlay { - height: 100%; - width: 100%; - position: absolute; - top: 0; - left: 0; - background: rgba(0,0,0,0.3); - z-index: 3; - display: flex; - align-items: center; - justify-content: center; - border-radius: 4px; -} - -.WorkflowMaker-deleteModal { - height: 200px; - width: 600px; - background-color: @default-bg; - border-radius: 5px; -} - -.WorkflowMaker-formTitle { - color: @list-title-txt; - font-size: 14px; - font-weight: bold; - margin-bottom: 20px; -} - -.WorkflowMaker-formHelp { - color: @default-interface-txt; -} - -.WorkflowMaker-formLists { - margin-bottom: 20px; - .SmartSearch-searchTermContainer { - width: 100%; - } -} - -.WorkflowMaker-formTitle { - display: flex; - color: @default-interface-txt; - margin-right: 10px; -} - -.WorkflowMaker-formLabel { - font-weight: normal; -} - -.WorkflowMaker-formElement { - margin-bottom: 10px; -} - -.WorkflowMaker-chart { - display: flex; - width: 100%; -} - -.WorkflowMaker-totalJobs { - margin-right: 5px; -} - -.WorkflowLegend-maker { - display: flex; - height: 40px; - line-height: 40px; - color: @default-interface-txt; - background: @default-bg; - border-bottom: 1px solid @b7grey; -} - -.WorkflowLegend-maker--left { - flex: 1 0 auto; -} - -.WorkflowLegend-maker--right { - flex: 0 0 217px; - text-align: right; - padding-right: 20px; - position: relative; -} - -.WorkflowLegend-onSuccessLegend { - height: 4px; - width: 20px; - background-color: @submit-button-bg; - margin: 18px 5px 18px 0px; -} - -.WorkflowLegend-onFailLegend { - height: 4px; - width: 20px; - background-color: @default-err; - margin: 18px 5px 18px 0px; -} - -.WorkflowLegend-alwaysLegend { - height: 4px; - width: 20px; - background-color: @default-link; - margin: 18px 5px 18px 0px; -} - -.WorkflowLegend-letterCircle{ - border-radius: 50%; - width: 20px; - height: 20px; - background: @default-icon; - color: @default-bg; - text-align: center; - margin: 10px 5px 10px 0px; - line-height: 20px; -} - -.WorkflowLegend-details { - align-items: center; - display: flex; - height: 40px; - line-height: 40px; - margin-top:10px; - border: 1px solid @d7grey; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} -.WorkflowLegend-details--left { - display: block; - flex: 1 0 auto; -} - -.WorkflowLegend-details--right { - flex: 0 0 44px; - text-align: right; - padding-right: 20px; - position:relative; -} - -.Key-menuIcon, -.WorkflowMaker-manualControlsIcon { - color: @default-icon; - vertical-align: middle; - font-size: 1.2em; - margin-left: 15px; -} - -.Key-menuIcon:hover, -.WorkflowMaker-manualControlsIcon:hover { - color: @default-link-hov; - cursor: pointer; -} - -.Key-menuIcon--active, -.WorkflowMaker-manualControlsIcon--active { - color: @default-link-hov; -} - -.WorkflowMaker-manualControls { - position: absolute; - left: -106px; - height: 60px; - width: 322px; - background-color: @default-bg; - display: flex; - border: 1px solid @b7grey; - border-top: 0px; - border-bottom-left-radius: 5px; - margin-left: -1px; - border-right: 0; -} - -.WorkflowLegend-manualControls { - position: absolute; - left: -272px; - top: 38px; - height: 60px; - width: 322px; - background-color: @default-bg; - display: flex; - border: 1px solid @d7grey; - border-bottom-left-radius: 5px; -} - -.WorkflowMaker-formTypeDropdown { - margin-bottom: 20px; -} - -.WorkflowMaker-preventBodyScrolling { - height: 100%; - overflow: hidden; -} - -.WorkflowMaker-invalidJobTemplateWarning { - margin-bottom: 5px; - color: @default-err; -} - -.WorkflowMaker-readOnlyPromptText { - margin-bottom: 20px; -} - -.WorkflowMaker-timeoutInput { - .ui-spinner { - width: 100px; - } -} - -.WorkflowMaker-timeoutSeconds { - margin-left: 10px; -} - -.WorkflowMaker-timeoutLabel { - margin-left: 3px; -} - -.Key-list { - margin: 0; - padding: 20px; - position: absolute; - background-color: @default-bg; - border: 1px solid @default-list-header-bg; -} - -.Key-listItem { - display: flex; - padding: 0; - margin: 5px 0 0 0; -} - -.Key-listItemContent { - margin: 0; - line-height: 20px; -} - -.Key-listItemContent--circle { - line-height: 28px; -} - -.Key-icon { - height: 3px; - width: 20px; - margin: 9px 5px 9px 0px; - outline: none; -} - -.Key-heading { - font-weight: 700; - margin: 0 0 10px; - line-height: 0; - padding: 0; -} - -.Key-icon--success { - background-color: @submit-button-bg; -} - -.Key-icon--fail { - background-color: @default-err; -} - -.Key-icon--always { - background-color: @default-link; -} - -.Key-icon--warning { - background: @default-warning; -} - -.Key-icon--default { - background: @default-icon; -} - -.Key-icon--circle { - border-radius: 50%; - width: 24px; - height: 24px; - color: @default-bg; - text-align: center; - line-height: 24px; - margin: 4px 5px 5px 0px; -} - -.Key-details { - display: flex; - height: 40px; - line-height: 40px; - padding-left: 20px; - border: 1px solid @default-no-items-bord; - margin-top:10px; -} diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js deleted file mode 100644 index d701d220d6..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js +++ /dev/null @@ -1,1109 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default ['$scope', 'TemplatesService', - 'ProcessErrors', '$q', 'Rest', - 'PromptService', 'TemplatesStrings', 'WorkflowChartService', - 'Wait', '$state', - function ($scope, TemplatesService, - ProcessErrors, $q, Rest, - PromptService, TemplatesStrings, WorkflowChartService, - Wait, $state - ) { - - let deletedNodeIds = []; - let workflowMakerNodeIdCounter; - let nodeIdToChartNodeIdMapping = {}; - let nodeRef = {}; - let allNodes = []; - let page = 1; - - $scope.strings = TemplatesStrings; - $scope.preventCredsWithPasswords = true; - $scope.showKey = false; - $scope.toggleKey = () => $scope.showKey = !$scope.showKey; - $scope.keyClassList = `{ 'Key-menuIcon--active': showKey }`; - $scope.readOnly = !_.get($scope, 'workflowJobTemplateObj.summary_fields.user_capabilities.edit'); - $scope.formState = { - 'showNodeForm': false, - 'showLinkForm': false - }; - - $scope.workflowChangesUnsaved = false; - $scope.workflowChangesStarted = false; - - $scope.cancelUnsavedChanges = () => { - $scope.unsavedChangesVisible = false; - }; - - let getNodes = () => { - Wait('start'); - TemplatesService.getWorkflowJobTemplateNodes($scope.workflowJobTemplateObj.id, page) - .then(({data}) => { - for (let i = 0; i < data.results.length; i++) { - allNodes.push(data.results[i]); - } - if (data.next) { - // Get the next page - page++; - getNodes(); - } else { - let arrayOfLinksForChart = []; - let arrayOfNodesForChart = []; - - ({arrayOfNodesForChart, arrayOfLinksForChart, nodeIdToChartNodeIdMapping, nodeRef, workflowMakerNodeIdCounter} = WorkflowChartService.generateArraysOfNodesAndLinks(allNodes)); - - $scope.graphState = { arrayOfNodesForChart, arrayOfLinksForChart }; - - Wait('stop'); - } - }, ({ data, status, config }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER'), - msg: $scope.strings.get('error.CALL', { - path: `${config.url}`, - action: `${config.method}`, - status - }) - }); - }); - }; - - getNodes(); - - $scope.saveWorkflowMaker = () => { - - Wait('start'); - - $scope.unsavedChangesVisible = false; - - let buildSendableNodeData = (node) => { - // Create the node - let sendableNodeData = { - extra_data: {}, - inventory: null, - job_type: null, - job_tags: null, - skip_tags: null, - limit: null, - diff_mode: null, - verbosity: null, - credential: null, - all_parents_must_converge: _.get(node, 'all_parents_must_converge', false) - }; - - if (_.has(node, 'fullUnifiedJobTemplateObject')) { - sendableNodeData.unified_job_template = node.fullUnifiedJobTemplateObject.id; - } - - if (_.has(node, 'promptData.extraVars')) { - const formVars = node.promptData.extraVars; - const formVarsJSON = typeof formVars === 'string' ? jsyaml.safeLoad(formVars) : formVars; - if (_.get(node, 'promptData.launchConf.defaults.extra_vars')) { - const defaultVars = node.promptData.launchConf.defaults.extra_vars; - const defaultVarsJSON = typeof defaultVars === 'string' ? jsyaml.safeLoad(defaultVars) : defaultVars; - - // Only include extra vars that differ from the template default vars - _.forOwn(formVarsJSON, (value, key) => { - if (!defaultVarsJSON[key] || defaultVarsJSON[key] !== value) { - sendableNodeData.extra_data[key] = value; - } - }); - if (_.isEmpty(sendableNodeData.extra_data)) { - delete sendableNodeData.extra_data; - } - } else { - if (_.has(node, 'promptData.extraVars') && !_.isEmpty(formVarsJSON)) { - sendableNodeData.extra_data = formVarsJSON; - } - } - } - - // Check to see if the user has provided any prompt values that are different - // from the defaults in the job template - - if (_.has(node, 'fullUnifiedJobTemplateObject') && - (node.fullUnifiedJobTemplateObject.type === "workflow_job_template" || - node.fullUnifiedJobTemplateObject.type === "job_template") && - node.promptData - ) { - sendableNodeData = PromptService.bundlePromptDataForSaving({ - promptData: node.promptData, - dataToSave: sendableNodeData - }); - } - - return sendableNodeData; - }; - - if ($scope.graphState.arrayOfNodesForChart.length > 1) { - let approvalTemplatePromises = []; - let addPromises = []; - let editPromises = []; - let credentialRequests = []; - - Object.keys(nodeRef).map((workflowMakerNodeId) => { - const node = nodeRef[workflowMakerNodeId]; - const all_parents_must_converge = _.get(node, 'all_parents_must_converge', false); - if (node.isNew) { - if (node.unifiedJobTemplate && node.unifiedJobTemplate.unified_job_type === "workflow_approval") { - addPromises.push(TemplatesService.addWorkflowNode({ - url: $scope.workflowJobTemplateObj.related.workflow_nodes, - data: { - all_parents_must_converge - } - }).then(({data: newNodeData}) => { - Rest.setUrl(newNodeData.related.create_approval_template); - approvalTemplatePromises.push(Rest.post({ - name: node.unifiedJobTemplate.name, - description: node.unifiedJobTemplate.description, - timeout: node.unifiedJobTemplate.timeout - }).then(() => { - node.originalNodeObject = newNodeData; - nodeIdToChartNodeIdMapping[newNodeData.id] = parseInt(workflowMakerNodeId); - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - })); - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - })); - } else { - addPromises.push(TemplatesService.addWorkflowNode({ - url: $scope.workflowJobTemplateObj.related.workflow_nodes, - data: buildSendableNodeData(node) - }).then(({data: newNodeData}) => { - node.originalNodeObject = newNodeData; - nodeIdToChartNodeIdMapping[newNodeData.id] = parseInt(workflowMakerNodeId); - if (_.get(node, 'promptData.launchConf.ask_credential_on_launch')) { - // This finds the credentials that were selected in the prompt but don't occur - // in the template defaults - let credentialIdsToPost = node.promptData.prompts.credentials.value.filter((credFromPrompt) => { - let defaultCreds = _.get(node, 'promptData.launchConf.defaults.credentials', []); - return !defaultCreds.some((defaultCred) => { - return credFromPrompt.id === defaultCred.id; - }); - }); - - credentialIdsToPost.forEach((credentialToPost) => { - credentialRequests.push({ - id: newNodeData.id, - data: { - id: credentialToPost.id - } - }); - }); - } - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - })); - } - } else if (node.isEdited) { - if (node.unifiedJobTemplate && node.unifiedJobTemplate.unified_job_type === "workflow_approval") { - if (node.originalNodeObject.summary_fields.unified_job_template.unified_job_type === "workflow_approval") { - Rest.setUrl(node.originalNodeObject.related.unified_job_template); - approvalTemplatePromises.push(Rest.patch({ - name: node.unifiedJobTemplate.name, - description: node.unifiedJobTemplate.description, - timeout: node.unifiedJobTemplate.timeout - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - })); - } else { - Rest.setUrl(node.originalNodeObject.related.create_approval_template); - approvalTemplatePromises.push(Rest.post({ - name: node.unifiedJobTemplate.name, - description: node.unifiedJobTemplate.description, - timeout: node.unifiedJobTemplate.timeout - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - })); - } - if (node.originalNodeObject.all_parents_must_converge !== all_parents_must_converge) { - editPromises.push(TemplatesService.editWorkflowNode({ - id: node.originalNodeObject.id, - data: { - all_parents_must_converge - } - })); - } - } else { - editPromises.push(TemplatesService.editWorkflowNode({ - id: node.originalNodeObject.id, - data: buildSendableNodeData(node) - })); - } - - if (_.get(node, 'promptData.launchConf.ask_credential_on_launch')) { - let credentialsNotInPriorCredentials = node.promptData.prompts.credentials.value.filter((credFromPrompt) => { - let defaultCreds = _.get(node, 'promptData.launchConf.defaults.credentials', []); - return !defaultCreds.some((defaultCred) => { - return credFromPrompt.id === defaultCred.id; - }); - }); - - let credentialsToAdd = credentialsNotInPriorCredentials.filter((credNotInPrior) => { - let previousOverrides = _.get(node, 'promptData.prompts.credentials.previousOverrides', []); - return !previousOverrides.some((priorCred) => { - return credNotInPrior.id === priorCred.id; - }); - }); - - let credentialsToRemove = []; - - if (_.has(node, 'promptData.prompts.credentials.previousOverrides')) { - credentialsToRemove = node.promptData.prompts.credentials.previousOverrides.filter((priorCred) => { - return !credentialsNotInPriorCredentials.some((credNotInPrior) => { - return priorCred.id === credNotInPrior.id; - }); - }); - } - - credentialsToAdd.forEach((credentialToAdd) => { - credentialRequests.push({ - id: node.originalNodeObject.id, - data: { - id: credentialToAdd.id - } - }); - }); - - credentialsToRemove.forEach((credentialToRemove) => { - credentialRequests.push({ - id: node.originalNodeObject.id, - data: { - id: credentialToRemove.id, - disassociate: true - } - }); - }); - } - } - - }); - - let deletePromises = deletedNodeIds.map((nodeId) => { - return TemplatesService.deleteWorkflowJobTemplateNode(nodeId); - }); - - $q.all(addPromises.concat(editPromises, deletePromises)) - .then(() => { - $q.all(approvalTemplatePromises) - .then(() => { - let disassociatePromises = []; - let linkMap = {}; - - // Build a link map for easy access - $scope.graphState.arrayOfLinksForChart.forEach(link => { - // link.source.id of 1 is our artificial start node - if (link.source.id !== 1) { - const sourceNodeId = nodeRef[link.source.id].originalNodeObject.id; - const targetNodeId = nodeRef[link.target.id].originalNodeObject.id; - if (!linkMap[sourceNodeId]) { - linkMap[sourceNodeId] = {}; - } - - linkMap[sourceNodeId][targetNodeId] = link.edgeType; - } - }); - - Object.keys(nodeRef).map((workflowNodeId) => { - let nodeId = nodeRef[workflowNodeId].originalNodeObject.id; - if (nodeRef[workflowNodeId].originalNodeObject.success_nodes) { - nodeRef[workflowNodeId].originalNodeObject.success_nodes.forEach((successNodeId) => { - if ( - !deletedNodeIds.includes(successNodeId) && - (!linkMap[nodeId] || - !linkMap[nodeId][successNodeId] || - linkMap[nodeId][successNodeId] !== "success") - ) { - disassociatePromises.push( - TemplatesService.disassociateWorkflowNode({ - parentId: nodeId, - nodeId: successNodeId, - edge: "success" - }) - ); - } - }); - } - if (nodeRef[workflowNodeId].originalNodeObject.failure_nodes) { - nodeRef[workflowNodeId].originalNodeObject.failure_nodes.forEach((failureNodeId) => { - if ( - !deletedNodeIds.includes(failureNodeId) && - (!linkMap[nodeId] || - !linkMap[nodeId][failureNodeId] || - linkMap[nodeId][failureNodeId] !== "failure") - ) { - disassociatePromises.push( - TemplatesService.disassociateWorkflowNode({ - parentId: nodeId, - nodeId: failureNodeId, - edge: "failure" - }) - ); - } - }); - } - if (nodeRef[workflowNodeId].originalNodeObject.always_nodes) { - nodeRef[workflowNodeId].originalNodeObject.always_nodes.forEach((alwaysNodeId) => { - if ( - !deletedNodeIds.includes(alwaysNodeId) && - (!linkMap[nodeId] || - !linkMap[nodeId][alwaysNodeId] || - linkMap[nodeId][alwaysNodeId] !== "always") - ) { - disassociatePromises.push( - TemplatesService.disassociateWorkflowNode({ - parentId: nodeId, - nodeId: alwaysNodeId, - edge: "always" - }) - ); - } - }); - } - }); - - $q.all(disassociatePromises) - .then(() => { - let associatePromises = []; - Object.keys(linkMap).map((sourceNodeId) => { - Object.keys(linkMap[sourceNodeId]).map((targetNodeId) => { - const sourceChartNodeId = nodeIdToChartNodeIdMapping[sourceNodeId]; - const targetChartNodeId = nodeIdToChartNodeIdMapping[targetNodeId]; - switch(linkMap[sourceNodeId][targetNodeId]) { - case "success": - if ( - !nodeRef[sourceChartNodeId].originalNodeObject.success_nodes || - !nodeRef[sourceChartNodeId].originalNodeObject.success_nodes.includes(nodeRef[targetChartNodeId].originalNodeObject.id) - ) { - associatePromises.push( - TemplatesService.associateWorkflowNode({ - parentId: parseInt(sourceNodeId), - nodeId: parseInt(targetNodeId), - edge: "success" - }) - ); - } - break; - case "failure": - if ( - !nodeRef[sourceChartNodeId].originalNodeObject.failure_nodes || - !nodeRef[sourceChartNodeId].originalNodeObject.failure_nodes.includes(nodeRef[targetChartNodeId].originalNodeObject.id) - ) { - associatePromises.push( - TemplatesService.associateWorkflowNode({ - parentId: parseInt(sourceNodeId), - nodeId: parseInt(targetNodeId), - edge: "failure" - }) - ); - } - break; - case "always": - if ( - !nodeRef[sourceChartNodeId].originalNodeObject.always_nodes || - !nodeRef[sourceChartNodeId].originalNodeObject.always_nodes.includes(nodeRef[targetChartNodeId].originalNodeObject.id) - ) { - associatePromises.push( - TemplatesService.associateWorkflowNode({ - parentId: parseInt(sourceNodeId), - nodeId: parseInt(targetNodeId), - edge: "always" - }) - ); - } - break; - } - }); - }); - - let credentialPromises = credentialRequests.map((request) => { - return TemplatesService.postWorkflowNodeCredential({ - id: request.id, - data: request.data - }); - }); - - return $q.all(associatePromises.concat(credentialPromises)) - .then(() => { - Wait('stop'); - $scope.workflowChangesUnsaved = false; - $scope.workflowChangesStarted = false; - $scope.closeDialog(); - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - }); - }).catch(({ - data, - status - }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - }); - }); - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - }); - } else { - - let deletePromises = deletedNodeIds.map((nodeId) => { - return TemplatesService.deleteWorkflowJobTemplateNode(nodeId); - }); - - $q.all(deletePromises) - .then(() => { - Wait('stop'); - $scope.workflowChangesUnsaved = false; - $scope.workflowChangesStarted = false; - $scope.closeDialog(); - $state.transitionTo('templates'); - }).catch(({ data, status }) => { - Wait('stop'); - ProcessErrors($scope, data, status, null, { - hdr: $scope.strings.get('error.HEADER') - }); - }); - } - }; - - /* ADD NODE FUNCTIONS */ - - $scope.startAddNodeWithoutChild = (parent) => { - $scope.workflowChangesStarted = true; - if ($scope.nodeConfig) { - $scope.cancelNodeForm(); - } - - if ($scope.linkConfig) { - $scope.cancelLinkForm(); - } - - $scope.graphState.arrayOfNodesForChart.push({ - id: workflowMakerNodeIdCounter, - unifiedJobTemplate: null - }); - - $scope.graphState.nodeBeingAdded = workflowMakerNodeIdCounter; - - $scope.graphState.arrayOfLinksForChart.push({ - source: { - id: parent.id, - unifiedJobTemplate: parent.unifiedJobTemplate - }, - target: {id: workflowMakerNodeIdCounter}, - edgeType: "placeholder" - }); - - $scope.nodeConfig = { - mode: "add", - nodeId: workflowMakerNodeIdCounter, - newNodeIsRoot: parent.id === 1 - }; - - workflowMakerNodeIdCounter++; - - $scope.$broadcast("refreshWorkflowChart"); - - $scope.formState.showNodeForm = true; - }; - - $scope.startAddNodeWithChild = (link) => { - $scope.workflowChangesStarted = true; - if ($scope.nodeConfig) { - $scope.cancelNodeForm(); - } - - if ($scope.linkConfig) { - $scope.cancelLinkForm(); - } - - $scope.graphState.arrayOfNodesForChart.push({ - id: workflowMakerNodeIdCounter, - unifiedJobTemplate: null - }); - - $scope.graphState.nodeBeingAdded = workflowMakerNodeIdCounter; - - $scope.graphState.arrayOfLinksForChart.push({ - source: { - id: link.source.id, - unifiedJobTemplate: link.source.unifiedJobTemplate - }, - target: {id: workflowMakerNodeIdCounter}, - edgeType: "placeholder" - }); - - $scope.nodeConfig = { - mode: "add", - nodeId: workflowMakerNodeIdCounter, - newNodeIsRoot: link.source.id === 1 - }; - - // Search for the link that used to exist between source and target and shift it to - // go from our new node to the target - $scope.graphState.arrayOfLinksForChart.forEach((linkToCompare) => { - if (linkToCompare.source.id === link.source.id && linkToCompare.target.id === link.target.id) { - linkToCompare.source = {id: workflowMakerNodeIdCounter}; - } - }); - - workflowMakerNodeIdCounter++; - - $scope.$broadcast("refreshWorkflowChart"); - - $scope.formState.showNodeForm = true; - }; - - $scope.confirmNodeForm = (nodeFormData) => { - const { edgeType, selectedTemplate, promptData } = nodeFormData; - const isPauseNode = selectedTemplate.type === "workflow_approval" || - selectedTemplate.unified_job_type === "workflow_approval"; - // edgeType, selectedTemplate, promptData - // can determine pause node by looking at the type (?) or maybe unified_job_type - $scope.workflowChangesUnsaved = true; - const nodeId = $scope.nodeConfig.nodeId; - if ($scope.nodeConfig.mode === "add") { - if (edgeType && edgeType.value && selectedTemplate) { - if (isPauseNode) { - nodeRef[$scope.nodeConfig.nodeId] = { - unifiedJobTemplate: { - name: selectedTemplate.name, - description: selectedTemplate.description, - timeout: selectedTemplate.timeout, - unified_job_type: "workflow_approval" - }, - isNew: true - }; - } else { - nodeRef[$scope.nodeConfig.nodeId] = { - fullUnifiedJobTemplateObject: selectedTemplate, - promptData, - isNew: true - }; - } - $scope.graphState.nodeBeingAdded = null; - - $scope.graphState.arrayOfLinksForChart.map( (link) => { - if (link.target.id === nodeId) { - link.edgeType = edgeType.value; - link.target.unifiedJobTemplate = selectedTemplate; - } - }); - } - } else if ($scope.nodeConfig.mode === "edit") { - if (selectedTemplate) { - if (isPauseNode) { - // If it's a _new_ pause node then we'll want to create the new ujt - // If it's an existing pause node then we'll want to update the ujt - nodeRef[$scope.nodeConfig.nodeId].unifiedJobTemplate = { - name: selectedTemplate.name, - description: selectedTemplate.description, - timeout: selectedTemplate.timeout, - unified_job_type: "workflow_approval" - }; - nodeRef[$scope.nodeConfig.nodeId].isEdited = true; - } else { - nodeRef[$scope.nodeConfig.nodeId].fullUnifiedJobTemplateObject = selectedTemplate; - nodeRef[$scope.nodeConfig.nodeId].unifiedJobTemplate = selectedTemplate; - nodeRef[$scope.nodeConfig.nodeId].promptData = _.cloneDeep(promptData); - nodeRef[$scope.nodeConfig.nodeId].isEdited = true; - } - - $scope.graphState.nodeBeingEdited = null; - - $scope.graphState.arrayOfLinksForChart.map( (link) => { - if (link.target.id === nodeId) { - link.target.unifiedJobTemplate = selectedTemplate; - } - if (link.source.id === nodeId) { - link.source.unifiedJobTemplate = selectedTemplate; - } - }); - } - } - nodeRef[$scope.nodeConfig.nodeId].all_parents_must_converge = nodeFormData.all_parents_must_converge; - - $scope.graphState.arrayOfNodesForChart.map( (node) => { - if (node.id === nodeId) { - node.all_parents_must_converge = nodeFormData.all_parents_must_converge; - if (isPauseNode) { - node.unifiedJobTemplate = { - unified_job_type: 'workflow_approval', - name: selectedTemplate.name, - description: selectedTemplate.description, - timeout: selectedTemplate.timeout, - }; - } else { - node.unifiedJobTemplate = selectedTemplate; - } - } - }); - - $scope.formState.showNodeForm = false; - $scope.nodeConfig = null; - - $scope.$broadcast("refreshWorkflowChart"); - }; - - $scope.cancelNodeForm = () => { - $scope.workflowChangesStarted = false; - const nodeId = $scope.nodeConfig.nodeId; - if ($scope.nodeConfig.mode === "add") { - // Remove the placeholder node from the array - for( let i = $scope.graphState.arrayOfNodesForChart.length; i--; ){ - if ($scope.graphState.arrayOfNodesForChart[i].id === nodeId) { - $scope.graphState.arrayOfNodesForChart.splice(i, 1); - i = 0; - } - } - - // Update the links - let parents = []; - let children = []; - - // Remove any links that reference this node - for( let i = $scope.graphState.arrayOfLinksForChart.length; i--; ){ - const link = $scope.graphState.arrayOfLinksForChart[i]; - - if (link.source.id === nodeId || link.target.id === nodeId) { - if (link.source.id === nodeId) { - children.push({id: link.target.id, edgeType: link.edgeType}); - } else if (link.target.id === nodeId) { - parents.push(link.source.id); - } - $scope.graphState.arrayOfLinksForChart.splice(i, 1); - } - } - - // Add the new links - parents.forEach((parentId) => { - children.forEach((child) => { - let source = { - id: parentId - }; - if (parentId === 1) { - child.edgeType = "always"; - } - $scope.graphState.arrayOfLinksForChart.push({ - source, - target: {id: child.id}, - edgeType: child.edgeType - }); - }); - }); - - } else if ($scope.nodeConfig.mode === "edit") { - $scope.graphState.nodeBeingEdited = null; - } - $scope.formState.showNodeForm = false; - $scope.nodeConfig = null; - $scope.$broadcast("refreshWorkflowChart"); - }; - - /* EDIT NODE FUNCTIONS */ - - $scope.startEditNode = (nodeToEdit) => { - $scope.workflowChangesStarted = true; - if ($scope.linkConfig) { - $scope.cancelLinkForm(); - } - - if (!$scope.nodeConfig || ($scope.nodeConfig && $scope.nodeConfig.nodeId !== nodeToEdit.id)) { - if ($scope.nodeConfig) { - $scope.cancelNodeForm(); - } - - $scope.nodeConfig = { - mode: "edit", - nodeId: nodeToEdit.id, - node: nodeRef[nodeToEdit.id] - }; - - $scope.graphState.nodeBeingEdited = nodeToEdit.id; - - $scope.formState.showNodeForm = true; - } - - $scope.$broadcast("refreshWorkflowChart"); - }; - - /* LINK FUNCTIONS */ - - $scope.startEditLink = (linkToEdit) => { - $scope.workflowChangesStarted = true; - const setupLinkEdit = () => { - - // Determine whether or not this link can be removed - let numberOfParents = 0; - $scope.graphState.arrayOfLinksForChart.forEach((link) => { - if (link.target.id === linkToEdit.target.id) { - numberOfParents++; - } - }); - - $scope.graphState.linkBeingEdited = { - source: linkToEdit.source.id, - target: linkToEdit.target.id - }; - - $scope.linkConfig = { - mode: "edit", - source: { - id: linkToEdit.source.id, - name: _.get(linkToEdit, 'source.unifiedJobTemplate.name') || "" - }, - target: { - id: linkToEdit.target.id, - name: _.get(linkToEdit, 'target.unifiedJobTemplate.name') || "" - }, - edgeType: linkToEdit.edgeType, - canUnlink: numberOfParents > 1 - }; - $scope.formState.showLinkForm = true; - - $scope.$broadcast("refreshWorkflowChart"); - }; - - if ($scope.nodeConfig) { - $scope.cancelNodeForm(); - } - - if ($scope.linkConfig) { - if ($scope.linkConfig.source.id !== linkToEdit.source.id || $scope.linkConfig.target.id !== linkToEdit.target.id) { - // User is going from editing one link to editing another - if ($scope.linkConfig.mode === "add") { - $scope.graphState.arrayOfLinksForChart.splice($scope.graphState.arrayOfLinksForChart.length-1, 1); - } - setupLinkEdit(); - } - } else { - setupLinkEdit(); - } - - }; - - $scope.selectNodeForLinking = (node) => { - $scope.workflowChangesStarted = true; - if ($scope.nodeConfig) { - $scope.cancelNodeForm(); - } - // User was add/editing a link and then hit the link icon - if ($scope.linkConfig && $scope.linkConfig.target) { - $scope.cancelLinkForm(); - } - if ($scope.linkConfig) { - // This is the second node selected - $scope.linkConfig.target = { - id: node.id, - name: node.unifiedJobTemplate.name - }; - $scope.linkConfig.edgeType = "success"; - - $scope.graphState.arrayOfNodesForChart.forEach((nodeToUpdate) => { - nodeToUpdate.isInvalidLinkTarget = false; - }); - - $scope.graphState.arrayOfLinksForChart.push({ - source: {id: $scope.linkConfig.source.id}, - target: {id: node.id}, - edgeType: "placeholder" - }); - - $scope.graphState.linkBeingEdited = { - source: {id: $scope.linkConfig.source.id}, - target: {id: node.id} - }; - - $scope.graphState.arrayOfLinksForChart.forEach((link, index) => { - if (link.source.id === 1 && link.target.id === node.id) { - $scope.graphState.arrayOfLinksForChart.splice(index, 1); - } - }); - - $scope.graphState.isLinkMode = false; - } else { - // This is the first node selected - $scope.graphState.addLinkSource = node.id; - $scope.linkConfig = { - mode: "add", - source: { - id: node.id, - name: node.unifiedJobTemplate.name - } - }; - - let parentMap = {}; - let invalidLinkTargetIds = []; - - // Find and mark any ancestors as disabled to prevent cycles - $scope.graphState.arrayOfLinksForChart.forEach((link) => { - // id=1 is our artificial root node so we don't care about that - if (link.source.id !== 1) { - if (link.source.id === node.id) { - // Disables direct children from the add link process - invalidLinkTargetIds.push(link.target.id); - } - if (!parentMap[link.target.id]) { - parentMap[link.target.id] = []; - } - parentMap[link.target.id].push(link.source.id); - } - }); - - let getAncestors = (id) => { - if (parentMap[id]) { - parentMap[id].forEach((parentId) => { - invalidLinkTargetIds.push(parentId); - getAncestors(parentId); - }); - } - }; - - getAncestors(node.id); - - // Filter out the duplicates - invalidLinkTargetIds.filter((element, index, array) => index === array.indexOf(element)).forEach((ancestorId) => { - $scope.graphState.arrayOfNodesForChart.forEach((node) => { - if (node.id === ancestorId) { - node.isInvalidLinkTarget = true; - } - }); - }); - - $scope.graphState.isLinkMode = true; - - $scope.formState.showLinkForm = true; - } - - $scope.$broadcast("refreshWorkflowChart"); - }; - - $scope.confirmLinkForm = (newEdgeType) => { - $scope.workflowChangesUnsaved = true; - $scope.graphState.arrayOfLinksForChart.forEach((link) => { - if (link.source.id === $scope.linkConfig.source.id && link.target.id === $scope.linkConfig.target.id) { - link.edgeType = newEdgeType; - } - }); - - if ($scope.linkConfig.mode === "add") { - $scope.graphState.arrayOfNodesForChart.forEach((node) => { - node.isInvalidLinkTarget = false; - }); - } - - $scope.graphState.linkBeingEdited = null; - $scope.graphState.addLinkSource = null; - $scope.formState.showLinkForm = false; - $scope.linkConfig = null; - $scope.$broadcast("refreshWorkflowChart"); - }; - - $scope.unlink = () => { - $scope.workflowChangesUnsaved = true; - // Remove the link - for( let i = $scope.graphState.arrayOfLinksForChart.length; i--; ){ - const link = $scope.graphState.arrayOfLinksForChart[i]; - - if (link.source.id === $scope.linkConfig.source.id && link.target.id === $scope.linkConfig.target.id) { - $scope.graphState.arrayOfLinksForChart.splice(i, 1); - } - } - - $scope.formState.showLinkForm = false; - $scope.linkConfig = null; - $scope.$broadcast("refreshWorkflowChart"); - }; - - $scope.cancelLinkForm = () => { - $scope.workflowChangesStarted = false; - if ($scope.linkConfig.mode === "add" && $scope.linkConfig.target) { - $scope.graphState.arrayOfLinksForChart.splice($scope.graphState.arrayOfLinksForChart.length-1, 1); - let targetIsOrphaned = true; - $scope.graphState.arrayOfLinksForChart.forEach((link) => { - if (link.target.id === $scope.linkConfig.target.id) { - targetIsOrphaned = false; - } - }); - if (targetIsOrphaned) { - // Link it to the start node - $scope.graphState.arrayOfLinksForChart.push({ - source: {id: 1}, - target: {id: $scope.linkConfig.target.id}, - edgeType: "always" - }); - } - } - $scope.graphState.linkBeingEdited = null; - $scope.graphState.addLinkSource = null; - $scope.graphState.isLinkMode = false; - $scope.graphState.arrayOfNodesForChart.forEach((node) => { - node.isInvalidLinkTarget = false; - }); - $scope.formState.showLinkForm = false; - $scope.linkConfig = null; - $scope.$broadcast("refreshWorkflowChart"); - }; - - /* DELETE NODE FUNCTIONS */ - - $scope.startDeleteNode = (nodeToDelete) => { - $scope.workflowChangesStarted = true; - $scope.nodeToBeDeleted = nodeToDelete; - $scope.deleteOverlayVisible = true; - }; - - $scope.cancelDeleteNode = () => { - $scope.workflowChangesStarted = false; - $scope.nodeToBeDeleted = null; - $scope.deleteOverlayVisible = false; - }; - - $scope.confirmDeleteNode = () => { - $scope.workflowChangesUnsaved = true; - if ($scope.nodeToBeDeleted) { - const nodeId = $scope.nodeToBeDeleted.id; - - if ($scope.linkConfig) { - $scope.cancelLinkForm(); - } - - if ($scope.nodeConfig && $scope.nodeConfig.nodeId === nodeId) { - $scope.cancelNodeForm(); - } - - // Remove the node from the array - for( let i = $scope.graphState.arrayOfNodesForChart.length; i--; ){ - if ($scope.graphState.arrayOfNodesForChart[i].id === nodeId) { - $scope.graphState.arrayOfNodesForChart.splice(i, 1); - i = 0; - } - } - - // Update the links - let parents = []; - let children = []; - let linkParentMapping = {}; - - // Remove any links that reference this node - for( let i = $scope.graphState.arrayOfLinksForChart.length; i--; ){ - const link = $scope.graphState.arrayOfLinksForChart[i]; - - if (!linkParentMapping[link.target.id]) { - linkParentMapping[link.target.id] = []; - } - - linkParentMapping[link.target.id].push(link.source.id); - - if (link.source.id === nodeId || link.target.id === nodeId) { - if (link.source.id === nodeId) { - children.push({id: link.target.id, edgeType: link.edgeType}); - } else if (link.target.id === nodeId) { - parents.push(link.source.id); - } - $scope.graphState.arrayOfLinksForChart.splice(i, 1); - } - } - - // Add the new links - parents.forEach((parentId) => { - children.forEach((child) => { - if (parentId === 1) { - // We only want to create a link from the start node to this node if it - // doesn't have any other parents - if(linkParentMapping[child.id].length === 1) { - $scope.graphState.arrayOfLinksForChart.push({ - source: {id: parentId}, - target: {id: child.id}, - edgeType: "always" - }); - } - } else { - // We don't want to add a link that already exists - if (!linkParentMapping[child.id].includes(parentId)) { - $scope.graphState.arrayOfLinksForChart.push({ - source: {id: parentId}, - target: {id: child.id}, - edgeType: child.edgeType - }); - } - } - - }); - }); - - if (nodeRef[$scope.nodeToBeDeleted.id].isNew !== true) { - deletedNodeIds.push(nodeRef[$scope.nodeToBeDeleted.id].originalNodeObject.id); - } - - delete nodeRef[$scope.nodeToBeDeleted.id]; - - $scope.deleteOverlayVisible = false; - - $scope.nodeToBeDeleted = null; - $scope.deleteOverlayVisible = false; - - $scope.$broadcast("refreshWorkflowChart"); - } - - }; - - $scope.toggleManualControls = () => { - $scope.showManualControls = !$scope.showManualControls; - }; - - $scope.panChart = (direction) => { - $scope.$broadcast('panWorkflowChart', { - direction: direction - }); - }; - - $scope.zoomChart = (zoom) => { - $scope.$broadcast('zoomWorkflowChart', { - zoom: zoom - }); - }; - - $scope.resetChart = () => { - $scope.$broadcast('resetWorkflowChart'); - }; - - $scope.workflowZoomed = (zoom) => { - $scope.$broadcast('workflowZoomed', { - zoom: zoom - }); - }; - - $scope.zoomToFitChart = () => { - $scope.$broadcast('zoomToFitChart'); - }; - } -]; diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js deleted file mode 100644 index 79bb9f9429..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js +++ /dev/null @@ -1,99 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import workflowMakerController from './workflow-maker.controller'; - -export default ['templateUrl', 'CreateDialog', 'Wait', '$state', '$window', - function(templateUrl, CreateDialog, Wait, $state, $window) { - return { - scope: { - workflowJobTemplateObj: '=', - canAddOrEdit: '=' - }, - restrict: 'E', - templateUrl: templateUrl('templates/workflows/workflow-maker/workflow-maker'), - controller: workflowMakerController, - link: function(scope) { - - let availableHeight = $(window).height(), - availableWidth = $(window).width(), - minimumWidth = 682, - minimumHeight = 400; - - CreateDialog({ - id: 'workflow-modal-dialog', - scope: scope, - width: availableWidth > minimumWidth ? availableWidth : minimumWidth, - height: availableHeight > minimumHeight ? availableHeight : minimumHeight, - draggable: false, - dialogClass: 'WorkflowMaker-dialog', - position: ['center', 20], - onClose: function() { - $('#workflow-modal-dialog').empty(); - $('body').removeClass('WorkflowMaker-preventBodyScrolling'); - }, - onOpen: function() { - Wait('stop'); - $('body').addClass('WorkflowMaker-preventBodyScrolling'); - - // Let the modal height be variable based on the content - // and set a uniform padding - $('#workflow-modal-dialog').css({ 'padding': '20px' }); - $('#workflow-modal-dialog').outerHeight(availableHeight > minimumHeight ? availableHeight : minimumHeight); - $('#workflow-modal-dialog').outerWidth(availableWidth > minimumWidth ? availableWidth : minimumWidth); - - }, - _allowInteraction: function(e) { - return !!$(e.target).is('.select2-input') || this._super(e); - }, - callback: 'WorkflowDialogReady' - }); - if (scope.removeWorkflowDialogReady) { - scope.removeWorkflowDialogReady(); - } - scope.removeWorkflowDialogReady = scope.$on('WorkflowDialogReady', function() { - $('#workflow-modal-dialog').dialog('open'); - - scope.modalOpen = true; - - scope.$broadcast("refreshWorkflowChart"); - }); - - scope.closeDialog = function(exitWithUnsavedChanges) { - if ( - !scope.canAddOrEdit || - exitWithUnsavedChanges || - !(scope.workflowChangesUnsaved || scope.workflowChangesStarted) - ) { - scope.unsavedChangesVisible = false; - $('#workflow-modal-dialog').dialog('destroy'); - $('body').removeClass('WorkflowMaker-preventBodyScrolling'); - - $state.go('^'); - } else { - scope.unsavedChangesVisible = true; - } - }; - - function onResize(){ - availableHeight = $(window).height(); - availableWidth = $(window).width(); - $('#workflow-modal-dialog').outerHeight(availableHeight > minimumHeight ? availableHeight : minimumHeight); - $('#workflow-modal-dialog').outerWidth(availableWidth > minimumWidth ? availableWidth : minimumWidth); - - scope.$broadcast('workflowMakerModalResized'); - } - - function cleanUpResize() { - angular.element($window).off('resize', onResize); - } - - angular.element($window).on('resize', onResize); - scope.$on('$destroy', cleanUpResize); - } - }; - } -]; diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html deleted file mode 100644 index be34045b01..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html +++ /dev/null @@ -1,110 +0,0 @@ - diff --git a/awx/ui/client/src/templates/workflows/workflow.block.less b/awx/ui/client/src/templates/workflows/workflow.block.less deleted file mode 100644 index 66f3f76ec4..0000000000 --- a/awx/ui/client/src/templates/workflows/workflow.block.less +++ /dev/null @@ -1,13 +0,0 @@ -.Workflow-warning { - float: right; - margin-right: 20px; - color: @default-interface-txt; -} -.Workflow-warningIcon { - color: @default-warning; - margin-right: 5px; -} -.Workflow-warningLink { - color: @default-link; - cursor: pointer; -} diff --git a/awx/ui/client/src/tooltip/tooltip.block.less b/awx/ui/client/src/tooltip/tooltip.block.less deleted file mode 100644 index bdcae890a2..0000000000 --- a/awx/ui/client/src/tooltip/tooltip.block.less +++ /dev/null @@ -1,78 +0,0 @@ -/** @define Tooltip */ -.tooltip.bs-tooltip-bottom .tooltip-arrow { - border-bottom-color: @default-interface-txt; -} - -.tooltip.bs-tooltip-top .tooltip-arrow { - border-top-color: @default-interface-txt; -} - -.tooltip.bs-tooltip-left .tooltip-arrow { - border-left-color: @default-interface-txt; -} - -.tooltip.bs-tooltip-right .tooltip-arrow { - border-right-color: @default-interface-txt; -} - -.tooltip.Tooltip.fade.bottom.in { - opacity: 1; - padding-top: 4px; -} - -.tooltip-inner { - background-color: @default-interface-txt; -} - -.tooltip-inner--logOut { - margin-left: -15px !important; -} - -.tooltip { - z-index: 2050; - opacity: 1.0; -} - -.tooltip-inner { - padding: 10px; - text-align:left; - max-width: 150px; -} - -.Tooltip-inner { - white-space: pre-wrap; - word-break: break-word; -} -.Tooltip-wide { - max-width: 300px!important; -} - -.Tooltip-secondary { - .Tooltip-inner { - background-color: @default-icon; - } -} - -.Tooltip-secondary.bs-tooltip-top { - .Tooltip-arrow { - border-top-color: @default-icon; - } -} - -.Tooltip-secondary.bs-tooltip-bottom { - .Tooltip-arrow { - border-bottom-color: @default-icon; - } -} - -.Tooltip-secondary.bs-tooltip-left { - .Tooltip-arrow { - border-left-color: @default-icon; - } -} - -.Tooltip-secondary.bs-tooltip-right { - .Tooltip-arrow { - border-right-color: @default-icon; - } -} diff --git a/awx/ui/client/src/users/add/users-add.controller.js b/awx/ui/client/src/users/add/users-add.controller.js deleted file mode 100644 index b6b1b3d035..0000000000 --- a/awx/ui/client/src/users/add/users-add.controller.js +++ /dev/null @@ -1,121 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import { N_ } from "../../i18n"; - -const user_type_options = [ - { type: 'normal', label: N_('Normal User') }, - { type: 'system_auditor', label: N_('System Auditor') }, - { type: 'system_administrator', label: N_('System Administrator') }, -]; - -export default ['$scope', '$rootScope', 'UserForm', 'GenerateForm', 'Rest', - 'Alert', 'ProcessErrors', 'ReturnToCaller', 'GetBasePath', - 'Wait', 'CreateSelect2', '$state', '$location', 'i18n', 'canAdd', - function($scope, $rootScope, UserForm, GenerateForm, Rest, Alert, - ProcessErrors, ReturnToCaller, GetBasePath, Wait, CreateSelect2, - $state, $location, i18n, canAdd) { - - var defaultUrl = GetBasePath('organizations'), - form = UserForm; - - init(); - - function init() { - // apply form definition's default field values - GenerateForm.applyDefaults(form, $scope); - - $scope.canAdd = canAdd; - $scope.isAddForm = true; - $scope.ldap_user = false; - $scope.not_ldap_user = !$scope.ldap_user; - $scope.ldap_dn = null; - $scope.socialAuthUser = false; - $scope.external_account = null; - $scope.last_login = null; - - Rest.setUrl(GetBasePath('users')); - Rest.options() - .then(({data}) => { - if (!data.actions.POST) { - $state.go("^"); - Alert(i18n._('Permission Error'), i18n._('You do not have permission to add a user.'), 'alert-info'); - } - }); - - $scope.user_type_options = user_type_options; - $scope.user_type = user_type_options[0]; - $scope.$watch('user_type', user_type_sync($scope)); - CreateSelect2({ - element: '#user_user_type', - multiple: false - }); - } - - function user_type_sync($scope) { - return (type_option) => { - $scope.is_superuser = false; - $scope.is_system_auditor = false; - switch (type_option.type) { - case 'system_administrator': - $scope.is_superuser = true; - break; - case 'system_auditor': - $scope.is_system_auditor = true; - break; - } - }; - } - - // Save - $scope.formSave = function() { - var fld, data = {}; - if ($scope[form.name + '_form'].$valid) { - if ($scope.organization !== undefined && $scope.organization !== null && $scope.organization !== '') { - Rest.setUrl(defaultUrl + $scope.organization + '/users/'); - for (fld in form.fields) { - if (form.fields[fld].realName) { - data[form.fields[fld].realName] = $scope[fld]; - } else { - data[fld] = $scope[fld]; - } - } - data.is_superuser = $scope.is_superuser; - data.is_system_auditor = $scope.is_system_auditor; - Wait('start'); - Rest.post(data) - .then(({data}) => { - var base = $location.path().replace(/^\//, '').split('/')[0]; - if (base === 'users') { - $rootScope.flashMessage = i18n._('New user successfully created!'); - $rootScope.$broadcast("EditIndicatorChange", "users", data.id); - $state.go('users.edit', { user_id: data.id }, { reload: true }); - } else { - ReturnToCaller(1); - } - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, form, { hdr: i18n._('Error!'), msg: i18n._('Failed to add new user. POST returned status: ') + status }); - }); - } else { - $scope.organization_name_api_error = i18n._('A value is required'); - } - } - }; - - $scope.formCancel = function() { - $state.go('users'); - }; - - // Password change - $scope.clearPWConfirm = function() { - // If password value changes, make sure password_confirm must be re-entered - $scope.password_confirm = ''; - let passValidity = (!$scope.password || $scope.password === '') ? true : false; - $scope[form.name + '_form'].password_confirm.$setValidity('awpassmatch', passValidity); - }; - } -]; diff --git a/awx/ui/client/src/users/edit/users-edit.controller.js b/awx/ui/client/src/users/edit/users-edit.controller.js deleted file mode 100644 index 9d118c72d7..0000000000 --- a/awx/ui/client/src/users/edit/users-edit.controller.js +++ /dev/null @@ -1,186 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import { N_ } from "../../i18n"; - -const user_type_options = [ - { type: 'normal', label: N_('Normal User') }, - { type: 'system_auditor', label: N_('System Auditor') }, - { type: 'system_administrator', label: N_('System Administrator') }, -]; - -export default ['$scope', '$rootScope', '$stateParams', 'UserForm', 'Rest', - 'ProcessErrors', 'GetBasePath', 'Wait', 'CreateSelect2', - '$state', 'i18n', 'resolvedModels', 'resourceData', - function($scope, $rootScope, $stateParams, UserForm, Rest, ProcessErrors, - GetBasePath, Wait, CreateSelect2, $state, i18n, models, resourceData) { - - for (var i = 0; i < user_type_options.length; i++) { - user_type_options[i].label = i18n._(user_type_options[i].label); - } - - const { me } = models; - var form = UserForm, - main = {}, - id = $stateParams.user_id, - defaultUrl = GetBasePath('users') + id, - user_obj = resourceData.data; - - $scope.breadcrumb.user_name = user_obj.username; - - init(); - - function init() { - _.forEach(form.fields, (value, key) => { - $scope[key] = user_obj[key]; - }); - - $scope.canEdit = me.get('summary_fields.user_capabilities.edit'); - $scope.isOrgAdmin = me.get('related.admin_of_organizations.count') > 0; - $scope.isCurrentlyLoggedInUser = (parseInt(id) === $rootScope.current_user.id); - $scope.hidePagination = false; - $scope.hideSmartSearch = false; - $scope.user_type_options = user_type_options; - $scope.user_type = user_type_options[0]; - $scope.$watch('user_type', user_type_sync($scope)); - $scope.$watch('is_superuser', hidePermissionsTabSmartSearchAndPaginationIfSuperUser($scope)); - $scope.user_id = id; - $scope.ldap_user = (user_obj.ldap_dn !== null && user_obj.ldap_dn !== undefined && user_obj.ldap_dn !== '') ? true : false; - $scope.not_ldap_user = !$scope.ldap_user; - main.ldap_user = $scope.ldap_user; - $scope.socialAuthUser = (user_obj.auth.length > 0) ? true : false; - $scope.last_login = user_obj.last_login; - $scope.external_account = user_obj.external_account; - - $scope.user_type = $scope.user_type_options[0]; - $scope.is_system_auditor = false; - $scope.is_superuser = false; - if (user_obj.is_system_auditor) { - $scope.user_type = $scope.user_type_options[1]; - $scope.is_system_auditor = true; - } - if (user_obj.is_superuser) { - $scope.user_type = $scope.user_type_options[2]; - $scope.is_superuser = true; - } - - $scope.user_obj = user_obj; - $scope.name = user_obj.username; - - CreateSelect2({ - element: '#user_user_type', - multiple: false - }); - - $scope.$watch('user_obj.summary_fields.user_capabilities.edit', function(val) { - $scope.canAdd = (val === false) ? false : true; - }); - } - - function user_type_sync($scope) { - return (type_option) => { - $scope.is_superuser = false; - $scope.is_system_auditor = false; - switch (type_option.type) { - case 'system_administrator': - $scope.is_superuser = true; - break; - case 'system_auditor': - $scope.is_system_auditor = true; - break; - } - }; - } - - // Organizations and Teams tab pagination is hidden through other mechanism - function hidePermissionsTabSmartSearchAndPaginationIfSuperUser(scope) { - return function(isSuperuserNewValue) { - let shouldHide = isSuperuserNewValue; - if (shouldHide === true) { - scope.hidePagination = true; - scope.hideSmartSearch = true; - } else if (shouldHide === false) { - scope.hidePagination = false; - scope.hideSmartSearch = false; - } - }; - } - - $scope.redirectToResource = function(resource) { - let type = resource.summary_fields.resource_type.replace(/ /g , "_"); - var id = resource.related[type].split("/")[4]; - switch (type) { - case 'organization': - $state.go('organizations.edit', { "organization_id": id }, { reload: true }); - break; - case 'team': - $state.go('teams.edit', { "team_id": id }, { reload: true }); - break; - case 'credential': - $state.go('credentials.edit', { "credential_id": id }, { reload: true }); - break; - case 'project': - $state.go('projects.edit', { "project_id": id }, { reload: true }); - break; - case 'inventory': - $state.go('inventories.edit', { "inventory_id": id }, { reload: true }); - break; - case 'job_template': - $state.go('templates.editJobTemplate', { "job_template_id": id }, { reload: true }); - break; - case 'workflow_job_template': - $state.go('templates.editWorkflowJobTemplate', { "workflow_job_template_id": id }, { reload: true }); - break; - } - }; - - // prepares a data payload for a PUT request to the API - var processNewData = function(fields) { - var data = {}; - _.forEach(fields, function(value, key) { - if (value.type === 'sensitive') { - if ($scope[key] !== '' && $scope[key] !== null && $scope[key] !== undefined) { - data[key] = $scope[key]; - } - } else { - data[key] = $scope[key]; - } - }); - data.is_superuser = $scope.is_superuser; - data.is_system_auditor = $scope.is_system_auditor; - return data; - }; - - $scope.formCancel = function() { - $state.go('users', null, { reload: true }); - }; - - $scope.formSave = function() { - $rootScope.flashMessage = null; - if ($scope[form.name + '_form'].$valid) { - Rest.setUrl(defaultUrl + '/'); - var data = processNewData(form.fields); - Rest.put(data).then(() => { - $state.go($state.current, null, { reload: true }); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n.sprintf(i18n._('Failed to retrieve user: %s. GET status: '), $stateParams.id) + status - }); - }); - } - }; - - $scope.clearPWConfirm = function() { - // If password value changes, make sure password_confirm must be re-entered - $scope.password_confirm = ''; - let passValidity = (!$scope.password || $scope.password === '') ? true : false; - $scope[form.name + '_form'].password_confirm.$setValidity('awpassmatch', passValidity); - $rootScope.flashMessage = null; - }; - } -]; diff --git a/awx/ui/client/src/users/list/users-list.controller.js b/awx/ui/client/src/users/list/users-list.controller.js deleted file mode 100644 index 96d01ebf04..0000000000 --- a/awx/ui/client/src/users/list/users-list.controller.js +++ /dev/null @@ -1,99 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import { N_ } from "../../i18n"; - -const user_type_options = [ - { type: 'normal', label: N_('Normal User') }, - { type: 'system_auditor', label: N_('System Auditor') }, - { type: 'system_administrator', label: N_('System Administrator') }, -]; - -export default ['$scope', '$rootScope', 'Rest', 'UserList', 'Prompt', - 'ProcessErrors', 'GetBasePath', 'Wait', '$state', '$filter', - 'rbacUiControlService', 'Dataset', 'i18n', 'resolvedModels', - function($scope, $rootScope, Rest, UserList, Prompt, - ProcessErrors, GetBasePath, Wait, $state, $filter, rbacUiControlService, - Dataset, i18n, models) { - - for (var i = 0; i < user_type_options.length; i++) { - user_type_options[i].label = i18n._(user_type_options[i].label); - } - - const { me } = models; - var list = UserList, - defaultUrl = GetBasePath('users'); - - init(); - - function init() { - $scope.canEdit = me.get('summary_fields.user_capabilities.edit'); - $scope.canAdd = false; - - rbacUiControlService.canAdd('users') - .then(function(params) { - $scope.canAdd = params.canAdd; - }); - - // search init - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - - - $rootScope.flashMessage = null; - $scope.selected = []; - } - - $scope.addUser = function() { - $state.go('users.add'); - }; - - $scope.editUser = function(id) { - $state.go('users.edit', { user_id: id }); - }; - - $scope.deleteUser = function(id, name) { - - var action = function() { - $('#prompt-modal').modal('hide'); - Wait('start'); - var url = defaultUrl + id + '/'; - Rest.setUrl(url); - Rest.destroy() - .then(() => { - - let reloadListStateParams = null; - - if($scope.users.length === 1 && $state.params.user_search && _.has($state, 'params.user_search.page') && $state.params.user_search.page !== '1') { - reloadListStateParams = _.cloneDeep($state.params); - reloadListStateParams.user_search.page = (parseInt(reloadListStateParams.user_search.page)-1).toString(); - } - - if (parseInt($state.params.user_id) === id) { - $state.go('^', null, { reload: true }); - } else { - $state.go('.', null, { reload: true }); - } - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n.sprintf(i18n._('Call to %s failed. DELETE returned status: '), url) + status - }); - }); - }; - - Prompt({ - hdr: i18n._('Delete'), - resourceName: $filter('sanitize')(name), - body: '
' + i18n._('Are you sure you want to delete this user?') + '
', - action: action, - actionText: i18n._('DELETE') - }); - }; - } -]; diff --git a/awx/ui/client/src/users/main.js b/awx/ui/client/src/users/main.js deleted file mode 100644 index 64222e3977..0000000000 --- a/awx/ui/client/src/users/main.js +++ /dev/null @@ -1,114 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import UsersList from './list/users-list.controller'; -import UsersAdd from './add/users-add.controller'; -import UsersEdit from './edit/users-edit.controller'; -import UserForm from './users.form'; -import UserList from './users.list'; - -import userListRoute from './users.route'; -import UserTokensListRoute from '../../features/users/tokens/users-tokens-list.route'; -import UserTokensAddRoute from '../../features/users/tokens/users-tokens-add.route'; -import UserTokensAddApplicationRoute from '../../features/users/tokens/users-tokens-add-application.route'; - -export default -angular.module('Users', []) - .controller('UsersList', UsersList) - .controller('UsersAdd', UsersAdd) - .controller('UsersEdit', UsersEdit) - .factory('UserForm', UserForm) - .factory('UserList', UserList) - .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', - function($stateProvider, stateDefinitionsProvider, $stateExtenderProvider) { - let stateDefinitions = stateDefinitionsProvider.$get(); - let stateExtender = $stateExtenderProvider.$get(); - - function generateStateTree() { - let userAdd = stateDefinitions.generateTree({ - name: 'users.add', - url: '/add', - modes: ['add'], - form: 'UserForm', - controllers: { - add: 'UsersAdd' - }, - resolve: { - add: { - canAdd: ['rbacUiControlService', '$state', function(rbacUiControlService, $state) { - return rbacUiControlService.canAdd('users') - .then(function(res) { - return res.canAdd; - }) - .catch(function() { - $state.go('users'); - }); - }], - resolvedModels: ['MeModel', '$q', function(Me, $q) { - const promises= { - me: new Me('get').then((me) => me.extend('get', 'admin_of_organizations')) - }; - - return $q.all(promises); - }] - } - } - }); - - let userEdit = stateDefinitions.generateTree({ - name: 'users.edit', - url: '/:user_id', - modes: ['edit'], - form: 'UserForm', - parent: 'users', - controllers: { - edit: 'UsersEdit' - }, - data: { - activityStream: true, - activityStreamTarget: 'user' - }, - breadcrumbs: { - edit: "{{breadcrumb.user_name}}" - }, - resolve: { - edit: { - resolvedModels: ['MeModel', '$q', function(Me, $q) { - const promises= { - me: new Me('get').then((me) => me.extend('get', 'admin_of_organizations')) - }; - - return $q.all(promises); - }] - } - }, - }); - - return Promise.all([ - userAdd, - userEdit - ]).then((generated) => { - return { - states: _.reduce(generated, (result, definition) => { - return result.concat(definition.states); - }, [ - stateExtender.buildDefinition(userListRoute), - stateExtender.buildDefinition(UserTokensListRoute), - stateExtender.buildDefinition(UserTokensAddRoute), - stateExtender.buildDefinition(UserTokensAddApplicationRoute) - ]) - }; - }); - } - - $stateProvider.state({ - name: 'users.**', - url: '/users', - lazyLoad: () => generateStateTree() - }); - - } - ]); diff --git a/awx/ui/client/src/users/users.form.js b/awx/ui/client/src/users/users.form.js deleted file mode 100644 index e4ee459db1..0000000000 --- a/awx/ui/client/src/users/users.form.js +++ /dev/null @@ -1,247 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Users - * @description This form is for adding/editing users -*/ - -export default ['i18n', function(i18n) { - return { - - addTitle: i18n._('NEW USER'), - editTitle: '{{ username }}', - name: 'user', - // the top-most node of generated state tree - stateTree: 'users', - forceListeners: true, - tabs: true, - messageBar: { - ngShow: 'isOrgAdmin && !canEdit', - message: i18n._("Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams.") - }, - fields: { - first_name: { - label: i18n._('First Name'), - type: 'text', - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)', - required: false, - }, - last_name: { - label: i18n._('Last Name'), - type: 'text', - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)', - required: false, - }, - organization: { - label: i18n._('Organization'), - type: 'lookup', - list: 'OrganizationList', - basePath: 'organizations', - sourceModel: 'organization', - sourceField: 'name', - required: true, - excludeMode: 'edit', - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - email: { - label: i18n._('Email'), - type: 'email', - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)', - required: true, - autocomplete: false - }, - username: { - label: i18n._('Username'), - type: 'text', - awRequiredWhen: { - reqExpression: "not_ldap_user && external_account === null", - init: true - }, - autocomplete: false, - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - password: { - label: i18n._('Password'), - type: 'sensitive', - hasShowInputButton: true, - ngShow: 'ldap_user == false && socialAuthUser === false && external_account === null', - awRequiredWhen: { - reqExpression: "isAddForm", - init: false - }, - ngChange: "clearPWConfirm()", - autocomplete: false, - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - password_confirm: { - label: i18n._('Confirm Password'), - type: 'sensitive', - hasShowInputButton: true, - ngShow: 'ldap_user == false && socialAuthUser === false && external_account === null', - awRequiredWhen: { - reqExpression: "isAddForm", - init: false - }, - awPassMatch: true, - associated: 'password', - autocomplete: false, - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - user_type: { - label: i18n._('User Type'), - type: 'select', - ngOptions: 'item as item.label for item in user_type_options track by item.type', - disableChooseOption: true, - ngModel: 'user_type', - ngShow: 'current_user["is_superuser"]', - ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - }, - - buttons: { - cancel: { - ngClick: 'formCancel()', - ngShow: '(user_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - close: { - ngClick: 'formCancel()', - ngShow: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)' - }, - save: { - ngClick: 'formSave()', - ngDisabled: true, - ngShow: '(user_obj.summary_fields.user_capabilities.edit || canAdd)' - } - }, - - related: { - organizations: { - name: 'organizations', - awToolTip: i18n._('Please save before assigning to organizations.'), - basePath: 'api/v2/users/{{$stateParams.user_id}}/organizations', - emptyListText: i18n._('Please add user to an Organization.'), - search: { - page_size: '10' - }, - dataPlacement: 'top', - type: 'collection', - title: i18n._('Organizations'), - iterator: 'organization', - index: false, - open: false, - - actions: {}, - - fields: { - name: { - key: true, - label: i18n._('Name'), - columnClass: "col-sm-6" - }, - description: { - label: i18n._('Description'), - columnClass: "col-sm-6" - } - }, - //hideOnSuperuser: true // RBAC defunct - }, - teams: { - name: 'teams', - awToolTip: i18n._('Please save before assigning to teams.'), - basePath: 'api/v2/users/{{$stateParams.user_id}}/teams', - search: { - page_size: '10' - }, - dataPlacement: 'top', - type: 'collection', - title: i18n._('Teams'), - iterator: 'team', - open: false, - index: false, - actions: {}, - emptyListText: i18n._('This user is not a member of any teams'), - fields: { - name: { - key: true, - label: i18n._('Name'), - columnClass: "col-sm-6" - }, - description: { - label: i18n._('Description'), - columnClass: "col-sm-6" - } - }, - //hideOnSuperuser: true // RBAC defunct - }, - permissions: { - name: 'permissions', - basePath: 'api/v2/users/{{$stateParams.user_id}}/roles/', - search: { - page_size: '10', - order_by: 'id' - }, - awToolTip: i18n._('Please save before assigning to organizations.'), - dataPlacement: 'top', - hideSearchAndActions: true, - type: 'collection', - title: i18n._('Permissions'), - iterator: 'permission', - open: false, - index: false, - emptyListText: i18n._('No permissions have been granted'), - fields: { - name: { - label: i18n._('Name'), - ngBind: 'permission.summary_fields.resource_name', - ngClick: "redirectToResource(permission)", - nosort: true, - columnClass: "col-sm-4" - }, - type: { - label: i18n._('Type'), - ngBind: 'permission.summary_fields.resource_type_display_name', - nosort: true, - columnClass: "col-sm-3" - }, - role: { - label: i18n._('Role'), - ngBind: 'permission.name', - nosort: true, - columnClass: "col-sm-3" - }, - }, - actions: { - add: { - ngClick: "$state.go('.add')", - label: i18n._('Add'), - awToolTip: i18n._('Grant Permission'), - actionClass: 'at-Button--add', - actionId: 'button-add--permission', - ngShow: '(!is_superuser && (user_obj.summary_fields.user_capabilities.edit || canAdd))' - } - }, - fieldActions: { - columnClass: 'col-sm-2', - "delete": { - label: i18n._('Remove'), - ngClick: 'deletePermissionFromUser(user_id, username, permission.name, permission.summary_fields.resource_name, permission.related.users)', - iconClass: 'fa fa-times', - awToolTip: i18n._('Dissassociate permission from user'), - ngShow: 'permission.summary_fields.user_capabilities.unattach' - } - }, - //hideOnSuperuser: true // RBAC defunct - }, - tokens: { - ngIf: 'isCurrentlyLoggedInUser', - title: i18n._('Tokens'), - skipGenerator: true, - } - } - - };}]; diff --git a/awx/ui/client/src/users/users.list.js b/awx/ui/client/src/users/users.list.js deleted file mode 100644 index 47e4e1f8d7..0000000000 --- a/awx/ui/client/src/users/users.list.js +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - -export default ['i18n', function(i18n) { - return { - - name: 'users', - stateTree: 'users', - search: { - order_by: 'username' - }, - iterator: 'user', - selectTitle: i18n._('Add Users'), - editTitle: i18n._('USERS'), - listTitle: i18n._('USERS'), - selectInstructions: '

Select existing users by clicking each user or checking the related checkbox. When finished, click the blue ' + - 'Select button, located bottom right.

When available, a brand new user can be created by clicking the ' + - ' button.

', - index: false, - hover: true, - - fields: { - username: { - key: true, - label: i18n._('Username'), - columnClass: 'col-md-3 col-sm-3 col-xs-9' - }, - first_name: { - label: i18n._('First Name'), - columnClass: 'd-none d-sm-flex col-sm-3' - }, - last_name: { - label: i18n._('Last Name'), - columnClass: 'd-none d-sm-flex col-sm-3' - } - }, - - actions: { - add: { - label: i18n._('Create New'), - mode: 'all', // One of: edit, select, all - ngClick: 'addUser()', - basePaths: ['organizations', 'users'], // base path must be in list, or action not available - awToolTip: i18n._('Create a new user'), - actionClass: 'at-Button--add', - actionId: 'button-add', - ngShow: 'canAdd && canEdit' - } - }, - - fieldActions: { - - columnClass: 'col-md-3 col-sm-3 col-xs-3', - - edit: { - label: i18n._('Edit'), - ngClick: "editUser(user.id)", - icon: 'icon-edit', - "class": 'btn-xs btn-default', - awToolTip: i18n._('Edit user'), - dataPlacement: 'top', - ngShow: 'user.summary_fields.user_capabilities.edit' - }, - - view: { - label: i18n._('View'), - ngClick: "editUser(user.id)", - "class": 'btn-xs btn-default', - awToolTip: i18n._('View user'), - dataPlacement: 'top', - ngShow: '!user.summary_fields.user_capabilities.edit' - }, - - "delete": { - label: i18n._('Delete'), - ngClick: "deleteUser(user.id, user.username)", - icon: 'icon-trash', - "class": 'btn-xs btn-danger', - awToolTip: i18n._('Delete user'), - dataPlacement: 'top', - ngShow: 'user.summary_fields.user_capabilities.delete' - } - } - };}]; diff --git a/awx/ui/client/src/users/users.partial.html b/awx/ui/client/src/users/users.partial.html deleted file mode 100644 index 41b78528d4..0000000000 --- a/awx/ui/client/src/users/users.partial.html +++ /dev/null @@ -1,6 +0,0 @@ -
- -
-
-
-
diff --git a/awx/ui/client/src/users/users.route.js b/awx/ui/client/src/users/users.route.js deleted file mode 100644 index 80f581a93b..0000000000 --- a/awx/ui/client/src/users/users.route.js +++ /dev/null @@ -1,55 +0,0 @@ -import {templateUrl} from '../shared/template-url/template-url.factory'; -import { N_ } from '../i18n'; - -export default { - name: 'users', - route: '/users', - ncyBreadcrumb: { - label: N_('USERS') - }, - data: { - activityStream: true, - activityStreamTarget: 'user' - }, - params: { - user_search: { - value: { - page_size: 20, - order_by: 'username' - } - } - }, - views: { - '@': { - templateUrl: templateUrl('users/users') - }, - 'list@users': { - templateProvider: function(UserList, generateList) { - let html = generateList.build({ - list: UserList, - mode: 'edit' - }); - html = generateList.wrapPanel(html); - return html; - }, - controller: 'UsersList' - } - }, - searchPrefix: 'user', - resolve: { - Dataset: ['UserList', 'QuerySet', '$stateParams', 'GetBasePath', - function(list, qs, $stateParams, GetBasePath) { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - } - ], - resolvedModels: ['MeModel', '$q', function(Me, $q) { - const promises= { - me: new Me('get') - }; - - return $q.all(promises); - }] - - } -}; diff --git a/awx/ui/client/src/vendor.js b/awx/ui/client/src/vendor.js deleted file mode 100644 index b68880a9e7..0000000000 --- a/awx/ui/client/src/vendor.js +++ /dev/null @@ -1,76 +0,0 @@ -// Theme -require('~assets/custom-theme/jquery-ui-1.10.3.custom.min.css'); -require('~node_modules/bootstrap/dist/css/bootstrap.min.css'); -require('~assets/fontcustom/fontcustom.css'); -require('~node_modules/components-font-awesome/css/font-awesome.min.css'); -require('~node_modules/select2/dist/css/select2.css'); -require('~node_modules/codemirror/lib/codemirror.css'); -require('~node_modules/codemirror/theme/elegant.css'); -require('~node_modules/codemirror/addon/lint/lint.css'); -require('~node_modules/nvd3/build/nv.d3.css'); -require('~node_modules/ng-toast/dist/ngToast.min.css'); - -// jQuery + extensions -global.jQuery = require('jquery'); - -global.jquery = global.jQuery; -global.$ = global.jQuery; - -require('jquery-resize'); -require('jquery-ui'); -require('jquery-ui/ui/widgets/button'); -require('jquery-ui/ui/widgets/dialog'); -require('jquery-ui/ui/widgets/slider'); -require('jquery-ui/ui/widgets/spinner'); -require('bootstrap'); -require('popper.js'); -require('bootstrap-datepicker'); - -// jquery-ui and bootstrap both define $.fn.button -// the code below resolves that namespace clash -const btn = $.fn.button.noConflict(); -$.fn.btn = btn; - -// Whitelist table elements so they can be used in popovers -$.fn.popover.Constructor.Default.whiteList.blockquote = []; -$.fn.popover.Constructor.Default.whiteList.table = []; -$.fn.popover.Constructor.Default.whiteList.th = []; -$.fn.popover.Constructor.Default.whiteList.tr = []; -$.fn.popover.Constructor.Default.whiteList.td = []; -$.fn.popover.Constructor.Default.whiteList.tbody = []; -$.fn.popover.Constructor.Default.whiteList.thead = []; - -require('select2'); - -// Standalone libs -global._ = require('lodash'); -require('moment'); -require('rrule'); -require('sprintf-js'); -require('reconnectingwebsocket'); -global.dagre = require('dagre'); - -// D3 + extensions -require('d3'); -require('nvd3'); - -// Angular -require('angular'); -require('angular-cookies'); -require('angular-sanitize'); -require('angular-breadcrumb'); -require('angular-codemirror'); -require('angular-drag-and-drop-lists'); -require('angular-duration-format'); -require('angular-gettext'); -require('angular-moment'); -require('angular-scheduler'); -require('angular-tz-extensions'); -require('@uirouter/angularjs'); -require('ng-toast-provider'); -require('ng-toast-directives'); -require('ng-toast'); -require('lr-infinite-scroll'); -require('codemirror/mode/yaml/yaml'); -require('codemirror/mode/javascript/javascript'); -require('codemirror/mode/jinja2/jinja2'); diff --git a/awx/ui/client/src/workflow-results/main.js b/awx/ui/client/src/workflow-results/main.js deleted file mode 100644 index f01c60ccaf..0000000000 --- a/awx/ui/client/src/workflow-results/main.js +++ /dev/null @@ -1,18 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import workflowStatusBar from './workflow-status-bar/main'; -import route from './workflow-results.route.js'; -import workflowResultsService from './workflow-results.service'; -import controller from './workflow-results.controller'; - -export default - angular.module('workflowResults', [workflowStatusBar.name]) - .run(['$stateExtender', function($stateExtender) { - $stateExtender.addState(route); - }]) - .controller('workflowResultsController', controller) - .service('workflowResultsService', workflowResultsService); diff --git a/awx/ui/client/src/workflow-results/standard-out.block.less b/awx/ui/client/src/workflow-results/standard-out.block.less deleted file mode 100644 index aab04ed73b..0000000000 --- a/awx/ui/client/src/workflow-results/standard-out.block.less +++ /dev/null @@ -1,47 +0,0 @@ -/** @define StandardOut */ - -@breakpoint-md: 1180px; - -.StandardOut-panelHeader { - .OnePlusOne-panelHeader -} - -.StandardOut-panelHeaderText { - align-items: center; - flex: 1 0 auto; - display: flex; -} - -.StandardOut-panelHeaderActions { - justify-content: flex-end; - margin-left: 10px; - font-size: 12px; -} - -.StandardOut-actionButton { - font-size: 16px; - height: 30px; - min-width: 30px; - color: @list-action-icon; - background-color: inherit; - border: none; - border-radius: 5px; -} - -.StandardOut-actionButton:hover { - background-color: @list-actn-bg-hov; - color: @list-actn-icn-hov; -} - -.StandardOut-actionButton--active { - background-color: @list-actn-bg-hov; - color: @list-actn-icn-hov; - - &:hover { - background-color: @default-link-hov; - } -} - -.StandardOut-actionButton + a { - margin-left: 15px; -} diff --git a/awx/ui/client/src/workflow-results/workflow-results.block.less b/awx/ui/client/src/workflow-results/workflow-results.block.less deleted file mode 100644 index 93b968c7d5..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-results.block.less +++ /dev/null @@ -1,175 +0,0 @@ -@breakpoint-md: 1200px; -@breakpoint-sm: 700px; - -.WorkflowResults { - .OnePlusTwo-container(100%, @breakpoint-md); - - &.fullscreen { - .WorkflowResults-rightSide { - max-width: 100%; - } - } - - @media screen and (max-width: @breakpoint-md) { - display: block; - min-width: 400px; - } -} - -.WorkflowResults-leftSide { - max-width: 33%; - - .OnePlusTwo-left--panel(100%, @breakpoint-md); - height: ~"calc(100vh - 120px)"; - min-height: 350px; - display:flex; - .card { - width: 100%; - overflow: scroll; - } - @media screen and (width: @breakpoint-md - 1px){ - width: 100%; - } -} - -.WorkflowResults-rightSide { - .OnePlusTwo-right--panel(100%, @breakpoint-md); - height: ~"calc(100vh - 120px)"; - min-height: 350px; - min-width: 0; - display:flex; - .card { - width:100% - } - - @media (max-width: @breakpoint-md - 1px) { - padding-right: 15px; - } -} - -@media (max-width: @breakpoint-md) { - .WorkflowResults-rightSide { - height: inherit; - } -} - -.WorkflowResults-stdoutActionButton--active { - display: none; - visibility: hidden; - flex:none; - width:0px; - padding-right: 0px; -} - -.WorkflowResults-panelHeader { - display: flex; - height: 30px; -} - -.WorkflowResults-panelHeaderText { - color: @default-interface-txt; - flex: 1 0 auto; - font-size: 14px; - font-weight: bold; - margin-right: 10px; - text-transform: uppercase; -} - -.WorkflowResults-resultRow { - width: 100%; - display: flex; - padding-bottom: 10px; - flex-wrap: wrap; -} - -.WorkflowResults-resultRow--variables { - flex-direction: column; -} - -.WorkflowResults-resultRowLabel { - text-transform: uppercase; - color: @default-interface-txt; - font-size: 12px; - font-weight: normal!important; - width: 30%; - margin-right: 20px; - - @media screen and (max-width: @breakpoint-md) { - flex: 2.5 0 auto; - } -} - -.WorkflowResults-resultRowLabel--fullWidth { - width: 100%; - margin-right: 0px; -} - -.WorkflowResults-resultRowText { - width: ~"calc(70% - 20px)"; - flex: 1 0 auto; - text-transform: none; - word-wrap: break-word; -} - -.WorkflowResults-resultRowText--fullWidth { - width: 100%; -} - -.WorkflowResults-statusResultIcon { - padding-left: 0px; - padding-right: 10px; -} - -.WorkflowResults-panelRightTitle{ - flex-wrap: wrap; -} - -.WorkflowResults-panelRightTitleText{ - word-wrap: break-word; - word-break: break-all; - max-width: 100%; -} - -.WorkflowResults-badgeAndActionRow{ - display:flex; - flex: 1 0 auto; - justify-content: flex-end; - flex-wrap: wrap; - max-width: 100%; -} - -.WorkflowResults-badgeRow { - display: flex; - align-items: center; - margin-right: 5px; -} - -.WorkflowResults-badgeTitle{ - color: @default-interface-txt; - font-size: 14px; - margin-right: 10px; - font-weight: normal; - text-transform: uppercase; - margin-left: 20px; -} - -.WorkflowResults-extraVarsLabel { - font-size:14px!important; -} - -.WorkflowResults-seeMoreLess { - color: #337AB7; - margin: 4px 0px; - text-transform: uppercase; - padding: 2px 0px; - cursor: pointer; - border-radius: 5px; - font-size: 11px; -} - -.WorkflowResults-rightSide .WorkflowChart-svg { - background-color: @f6grey; - border: 1px solid @d7grey; - border-top: 0px; - border-bottom-right-radius: 5px; -} diff --git a/awx/ui/client/src/workflow-results/workflow-results.controller.js b/awx/ui/client/src/workflow-results/workflow-results.controller.js deleted file mode 100644 index d18f90f02f..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-results.controller.js +++ /dev/null @@ -1,311 +0,0 @@ -export default ['workflowData', 'workflowResultsService', 'workflowDataOptions', - 'jobLabels', 'workflowNodes', '$scope', - 'ParseVariableString', 'count', '$state', 'i18n', 'WorkflowChartService', '$filter', - 'moment', function(workflowData, workflowResultsService, - workflowDataOptions, jobLabels, workflowNodes, $scope, - ParseVariableString, count, $state, i18n, WorkflowChartService, $filter, - moment) { - let nodeRef; - var runTimeElapsedTimer = null; - - $scope.toggleKey = () => $scope.showKey = !$scope.showKey; - $scope.keyClassList = `{ 'Key-menuIcon--active': showKey }`; - - var getLinks = function() { - var getLink = function(key) { - if(key === 'schedule') { - if($scope.workflow.related.schedule) { - return '/#/templates/workflow_job_template/' + $scope.workflow.workflow_job_template + '/schedules' + $scope.workflow.related.schedule.split(/api\/v\d+\/schedules/)[1]; - } - else { - return null; - } - } - else { - if ($scope.workflow.related[key]) { - return '/#/' + $scope.workflow.related[key] - .split(/api\/v\d+\//)[1]; - } else { - return null; - } - } - }; - - $scope.workflow_template_link = '/#/templates/workflow_job_template/'+$scope.workflow.workflow_job_template; - $scope.created_by_link = getLink('created_by'); - $scope.scheduled_by_link = getLink('schedule'); - $scope.cloud_credential_link = getLink('cloud_credential'); - $scope.network_credential_link = getLink('network_credential'); - - $scope.launched_by_webhook_link = null; - if ($scope.workflow.launch_type === 'webhook') { - $scope.launched_by_webhook_link = $scope.workflow_template_link; - } - - if ($scope.workflow.summary_fields.inventory) { - if ($scope.workflow.summary_fields.inventory.kind === 'smart') { - $scope.inventory_link = '/#/inventories/smart/' + $scope.workflow.inventory; - } else { - $scope.inventory_link = '/#/inventories/inventory/' + $scope.workflow.inventory; - } - } - - $scope.strings = { - tooltips: { - RELAUNCH: i18n._('Relaunch using the same parameters'), - CANCEL: i18n._('Cancel'), - DELETE: i18n._('Delete'), - EDIT_USER: i18n._('Edit the user'), - EDIT_WORKFLOW: i18n._('Edit the workflow job template'), - EDIT_SLICE_TEMPLATE: i18n._('Edit the slice job template'), - EDIT_SCHEDULE: i18n._('Edit the schedule'), - EDIT_INVENTORY: i18n._('Edit the inventory'), - SOURCE_WORKFLOW_JOB: i18n._('View the source Workflow Job'), - TOGGLE_STDOUT_FULLSCREEN: i18n._('Expand Output'), - WEBHOOK_WORKFLOW_JOB_TEMPLATE: i18n._('View the webhook configuration on the workflow job template.'), - STATUS: '' // re-assigned elsewhere - }, - labels: { - TEMPLATE: i18n._('Template'), - LAUNCHED_BY: i18n._('Launched By'), - STARTED: i18n._('Started'), - FINISHED: i18n._('Finished'), - LABELS: i18n._('Labels'), - STATUS: i18n._('Status'), - SLICE_TEMPLATE: i18n._('Slice Job Template'), - JOB_EXPLANATION: i18n._('Explanation'), - SOURCE_WORKFLOW_JOB: i18n._('Source Workflow'), - INVENTORY: i18n._('Inventory'), - LIMIT: i18n._('Inventory Limit'), - SCM_BRANCH: i18n._('SCM Branch') - }, - details: { - HEADER: i18n._('DETAILS'), - NOT_FINISHED: i18n._('Not Finished'), - NOT_STARTED: i18n._('Not Started'), - SHOW_LESS: i18n._('Show Less'), - SHOW_MORE: i18n._('Show More'), - WEBHOOK: i18n._('Webhook'), - }, - results: { - TOTAL_NODES: i18n._('Total Nodes'), - ELAPSED: i18n._('Elapsed'), - }, - legend: { - ON_SUCCESS: i18n._('On Success'), - ON_FAILURE: i18n._('On Failure'), - ALWAYS: i18n._('Always'), - PROJECT_SYNC: i18n._('Project Sync'), - INVENTORY_SYNC: i18n._('Inventory Sync'), - WORKFLOW: i18n._('Workflow'), - KEY: i18n._('KEY'), - } - }; - }; - - var getLabelsAndTooltips = function() { - var getLabel = function(key) { - if ($scope.workflowOptions && $scope.workflowOptions[key]) { - return $scope.workflowOptions[key].choices - .filter(val => val[0] === $scope.workflow[key]) - .map(val => val[1])[0]; - } else { - return null; - } - }; - - $scope.workflow.statusLabel = i18n._(getLabel('status')); - $scope.strings.tooltips.STATUS = `${i18n._('Job')} ${$scope.workflow.statusLabel}`; - }; - - var updateWorkflowJobElapsedTimer = function(time) { - $scope.workflow.elapsed = time; - }; - - function init() { - // put initially resolved request data on scope - $scope.workflow = workflowData; - $scope.workflow_nodes = workflowNodes; - $scope.workflowOptions = workflowDataOptions.actions.GET; - $scope.labels = jobLabels; - $scope.showManualControls = false; - $scope.readOnly = true; - $scope.count = count.val; - - // Start elapsed time updater for job known to be running - if ($scope.workflow.started !== null && $scope.workflow.status === 'running') { - runTimeElapsedTimer = workflowResultsService.createOneSecondTimer($scope.workflow.started, updateWorkflowJobElapsedTimer); - } - - if(workflowData.summary_fields && workflowData.summary_fields.workflow_job_template && - workflowData.summary_fields.workflow_job_template.id){ - $scope.workflow_job_template_link = `/#/templates/workflow_job_template/${$scope.workflow.summary_fields.workflow_job_template.id}`; - } - - if(workflowData.summary_fields && workflowData.summary_fields.job_template && - workflowData.summary_fields.job_template.id){ - $scope.slice_job_template_link = `/#/templates/job_template/${$scope.workflow.summary_fields.job_template.id}`; - } - - if (_.get(workflowData, 'summary_fields.source_workflow_job.id')) { - $scope.source_workflow_job_link = `/#/workflows/${workflowData.summary_fields.source_workflow_job.id}`; - } - - if (workflowData.job_explanation) { - const limit = 150; - const more = workflowData.job_explanation; - const less = $filter('limitTo')(more, limit); - const showMore = false; - const hasMoreToShow = more.length > limit; - - const job_explanation = { - more: more, - less: less, - showMore: showMore, - hasMoreToShow: hasMoreToShow - }; - - $scope.job_explanation = job_explanation; - } - - // turn related api browser routes into front end routes - getLinks(); - - // use options labels to manipulate display of details - getLabelsAndTooltips(); - - // set up a read only code mirror for extra vars - $scope.variables = ParseVariableString($scope.workflow.extra_vars); - $scope.varsTooltip= i18n._('Read only view of extra variables added to the workflow.'); - $scope.varsLabel = i18n._('Extra Variables'); - $scope.varsName = 'extra_vars'; - - // Click binding for the expand/collapse button on the standard out log - $scope.stdoutFullScreen = false; - - let arrayOfLinksForChart = []; - let arrayOfNodesForChart = []; - - ({arrayOfNodesForChart, arrayOfLinksForChart, nodeRef} = WorkflowChartService.generateArraysOfNodesAndLinks(workflowNodes)); - - $scope.graphState = { arrayOfNodesForChart, arrayOfLinksForChart }; - } - - $scope.toggleStdoutFullscreen = function() { - - $scope.$broadcast('workflowDetailsResized'); - - $scope.stdoutFullScreen = !$scope.stdoutFullScreen; - - if ($scope.stdoutFullScreen === true) { - $scope.toggleStdoutFullscreenTooltip = i18n._("Collapse Output"); - } else if ($scope.stdoutFullScreen === false) { - $scope.toggleStdoutFullscreenTooltip = i18n._("Expand Output"); - } - }; - - $scope.deleteJob = function() { - workflowResultsService.deleteJob($scope.workflow); - }; - - $scope.cancelJob = function() { - workflowResultsService.cancelJob($scope.workflow); - }; - - $scope.relaunchJob = function() { - workflowResultsService.relaunchJob($scope); - }; - - $scope.toggleManualControls = function() { - $scope.showManualControls = !$scope.showManualControls; - }; - - $scope.lessLabels = false; - $scope.toggleLessLabels = function() { - if (!$scope.lessLabels) { - $('#workflow-results-labels').slideUp(200); - $scope.lessLabels = true; - } - else { - $('#workflow-results-labels').slideDown(200); - $scope.lessLabels = false; - } - }; - - $scope.panChart = function(direction) { - $scope.$broadcast('panWorkflowChart', { - direction: direction - }); - }; - - $scope.zoomChart = function(zoom) { - $scope.$broadcast('zoomWorkflowChart', { - zoom: zoom - }); - }; - - $scope.resetChart = function() { - $scope.$broadcast('resetWorkflowChart'); - }; - - $scope.zoomToFitChart = function() { - $scope.$broadcast('zoomToFitChart'); - }; - - $scope.workflowZoomed = function(zoom) { - $scope.$broadcast('workflowZoomed', { - zoom: zoom - }); - }; - - init(); - - // Processing of job-status messages from the websocket - $scope.$on(`ws-jobs`, function(e, data) { - // Update the workflow job's unified job: - if (parseInt(data.unified_job_id, 10) === parseInt($scope.workflow.id,10)) { - $scope.workflow.status = data.status; - // start internval counter for job that transitioned to running - if ($scope.workflow.status === 'running') { - runTimeElapsedTimer = workflowResultsService.createOneSecondTimer(moment(), updateWorkflowJobElapsedTimer); - } - - if(data.status === "successful" || data.status === "failed" || data.status === "canceled" || data.status === "error"){ - $state.go('.', null, { reload: true }); - } - } - // Update the jobs spawned by the workflow: - if(data.hasOwnProperty('workflow_job_id') && - parseInt(data.workflow_job_id, 10) === parseInt($scope.workflow.id,10)){ - - // This check ensures that the workflow status icon doesn't get stuck in - // the waiting state due to the UI missing the initial socket message. This - // can happen if the GET request on the workflow job returns "waiting" and - // the sockets aren't established yet so we miss the event that indicates - // the workflow job has moved into a running state. - if (!_.includes(['running', 'successful', 'failed', 'error', 'canceled'], $scope.workflow.status)){ - $scope.workflow.status = 'running'; - runTimeElapsedTimer = workflowResultsService.createOneSecondTimer(moment(), updateWorkflowJobElapsedTimer); - } - - $scope.graphState.arrayOfNodesForChart.forEach((node) => { - if (nodeRef[node.id] && nodeRef[node.id].originalNodeObject.id === data.workflow_node_id) { - node.job = { - id: data.unified_job_id, - status: data.status - }; - - $scope.$broadcast("refreshWorkflowChart"); - } - }); - - $scope.count = workflowResultsService - .getCounts($scope.graphState.arrayOfNodesForChart); - } - getLabelsAndTooltips(); - }); - - $scope.$on('$destroy', function() { - workflowResultsService.destroyTimer(runTimeElapsedTimer); - }); -}]; diff --git a/awx/ui/client/src/workflow-results/workflow-results.partial.html b/awx/ui/client/src/workflow-results/workflow-results.partial.html deleted file mode 100644 index 3f04141068..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-results.partial.html +++ /dev/null @@ -1,391 +0,0 @@ -
-
-
- - -
-
- - -
-
- {{ strings.details.HEADER }} -
- - -
- - - - - - - - - -
-
- - -
- - -
- -
- - {{ workflow.statusLabel }} -
-
- - -
- - -
- {{ job_explanation.less }} - ... - - {{ strings.details.SHOW_MORE }} - -
- -
- {{ job_explanation.more }} - - {{ strings.details.SHOW_LESS }} - -
-
- - -
- -
- {{ (workflow.started | longDate) || strings.details.NOT_STARTED }} -
-
- - -
- -
- {{ (workflow.finished | - longDate) || strings.details.NOT_FINISHED }} -
-
- - -
- - -
- - -
- -
- {{ workflow.limit }} -
-
- - -
- -
- {{ workflow.scm_branch }} -
-
- - -
- - -
- - -
- - -
- - -
- - -
- - - -
- - -
- - -
- - -
- - -
- - -
- - - - - - - - - -
- -
-
- - -
-
- - -
-
- - - {{ workflow.name }} -
-
- -
- -
- {{ strings.results.TOTAL_NODES }} -
- - {{ workflow_nodes.length || 0}} - - - -
- {{ strings.results.ELAPSED }} -
- - {{ workflow.elapsed * 1000 | duration: "hh:mm:ss"}} - -
- - -
- - - - -
-
-
- -
-
- - -
-
- -
- -
-
-
- - -
- -
-
-
diff --git a/awx/ui/client/src/workflow-results/workflow-results.route.js b/awx/ui/client/src/workflow-results/workflow-results.route.js deleted file mode 100644 index 149a211129..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-results.route.js +++ /dev/null @@ -1,138 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import {templateUrl} from '../shared/template-url/template-url.factory'; - -import workflowResultsController from './workflow-results.controller'; - -export default { - name: 'workflowResults', - url: '/workflows/:id', - ncyBreadcrumb: { - parent: 'jobs', - label: '{{ workflow.id }} - {{ workflow.name }}' - }, - templateUrl: templateUrl('workflow-results/workflow-results'), - controller: workflowResultsController, - resolve: { - // the GET for the particular workflow - workflowData: ['Rest', 'GetBasePath', '$stateParams', '$q', '$state', 'Alert', 'i18n', function(Rest, GetBasePath, $stateParams, $q, $state, Alert, i18n) { - Rest.setUrl(GetBasePath('workflow_jobs') + $stateParams.id); - var defer = $q.defer(); - Rest.get() - .then(function(data) { - defer.resolve(data.data); - }, function(data) { - defer.reject(data); - - if (data.status === 404) { - Alert(i18n._('Job Not Found'), i18n._('Cannot find job.'), 'alert-info'); - } else if (data.status === 403) { - Alert(i18n._('Insufficient Permissions'), i18n._('You do not have permission to view this job.'), 'alert-info'); - } - - $state.go('jobs'); - }); - return defer.promise; - }], - // after the GET for the job, this helps us keep the status bar from - // flashing as rest data comes in. Provides the list of workflow nodes - workflowNodes: ['workflowData', 'Rest', '$q', function(workflowData, Rest, $q) { - var defer = $q.defer(); - Rest.setUrl(workflowData.related.workflow_nodes + '?order_by=id&page_size=200'); - Rest.get() - .then(({data}) => { - if(data.next) { - let allNodes = data.results; - let getNodes = function(nextUrl){ - // Get the workflow nodes - Rest.setUrl(nextUrl); - Rest.get() - .then(function(nextData) { - for(var i=0; i { - // TODO: handle this - //defer.resolve(data); - }); - return defer.promise; - }], - // after the GET for the workflow & it's nodes, this helps us keep the - // status bar from flashing as rest data comes in. If the workflow - // is finished and there's a playbook_on_stats event, go ahead and - // resolve the count so you don't get that flashing! - count: ['workflowData', 'workflowNodes', 'workflowResultsService', 'Rest', '$q', function(workflowData, workflowNodes, workflowResultsService, Rest, $q) { - var defer = $q.defer(); - defer.resolve({ - val: workflowResultsService - .getCounts(workflowNodes), - countFinished: true}); - return defer.promise; - }], - // GET for the particular jobs labels to be displayed in the - // left-hand pane - jobLabels: ['Rest', 'GetBasePath', '$stateParams', '$q', function(Rest, GetBasePath, $stateParams, $q) { - var getNext = function(data, arr, resolve) { - Rest.setUrl(data.next); - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, arr.concat(data.results), resolve); - } else { - resolve.resolve(arr.concat(data.results) - .map(val => val.name)); - } - }); - }; - - var seeMoreResolve = $q.defer(); - - Rest.setUrl(GetBasePath('workflow_jobs') + $stateParams.id + '/labels/'); - Rest.get() - .then(({data}) => { - if (data.next) { - getNext(data, data.results, seeMoreResolve); - } else { - seeMoreResolve.resolve(data.results - .map(val => val.name)); - } - }); - - return seeMoreResolve.promise; - }], - // OPTIONS request for the workflow. Used to make things like the - // verbosity data in the left-hand pane prettier than just an - // integer - workflowDataOptions: ['Rest', 'GetBasePath', '$stateParams', '$q', function(Rest, GetBasePath, $stateParams, $q) { - Rest.setUrl(GetBasePath('workflow_jobs') + $stateParams.id); - var defer = $q.defer(); - Rest.options() - .then(function(data) { - defer.resolve(data.data); - }, function(data) { - defer.reject(data); - }); - return defer.promise; - }] - } - -}; diff --git a/awx/ui/client/src/workflow-results/workflow-results.service.js b/awx/ui/client/src/workflow-results/workflow-results.service.js deleted file mode 100644 index ea180d34b8..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-results.service.js +++ /dev/null @@ -1,137 +0,0 @@ -/************************************************* -* Copyright (c) 2016 Ansible, Inc. -* -* All Rights Reserved -*************************************************/ - - -export default ['i18n', 'Prompt', '$filter', 'Wait', 'Rest', '$state', 'ProcessErrors', 'WorkflowJobModel', '$interval', 'moment', 'ComponentsStrings', function (i18n, Prompt, $filter, Wait, Rest, $state, ProcessErrors, WorkflowJob, $interval, moment, strings) { - var val = { - getCounts: function(workflowNodes){ - var nodeArr = []; - workflowNodes.forEach(node => { - if(node && node.summary_fields && node.summary_fields.job && node.summary_fields.job.status){ - nodeArr.push(node.summary_fields.job.status); - } else if (_.has(node, 'job.status')) { - nodeArr.push(node.job.status); - } - }); - // use the workflow nodes data populate above to get the count - var count = { - successful : _.filter(nodeArr, function(o){ - return o === "successful"; - }), - failed : _.filter(nodeArr, function(o){ - return o === "failed" || o === "error" || o === "canceled"; - }) - }; - - // turn the count into an actual count, rather than a list of - // statuses - Object.keys(count).forEach(key => { - count[key] = count[key].length; - }); - - return count; - }, - deleteJob: function(workflow) { - Prompt({ - hdr: i18n._('Delete Job'), - resourceName: `#${workflow.id} ` + $filter('sanitize')(workflow.name), - body: `
- ${i18n._('Are you sure you want to delete this workflow?')} -
`, - action: function() { - Wait('start'); - Rest.setUrl(workflow.url); - Rest.destroy() - .then(() => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - $state.go('jobs'); - }) - .catch(({obj, status}) => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - ProcessErrors(null, obj, status, null, { - hdr: i18n._('Error!'), - msg: `${i18n._('Could not delete job. Returned status: ' + status)}` - }); - }); - }, - actionText: i18n._('DELETE') - }); - }, - cancelJob: function(workflow) { - var doCancel = function() { - Rest.setUrl(workflow.url + 'cancel'); - Rest.post({}) - .then(() => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - }) - .catch(({obj, status}) => { - Wait('stop'); - $('#prompt-modal').modal('hide'); - ProcessErrors(null, obj, status, null, { - hdr: i18n._('Error!'), - msg: `${i18n._('Could not cancel workflow. Returned status: ' + status)}` - }); - }); - }; - - Prompt({ - hdr: i18n._('Cancel Workflow'), - resourceName: `#${workflow.id} ${$filter('sanitize')(workflow.name)}`, - body: `
- ${i18n._('Are you sure you want to cancel this workflow job?')} -
`, - action: function() { - Wait('start'); - Rest.setUrl(workflow.url + 'cancel'); - Rest.get() - .then(({data}) => { - if (data.can_cancel === true) { - doCancel(); - } else { - $('#prompt-modal').modal('hide'); - ProcessErrors(null, data, null, null, { - hdr: i18n._('Error!'), - msg: `${i18n._('Job has completed. Unable to be canceled.')}` - }); - } - }); - }, - actionText: i18n._('PROCEED') - }); - }, - relaunchJob: function(scope) { - const workflowJob = new WorkflowJob(); - - workflowJob.postRelaunch({ - id: scope.workflow.id - }).then((launchRes) => { - $state.go('workflowResults', { id: launchRes.data.id }, { reload: true }); - }).catch(({ data, status, config }) => { - ProcessErrors(scope, data, status, null, { - hdr: strings.get('error.HEADER'), - msg: strings.get('error.CALL', { path: `${config.url}`, status }) - }); - }); - }, - createOneSecondTimer: function(startTime, fn) { - return $interval(function(){ - fn(moment().diff(moment(startTime), 'seconds')); - }, 1000); - }, - destroyTimer: function(timer) { - if (timer !== null) { - $interval.cancel(timer); - timer = null; - return true; - } - return false; - } - }; - return val; -}]; diff --git a/awx/ui/client/src/workflow-results/workflow-status-bar/main.js b/awx/ui/client/src/workflow-results/workflow-status-bar/main.js deleted file mode 100644 index 251258fc70..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-status-bar/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -import workflowStatusBar from './workflow-status-bar.directive'; - -export default - angular.module('workflowStatusBarDirective', []) - .directive('workflowStatusBar', workflowStatusBar); diff --git a/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.block.less b/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.block.less deleted file mode 100644 index b5a14a8605..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.block.less +++ /dev/null @@ -1,58 +0,0 @@ -.WorkflowStatusBar { - display: flex; - flex: 0 0 auto; - width: 100%; - margin-top: 10px; - margin-bottom: 15px; -} - -.WorkflowStatusBar-successful, -.WorkflowStatusBar-failed, -.WorkflowStatusBar-pending, -.WorkflowStatusBar-noData { - height: 15px; - border-top: 5px solid @default-bg; - border-bottom: 5px solid @default-bg; -} - -.WorkflowStatusBar-successful { - background-color: @default-succ; - display: flex; - flex: 0 0 auto; -} - -.WorkflowStatusBar-failed { - background-color: @default-err; - flex: 0 0 auto; -} - -.WorkflowStatusBar-pending { - background-color: @b7grey; - flex: 0 0 auto; -} - -.WorkflowStatusBar-noData { - background-color: @default-icon-hov; - flex: 1 0 auto; -} - -.WorkflowStatusBar-tooltipLabel { - text-transform: uppercase; - margin-right: 15px; -} - -.WorkflowStatusBar-tooltipBadge { - border-radius: 5px; -} - -.WorkflowStatusBar-tooltipBadge--successful { - background-color: @default-succ; -} - -.WorkflowStatusBar-tooltipBadge--failed { - background-color: @default-err; -} - -.WorkflowStatusBar-tooltipBadge--pending { - background-color: @b7grey; -} diff --git a/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.directive.js b/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.directive.js deleted file mode 100644 index 8ffe84beae..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.directive.js +++ /dev/null @@ -1,53 +0,0 @@ -/************************************************* - * Copyright (c) 2016 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -export default [ 'templateUrl', 'OutputStrings', - function(templateUrl, OutputStrings) { - return { - scope: true, - templateUrl: templateUrl('workflow-results/workflow-status-bar/workflow-status-bar'), - restrict: 'E', - link: function(scope) { - scope.strings = OutputStrings; - // as count is changed by jobs coming in, - // update the workflow status bar - scope.$watch('count', function(val) { - if (val) { - Object.keys(val).forEach(key => { - // reposition the workflow status bar by setting - // the various flex values to the count of - // those jobs - $(`.WorkflowStatusBar-${key}`) - .css('flex', `${val[key]} 0 auto`); - - let tooltipLabel = key; - - switch(key) { - case 'successful': - tooltipLabel = scope.strings.get('workflow_status.SUCCESSFUL'); - break; - case 'failed': - tooltipLabel = scope.strings.get('workflow_status.FAILED'); - break; - } - - // set the tooltip to give how many jobs of - // each type - if (val[key] > 0) { - scope[`${key}CountTip`] = `${tooltipLabel}${val[key]}`; - } - }); - - // if there are any hosts that have finished, don't - // show default grey bar - scope.hostsFinished = (Object - .keys(val) - .filter(key => (val[key] > 0)).length > 0); - } - }); - } - }; -}]; diff --git a/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.partial.html b/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.partial.html deleted file mode 100644 index 0a7c2f07f3..0000000000 --- a/awx/ui/client/src/workflow-results/workflow-status-bar/workflow-status-bar.partial.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/awx/ui/conf.py b/awx/ui/conf.py index 335ca0d386..3148aec6ee 100644 --- a/awx/ui/conf.py +++ b/awx/ui/conf.py @@ -71,3 +71,4 @@ register( category=_('UI'), category_slug='ui', ) + diff --git a/awx/ui/context_processors.py b/awx/ui/context_processors.py deleted file mode 100644 index 38976a6eaa..0000000000 --- a/awx/ui/context_processors.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 2015 Ansible, Inc. -# All Rights Reserved. - -# Django -from django.conf import settings as django_settings - -# Ansible Tower -from awx.main.utils import get_awx_version - -def settings(request): - return { - 'settings': django_settings, - } - -def version(request): - context = getattr(request, 'parser_context', {}) - return { - 'version': get_awx_version(), - 'tower_version': get_awx_version(), - 'short_tower_version': get_awx_version().split('-')[0], - 'deprecated': getattr( - context.get('view'), - 'deprecated', - False - ) - } diff --git a/awx/ui/fields.py b/awx/ui/fields.py index 32e08a12c1..4d96165d4d 100644 --- a/awx/ui/fields.py +++ b/awx/ui/fields.py @@ -42,3 +42,4 @@ class CustomLogoField(fields.CharField): except (TypeError, binascii.Error): self.fail('invalid_data') return data + diff --git a/awx/ui/grunt-tasks/jshint.js b/awx/ui/grunt-tasks/jshint.js deleted file mode 100644 index 0ed7193e6e..0000000000 --- a/awx/ui/grunt-tasks/jshint.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - source: { - src: ['client/src/**/*.js', '*conf.js', '*.config.js', 'Gruntfile.js'], - options: { - reporter: require('jshint-stylish'), - jshintrc: true - } - }, - -}; diff --git a/awx/ui/grunt-tasks/nggettext_compile.js b/awx/ui/grunt-tasks/nggettext_compile.js deleted file mode 100644 index 1fb250a6d4..0000000000 --- a/awx/ui/grunt-tasks/nggettext_compile.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - all: { - options: { - format: 'json' - }, - files: [{ - expand: true, - dot: true, - dest: 'client/languages', - cwd: 'po', - ext: '.json', - src: ['*.po'] - }] - } -}; - diff --git a/awx/ui/grunt-tasks/nggettext_extract.js b/awx/ui/grunt-tasks/nggettext_extract.js deleted file mode 100644 index 8b07d36693..0000000000 --- a/awx/ui/grunt-tasks/nggettext_extract.js +++ /dev/null @@ -1,23 +0,0 @@ -let source = [ - 'client/features/**/*.js', - 'client/features/**/*.html', - 'client/lib/**/*.js', - 'client/lib/**/*.html', - 'client/src/**/*.js', - 'client/src/**/*.html', - 'client/*.ejs' -]; - -module.exports = { - all: { - options: { - markerNames: ['_', 'N_'], - moduleName: 't', - moduleMethodString: 's', - moduleMethodPlural: 'p' - }, - files: { - 'po/ansible-tower-ui.pot': source - } - } -}; diff --git a/awx/ui/models.py b/awx/ui/models.py deleted file mode 100644 index 33cc349cf4..0000000000 --- a/awx/ui/models.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2015 Ansible, Inc. -# All Rights Reserved. - -# Empty models file. diff --git a/awx/ui/package-lock.json b/awx/ui/package-lock.json deleted file mode 100644 index c3dd1a9fd4..0000000000 --- a/awx/ui/package-lock.json +++ /dev/null @@ -1,14862 +0,0 @@ -{ - "name": "awx", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.0.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.26.tgz", - "integrity": "sha512-W+fpe5s91FBGE0pEa0lnqGLL4USgpLgs4nokw16SrBBco/gQxuua7KnArSEOd5iaMqbbSHV10vUDkJYJJqpXKA==", - "dev": true - }, - "@uirouter/angularjs": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.18.tgz", - "integrity": "sha512-tswhwMMBDnbGOZnnCVpnA0pbd7dXkBck1HO0WY7fw8GO3dKbWAAc/rL0479dLypR89UDDGym5leTvZCLW4cJnA==", - "requires": { - "@uirouter/core": "5.0.19" - } - }, - "@uirouter/core": { - "version": "5.0.19", - "resolved": "https://registry.npmjs.org/@uirouter/core/-/core-5.0.19.tgz", - "integrity": "sha512-wow+CKRThUAQkiTLNQCBsKQIU3NbH8GGH/w/TrcjKdvkZQA2jQB9QSqmmZxj7XNoZXY7QVcSSc4DWmxuSeAWmQ==" - }, - "a-sync-waterfall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.0.tgz", - "integrity": "sha1-OOgxnXk3niRiiEW1O5ZyKyng5Hw=", - "dev": true - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "~2.1.11", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", - "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "^4.0.3" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "~3.0.0", - "semver": "~5.0.1" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "almond": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/almond/-/almond-0.3.3.tgz", - "integrity": "sha1-oOfJWsdiTWQXtElLHmi/9pMWiiA=" - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "angular": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.1.tgz", - "integrity": "sha512-eiasF4uFXsmKD8qYpkKEi9rKVxMv0nIDZXsYrwzSbPIbjmTV05bx+18VDbRmMx7p+gL84T9Qw2NCpVe8w1QKHQ==" - }, - "angular-breadcrumb": { - "version": "git+https://git@github.com/ansible/angular-breadcrumb.git#6c2b1ad45ad5fbe7adf39af1ef3b294ca8e207a9", - "from": "git+https://git@github.com/ansible/angular-breadcrumb.git#0.4.1" - }, - "angular-codemirror": { - "version": "git+https://git@github.com/ansible/angular-codemirror.git#4ee3223f505cb0df2406a1e61073beaeebd3b56a", - "from": "git+https://git@github.com/ansible/angular-codemirror.git#v1.2.1", - "requires": { - "angular": "^1.7.9", - "codemirror": "^5.17.0", - "jquery": "^3.5.1" - }, - "dependencies": { - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - } - } - }, - "angular-cookies": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.7.9.tgz", - "integrity": "sha512-3eRq/aPrtCZKDWQnc3nW3sFoMbLiHkCkyDF2O9u7VXnqvVsUPaipk5R1ZqahgcSQHQrN/F5IU4T4nrz52qAZmA==" - }, - "angular-drag-and-drop-lists": { - "version": "git+https://git@github.com/ansible/angular-drag-and-drop-lists.git#cceda38b836402ed4ce77fc287c23c8d02e950f6", - "from": "git+https://git@github.com/ansible/angular-drag-and-drop-lists.git#v1.4.1" - }, - "angular-duration-format": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/angular-duration-format/-/angular-duration-format-1.0.1.tgz", - "integrity": "sha1-scbu5u7/3ljrQmRM8WU+VXTP3xw=" - }, - "angular-filters": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/angular-filters/-/angular-filters-1.1.2.tgz", - "integrity": "sha1-btYFgIEsmQmnzHR2dyfR2ZOkVjM=" - }, - "angular-gettext": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/angular-gettext/-/angular-gettext-2.3.11.tgz", - "integrity": "sha512-CcoK8IXQLjdu5DzU2rJ38CNNfBPIrEZoPC6pgGf/q//upt6O+WpiL0DawEzy7gw5i3Em7ANh+BrXRoR1tgrFEQ==" - }, - "angular-gettext-tools": { - "version": "2.3.18", - "resolved": "https://registry.npmjs.org/angular-gettext-tools/-/angular-gettext-tools-2.3.18.tgz", - "integrity": "sha512-FR3w2dY09bEwm7REzIHPDytg0TuL2ps94/f/hIjGQXCkTmp+hIDnVAuFEX55neQ1xaDZynBs+jG9vxutKLkkiQ==", - "dev": true, - "requires": { - "babylon": "^6.11.4", - "binary-search": "^1.2.0", - "cheerio": "~0.19.0", - "lodash": "^4.17.5", - "pofile": "~1.0.0", - "typescript": "~2.3.2", - "typescript-eslint-parser": "^3.0.0" - } - }, - "angular-mocks": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.7.9.tgz", - "integrity": "sha512-LQRqqiV3sZ7NTHBnNmLT0bXtE5e81t97+hkJ56oU0k3dqKv1s6F+nBWRlOVzqHWPGFOiPS8ZJVdrS8DFzHyNIA==", - "dev": true - }, - "angular-moment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz", - "integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==", - "requires": { - "moment": ">=2.8.0 <3.0.0" - } - }, - "angular-mousewheel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/angular-mousewheel/-/angular-mousewheel-1.0.5.tgz", - "integrity": "sha1-/fA45SnT2K91wO6IFfu717gAdUo=", - "requires": { - "angular": "^1.0.6", - "hamsterjs": "^1.0.2" - } - }, - "angular-sanitize": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.7.9.tgz", - "integrity": "sha512-nB/xe7JQWF9nLvhHommAICQ3eWrfRETo0EVGFESi952CDzDa+GAJ/2BFBNw44QqQPxj1Xua/uYKrbLsOGWZdbQ==" - }, - "angular-scheduler": { - "version": "git+https://git@github.com/ansible/angular-scheduler.git#d72b62f47fb5c11b3284eaaea11c4d5525fa3b99", - "from": "git+https://git@github.com/ansible/angular-scheduler.git#v0.4.4", - "requires": { - "angular": "^1.7.9", - "angular-tz-extensions": "github:ansible/angular-tz-extensions", - "jquery": "^3.5.1", - "jquery-ui": "*", - "lodash": "^4.17.15", - "moment": "^2.10.2", - "rrule": "github:jkbrzt/rrule#4ff63b2f8524fd6d5ba6e80db770953b5cd08a0c" - }, - "dependencies": { - "angular-tz-extensions": { - "version": "github:ansible/angular-tz-extensions#5c594b5756d29637601020bba16274f10ee0ed65", - "from": "github:ansible/angular-tz-extensions", - "requires": { - "angular": "^1.7.9", - "angular-filters": "^1.1.2", - "jquery": "^3.5.1", - "jstimezonedetect": "1.0.5", - "timezone-js": "github:ansible/timezone-js#0.4.14" - } - }, - "rrule": { - "version": "github:jkbrzt/rrule#4ff63b2f8524fd6d5ba6e80db770953b5cd08a0c", - "from": "github:jkbrzt/rrule#4ff63b2f8524fd6d5ba6e80db770953b5cd08a0c" - } - } - }, - "angular-tz-extensions": { - "version": "git+https://git@github.com/ansible/angular-tz-extensions.git#5c594b5756d29637601020bba16274f10ee0ed65", - "from": "git+https://git@github.com/ansible/angular-tz-extensions.git#v0.6.1", - "requires": { - "angular": "^1.7.9", - "angular-filters": "^1.1.2", - "jquery": "^3.5.1", - "jstimezonedetect": "1.0.5", - "timezone-js": "github:ansible/timezone-js#0.4.14" - }, - "dependencies": { - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - }, - "timezone-js": { - "version": "github:ansible/timezone-js#6937de14ce0c193961538bb5b3b12b7ef62a358f", - "from": "github:ansible/timezone-js#0.4.14" - } - } - }, - "angular-xeditable": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/angular-xeditable/-/angular-xeditable-0.8.1.tgz", - "integrity": "sha512-L4AkM18NDKL1M/vumZxSfMm+IGO/tWDIDjy0tk9qo5TO4zGH4R8Z1g+IelewUPR3KvLPhkXUcZsIY+wjMnOTaw==", - "requires": { - "angular": "~1.x" - } - }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-to-html": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.4.tgz", - "integrity": "sha512-XuUGfj3zOAg3/NCU7Oyf9PaCyFuDVj8dzMqezMycPxo5U52atXt+R4L/zW7ETNA2GTjyj/KGBVEFI8sgPWUu2w==", - "requires": { - "entities": "^1.1.1" - } - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archiver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", - "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^1.2.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - } - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-find": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", - "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assertion-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", - "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true, - "optional": true - }, - "axios": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.16.2.tgz", - "integrity": "sha1-uk+S8XFn37q0CYN4VFS5rBScPG0=", - "dev": true, - "requires": { - "follow-redirects": "^1.2.3", - "is-buffer": "^1.1.5" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-istanbul": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/babel-istanbul/-/babel-istanbul-0.12.2.tgz", - "integrity": "sha1-5yPwfJokMtiAVVILwi519cI5Fhw=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "multi-glob": "^1.0.1", - "nopt": "3.x", - "object-assign": "^4.0.1", - "once": "1.x", - "resolve": "^1.1.0", - "source-map": "0.4.x", - "supports-color": "3.1.x", - "which": "1.2.x", - "wordwrap": "1.0.x" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "babel-loader": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.4.tgz", - "integrity": "sha512-/hbyEvPzBJuGpk9o80R0ZyTej6heEOr59GoEUtn8qFKbnx4cJm9FWES6J/iv644sYgrtVw9JJQkjaLW/bqb5gw==", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "binary-search": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.3.tgz", - "integrity": "sha512-T/jKp3vw1JI+6KQgsyT5R6CcRhMtxlHojeKrA5gX5WG50BQaoujRfoJJKMkuokNuZ0w2S+1wHufEWzw6Qhj30Q==", - "dev": true - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "bootstrap": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", - "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" - }, - "bootstrap-datepicker": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.8.0.tgz", - "integrity": "sha512-213St/G8KT3mjs4qu4qwww74KWysMaIeqgq5OhrboZjIjemIpyuxlSo9FNNI5+KzpkkxkRRba+oewiRGV42B1A==", - "requires": { - "jquery": ">=1.7.1 <4.0.0" - }, - "dependencies": { - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } - } - }, - "caniuse-db": { - "version": "1.0.30000851", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000851.tgz", - "integrity": "sha1-ig08pN3nIGhWCsyYus91o1no0+M=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000851", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000851.tgz", - "integrity": "sha512-Y1ecA1cL9wg0vni8t33nBw/poX8ypm+2c3fbwAESj8cm4ufK9CBFQ1+nUK8Dp5dtFo5Fc3JzkI5DKmQbuIo6hQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chai-nightwatch": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz", - "integrity": "sha1-HKVt52jTwIaP5/wvTTLC/olOa+k=", - "dev": true, - "requires": { - "assertion-error": "1.0.0", - "deep-eql": "0.1.3" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "cheerio": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", - "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", - "dev": true, - "requires": { - "css-select": "~1.0.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "~3.8.1", - "lodash": "^3.2.0" - }, - "dependencies": { - "lodash": { - "version": "3.8.0", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.8.0.tgz", - "integrity": "sha1-N265i9zZOCqTZcM8TLglDeEyW5E=", - "dev": true - } - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true - }, - "chromedriver": { - "version": "77.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-77.0.0.tgz", - "integrity": "sha512-mZa1IVx4HD8rDaItWbnS470mmypgiWsDiu98r0NkiT4uLm3qrANl4vOU6no6vtWtLQiW5kt1POcIbjeNpsLbXA==", - "dev": true, - "requires": { - "del": "^4.1.1", - "extract-zip": "^1.6.7", - "mkdirp": "^0.5.1", - "request": "^2.88.0", - "tcp-port-used": "^1.0.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true, - "requires": { - "chalk": "^1.1.3" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", - "dev": true, - "requires": { - "source-map": "0.5.x" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "clean-webpack-plugin": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz", - "integrity": "sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA==", - "dev": true, - "requires": { - "rimraf": "^2.6.1" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "requires": { - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codemirror": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.38.0.tgz", - "integrity": "sha512-PEPnDg8U3DTGFB/Dn2T/INiRNC9CB5k2vLAQJidYCsHvAgtXbklqnuidEwx7yGrMrdGhl0L0P3iNKW9I07J6tQ==" - }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true, - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "^4.5.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - } - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "components-font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/components-font-awesome/-/components-font-awesome-4.7.0.tgz", - "integrity": "sha1-p1UAlLbiy1zX3OScQFdxxTPpz+E=" - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", - "dev": true, - "requires": { - "mime-db": ">= 1.34.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", - "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=", - "dev": true - } - } - }, - "compression": { - "version": "1.7.2", - "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", - "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "bytes": "3.0.0", - "compressible": "~2.0.13", - "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.1", - "vary": "~1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz", - "integrity": "sha512-OlTo6DYg0XfTKOF8eLf79wcHm4Ut10xU2cRBRPMW/NA5F9VMjZGTfRHWDIYC3s+1kObGYrBLshXWU1K0hILkNQ==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" - }, - "dependencies": { - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "crc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", - "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", - "dev": true - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "cson-parser": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-1.3.5.tgz", - "integrity": "sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ=", - "dev": true, - "requires": { - "coffee-script": "^1.10.0" - }, - "dependencies": { - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "dev": true - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-loader": { - "version": "0.28.11", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", - "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "css-select": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", - "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "1.0", - "domutils": "1.4", - "nth-check": "~1.0.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - } - } - }, - "css-what": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", - "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "d3": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" - }, - "dagre": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.2.tgz", - "integrity": "sha512-TEOOGZOkCOgCG7AoUIq64sJ3d21SMv8tyoqteLpX+UsUsS9Qw8iap4hhogXY4oB3r0bbZuAjO0atAilgCmsE0Q==", - "requires": { - "graphlib": "^2.1.5", - "lodash": "^4.17.4" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "date-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz", - "integrity": "sha1-GIdtC9pMGf5w3Tv0sDTygbEqQLY=", - "dev": true, - "requires": { - "time-zone": "^0.1.0" - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "dev": true, - "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - } - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", - "dev": true, - "requires": { - "utila": "~0.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", - "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.48", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", - "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, - "enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - } - }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", - "dev": true, - "requires": { - "recast": "~0.11.12", - "through": "~2.3.6" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } - } - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-airbnb-base": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", - "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", - "dev": true, - "requires": { - "eslint-restricted-globals": "^0.1.1" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "eslint-import-resolver-webpack": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.8.4.tgz", - "integrity": "sha512-b6JxR57ruiMxq2tIu4T/SrYED5RKJfeBEs8u3+JWF+O2RxDmFpUH84c5uS1T5qiP0K4r0SL7CXhvd41hXdDlAg==", - "dev": true, - "requires": { - "array-find": "^1.0.0", - "debug": "^2.6.8", - "enhanced-resolve": "~0.9.0", - "find-root": "^0.1.1", - "has": "^1.0.1", - "interpret": "^1.0.0", - "is-absolute": "^0.2.3", - "lodash.get": "^3.7.0", - "node-libs-browser": "^1.0.0 || ^2.0.0", - "resolve": "^1.2.0", - "semver": "^5.3.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "eslint-loader": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", - "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", - "dev": true, - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "eslint-plugin-disable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-disable/-/eslint-plugin-disable-0.3.0.tgz", - "integrity": "sha1-xfQRz0AE5I55roLPw7KLldyQtzc=", - "dev": true, - "requires": { - "multimatch": "^2.1.0", - "resolve": "^1.1.6" - } - }, - "eslint-plugin-import": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz", - "integrity": "sha1-2tMXgSktZmSyUxf9BJ0uKy8CIF0=", - "dev": true, - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "eslint-restricted-globals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", - "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", - "dev": true - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } - } - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, - "requires": { - "original": ">=0.0.5" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", - "dev": true, - "requires": { - "array-slice": "^0.2.3", - "array-unique": "^0.2.1", - "braces": "^0.1.2" - }, - "dependencies": { - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true, - "requires": { - "expand-range": "^0.1.0" - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "^0.1.1", - "repeat-string": "^0.2.2" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-root": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-0.1.2.tgz", - "integrity": "sha1-mNImfP8ZFsyvJ0OzoO6oHXnX3NE=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" - }, - "dependencies": { - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "follow-redirects": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", - "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", - "dev": true, - "requires": { - "debug": "^3.1.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-minipass": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", - "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", - "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - } - } - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-uri": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", - "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", - "dev": true, - "requires": { - "data-uri-to-buffer": "1", - "debug": "2", - "extend": "3", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "graphlib": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz", - "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==", - "requires": { - "lodash": "^4.11.1" - } - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "grunt": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", - "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", - "dev": true, - "requires": { - "coffeescript": "~1.10.0", - "dateformat": "~1.0.12", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.3.0", - "glob": "~7.0.0", - "grunt-cli": "~1.2.0", - "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~2.0.0", - "grunt-legacy-util": "~1.1.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.13.0", - "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", - "nopt": "~3.0.6", - "path-is-absolute": "~1.0.0", - "rimraf": "~2.6.2" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "grunt-angular-gettext": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/grunt-angular-gettext/-/grunt-angular-gettext-2.3.9.tgz", - "integrity": "sha512-gOB0qBwADWXiKhpkyzeTHq2WyIFZKCzdn7HIRRyUn7xURxyBXgRjBTXEtUhWhg5bnY8z4lW28eCuki2RoYnt7Q==", - "dev": true, - "requires": { - "angular-gettext-tools": "~2.3.9" - } - }, - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "~0.3.0", - "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "grunt-concurrent": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-2.3.1.tgz", - "integrity": "sha1-Hj2zjM71o9oRleYdYx/n4yE0TSM=", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "async": "^1.2.1", - "indent-string": "^2.0.0", - "pad-stream": "^1.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "grunt-contrib-jshint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", - "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "hooker": "^0.2.3", - "jshint": "~2.9.4" - }, - "dependencies": { - "jshint": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz", - "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.10", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", - "dev": true - }, - "grunt-legacy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", - "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", - "dev": true, - "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.5" - } - }, - "grunt-legacy-log-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", - "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", - "dev": true, - "requires": { - "chalk": "~2.4.1", - "lodash": "~4.17.10" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "grunt-legacy-util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", - "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", - "dev": true, - "requires": { - "async": "~1.5.2", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.10", - "underscore.string": "~3.3.4", - "which": "~1.3.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "grunt-newer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/grunt-newer/-/grunt-newer-1.3.0.tgz", - "integrity": "sha1-g8y3od2ny9irI7BZAk6+YUrS80I=", - "dev": true, - "requires": { - "async": "^1.5.2", - "rimraf": "^2.5.2" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "hamsterjs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hamsterjs/-/hamsterjs-1.1.3.tgz", - "integrity": "sha512-q4XBr7hnxx1WyZA8mpVDuZVa1YXaR0WZaFSBxnj8hUXltuqXJOt5yuWYkAbMXsj+q0REDUO990+/TuxEadXFyg==" - }, - "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true - }, - "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.5.14", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.14.tgz", - "integrity": "sha512-dgyjIw8KFK6AyVl5vm2tEqPewv5TKGEiiVFLI1LbF+oHua/Njd8tZk3lIbF1AWU1rNdEg7scaceADb4zqCcWXg==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "hard-source-webpack-plugin": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.5.18.tgz", - "integrity": "sha512-qo1kuq0J4aII77JnkS36/mkhM+Mk7MNURKKmVVgY+m+2Pm3iu/hOUVkJS4sqRAKLcRRtDMdr+SrlPgJZCmdcPQ==", - "dev": true, - "requires": { - "lodash": "^4.15.0", - "mkdirp": "^0.5.1", - "node-object-hash": "^1.2.0", - "rimraf": "^2.6.2", - "source-list-map": "^0.1.6", - "source-map": "^0.5.6", - "webpack-core": "~0.6.0", - "webpack-sources": "^1.0.1", - "write-json-file": "^2.3.0" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true, - "optional": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", - "dev": true - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" - }, - "html-loader": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", - "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", - "dev": true, - "requires": { - "es6-templates": "^0.2.3", - "fastparse": "^1.1.1", - "html-minifier": "^3.5.8", - "loader-utils": "^1.1.0", - "object-assign": "^4.1.1" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "html-minifier": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.16.tgz", - "integrity": "sha512-zP5EfLSpiLRp0aAgud4CQXPQZm9kXwWjR/cF0PfdOj+jjWnOaCgeZcll4kYXSvIBPeUMmyaSc7mM4IDtA+kboA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.15.x", - "he": "1.1.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.3.x" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.3.28", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.28.tgz", - "integrity": "sha512-68Rc/aA6cswiaQ5SrE979UJcXX+ADA1z33/ZsPd+fbAiVdjZ16OXdbtGO+rJUUBgK6qdf3SOPhQf3K/ybF5Miw==", - "dev": true, - "requires": { - "commander": "~2.15.0", - "source-map": "~0.6.1" - } - } - } - }, - "html-webpack-harddisk-plugin": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/html-webpack-harddisk-plugin/-/html-webpack-harddisk-plugin-0.1.0.tgz", - "integrity": "sha1-QyAklhohrGaPorXf4kYpxgucWNc=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "dev": true, - "requires": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", - "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=", - "dev": true, - "requires": { - "agent-base": "2", - "debug": "2", - "extend": "3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dev": true, - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2", - "debug": "2", - "extend": "3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, - "requires": { - "meow": "^3.3.0" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz", - "integrity": "sha1-x+NWzeoiWucbNtcPLnGpK6TkJZA=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "dev": true - }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "dev": true, - "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" - }, - "dependencies": { - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - } - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true, - "requires": { - "is-unc-path": "^0.1.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.0" - } - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "is2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", - "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^2.1.0", - "is-url": "^1.2.2" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-instrumenter-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", - "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", - "dev": true, - "requires": { - "convert-source-map": "^1.5.0", - "istanbul-lib-instrument": "^1.7.3", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - } - } - }, - "jasmine-core": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", - "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", - "dev": true - }, - "javascript-detect-element-resize": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/javascript-detect-element-resize/-/javascript-detect-element-resize-0.5.3.tgz", - "integrity": "sha1-GnHNUd/lZZB/KZAS/nOilBBAJd4=" - }, - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - }, - "jquery-mousewheel": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", - "integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU=" - }, - "jquery-ui": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz", - "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE=" - }, - "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "jshint": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", - "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.11", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "jshint-stylish": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.2.1.tgz", - "integrity": "sha1-JCCCosA1rgP9gQROBXDMQgjPbmE=", - "dev": true, - "requires": { - "beeper": "^1.1.0", - "chalk": "^1.0.0", - "log-symbols": "^1.0.0", - "plur": "^2.1.0", - "string-length": "^1.0.0", - "text-table": "^0.2.0" - } - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jstimezonedetect": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/jstimezonedetect/-/jstimezonedetect-1.0.5.tgz", - "integrity": "sha1-k9A1zSDox9ZOsTdc9ap6EKAkRmo=" - }, - "karma": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", - "dev": true, - "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "chokidar": "^1.4.1", - "colors": "^1.1.0", - "combine-lists": "^1.0.0", - "connect": "^3.6.0", - "core-js": "^2.2.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "expand-braces": "^0.1.1", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^3.8.0", - "log4js": "^0.6.31", - "mime": "^1.3.4", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "1.7.3", - "source-map": "^0.5.3", - "tmp": "0.0.31", - "useragent": "^2.1.12" - }, - "dependencies": { - "lodash": { - "version": "3.8.0", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.8.0.tgz", - "integrity": "sha1-N265i9zZOCqTZcM8TLglDeEyW5E=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", - "dev": true, - "requires": { - "fs-access": "^1.0.0", - "which": "^1.2.1" - } - }, - "karma-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz", - "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==", - "dev": true, - "requires": { - "dateformat": "^1.0.6", - "istanbul": "^0.4.0", - "lodash": "^4.17.0", - "minimatch": "^3.0.0", - "source-map": "^0.5.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "karma-firefox-launcher": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz", - "integrity": "sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA==", - "dev": true - }, - "karma-html2js-preprocessor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-1.1.0.tgz", - "integrity": "sha1-/Ant8Eu+K7bu6boZaPgmtziAIL0=", - "dev": true - }, - "karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", - "dev": true - }, - "karma-junit-reporter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz", - "integrity": "sha1-T5xAzt+xo5X4rvh2q/lhiZF8Y5Y=", - "dev": true, - "requires": { - "path-is-absolute": "^1.0.0", - "xmlbuilder": "8.2.2" - } - }, - "karma-sourcemap-loader": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", - "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "karma-webpack": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.13.tgz", - "integrity": "sha512-2cyII34jfrAabbI2+4Rk4j95Nazl98FvZQhgSiqKUDarT317rxfv/EdzZ60CyATN4PQxJdO5ucR5bOOXkEVrXw==", - "dev": true, - "requires": { - "async": "^2.0.0", - "babel-runtime": "^6.0.0", - "loader-utils": "^1.0.0", - "lodash": "^4.0.0", - "source-map": "^0.5.6", - "webpack-dev-middleware": "^1.12.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "legacy-loader": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/legacy-loader/-/legacy-loader-0.0.2.tgz", - "integrity": "sha1-iEVZAGIV6uqlBVjXCbSmbmcw3E4=", - "requires": { - "loader-utils": "^0.2.6", - "source-map": "^0.3.0" - } - }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", - "dev": true, - "requires": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.2.11", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "2.81.0", - "source-map": "^0.5.3" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "less-plugin-autoprefix": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/less-plugin-autoprefix/-/less-plugin-autoprefix-1.5.1.tgz", - "integrity": "sha1-vKTlsuSMrGlloXgxQuOzLDwAzgc=", - "dev": true, - "requires": { - "autoprefixer": "^6.0.0", - "postcss": "^5.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-grunt-configs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/load-grunt-configs/-/load-grunt-configs-1.0.0.tgz", - "integrity": "sha1-vbn67BSrcg1TiNZ8LqvdUQdxeBk=", - "dev": true, - "requires": { - "cson-parser": "^1.0.9", - "inquirer": "^0.8.2", - "js-yaml": "^3.2.7", - "lodash": "^3.6.0", - "rimraf": "^2.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", - "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", - "dev": true - }, - "cli-width": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", - "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "inquirer": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.8.5.tgz", - "integrity": "sha1-29dAz2yjtzEpamPOb22WGFHzNt8=", - "dev": true, - "requires": { - "ansi-regex": "^1.1.1", - "chalk": "^1.0.0", - "cli-width": "^1.0.1", - "figures": "^1.3.5", - "lodash": "^3.3.1", - "readline2": "^0.1.1", - "rx": "^2.4.3", - "through": "^2.3.6" - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "load-grunt-tasks": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.5.2.tgz", - "integrity": "sha1-ByhWEYD9IP+KaSdQWFL8WKrqDIg=", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "multimatch": "^2.0.0", - "pkg-up": "^1.0.0", - "resolve-pkg": "^0.1.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-fs-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "dev": true, - "requires": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._baseassign": "^3.0.0", - "lodash._basefor": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", - "dev": true - }, - "lodash._baseget": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/lodash._baseget/-/lodash._baseget-3.7.2.tgz", - "integrity": "sha1-G2rh1frPPCVTI1ChPBGXy4u2dPQ=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._stack": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lodash._stack/-/lodash._stack-4.1.3.tgz", - "integrity": "sha1-dRqnbBuWSwR+dtFPxyoJP8teLdA=", - "dev": true - }, - "lodash._topath": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/lodash._topath/-/lodash._topath-3.8.1.tgz", - "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", - "dev": true, - "requires": { - "lodash.isarray": "^3.0.0" - } - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clone": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz", - "integrity": "sha1-hGiMc9MrWpDKJWFpY/GJJSqZcEM=", - "dev": true, - "requires": { - "lodash._baseclone": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "lodash.defaultsdeep": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz", - "integrity": "sha1-bBpYbmxWR7DmTi15gUG4g2FYvoo=", - "dev": true, - "requires": { - "lodash._baseclone": "^4.0.0", - "lodash._stack": "^4.0.0", - "lodash.isplainobject": "^4.0.0", - "lodash.keysin": "^4.0.0", - "lodash.mergewith": "^4.0.0", - "lodash.rest": "^4.0.0" - }, - "dependencies": { - "lodash._baseclone": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz", - "integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ=", - "dev": true - } - } - }, - "lodash.get": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-3.7.0.tgz", - "integrity": "sha1-POaK4skWg7KBzFOUEoMDy/deaR8=", - "dev": true, - "requires": { - "lodash._baseget": "^3.0.0", - "lodash._topath": "^3.0.0" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.keysin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.2.0.tgz", - "integrity": "sha1-jMP7NcLZSsxEOhhj4C+kB5nqbyg=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true - }, - "lodash.rest": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz", - "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=", - "dev": true - }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", - "dev": true, - "requires": { - "readable-stream": "~1.0.2", - "semver": "~4.3.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "^3.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lr-infinite-scroll": { - "version": "git+https://git@github.com/lorenzofox3/lrInfiniteScroll.git#59d348bc5c18f164438d2a30f1fd79b333c3b649", - "from": "git+https://git@github.com/lorenzofox3/lrInfiniteScroll.git" - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", - "dev": true - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "~1.33.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mkpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", - "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", - "dev": true - }, - "mocha-nightwatch": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mocha-nightwatch/-/mocha-nightwatch-3.2.2.tgz", - "integrity": "sha1-kby5s73gV912d8eBJeSR5Y1mZHw=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.5", - "glob": "7.0.5", - "growl": "1.9.2", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multi-glob": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/multi-glob/-/multi-glob-1.0.1.tgz", - "integrity": "sha1-5n0qtEKdJ2BubrTbNQlK/JF4h1A=", - "dev": true, - "requires": { - "async": "1.x", - "glob": "5.x", - "lodash": "3.x" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", - "dev": true - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "ng-toast": { - "version": "git+https://git@github.com/ansible/ngToast.git#4550efb9cf7fb90c9bfbd9476f1fe650aaad5b6e", - "from": "git+https://git@github.com/ansible/ngToast.git#v2.2.1", - "requires": { - "angular": "^1.7.9", - "angular-sanitize": "^1.7.9" - } - }, - "ngtemplate-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ngtemplate-loader/-/ngtemplate-loader-2.0.1.tgz", - "integrity": "sha1-nX7S6KI2NSOte2TXSqxALY2v8/M=", - "dev": true, - "requires": { - "jsesc": "^0.5.0", - "loader-utils": "^1.0.2" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "nightwatch": { - "version": "0.9.21", - "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-0.9.21.tgz", - "integrity": "sha1-nnlKdRS0/V9GYC02jlBRUjKrnpA=", - "dev": true, - "requires": { - "chai-nightwatch": "~0.1.x", - "ejs": "2.5.7", - "lodash.clone": "3.0.3", - "lodash.defaultsdeep": "4.3.2", - "minimatch": "3.0.3", - "mkpath": "1.0.0", - "mocha-nightwatch": "3.2.2", - "optimist": "0.6.1", - "proxy-agent": "2.0.0", - "q": "1.4.1" - }, - "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - } - } - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - } - }, - "node-object-hash": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-1.4.1.tgz", - "integrity": "sha512-JQVqSM5/mOaUoUhCYR0t1vgm8RFo7qpJtPvnoFCLeqQh1xrfmr3BCD3nGBnACzpIEF7F7EVgqGD3O4lao/BY/A==", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nunjucks": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.1.3.tgz", - "integrity": "sha512-UtlKKAzg9vdtvURdNy9DjGhiB7qYf2R7Ez+hsucOQG5gYJexSggXSSZ+9IpSDyKOlWu/4rMVPH2oVoANOSqNKA==", - "dev": true, - "requires": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "chokidar": "^2.0.0", - "postinstall-build": "^5.0.1", - "yargs": "^3.32.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "nvd3": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.6.tgz", - "integrity": "sha1-LT66dL8zNjtRAevx0JPFmlOuc8Q=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-hash": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", - "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==", - "dev": true - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "original": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", - "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", - "dev": true, - "requires": { - "url-parse": "~1.4.0" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pac-proxy-agent": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz", - "integrity": "sha512-QBELCWyLYPgE2Gj+4wUEiMscHrQ8nRPBzYItQNOHWavwBt25ohZHQC4qnd5IszdVVrFbLsQ+dPkm6eqdjJAmwQ==", - "dev": true, - "requires": { - "agent-base": "2", - "debug": "2", - "extend": "3", - "get-uri": "2", - "http-proxy-agent": "1", - "https-proxy-agent": "1", - "pac-resolver": "~2.0.0", - "raw-body": "2", - "socks-proxy-agent": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "pac-resolver": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-2.0.0.tgz", - "integrity": "sha1-mbiNLxk/ve78HJpSnB8yYKtSd80=", - "dev": true, - "requires": { - "co": "~3.0.6", - "degenerator": "~1.0.2", - "ip": "1.0.1", - "netmask": "~1.0.4", - "thunkify": "~2.1.1" - }, - "dependencies": { - "co": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz", - "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=", - "dev": true - } - } - }, - "pad-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pad-stream/-/pad-stream-1.2.0.tgz", - "integrity": "sha1-Yx3Mn3mBC3BZZeid7eps/w/B38k=", - "dev": true, - "requires": { - "meow": "^3.0.0", - "pumpify": "^1.3.3", - "repeating": "^2.0.0", - "split2": "^1.0.0", - "through2": "^2.0.0" - } - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "pofile": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.0.11.tgz", - "integrity": "sha512-Vy9eH1dRD9wHjYt/QqXcTz+RnX/zg53xK+KljFSX30PvdDMb2z+c6uDUeblUGqqJgz3QFsdlA0IJvHziPmWtQg==", - "dev": true - }, - "popper.js": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.6.tgz", - "integrity": "sha512-AGwHGQBKumlk/MDfrSOf0JHhJCImdDMcGNoqKmKkU+68GFazv3CQ6q9r7Ja1sKDZmYWTckY/uLyEznheTDycnA==" - }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "dev": true, - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true, - "requires": { - "postcss": "^5.0.14" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "requires": { - "postcss": "^5.0.14" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "requires": { - "postcss": "^5.0.16" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", - "dev": true, - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true, - "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true, - "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", - "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "dev": true, - "requires": { - "postcss": "^5.0.5" - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dev": true, - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "dev": true, - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "dev": true, - "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } - }, - "postinstall-build": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postinstall-build/-/postinstall-build-5.0.1.tgz", - "integrity": "sha1-uRepB5smF42aJK9aXNjLSpkdEbk=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dev": true, - "requires": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" - }, - "dependencies": { - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" - } - }, - "proxy-agent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz", - "integrity": "sha1-V+tTR6qAXXTsaByyVknbo5yTNJk=", - "dev": true, - "requires": { - "agent-base": "2", - "debug": "2", - "extend": "3", - "http-proxy-agent": "1", - "https-proxy-agent": "1", - "lru-cache": "~2.6.5", - "pac-proxy-agent": "1", - "socks-proxy-agent": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "lru-cache": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", - "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=", - "dev": true - } - } - }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "puppeteer": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.8.0.tgz", - "integrity": "sha512-wJ7Fxs03l4dy/ZXQACUKBBobIuJaS4NHq44q7/QinpAXFMwJMJFEIPjzoksVzUhZxQe+RXnjXH69mg13yMh0BA==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.0", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^5.1.1" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - } - }, - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", - "dev": true - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", - "dev": true - }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - } - }, - "readline2": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", - "integrity": "sha1-mUQ7pug7gw7zBRv9fcJBqCco1Wg=", - "dev": true, - "requires": { - "mute-stream": "0.0.4", - "strip-ansi": "^2.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", - "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", - "dev": true - }, - "mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha1-qSGZYKbV1dBGWXruUSUsZlX3F34=", - "dev": true - }, - "strip-ansi": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", - "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", - "dev": true, - "requires": { - "ansi-regex": "^1.0.0" - } - } - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "reconnectingwebsocket": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/reconnectingwebsocket/-/reconnectingwebsocket-1.0.0.tgz", - "integrity": "sha1-C4Jbq7N7ZwRFxlqn0+2XgwAgVEQ=" - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "~0.1", - "htmlparser2": "~3.3.0", - "strip-ansi": "^3.0.0", - "utila": "~0.3" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" - }, - "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1" - } - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-pkg": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-0.1.0.tgz", - "integrity": "sha1-AsyZNBDik2livZcWahsHfalyVTE=", - "dev": true, - "requires": { - "resolve-from": "^2.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - } - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "rrule": { - "version": "git+https://git@github.com/jkbrzt/rrule.git#4ff63b2f8524fd6d5ba6e80db770953b5cd08a0c", - "from": "rrule@git+https://git@github.com/jkbrzt/rrule.git#4ff63b2f8524fd6d5ba6e80db770953b5cd08a0c" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rx": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", - "integrity": "sha1-Ia3H2A8CACr1Da6X/Z2/JIdV9WY=", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "select2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.5.tgz", - "integrity": "sha1-eqxQaSVhmFs007guxV4ib4lg1Ao=", - "requires": { - "almond": "~0.3.1", - "jquery-mousewheel": "~3.1.13" - } - }, - "selfsigned": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", - "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", - "dev": true, - "requires": { - "node-forge": "0.7.5" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", - "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", - "dev": true, - "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", - "dev": true, - "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - } - } - }, - "socks-proxy-agent": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz", - "integrity": "sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw==", - "dev": true, - "requires": { - "agent-base": "2", - "extend": "3", - "socks": "~1.1.5" - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", - "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", - "requires": { - "amdefine": ">=0.0.4" - } - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", - "dev": true, - "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", - "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", - "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", - "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.1.1.tgz", - "integrity": "sha1-Fi2bGIZfAqsvKtlYVSLbm1TEgfk=", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - }, - "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" - }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "dev": true, - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - } - } - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", - "dev": true - }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "tar-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", - "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.1.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.0", - "xtend": "^4.0.0" - } - }, - "tcp-port-used": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", - "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", - "dev": true, - "requires": { - "debug": "4.1.0", - "is2": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "test-exclude": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", - "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", - "dev": true - }, - "thunky": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", - "dev": true - }, - "time-grunt": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.4.0.tgz", - "integrity": "sha1-BiIT5mDJB+hvRAVWwB6mWXtxJCA=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "date-time": "^1.1.0", - "figures": "^1.0.0", - "hooker": "^0.2.3", - "number-is-nan": "^1.0.0", - "pretty-ms": "^2.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - } - } - }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", - "dev": true - }, - "time-zone": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz", - "integrity": "sha1-Sncotqwo2w4Aj1FAQ/1VW9VXO0Y=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timezone-js": { - "version": "github:ansible/timezone-js#6937de14ce0c193961538bb5b3b12b7ef62a358f", - "from": "github:ansible/timezone-js#0.4.14" - }, - "titlecase": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/titlecase/-/titlecase-1.1.2.tgz", - "integrity": "sha1-eBE9EQgIa4MmMxoyR96o9aSeqFM=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.4.tgz", - "integrity": "sha1-PTgyGCgjHkNPKHUUlZw3qCtin0I=", - "dev": true - }, - "typescript-eslint-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/typescript-eslint-parser/-/typescript-eslint-parser-3.0.0.tgz", - "integrity": "sha1-3QQ1swOryEFGTALQAYTXs5vUiLU=", - "dev": true, - "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "dev": true, - "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", - "dev": true, - "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", - "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", - "dev": true, - "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "webpack-dev-server": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", - "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", - "sockjs": "0.3.19", - "sockjs-client": "1.1.4", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "webpack-merge": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", - "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==", - "dev": true, - "requires": { - "lodash": "^4.17.5" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - }, - "dependencies": { - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "dev": true, - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } - }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, - "xmlbuilder": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", - "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - } - } - } - } -} diff --git a/awx/ui/package.json b/awx/ui/package.json deleted file mode 100644 index 698a7b5b6a..0000000000 --- a/awx/ui/package.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "name": "awx", - "version": "1.0.0", - "repository": { - "type": "git", - "url": "https://github.com/ansible/awx" - }, - "config": { - "django_port": "8043", - "django_host": "localhost" - }, - "engines": { - "node": "^8.11.2", - "npm": "^6.4.1" - }, - "scripts": { - "ui-docker-machine": "ip=$(docker-machine ip $DOCKER_MACHINE_NAME); npm set ansible-tower:django_host ${ip}; grunt dev;", - "ui-docker": "npm run watch;", - "build-devel": "npm run dev", - "pot": "grunt nggettext_extract", - "languages": "grunt nggettext_compile", - "build-release": "npm run production", - "pretest": "", - "test": "karma start test/spec/karma.spec.js", - "jshint": "grunt jshint:source --no-color", - "test:ci": "npm run test -- --single-run --reporter junit,dots --browsers=chromeHeadless", - "e2e": "./test/e2e/runner.js --config ./test/e2e/nightwatch.conf.js", - "headless-e2e": "./test/e2e/runner.js --config ./test/e2e/nightwatch.conf.js --env headless --suiteRetries=2", - "unit": "karma start test/unit/karma.unit.js", - "lint": "eslint .", - "dev": "webpack --config build/webpack.development.js --progress", - "watch": "webpack-dev-server --config build/webpack.watch.js --progress --https", - "production": "webpack --config build/webpack.production.js", - "grab-licenses": "./utils/get_licenses.js", - "pre-check": "npm run lint && npm run jshint && npm run unit && npm run test" - }, - "devDependencies": { - "angular-mocks": "^1.7.9", - "archiver": "^2.1.1", - "axios": "^0.16.2", - "babel-core": "^6.26.0", - "babel-istanbul": "^0.12.2", - "babel-loader": "^7.1.2", - "babel-plugin-istanbul": "^4.1.5", - "babel-preset-env": "^1.6.0", - "chromedriver": "^77.0.0", - "clean-webpack-plugin": "^0.1.16", - "copy-webpack-plugin": "^4.0.1", - "css-loader": "^0.28.5", - "eslint": "^4.6.1", - "eslint-config-airbnb-base": "^12.0.0", - "eslint-import-resolver-webpack": "^0.8.3", - "eslint-loader": "^1.9.0", - "eslint-plugin-disable": "^0.3.0", - "eslint-plugin-import": "^2.7.0", - "extract-text-webpack-plugin": "^3.0.0", - "grunt": "^1.0.4", - "grunt-angular-gettext": "^2.2.3", - "grunt-cli": "^1.2.0", - "grunt-concurrent": "^2.3.0", - "grunt-contrib-jshint": "^1.0.0", - "grunt-newer": "^1.2.0", - "hard-source-webpack-plugin": "^0.5.8", - "html-loader": "^0.5.1", - "html-webpack-harddisk-plugin": "^0.1.0", - "html-webpack-plugin": "^2.30.1", - "istanbul-instrumenter-loader": "^3.0.0", - "jasmine-core": "^2.5.2", - "jshint": "^2.10.2", - "jshint-stylish": "^2.2.0", - "json-loader": "^0.5.4", - "karma": "^1.4.1", - "karma-chrome-launcher": "^2.2.0", - "karma-coverage": "^1.1.1", - "karma-firefox-launcher": "^1.0.0", - "karma-html2js-preprocessor": "^1.0.0", - "karma-jasmine": "^1.1.0", - "karma-junit-reporter": "^1.2.0", - "karma-sourcemap-loader": "^0.3.7", - "karma-webpack": "^2.0.4", - "less": "^2.7.2", - "less-loader": "^4.0.5", - "less-plugin-autoprefix": "^1.4.2", - "load-grunt-configs": "^1.0.0", - "load-grunt-tasks": "^3.5.0", - "ngtemplate-loader": "^2.0.1", - "nightwatch": "^0.9.19", - "node-object-hash": "^1.3.0", - "nunjucks": "^3.1.2", - "puppeteer": "^1.8.0", - "time-grunt": "^1.4.0", - "uglifyjs-webpack-plugin": "^0.4.6", - "uuid": "^3.1.0", - "webpack": "^3.0.0", - "webpack-dev-server": "^2.7.1", - "webpack-merge": "^4.1.0" - }, - "dependencies": { - "@uirouter/angularjs": "1.0.18", - "angular": "^1.8.1", - "angular-breadcrumb": "git+https://git@github.com/ansible/angular-breadcrumb#0.4.1", - "angular-codemirror": "git+https://git@github.com/ansible/angular-codemirror.git#v1.2.1", - "angular-cookies": "^1.7.9", - "angular-drag-and-drop-lists": "git+https://git@github.com/ansible/angular-drag-and-drop-lists#v1.4.1", - "angular-duration-format": "^1.0.1", - "angular-gettext": "^2.3.5", - "angular-moment": "^1.3.0", - "angular-mousewheel": "^1.0.5", - "angular-sanitize": "^1.7.9", - "angular-scheduler": "git+https://git@github.com/ansible/angular-scheduler.git#v0.4.4", - "angular-tz-extensions": "git+https://git@github.com/ansible/angular-tz-extensions.git#v0.6.1", - "angular-xeditable": "~0.8.0", - "ansi-to-html": "^0.6.3", - "babel-polyfill": "^6.26.0", - "bootstrap": "^4.3.1", - "bootstrap-datepicker": "^1.8.0", - "codemirror": "^5.17.0", - "components-font-awesome": "^4.6.1", - "d3": "^3.5.4", - "dagre": "^0.8.2", - "hamsterjs": "^1.1.2", - "html-entities": "^1.2.1", - "inherits": "^1.0.2", - "javascript-detect-element-resize": "^0.5.3", - "jquery": "^3.5.1", - "jquery-ui": "^1.12.1", - "js-yaml": "^3.13.1", - "legacy-loader": "0.0.2", - "lodash": "^4.17.15", - "lr-infinite-scroll": "git+https://git@github.com/lorenzofox3/lrInfiniteScroll", - "moment": "^2.19.4", - "ng-toast": "git+https://git@github.com/ansible/ngToast.git#v2.2.1", - "nvd3": "^1.8.6", - "popper.js": "~1.14.4", - "reconnectingwebsocket": "^1.0.0", - "rrule": "git+https://git@github.com/jkbrzt/rrule#4ff63b2f8524fd6d5ba6e80db770953b5cd08a0c", - "select2": "^4.0.2", - "sprintf-js": "^1.0.3", - "timezone-js": "github:ansible/timezone-js#0.4.14", - "titlecase": "^1.1.2" - } -} diff --git a/awx/ui/po/ansible-tower-ui.pot b/awx/ui/po/ansible-tower-ui.pot deleted file mode 100644 index 5da8733512..0000000000 --- a/awx/ui/po/ansible-tower-ui.pot +++ /dev/null @@ -1,8031 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" - -#: client/src/projects/add/projects-add.controller.js:166 -#: client/src/projects/edit/projects-edit.controller.js:287 -msgid "%sNote:%s Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:145 -#: client/src/projects/edit/projects-edit.controller.js:266 -msgid "%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:62 -msgid "(HH24:MM:SS UTC)" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:57 -msgid "(HH24:MM:SS)" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:568 -msgid "(Limited to first 10)" -msgstr "" - -#: client/src/credentials/credentials.form.js:286 -msgid "(defaults to %s)" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -msgid "(seconds)" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:67 -msgid "100" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:61 -msgid "20" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:64 -msgid "50" -msgstr "" - -#: client/src/license/license.partial.html:193 -msgid "Automation analytics: This data is used to enhance future releases of the Tower Software and to provide Automation Analytics to Tower subscribers." -msgstr "" - -#: client/src/license/license.partial.html:171 -msgid "I agree to the End User License Agreement" -msgstr "" - -#: client/src/license/license.partial.html:187 -msgid "User analytics: This data is used to enhance future releases of the Tower Software and help streamline customer experience and success." -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:32 -msgid "" -"\n" -"
\n" -" You have been logged out. Please sign in.\n" -"
" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:19 -msgid "" -"

\n" -" Enter inventory variables using either JSON or YAML\n" -" syntax. Use the radio button to toggle between the two.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" View YAML examples at\n" -" \n" -" docs.ansible.com\n" -"

" -msgstr "" - -#: client/features/templates/templates.strings.js:65 -msgid "

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" -msgstr "" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:213 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:222 -msgid "A NEW WEBHOOK KEY WILL BE GENERATED ON SAVE" -msgstr "" - -#: client/src/projects/projects.form.js:138 -msgid "A refspec to fetch (passed to the Ansible git module). This parameter allows access to references via the branch field not otherwise available." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 -#: client/src/scheduler/scheduler.strings.js:22 -msgid "A schedule name is required." -msgstr "" - -#: client/src/users/add/users-add.controller.js:104 -msgid "A value is required" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:173 -msgid "A value is required." -msgstr "" - -#: client/src/about/about.route.js:10 -msgid "ABOUT" -msgstr "" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:18 -msgid "ACTION" -msgstr "" - -#: client/src/activity-stream/activity-detail.form.js:23 -msgid "ACTIVITY DETAIL" -msgstr "" - -#: client/src/activity-stream/activitystream.route.js:28 -#: client/src/activity-stream/streams.list.js:14 -#: client/src/activity-stream/streams.list.js:15 -msgid "ACTIVITY STREAM" -msgstr "" - -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:7 -msgid "ADD" -msgstr "" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:3 -msgid "ADD A NEW TEMPLATE" -msgstr "" - -#: client/features/templates/templates.strings.js:123 -msgid "ADD A NODE" -msgstr "" - -#: client/features/templates/templates.strings.js:141 -msgid "ADD LINK" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:16 -msgid "ADD SURVEY PROMPT" -msgstr "" - -#: client/src/shared/smart-search/smart-search.partial.html:48 -msgid "ADDITIONAL INFORMATION" -msgstr "" - -#: client/features/output/output.strings.js:101 -msgid "ADDITIONAL_INFORMATION" -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:241 -#: client/src/organizations/list/organizations-list.controller.js:90 -msgid "ADMINS" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:4 -msgid "ALL ACTIVITY" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:44 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js:47 -msgid "ALL GROUPS" -msgstr "" - -#: client/src/credentials/credentials.form.js:198 -msgid "API Key" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:247 -msgid "API Service/Integration Key" -msgstr "" - -#: client/src/notifications/shared/type-change.service.js:66 -msgid "API Token" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:40 -msgid "APPLICATION" -msgstr "" - -#: client/features/applications/applications.strings.js:23 -msgid "APPLICATION INFORMATION" -msgstr "" - -#: client/features/applications/applications.strings.js:28 -#: client/features/applications/applications.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:47 -msgid "APPLICATIONS" -msgstr "" - -#: client/lib/components/components.strings.js:126 -msgid "APPROVAL" -msgstr "" - -#: client/features/templates/templates.strings.js:155 -msgid "APPROVAL TIMED OUT" -msgstr "" - -#: client/lib/components/components.strings.js:128 -msgid "APPROVE" -msgstr "" - -#: client/features/templates/templates.strings.js:157 -msgid "APPROVED" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js:19 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js:19 -msgid "ASSOCIATED GROUPS" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js:19 -msgid "ASSOCIATED HOSTS" -msgstr "" - -#: client/lib/components/components.strings.js:89 -#: client/lib/components/layout/layout.partial.html:24 -msgid "About" -msgstr "" - -#: client/lib/components/components.strings.js:93 -msgid "Access" -msgstr "" - -#: client/src/credentials/credentials.form.js:91 -msgid "Access Key" -msgstr "" - -#: client/src/configuration/settings.service.js:40 -msgid "Access Token Expiration" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:225 -msgid "Account SID" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:184 -msgid "Account Token" -msgstr "" - -#: client/src/activity-stream/activity-detail.form.js:36 -msgid "Action" -msgstr "" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:21 -#: client/src/inventories-hosts/hosts/hosts.partial.html:49 -#: client/src/shared/form-generator.js:1872 -#: client/src/shared/list-generator/list-generator.factory.js:571 -msgid "Actions" -msgstr "" - -#: client/features/templates/templates.strings.js:18 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:18 -#: client/src/templates/templates.list.js:36 -msgid "Activity" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:84 -msgid "Activity Stream" -msgstr "" - -#: client/features/credentials/legacy.credentials.js:70 -#: client/src/credentials/credentials.form.js:446 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:113 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:110 -#: client/src/organizations/organizations.form.js:117 -#: client/src/organizations/organizations.form.js:159 -#: client/src/projects/projects.form.js:285 -#: client/src/teams/teams.form.js:169 -#: client/src/teams/teams.form.js:85 -#: client/src/templates/workflows.form.js:295 -#: client/src/users/users.form.js:221 -msgid "Add" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:74 -msgid "Add Container Group" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:75 -msgid "Add Credential" -msgstr "" - -#: client/src/credentials/credentials.list.js:14 -msgid "Add Credentials" -msgstr "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:13 -msgid "Add Inventories" -msgstr "" - -#: client/src/shared/stateDefinitions.factory.js:304 -msgid "Add Permissions" -msgstr "" - -#: client/src/projects/projects.list.js:13 -msgid "Add Project" -msgstr "" - -#: client/src/shared/form-generator.js:1664 -#: client/src/templates/job_templates/job-template.form.js:596 -#: client/src/templates/workflows.form.js:351 -msgid "Add Survey" -msgstr "" - -#: client/src/teams/teams.list.js:13 -msgid "Add Team" -msgstr "" - -#: client/src/teams/teams.form.js:86 -msgid "Add User" -msgstr "" - -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/shared/stateDefinitions.factory.js:594 -#: client/src/users/users.list.js:17 -msgid "Add Users" -msgstr "" - -#: client/src/organizations/organizations.form.js:118 -msgid "Add Users to this organization." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:58 -msgid "Add a group" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:135 -msgid "Add a host" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:44 -msgid "Add a new instance" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:25 -msgid "Add a new instance group" -msgstr "" - -#: client/src/organizations/list/organizations-list.partial.html:20 -msgid "Add a new organization" -msgstr "" - -#: client/features/projects/projects.strings.js:14 -msgid "Add a new project" -msgstr "" - -#: client/src/scheduler/schedules.list.js:81 -msgid "Add a new schedule" -msgstr "" - -#: client/features/templates/templates.strings.js:24 -msgid "Add a new template" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:43 -msgid "Add a new token" -msgstr "" - -#: client/features/credentials/legacy.credentials.js:71 -#: client/src/credentials/credentials.form.js:447 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:115 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:112 -#: client/src/organizations/organizations.form.js:160 -#: client/src/projects/projects.form.js:286 -#: client/src/templates/job_templates/job-template.form.js:541 -#: client/src/templates/workflows.form.js:296 -msgid "Add a permission" -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:63 -msgid "Add existing user to organization" -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:256 -msgid "Add existing user to organization as administrator" -msgstr "" - -#: client/src/shared/form-generator.js:1394 -msgid "Admin" -msgstr "" - -#: client/lib/components/components.strings.js:94 -msgid "Administration" -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:262 -msgid "Admins" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:376 -msgid "After every project update where the SCM revision changes, refresh the inventory from the selected source before executing job tasks. This is intended for static content, like the Ansible inventory .ini file format." -msgstr "" - -#: client/features/templates/templates.strings.js:160 -#: client/lib/components/components.strings.js:105 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:41 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:49 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:72 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:80 -msgid "All" -msgstr "" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 -msgid "All Activity" -msgstr "" - -#: client/features/portalMode/index.view.html:33 -msgid "All Jobs" -msgstr "" - -#: client/src/projects/projects.form.js:208 -#: client/src/projects/projects.form.js:211 -msgid "Allow branch override" -msgstr "" - -#: client/src/projects/projects.form.js:210 -msgid "Allow changing the SCM branch or revision in a job template that uses this project." -msgstr "" - -#: client/features/templates/templates.strings.js:114 -#: client/src/workflow-results/workflow-results.controller.js:97 -msgid "Always" -msgstr "" - -#: client/features/projects/projects.strings.js:25 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "An SCM update does not appear to be running for project:" -msgstr "" - -#: client/lib/services/base-string.service.js:83 -msgid "Ansible AWX Logo" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:66 -#: client/src/organizations/organizations.form.js:47 -#: client/src/organizations/organizations.form.js:52 -#: client/src/projects/projects.form.js:238 -#: client/src/projects/projects.form.js:243 -#: client/src/templates/job_templates/job-template.form.js:255 -#: client/src/templates/job_templates/job-template.form.js:261 -msgid "Ansible Environment" -msgstr "" - -#: client/src/projects/projects.form.js:145 -msgid "Ansible Tower Documentation" -msgstr "" - -#: client/lib/services/base-string.service.js:84 -msgid "Ansible Tower Logo" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:62 -#: client/src/templates/survey-maker/shared/question-definition.form.js:68 -msgid "Answer Type" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:44 -#: client/src/templates/survey-maker/shared/question-definition.form.js:53 -msgid "Answer Variable Name" -msgstr "" - -#: client/features/templates/templates.strings.js:161 -msgid "Any" -msgstr "" - -#: client/features/users/tokens/users-tokens-add.controller.js:15 -msgid "Application" -msgstr "" - -#: client/lib/components/components.strings.js:87 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 -msgid "Applications" -msgstr "" - -#: client/features/templates/templates.strings.js:153 -#: client/src/notifications/notifications.list.js:40 -msgid "Approval" -msgstr "" - -#: client/src/workflow-results/workflow-results.service.js:87 -msgid "Are you sure you want to cancel this workflow job?" -msgstr "" - -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:110 -msgid "Are you sure you want to delete this job?" -msgstr "" - -#: client/src/notifications/notification-templates-list/list.controller.js:233 -msgid "Are you sure you want to delete this notification template?" -msgstr "" - -#: client/src/scheduler/factories/delete-schedule.factory.js:58 -msgid "Are you sure you want to delete this schedule?" -msgstr "" - -#: client/src/teams/list/teams-list.controller.js:80 -msgid "Are you sure you want to delete this team?" -msgstr "" - -#: client/src/users/list/users-list.controller.js:93 -msgid "Are you sure you want to delete this user?" -msgstr "" - -#: client/features/templates/templates.strings.js:110 -msgid "Are you sure you want to delete this workflow node?" -msgstr "" - -#: client/src/workflow-results/workflow-results.service.js:42 -msgid "Are you sure you want to delete this workflow?" -msgstr "" - -#: client/lib/services/base-string.service.js:92 -msgid "Are you sure you want to delete this {{ resourceType }}?" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:13 -msgid "Are you sure you want to delete this {{deleteMode}}?" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:26 -msgid "Are you sure you want to disassociate the group below from" -msgstr "" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:24 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:27 -msgid "Are you sure you want to disassociate the host below from" -msgstr "" - -#: client/features/templates/templates.strings.js:149 -msgid "Are you sure you want to exit the Workflow Creator without saving your changes?" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:46 -msgid "Are you sure you want to permanently delete the group below from the inventory?" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:104 -msgid "Are you sure you want to permanently delete the host below from the inventory?" -msgstr "" - -#: client/src/projects/edit/projects-edit.controller.js:242 -msgid "Are you sure you want to remove the %s below from %s?" -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:67 -msgid "Are you sure you want to remove the following administrator from this organization?" -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:66 -msgid "Are you sure you want to remove the following user from this organization?" -msgstr "" - -#: client/lib/services/base-string.service.js:109 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:109 -msgid "Are you sure you want to submit the request to cancel this job?" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:39 -msgid "Arguments" -msgstr "" - -#: client/features/output/output.strings.js:59 -msgid "Artifacts" -msgstr "" - -#: client/src/credentials/credentials.form.js:232 -#: client/src/credentials/credentials.form.js:271 -#: client/src/credentials/credentials.form.js:310 -#: client/src/credentials/credentials.form.js:396 -msgid "Ask at runtime?" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:36 -msgid "Associate an existing Instance" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:74 -msgid "Associate an existing group" -msgstr "" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:56 -msgid "Associate this host with a new group" -msgstr "" - -#: client/src/shared/form-generator.js:1396 -msgid "Auditor" -msgstr "" - -#: client/lib/components/components.strings.js:95 -#: client/src/configuration/settings.partial.html:2 -msgid "Authentication" -msgstr "" - -#: client/src/credentials/credentials.form.js:72 -msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." -msgstr "" - -#: client/src/credentials/credentials.form.js:68 -msgid "Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts." -msgstr "" - -#: client/src/configuration/settings.service.js:48 -msgid "Authorization Code Expiration" -msgstr "" - -#: client/src/credentials/credentials.form.js:342 -msgid "Authorize" -msgstr "" - -#: client/src/credentials/credentials.form.js:350 -msgid "Authorize Password" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:91 -msgid "Azure AD" -msgstr "" - -#: client/src/shared/directives.js:91 -msgid "BROWSE" -msgstr "" - -#: client/features/output/output.strings.js:124 -msgid "Back to Top" -msgstr "" - -#: client/src/projects/projects.form.js:82 -msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." -msgstr "" - -#: client/src/notifications/shared/type-change.service.js:56 -msgid "Basic Auth Password" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:129 -msgid "Become Privilege Escalation" -msgstr "" - -#: client/features/output/output.strings.js:87 -msgid "Branch" -msgstr "" - -#: client/src/projects/projects.form.js:129 -msgid "Branch to checkout. In addition to branches, you can input tags, commit hashes, and arbitrary refs. Some commit hashes and refs may not be availble unless you also provide a custom refspec." -msgstr "" - -#: client/features/templates/templates.strings.js:72 -#: client/src/templates/job_templates/job-template.form.js:112 -msgid "Branch to use in job run. Project default used if blank." -msgstr "" - -#: client/src/license/license.partial.html:113 -msgid "Browse" -msgstr "" - -#: client/src/license/license.partial.html:180 -msgid "By default, Tower collects and transmits analytics data on Tower usage to Red Hat. There are two categories of data collected by Tower. For more information, see this Tower documentation page. Uncheck the following boxes to disable this feature." -msgstr "" - -#: client/features/templates/templates.strings.js:151 -#: client/lib/services/base-string.service.js:61 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:29 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:50 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:23 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:16 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:16 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:16 -#: client/src/license/license.partial.html:259 -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:17 -#: client/src/partials/survey-maker-modal.html:17 -#: client/src/partials/survey-maker-modal.html:82 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:17 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:131 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:180 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:69 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:149 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:188 -msgid "CANCEL" -msgstr "" - -#: client/index.template.ejs:116 -msgid "CAUTION: Setting both numerical variables to \"0\" will delete all facts." -msgstr "" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:30 -msgid "CHANGES" -msgstr "" - -#: client/features/templates/templates.strings.js:131 -msgid "CHECK" -msgstr "" - -#: client/lib/components/components.strings.js:20 -msgid "CHOOSE A FILE" -msgstr "" - -#: client/features/output/output.strings.js:103 -#: client/src/shared/smart-search/smart-search.partial.html:26 -msgid "CLEAR ALL" -msgstr "" - -#: client/features/applications/applications.strings.js:21 -msgid "CLIENT ID" -msgstr "" - -#: client/features/applications/applications.strings.js:22 -msgid "CLIENT SECRET" -msgstr "" - -#: client/lib/services/base-string.service.js:62 -#: client/lib/services/base-string.service.js:77 -#: client/src/partials/survey-maker-modal.html:83 -msgid "CLOSE" -msgstr "" - -#: client/features/jobs/routes/hostCompletedJobs.route.js:27 -#: client/features/jobs/routes/templateCompletedJobs.route.js:28 -#: client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js:28 -msgid "COMPLETED JOBS" -msgstr "" - -#: client/features/templates/templates.strings.js:35 -#: client/src/scheduler/scheduler.strings.js:68 -msgid "CONFIRM" -msgstr "" - -#: client/lib/services/base-string.service.js:75 -msgid "COPY" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:25 -msgid "COULD NOT CREATE TOKEN" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:54 -msgid "CPU" -msgstr "" - -#: client/src/shared/stateDefinitions.factory.js:161 -msgid "CREATE %s" -msgstr "" - -#: client/features/applications/applications.strings.js:9 -msgid "CREATE APPLICATION" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:13 -msgid "CREATE CONTAINER GROUP" -msgstr "" - -#: client/features/credentials/credentials.strings.js:8 -#: client/src/credentials/credentials.form.js:16 -msgid "CREATE CREDENTIAL" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:16 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:16 -msgid "CREATE GROUP" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:17 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:17 -#: client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:17 -msgid "CREATE HOST" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:12 -msgid "CREATE INSTANCE GROUP" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:8 -msgid "CREATE INVENTORY SOURCE" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js:9 -#: client/src/scheduler/scheduler.strings.js:8 -#: client/src/scheduler/schedules.route.js:161 -#: client/src/scheduler/schedules.route.js:242 -#: client/src/scheduler/schedules.route.js:73 -msgid "CREATE SCHEDULE" -msgstr "" - -#: client/src/management-jobs/scheduler/main.js:83 -msgid "CREATE SCHEDULED JOB" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:18 -msgid "CREATE SOURCE" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:18 -#: client/features/users/tokens/tokens.strings.js:9 -#: client/features/users/tokens/users-tokens-add.route.js:49 -msgid "CREATE TOKEN" -msgstr "" - -#: client/features/output/output.strings.js:128 -msgid "CREATED" -msgstr "" - -#: client/features/credentials/credentials.strings.js:31 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:150 -msgid "CREDENTIAL" -msgstr "" - -#: client/src/credential-types/credential-types.form.js:21 -msgid "CREDENTIAL TYPE" -msgstr "" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:61 -msgid "CREDENTIAL TYPE:" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:11 -#: client/src/credential-types/credential-types.list.js:12 -#: client/src/credential-types/main.js:44 -msgid "CREDENTIAL TYPES" -msgstr "" - -#: client/features/credentials/legacy.credentials.js:11 -#: client/src/activity-stream/get-target-title.factory.js:17 -#: client/src/credentials/credentials.list.js:15 -#: client/src/credentials/credentials.list.js:16 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:5 -msgid "CREDENTIALS" -msgstr "" - -#: client/features/credentials/credentials.strings.js:49 -msgid "CREDENTIALS PERMISSIONS" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:398 -#: client/src/projects/projects.form.js:231 -msgid "Cache Timeout" -msgstr "" - -#: client/src/projects/projects.form.js:220 -msgid "Cache Timeout%s (seconds)%s" -msgstr "" - -#: client/src/users/list/users-list.controller.js:85 -msgid "Call to %s failed. DELETE returned status:" -msgstr "" - -#: client/src/projects/edit/projects-edit.controller.js:236 -msgid "Call to %s failed. POST returned status:" -msgstr "" - -#: client/src/management-jobs/card/card.controller.js:29 -msgid "Call to %s failed. Return status: %d" -msgstr "" - -#: client/lib/services/base-string.service.js:116 -msgid "Call to {{ path }} failed. {{ action }} returned status: {{ status }}." -msgstr "" - -#: client/features/output/output.strings.js:18 -#: client/lib/services/base-string.service.js:108 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:187 -#: client/src/configuration/forms/settings-form.controller.js:473 -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:24 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:624 -#: client/src/scheduler/scheduler.strings.js:56 -#: client/src/shared/form-generator.js:1652 -#: client/src/shared/lookup/lookup-modal.partial.html:19 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:33 -#: client/src/workflow-results/workflow-results.controller.js:56 -msgid "Cancel" -msgstr "" - -#: client/features/output/output.strings.js:54 -#: client/lib/services/base-string.service.js:110 -msgid "Cancel Job" -msgstr "" - -#: client/features/projects/projects.strings.js:31 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Cancel Not Allowed" -msgstr "" - -#: client/src/workflow-results/workflow-results.service.js:84 -msgid "Cancel Workflow" -msgstr "" - -#: client/src/workflow-results/workflow-results.partial.html:39 -msgid "Cancel job" -msgstr "" - -#: client/src/license/license.strings.js:8 -msgid "Cancel license lookup" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:104 -msgid "Cancel sync process" -msgstr "" - -#: client/src/projects/projects.list.js:128 -msgid "Cancel the SCM update" -msgstr "" - -#: client/lib/services/base-string.service.js:122 -msgid "Cancel the {{resourceType}}" -msgstr "" - -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:34 -msgid "Cancel unsaved changes" -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:32 -msgid "Canceled. Click for details" -msgstr "" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Cannot find job." -msgstr "" - -#: client/src/shared/smart-search/smart-search.controller.js:167 -msgid "Cannot search running job" -msgstr "" - -#: client/src/instance-groups/instance-groups.list.js:22 -msgid "Capacity" -msgstr "" - -#: client/lib/services/base-string.service.js:154 -msgid "Capacity (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:155 -msgid "Capacity (Descending)" -msgstr "" - -#: client/src/projects/projects.form.js:84 -msgid "Change %s when deploying {{BRAND_NAME}} to change this location." -msgstr "" - -#: client/src/activity-stream/activity-detail.form.js:41 -msgid "Changes" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:432 -msgid "Channel" -msgstr "" - -#: client/features/templates/templates.strings.js:73 -msgid "Check" -msgstr "" - -#: client/src/shared/form-generator.js:1046 -msgid "Choose a %s" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:407 -#: client/src/templates/workflows.form.js:180 -msgid "Choose a Webhook Service" -msgstr "" - -#: client/features/templates/templates.strings.js:62 -msgid "Choose a job type" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:125 -msgid "Choose a playbook" -msgstr "" - -#: client/features/templates/templates.strings.js:63 -msgid "Choose a verbosity" -msgstr "" - -#: client/src/projects/projects.form.js:60 -msgid "Choose an SCM Type" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:64 -msgid "Choose an answer type" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:67 -msgid "Choose an answer type or format you want as the prompt for the user. Refer to the Ansible Tower Documentation for more additional information about each option." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:532 -msgid "Choose an email option" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:111 -msgid "Choose an inventory file" -msgstr "" - -#: client/src/shared/directives.js:92 -msgid "Choose file" -msgstr "" - -#: client/src/license/license.partial.html:104 -msgid "Choose your license file, agree to the End User License Agreement, and click submit." -msgstr "" - -#: client/src/projects/projects.form.js:176 -msgid "Clean" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:299 -msgid "Clear" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:64 -msgid "Click for details" -msgstr "" - -#: client/src/shared/list-generator/list-actions.partial.html:59 -#: client/src/shared/list-generator/list-actions.partial.html:66 -msgid "Click for help" -msgstr "" - -#: client/features/templates/templates.strings.js:15 -msgid "Click here to open the workflow visualizer" -msgstr "" - -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:477 -msgid "Click here to open the workflow visualizer." -msgstr "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new inventory." -msgstr "" - -#: client/src/teams/teams.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new team." -msgstr "" - -#: client/src/templates/templates.list.js:17 -msgid "Click on a row to select it, and click Finished when done. Use the %s button to create a new job template." -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Click the" -msgstr "" - -#: client/features/templates/templates.strings.js:128 -msgid "Click to edit link" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:13 -msgid "Click to edit schedule." -msgstr "" - -#: client/features/templates/templates.strings.js:129 -msgid "Click to view link" -msgstr "" - -#: client/src/credentials/credentials.form.js:320 -msgid "Client ID" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:258 -msgid "Client Identifier" -msgstr "" - -#: client/src/credentials/credentials.form.js:329 -msgid "Client Secret" -msgstr "" - -#: client/lib/components/code-mirror/modal/code-mirror-modal.partial.html:67 -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:92 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:618 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:7 -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:8 -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:11 -#: client/src/partials/survey-maker-modal.html:28 -#: client/src/partials/survey-maker-modal.html:7 -#: client/src/scheduler/scheduler.strings.js:55 -#: client/src/scheduler/schedulerForm.partial.html:7 -#: client/src/shared/form-generator.js:1656 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:8 -#: client/src/shared/lookup/lookup-modal.partial.html:9 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:10 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:11 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:61 -msgid "Close" -msgstr "" - -#: client/lib/components/components.strings.js:135 -msgid "Close Approvals" -msgstr "" - -#: client/features/output/output.strings.js:136 -msgid "Close host event modal" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:7 -msgid "Close variables modal" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:26 -msgid "Cloud source not configured." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "Cloud source not configured. Click" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:80 -#: client/src/credentials/factories/kind-change.factory.js:136 -msgid "CloudForms URL" -msgstr "" - -#: client/features/output/output.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:201 -msgid "Collapse Output" -msgstr "" - -#: client/lib/components/components.strings.js:120 -msgid "Compact" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:125 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:135 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:155 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:168 -#: client/src/templates/job_templates/job-template.form.js:573 -#: client/src/templates/workflows.form.js:328 -msgid "Completed Jobs" -msgstr "" - -#: client/src/management-jobs/card/card.partial.html:34 -#: client/src/management-jobs/card/card.partial.html:37 -msgid "Configure Notifications" -msgstr "" - -#: client/src/users/users.form.js:82 -msgid "Confirm Password" -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:480 -msgid "Confirm Reset" -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:489 -msgid "Confirm factory reset" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "Confirm the removal of the" -msgstr "" - -#: client/src/teams/teams.form.js:24 -#: client/src/users/users.form.js:25 -msgid "Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams." -msgstr "" - -#: client/features/output/output.strings.js:68 -#: client/src/instance-groups/instance-groups.strings.js:78 -msgid "Container Group" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:38 -msgid "Container Groups Help" -msgstr "" - -#: client/src/login/authenticationServices/timer.factory.js:136 -msgid "Continue" -msgstr "" - -#: client/lib/components/components.strings.js:130 -msgid "Continue workflow job?" -msgstr "" - -#: client/features/templates/templates.strings.js:61 -#: client/src/templates/job_templates/job-template.form.js:195 -msgid "Control the level of output ansible will produce as the playbook executes." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:296 -msgid "Control the level of output ansible will produce for inventory source update jobs." -msgstr "" - -#: client/features/templates/templates.strings.js:159 -msgid "Convergence" -msgstr "" - -#: client/lib/components/components.strings.js:54 -msgid "Copied to clipboard." -msgstr "" - -#: client/src/credentials/credentials.list.js:73 -#: client/src/inventories-hosts/inventories/inventory.list.js:109 -#: client/src/inventory-scripts/inventory-scripts.list.js:61 -#: client/src/notifications/notificationTemplates.list.js:87 -#: client/src/projects/projects.list.js:106 -#: client/src/templates/templates.list.js:93 -msgid "Copy" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:55 -msgid "Copy Inventory" -msgstr "" - -#: client/src/credentials/credentials.list.js:76 -msgid "Copy credential" -msgstr "" - -#: client/lib/components/components.strings.js:53 -msgid "Copy full revision to clipboard." -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.list.js:64 -msgid "Copy inventory script" -msgstr "" - -#: client/src/notifications/notificationTemplates.list.js:90 -msgid "Copy notification" -msgstr "" - -#: client/src/projects/projects.list.js:109 -msgid "Copy project" -msgstr "" - -#: client/src/templates/templates.list.js:96 -msgid "Copy template" -msgstr "" - -#: client/lib/services/base-string.service.js:120 -msgid "Copy {{resourceType}}" -msgstr "" - -#: client/src/about/about.partial.html:31 -msgid "" -"Copyright © 2019 Red Hat, Inc.
\n" -" Visit Ansible.com for more information.
" -msgstr "" - -#: client/lib/components/components.strings.js:90 -msgid "Copyright © 2019 Red Hat, Inc." -msgstr "" - -#: client/src/workflow-results/workflow-results.service.js:78 -msgid "Could not cancel workflow. Returned status:" -msgstr "" - -#: client/src/workflow-results/workflow-results.service.js:58 -msgid "Could not delete job. Returned status:" -msgstr "" - -#: client/src/users/users.list.js:44 -msgid "Create New" -msgstr "" - -#: client/features/applications/applications.strings.js:32 -msgid "Create a new Application" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:35 -msgid "Create a new Instance Group" -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:48 -msgid "Create a new Smart Inventory from search results.

Note: changing the organization of the Smart Inventory could change the hosts included in the Smart Inventory." -msgstr "" - -#: client/src/credentials/credentials.list.js:52 -msgid "Create a new credential" -msgstr "" - -#: client/src/credential-types/credential-types.list.js:42 -msgid "Create a new credential type" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.list.js:40 -msgid "Create a new custom inventory" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:75 -msgid "Create a new group" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:139 -msgid "Create a new host" -msgstr "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:80 -msgid "Create a new inventory" -msgstr "" - -#: client/src/notifications/notificationTemplates.list.js:57 -msgid "Create a new notification template" -msgstr "" - -#: client/src/organizations/list/organizations-list.partial.html:22 -msgid "Create a new organization" -msgstr "" - -#: client/src/projects/projects.list.js:81 -msgid "Create a new project" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:72 -msgid "Create a new source" -msgstr "" - -#: client/src/teams/teams.list.js:43 -msgid "Create a new team" -msgstr "" - -#: client/src/templates/templates.list.js:56 -msgid "Create a new template" -msgstr "" - -#: client/src/users/users.list.js:48 -msgid "Create a new user" -msgstr "" - -#: client/lib/services/base-string.service.js:128 -msgid "Created (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:129 -msgid "Created (Descending)" -msgstr "" - -#: client/features/output/output.strings.js:60 -#: client/features/templates/templates.strings.js:29 -#: client/src/instance-groups/container-groups/add-container-group.controller.js:24 -#: client/src/instance-groups/container-groups/edit-container-group.controller.js:38 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:73 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:73 -#: client/src/projects/add/projects-add.controller.js:140 -#: client/src/projects/add/projects-add.controller.js:153 -#: client/src/projects/add/projects-add.controller.js:162 -#: client/src/projects/add/projects-add.controller.js:174 -#: client/src/projects/add/projects-add.controller.js:189 -#: client/src/projects/edit/projects-edit.controller.js:263 -#: client/src/projects/edit/projects-edit.controller.js:274 -#: client/src/projects/edit/projects-edit.controller.js:283 -#: client/src/projects/edit/projects-edit.controller.js:295 -#: client/src/projects/edit/projects-edit.controller.js:310 -msgid "Credential" -msgstr "" - -#: client/features/templates/templates.strings.js:40 -msgid "Credential Type" -msgstr "" - -#: client/lib/components/components.strings.js:76 -#: client/lib/models/models.strings.js:12 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 -msgid "Credential Types" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:80 -msgid "Credential to authenticate with Kubernetes or OpenShift.  Must be of type \"Kubernetes/OpenShift API Bearer Token”." -msgstr "" - -#: client/features/jobs/jobs.strings.js:16 -#: client/features/templates/templates.strings.js:21 -#: client/lib/components/components.strings.js:75 -#: client/lib/models/models.strings.js:8 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:128 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:58 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 -#: client/src/templates/job_templates/job-template.form.js:140 -#: client/src/templates/job_templates/job-template.form.js:152 -msgid "Credentials" -msgstr "" - -#: client/features/templates/templates.strings.js:41 -msgid "Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:17 -msgid "Critical" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:12 -msgid "Critical Risk" -msgstr "" - -#: client/src/shared/directives.js:93 -msgid "Current Image:" -msgstr "" - -#: client/features/output/output.strings.js:40 -msgid "Currently following output as it arrives. Click to unfollow" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:130 -msgid "Custom Inventory Script" -msgstr "" - -#: client/lib/services/base-string.service.js:85 -msgid "Custom Logo" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 -msgid "Custom Script" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:79 -msgid "Customize Pod Spec" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:549 -msgid "Customize messages…" -msgstr "" - -#: client/src/home/home.route.js:16 -msgid "DASHBOARD" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:28 -#: client/lib/services/base-string.service.js:74 -#: client/src/credential-types/list/list.controller.js:110 -#: client/src/credentials/list/credentials-list.controller.js:155 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:160 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:51 -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:131 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:184 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:24 -#: client/src/inventory-scripts/list/list.controller.js:130 -#: client/src/notifications/notification-templates-list/list.controller.js:235 -#: client/src/organizations/edit/organizations-edit.controller.js:180 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:69 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:68 -#: client/src/organizations/list/organizations-list.controller.js:202 -#: client/src/partials/survey-maker-modal.html:18 -#: client/src/projects/edit/projects-edit.controller.js:244 -#: client/src/scheduler/factories/delete-schedule.factory.js:60 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -#: client/src/teams/list/teams-list.controller.js:82 -#: client/src/users/list/users-list.controller.js:95 -#: client/src/workflow-results/workflow-results.service.js:62 -msgid "DELETE" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:81 -msgid "DELETE SURVEY" -msgstr "" - -#: client/features/templates/templates.strings.js:133 -msgid "DELETED" -msgstr "" - -#: client/features/templates/templates.strings.js:158 -msgid "DENIED" -msgstr "" - -#: client/lib/components/components.strings.js:129 -msgid "DENY" -msgstr "" - -#: client/features/projects/projects.strings.js:9 -#: client/features/users/tokens/tokens.strings.js:36 -msgid "DESCRIPTION" -msgstr "" - -#: client/features/templates/templates.strings.js:135 -#: client/src/instance-groups/instance-groups.strings.js:29 -#: client/src/workflow-results/workflow-results.controller.js:83 -msgid "DETAILS" -msgstr "" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:32 -msgid "DISASSOCIATE" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:5 -msgid "DYNAMIC HOSTS" -msgstr "" - -#: client/lib/components/components.strings.js:70 -msgid "Dashboard" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:576 -#: client/src/scheduler/scheduler.strings.js:52 -msgid "Date format" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:170 -#: client/src/scheduler/scheduler.strings.js:64 -msgid "Days of data to keep" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:101 -msgid "Default" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:196 -#: client/src/templates/survey-maker/shared/question-definition.form.js:213 -#: client/src/templates/survey-maker/shared/question-definition.form.js:228 -#: client/src/templates/survey-maker/shared/question-definition.form.js:242 -#: client/src/templates/survey-maker/shared/question-definition.form.js:256 -#: client/src/templates/survey-maker/shared/question-definition.form.js:272 -msgid "Default Answer" -msgstr "" - -#: client/src/configuration/settings.partial.html:9 -msgid "Define system-level features and functions" -msgstr "" - -#: client/features/output/output.strings.js:20 -#: client/lib/services/base-string.service.js:89 -#: client/src/credential-types/credential-types.list.js:73 -#: client/src/credential-types/list/list.controller.js:106 -#: client/src/credentials/credentials.list.js:92 -#: client/src/credentials/list/credentials-list.controller.js:151 -#: client/src/inventories-hosts/inventories/inventory.list.js:125 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:156 -#: client/src/inventory-scripts/inventory-scripts.list.js:79 -#: client/src/inventory-scripts/list/list.controller.js:126 -#: client/src/notifications/notification-templates-list/list.controller.js:231 -#: client/src/notifications/notificationTemplates.list.js:105 -#: client/src/organizations/edit/organizations-edit.controller.js:177 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:66 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:65 -#: client/src/organizations/list/organizations-list.controller.js:198 -#: client/src/projects/edit/projects-edit.controller.js:241 -#: client/src/scheduler/schedules.list.js:108 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:37 -#: client/src/teams/list/teams-list.controller.js:78 -#: client/src/teams/teams.list.js:72 -#: client/src/templates/templates.list.js:109 -#: client/src/users/list/users-list.controller.js:91 -#: client/src/users/users.list.js:79 -#: client/src/workflow-results/workflow-results.controller.js:57 -msgid "Delete" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:6 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:6 -msgid "Delete Group" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:128 -msgid "Delete Host" -msgstr "" - -#: client/features/output/output.strings.js:55 -#: client/src/workflow-results/workflow-results.service.js:39 -msgid "Delete Job" -msgstr "" - -#: client/src/organizations/list/organizations-list.partial.html:73 -msgid "Delete Organization" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:23 -msgid "Delete Question" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:180 -msgid "Delete Source" -msgstr "" - -#: client/src/credentials/credentials.list.js:94 -msgid "Delete credential" -msgstr "" - -#: client/src/credential-types/credential-types.list.js:75 -msgid "Delete credential type" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:107 -#: client/src/inventories-hosts/inventory-hosts.strings.js:19 -msgid "Delete group" -msgid_plural "Delete groups" -msgstr[0] "" -msgstr[1] "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:116 -#: client/src/inventories-hosts/inventory-hosts.strings.js:21 -msgid "Delete host" -msgid_plural "Delete hosts" -msgstr[0] "" -msgstr[1] "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:127 -msgid "Delete inventory" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.list.js:81 -msgid "Delete inventory script" -msgstr "" - -#: client/src/workflow-results/workflow-results.partial.html:52 -msgid "Delete job" -msgstr "" - -#: client/src/notifications/notificationTemplates.list.js:107 -msgid "Delete notification" -msgstr "" - -#: client/src/projects/projects.form.js:186 -msgid "Delete on Update" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:26 -msgid "Delete or promote the group's children?" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:67 -msgid "Delete question" -msgstr "" - -#: client/src/scheduler/schedules.list.js:111 -msgid "Delete schedule" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:121 -msgid "Delete source" -msgstr "" - -#: client/src/teams/teams.list.js:76 -msgid "Delete team" -msgstr "" - -#: client/src/templates/templates.list.js:112 -msgid "Delete template" -msgstr "" - -#: client/src/projects/projects.form.js:188 -msgid "Delete the local repository in its entirety prior to performing an update." -msgstr "" - -#: client/src/projects/projects.list.js:122 -msgid "Delete the project" -msgstr "" - -#: client/src/scheduler/scheduled-jobs.list.js:86 -msgid "Delete the schedule" -msgstr "" - -#: client/lib/services/base-string.service.js:121 -msgid "Delete the {{resourceType}}" -msgstr "" - -#: client/src/users/users.list.js:83 -msgid "Delete user" -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:14 -msgid "Delete {{ group }} and {{ host }}" -msgstr "" - -#: client/lib/services/base-string.service.js:91 -msgid "Deleting this {{ resourceType }} will make the following resources unavailable." -msgstr "" - -#: client/src/projects/projects.form.js:188 -msgid "Depending on the size of the repository this may significantly increase the amount of time required to complete an update." -msgstr "" - -#: client/features/applications/add-applications.controller.js:36 -#: client/features/templates/templates.strings.js:17 -#: client/features/users/tokens/users-tokens-add.controller.js:26 -#: client/src/credential-types/credential-types.form.js:34 -#: client/src/credentials/credentials.form.js:39 -#: client/src/inventories-hosts/hosts/host.form.js:62 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:39 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:61 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:74 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:63 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:72 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:28 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:36 -#: client/src/inventory-scripts/inventory-scripts.form.js:35 -#: client/src/notifications/notificationTemplates.form.js:39 -#: client/src/organizations/organizations.form.js:33 -#: client/src/projects/projects.form.js:37 -#: client/src/teams/teams.form.js:35 -#: client/src/templates/job_templates/job-template.form.js:41 -#: client/src/templates/survey-maker/shared/question-definition.form.js:36 -#: client/src/templates/workflows.form.js:49 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:128 -#: client/src/users/users.form.js:147 -#: client/src/users/users.form.js:175 -msgid "Description" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:156 -#: client/src/notifications/notificationTemplates.form.js:160 -msgid "Destination Channels" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:507 -#: client/src/notifications/notificationTemplates.form.js:511 -msgid "Destination Channels or Users" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:209 -#: client/src/notifications/notificationTemplates.form.js:210 -msgid "Destination SMS Number" -msgstr "" - -#: client/features/applications/applications.strings.js:15 -#: client/features/credentials/credentials.strings.js:13 -#: client/features/output/output.strings.js:46 -#: client/features/users/tokens/tokens.strings.js:14 -#: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1431 -msgid "Details" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:325 -#: client/src/notifications/notificationTemplates.form.js:375 -#: client/src/notifications/notificationTemplates.form.js:446 -#: client/src/notifications/notificationTemplates.form.js:478 -msgid "Disable SSL Verification" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:21 -msgid "Disable Survey" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Disable survey" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Group From Group" -msgstr "" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:6 -msgid "Disassociate Host" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:6 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Host From Group" -msgstr "" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:70 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:103 -msgid "Disassociate group" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:104 -msgid "Disassociate host" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:54 -#: client/src/configuration/forms/settings-form.controller.js:446 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:52 -msgid "Discard changes" -msgstr "" - -#: client/src/teams/teams.form.js:161 -msgid "Dissassociate permission from team" -msgstr "" - -#: client/src/users/users.form.js:234 -msgid "Dissassociate permission from user" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:286 -msgid "Divide the work done by this job template into the specified number of job slices, each running the same tasks against a portion of the inventory." -msgstr "" - -#: client/src/credentials/credentials.form.js:383 -#: client/src/credentials/factories/become-method-change.factory.js:54 -#: client/src/credentials/factories/kind-change.factory.js:110 -msgid "Domain Name" -msgstr "" - -#: client/features/output/output.strings.js:21 -msgid "Download Output" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.form.js:59 -msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. Refer to the Ansible Tower documentation for example syntax." -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:24 -msgid "Drag to reorder question" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:74 -msgid "Drop question here to reorder" -msgstr "" - -#: client/features/applications/applications.strings.js:10 -msgid "EDIT APPLICATION" -msgstr "" - -#: client/features/credentials/credentials.strings.js:9 -msgid "EDIT CREDENTIAL" -msgstr "" - -#: client/features/templates/templates.strings.js:142 -msgid "EDIT LINK" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:9 -msgid "EDIT SCHEDULE" -msgstr "" - -#: client/src/management-jobs/scheduler/main.js:97 -msgid "EDIT SCHEDULED JOB" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:17 -msgid "EDIT SURVEY PROMPT" -msgstr "" - -#: client/features/templates/templates.strings.js:124 -msgid "EDIT TEMPLATE" -msgstr "" - -#: client/lib/components/components.strings.js:9 -msgid "ENCRYPTED" -msgstr "" - -#: client/features/output/output.strings.js:105 -msgid "EXAMPLES" -msgstr "" - -#: client/src/shared/smart-search/smart-search.partial.html:36 -msgid "EXAMPLES:" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:15 -msgid "EXECUTE COMMAND" -msgstr "" - -#: client/features/templates/templates.strings.js:150 -msgid "EXIT" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:12 -msgid "EXPAND" -msgstr "" - -#: client/features/applications/applications.strings.js:29 -#: client/features/users/tokens/tokens.strings.js:37 -msgid "EXPIRATION" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:24 -msgid "EXPIRES" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:10 -#: client/lib/components/code-mirror/code-mirror.strings.js:50 -msgid "EXTRA VARIABLES" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:365 -msgid "Each time a job runs using this inventory, refresh the inventory from the selected source before executing job tasks." -msgstr "" - -#: client/src/projects/projects.form.js:199 -msgid "Each time a job runs using this project, update the revision of the project prior to starting the job." -msgstr "" - -#: client/src/credential-types/credential-types.list.js:56 -#: client/src/credentials/credentials.list.js:66 -#: client/src/inventories-hosts/inventories/inventory.list.js:102 -#: client/src/inventory-scripts/inventory-scripts.list.js:54 -#: client/src/notifications/notificationTemplates.list.js:71 -#: client/src/notifications/notificationTemplates.list.js:80 -#: client/src/scheduler/schedules.list.js:93 -#: client/src/teams/teams.list.js:55 -#: client/src/templates/templates.list.js:80 -#: client/src/users/users.list.js:60 -msgid "Edit" -msgstr "" - -#: client/src/organizations/list/organizations-list.partial.html:55 -msgid "Edit Organization" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:22 -msgid "Edit Question" -msgstr "" - -#: client/src/shared/form-generator.js:1668 -#: client/src/templates/job_templates/job-template.form.js:602 -#: client/src/templates/workflows.form.js:357 -msgid "Edit Survey" -msgstr "" - -#: client/src/credentials/credentials.list.js:68 -msgid "Edit credential" -msgstr "" - -#: client/src/credential-types/credential-types.list.js:58 -msgid "Edit credential type" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:91 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:85 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:89 -msgid "Edit group" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.list.js:89 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:95 -#: client/src/inventories-hosts/inventory-hosts.strings.js:25 -msgid "Edit host" -msgstr "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:104 -msgid "Edit inventory" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.list.js:56 -msgid "Edit inventory script" -msgstr "" - -#: client/src/notifications/notificationTemplates.list.js:73 -msgid "Edit notification" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:64 -msgid "Edit question" -msgstr "" - -#: client/src/scheduler/schedules.list.js:96 -msgid "Edit schedule" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:87 -msgid "Edit source" -msgstr "" - -#: client/src/teams/teams.list.js:59 -msgid "Edit team" -msgstr "" - -#: client/src/templates/templates.list.js:82 -msgid "Edit template" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:62 -msgid "Edit the inventory" -msgstr "" - -#: client/src/projects/projects.list.js:93 -msgid "Edit the project" -msgstr "" - -#: client/src/scheduler/scheduled-jobs.list.js:72 -#: client/src/workflow-results/workflow-results.controller.js:61 -msgid "Edit the schedule" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:60 -msgid "Edit the slice job template" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:58 -msgid "Edit the user" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:59 -msgid "Edit the workflow job template" -msgstr "" - -#: client/src/users/users.list.js:64 -msgid "Edit user" -msgstr "" - -#: client/features/projects/projects.strings.js:24 -msgid "Either you do not have access or the SCM update process completed" -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Either you do not have access or the SCM update process completed. Click the" -msgstr "" - -#: client/features/output/output.strings.js:116 -#: client/src/workflow-results/workflow-results.controller.js:92 -msgid "Elapsed" -msgstr "" - -#: client/src/credentials/credentials.form.js:191 -#: client/src/users/users.form.js:52 -msgid "Email" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:530 -#: client/src/notifications/notificationTemplates.form.js:531 -msgid "Email Options" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:353 -#: client/src/templates/job_templates/job-template.form.js:358 -#: client/src/templates/workflows.form.js:157 -#: client/src/templates/workflows.form.js:162 -msgid "Enable Concurrent Jobs" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:31 -msgid "Enable External Logging" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:363 -#: client/src/templates/job_templates/job-template.form.js:368 -msgid "Enable Fact Cache" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:326 -msgid "Enable Privilege Escalation" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:331 -#: client/src/templates/job_templates/job-template.form.js:338 -msgid "Enable Provisioning Callbacks" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:343 -#: client/src/templates/job_templates/job-template.form.js:348 -#: client/src/templates/workflows.form.js:167 -#: client/src/templates/workflows.form.js:172 -msgid "Enable Webhook" -msgstr "" - -#: client/src/configuration/settings.partial.html:3 -msgid "Enable simplified login for your Tower applications" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Enable survey" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:346 -msgid "Enable webhook for this job template." -msgstr "" - -#: client/src/templates/workflows.form.js:170 -msgid "Enable webhook for this workflow job template." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:324 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:326 -msgid "Enabled Value" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:314 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:316 -msgid "Enabled Variable" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:335 -msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact {{BRAND_NAME}} and request a configuration update using this job template." -msgstr "" - -#: client/src/credentials/factories/credential-form-save.factory.js:73 -msgid "Encrypted credentials are not supported." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:487 -#: client/src/scheduler/scheduler.strings.js:44 -msgid "End" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:532 -#: client/src/scheduler/scheduler.strings.js:46 -msgid "End Date" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:48 -msgid "End Time" -msgstr "" - -#: client/src/license/license.partial.html:163 -msgid "End User License Agreement" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:72 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:71 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:73 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:68 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:227 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:261 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:74 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:319 -msgid "Enter one Annotation Tag per line, without commas." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:510 -msgid "Enter one IRC channel or username per line. The pound symbol (#) for channels, and the at (@) symbol for users, are not required." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:159 -msgid "Enter one Slack channel per line. The pound symbol (#) is required for channels." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:97 -msgid "Enter one email address per line to create a recipient list for this type of notification." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:213 -msgid "Enter one phone number per line to specify where to route SMS messages." -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:81 -#: client/src/credentials/factories/kind-change.factory.js:137 -msgid "Enter the URL for the virtual machine which %scorresponds to your CloudForms instance. %sFor example, %s" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:71 -#: client/src/credentials/factories/kind-change.factory.js:127 -msgid "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor example, %s" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:49 -#: client/src/credentials/factories/kind-change.factory.js:105 -msgid "Enter the hostname or IP address which corresponds to your VMware vCenter." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:199 -msgid "Enter the number associated with the \"Messaging Service\" in Twilio in the format +18005550199." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:156 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:180 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:204 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:279 -msgid "Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "" - -#: client/features/output/output.strings.js:61 -msgid "Environment" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:146 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:153 -msgid "Environment Variables" -msgstr "" - -#: client/src/license/license.controller.js:232 -msgid "Error Applying License" -msgstr "" - -#: client/features/output/output.strings.js:89 -msgid "Error Details" -msgstr "" - -#: client/src/license/license.controller.js:166 -msgid "Error Fetching Licenses" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:615 -msgid "Error Message" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:626 -msgid "Error Message Body" -msgstr "" - -#: client/lib/services/base-string.service.js:115 -#: client/src/app.js:228 -#: client/src/configuration/forms/settings-form.controller.js:285 -#: client/src/configuration/forms/settings-form.controller.js:429 -#: client/src/configuration/forms/settings-form.controller.js:554 -#: client/src/configuration/forms/settings-form.controller.js:614 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:234 -#: client/src/credentials/factories/credential-form-save.factory.js:77 -#: client/src/credentials/factories/credential-form-save.factory.js:93 -#: client/src/home/home.controller.js:104 -#: client/src/home/home.controller.js:223 -#: client/src/home/home.controller.js:233 -#: client/src/home/home.controller.js:242 -#: client/src/home/home.controller.js:29 -#: client/src/home/home.controller.js:43 -#: client/src/home/home.controller.js:78 -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:34 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:37 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:47 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:116 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:126 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:153 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:203 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:222 -#: client/src/login/loginModal/loginModal.controller.js:144 -#: client/src/management-jobs/card/card.controller.js:122 -#: client/src/management-jobs/card/card.controller.js:28 -#: client/src/management-jobs/card/card.controller.js:58 -#: client/src/organizations/main.js:155 -#: client/src/organizations/main.js:168 -#: client/src/organizations/main.js:183 -#: client/src/projects/add/projects-add.controller.js:120 -#: client/src/projects/edit/projects-edit.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:220 -#: client/src/projects/edit/projects-edit.controller.js:236 -#: client/src/projects/main.js:121 -#: client/src/shared/stateDefinitions.factory.js:230 -#: client/src/templates/main.js:102 -#: client/src/templates/main.js:116 -#: client/src/templates/main.js:132 -#: client/src/templates/main.js:143 -#: client/src/templates/main.js:177 -#: client/src/templates/main.js:194 -#: client/src/templates/main.js:219 -#: client/src/templates/main.js:245 -#: client/src/templates/main.js:257 -#: client/src/templates/main.js:270 -#: client/src/templates/main.js:281 -#: client/src/templates/main.js:295 -#: client/src/templates/main.js:312 -#: client/src/templates/main.js:341 -#: client/src/templates/main.js:355 -#: client/src/templates/main.js:371 -#: client/src/templates/main.js:409 -#: client/src/templates/main.js:423 -#: client/src/templates/main.js:436 -#: client/src/templates/main.js:449 -#: client/src/templates/main.js:473 -#: client/src/templates/main.js:490 -#: client/src/templates/main.js:71 -#: client/src/templates/main.js:88 -#: client/src/users/add/users-add.controller.js:101 -#: client/src/users/edit/users-edit.controller.js:171 -#: client/src/users/list/users-list.controller.js:84 -#: client/src/workflow-results/workflow-results.service.js:57 -#: client/src/workflow-results/workflow-results.service.js:77 -#: client/src/workflow-results/workflow-results.service.js:99 -msgid "Error!" -msgstr "" - -#: client/src/activity-stream/streams.list.js:40 -msgid "Event" -msgstr "" - -#: client/src/activity-stream/factories/build-description.factory.js:157 -msgid "Event summary not available" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:190 -#: client/src/scheduler/scheduler.strings.js:29 -msgid "Every" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:142 -#: client/src/projects/edit/projects-edit.controller.js:264 -msgid "Example URLs for GIT SCM include:" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:163 -#: client/src/projects/edit/projects-edit.controller.js:284 -msgid "Example URLs for Mercurial SCM include:" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:175 -#: client/src/projects/edit/projects-edit.controller.js:296 -msgid "Example URLs for Remote Archive SCM include:" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:275 -msgid "Example URLs for Subversion SCM include:" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Example: ansible_facts.ansible_distribution:\"RedHat\"" -msgstr "" - -#: client/src/projects/projects.form.js:140 -msgid "Examples include:" -msgstr "" - -#: client/features/output/output.strings.js:62 -msgid "Execution Node" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:65 -msgid "Existing Group" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:142 -msgid "Existing Host" -msgstr "" - -#: client/features/output/output.strings.js:23 -#: client/src/workflow-results/workflow-results.controller.js:203 -#: client/src/workflow-results/workflow-results.controller.js:64 -msgid "Expand Output" -msgstr "" - -#: client/lib/components/components.strings.js:121 -msgid "Expanded" -msgstr "" - -#: client/src/license/license.partial.html:246 -msgid "Expires" -msgstr "" - -#: client/lib/services/base-string.service.js:132 -msgid "Expires (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:133 -msgid "Expires (Descending)" -msgstr "" - -#: client/src/license/license.partial.html:39 -msgid "Expires On" -msgstr "" - -#: client/lib/components/components.strings.js:133 -msgid "Expires:" -msgstr "" - -#: client/lib/components/components.strings.js:134 -msgid "Expires: Never" -msgstr "" - -#: client/features/output/output.strings.js:71 -#: client/src/workflow-results/workflow-results.controller.js:76 -msgid "Explanation" -msgstr "" - -#: client/features/output/output.strings.js:63 -#: client/features/templates/templates.strings.js:64 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:133 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:145 -#: client/src/partials/logviewer.html:8 -#: client/src/scheduler/scheduler.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:480 -#: client/src/templates/job_templates/job-template.form.js:487 -#: client/src/templates/workflows.form.js:136 -#: client/src/templates/workflows.form.js:143 -#: client/src/workflow-results/workflow-results.controller.js:180 -msgid "Extra Variables" -msgstr "" - -#: client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js:7 -msgid "FACTS" -msgstr "" - -#: client/features/output/output.strings.js:141 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:59 -msgid "FAILED" -msgstr "" - -#: client/features/output/output.strings.js:106 -msgid "FIELDS" -msgstr "" - -#: client/src/shared/smart-search/smart-search.partial.html:42 -msgid "FIELDS:" -msgstr "" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "FINISHED" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:103 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:105 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:114 -msgid "Facts" -msgstr "" - -#: client/lib/components/components.strings.js:106 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:86 -msgid "Failed" -msgstr "" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:44 -msgid "Failed Hosts" -msgstr "" - -#: client/src/projects/factories/get-project-path.factory.js:68 -msgid "Failed to access API config. GET status:" -msgstr "" - -#: client/src/users/add/users-add.controller.js:101 -msgid "Failed to add new user. POST returned status:" -msgstr "" - -#: client/src/credentials/factories/credential-form-save.factory.js:78 -msgid "Failed to create new Credential. POST status:" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:121 -msgid "Failed to create new project. POST returned status:" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:35 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:48 -#: client/src/templates/main.js:144 -#: client/src/templates/main.js:282 -msgid "Failed to get config. GET returned status:" -msgstr "" - -#: client/src/home/home.controller.js:43 -msgid "Failed to get dashboard graph data:" -msgstr "" - -#: client/src/home/home.controller.js:29 -msgid "Failed to get dashboard host graph data:" -msgstr "" - -#: client/src/home/home.controller.js:242 -msgid "Failed to get dashboard job templates list:" -msgstr "" - -#: client/src/home/home.controller.js:233 -msgid "Failed to get dashboard jobs list:" -msgstr "" - -#: client/src/home/home.controller.js:223 -msgid "Failed to get dashboard:" -msgstr "" - -#: client/src/templates/main.js:246 -msgid "Failed to get instance groups. GET returned status:" -msgstr "" - -#: client/src/templates/main.js:342 -#: client/src/templates/main.js:410 -#: client/src/templates/main.js:72 -msgid "Failed to get inventory info. GET returned status:" -msgstr "" - -#: client/src/templates/main.js:133 -msgid "Failed to get job template options. OPTIONS returned status:" -msgstr "" - -#: client/src/templates/main.js:178 -msgid "Failed to get job template. GET returned status:" -msgstr "" - -#: client/src/templates/main.js:117 -#: client/src/templates/main.js:258 -#: client/src/templates/main.js:356 -#: client/src/templates/main.js:424 -msgid "Failed to get labels. GET returned status:" -msgstr "" - -#: client/src/home/home.controller.js:79 -msgid "Failed to get new jobs for dashboard:" -msgstr "" - -#: client/src/home/home.controller.js:105 -msgid "Failed to get new templates for dashboard:" -msgstr "" - -#: client/src/organizations/main.js:184 -msgid "Failed to get organizations for which this user is a notification admin. GET returned" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:38 -#: client/src/projects/main.js:122 -#: client/src/templates/main.js:296 -#: client/src/templates/main.js:474 -msgid "Failed to get organizations for which this user is a notification administrator. GET returned" -msgstr "" - -#: client/src/templates/main.js:103 -#: client/src/templates/main.js:89 -msgid "Failed to get project info. GET returned status:" -msgstr "" - -#: client/src/templates/main.js:195 -#: client/src/templates/main.js:220 -msgid "Failed to get project. GET returned status:" -msgstr "" - -#: client/src/templates/main.js:313 -#: client/src/templates/main.js:491 -msgid "Failed to get webhook key GET returned" -msgstr "" - -#: client/src/templates/main.js:271 -#: client/src/templates/main.js:437 -msgid "Failed to get workflow job template labels. GET returned status:" -msgstr "" - -#: client/src/templates/main.js:372 -msgid "Failed to get workflow job template options. OPTIONS returned status:" -msgstr "" - -#: client/src/templates/main.js:450 -msgid "Failed to get workflow job template. GET returned status:" -msgstr "" - -#: client/src/app.js:229 -#: client/src/login/loginModal/loginModal.controller.js:145 -msgid "Failed to get workflow jobs pending approval. GET returned status:" -msgstr "" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:223 -msgid "Failed to retrieve job template extra variables." -msgstr "" - -#: client/src/projects/edit/projects-edit.controller.js:155 -msgid "Failed to retrieve project: %s. GET status:" -msgstr "" - -#: client/src/users/edit/users-edit.controller.js:172 -msgid "Failed to retrieve user: %s. GET status:" -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:430 -msgid "Failed to save settings. Returned status:" -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:555 -msgid "Failed to save toggle settings. Returned status:" -msgstr "" - -#: client/src/credentials/factories/credential-form-save.factory.js:94 -msgid "Failed to update Credential. PUT status:" -msgstr "" - -#: client/src/projects/edit/projects-edit.controller.js:220 -msgid "Failed to update project: %s. PUT status:" -msgstr "" - -#: client/features/output/output.strings.js:110 -msgid "Failed to update search results." -msgstr "" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:204 -#: client/src/management-jobs/card/card.controller.js:123 -#: client/src/management-jobs/card/card.controller.js:59 -msgid "Failed updating job %s with variables. POST returned: %d" -msgstr "" - -#: client/src/organizations/main.js:156 -msgid "Failed while checking to see if user is a notification administrator of this organization. GET returned" -msgstr "" - -#: client/src/organizations/main.js:169 -msgid "Failed while checking to see if user is an administrator of this organization. GET returned" -msgstr "" - -#: client/src/notifications/notifications.list.js:77 -msgid "Failure" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:81 -msgid "Field for passing a custom Kubernetes or OpenShift Pod specification." -msgstr "" - -#: client/src/scheduler/schedules.list.js:63 -msgid "Final Run" -msgstr "" - -#: client/lib/services/base-string.service.js:142 -msgid "Finish Time (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:143 -msgid "Finish Time (Descending)" -msgstr "" - -#: client/features/jobs/jobs.strings.js:10 -#: client/features/output/output.strings.js:52 -#: client/features/output/output.strings.js:64 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:56 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:44 -#: client/src/workflow-results/workflow-results.controller.js:72 -msgid "Finished" -msgstr "" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 -#: client/src/teams/teams.form.js:101 -#: client/src/users/users.form.js:29 -#: client/src/users/users.list.js:33 -msgid "First Name" -msgstr "" - -#: client/src/scheduler/schedules.list.js:53 -msgid "First Run" -msgstr "" - -#: client/src/organizations/organizations.form.js:133 -msgid "First name" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:19 -msgid "Float" -msgstr "" - -#: client/features/output/output.strings.js:102 -#: client/src/shared/smart-search/smart-search.partial.html:49 -msgid "For additional information on advanced search syntax please see the Ansible Tower" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:63 -#: client/src/credentials/factories/kind-change.factory.js:119 -msgid "For example, %s" -msgstr "" - -#: client/index.template.ejs:113 -msgid "For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept." -msgstr "" - -#: client/src/inventories-hosts/hosts/host.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:34 -msgid "For hosts that are part of an external inventory, this flag may be reset by the inventory sync process." -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:32 -#: client/src/inventories-hosts/inventory-hosts.strings.js:33 -msgid "For hosts that are part of an external inventory, this may be reset by the inventory sync process." -msgstr "" - -#: client/features/templates/templates.strings.js:59 -#: client/src/templates/job_templates/job-template.form.js:54 -msgid "For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook." -msgstr "" - -#: client/src/projects/projects.form.js:145 -msgid "For more information, refer to the" -msgstr "" - -#: client/features/output/output.strings.js:65 -#: client/src/instance-groups/instance-groups.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:110 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:97 -#: client/src/templates/job_templates/job-template.form.js:162 -#: client/src/templates/job_templates/job-template.form.js:168 -msgid "Forks" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:179 -#: client/src/scheduler/scheduler.strings.js:28 -msgid "Frequency Details" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:454 -#: client/src/scheduler/scheduler.strings.js:41 -msgid "Fri" -msgstr "" - -#: client/src/license/license.partial.html:150 -msgid "GET LICENSES" -msgstr "" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "GO TO NOTIFICATIONS TO" -msgstr "" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js:45 -msgid "GROUPS" -msgstr "" - -#: client/src/organizations/organizations.form.js:59 -#: client/src/organizations/organizations.form.js:62 -msgid "Galaxy Credentials" -msgstr "" - -#: client/src/shared/form-generator.js:801 -msgid "Generate field" -msgstr "" - -#: client/features/projects/projects.strings.js:18 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:28 -#: client/src/projects/edit/projects-edit.controller.js:119 -msgid "Get latest SCM revision" -msgstr "" - -#: client/features/output/output.strings.js:37 -msgid "Get next page" -msgstr "" - -#: client/features/output/output.strings.js:38 -msgid "Get previous page" -msgstr "" - -#: client/src/credential-types/add/add.controller.js:41 -msgid "Getting Started with Credential Types" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:92 -msgid "GitHub" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:110 -msgid "GitHub (Default)" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:31 -msgid "GitHub Category" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:111 -msgid "GitHub Org" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:112 -msgid "GitHub Team" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:18 -msgid "Go to current page of list" -msgstr "" - -#: client/features/output/output.strings.js:36 -msgid "Go to first page" -msgstr "" - -#: client/features/output/output.strings.js:39 -msgid "Go to last page of available output" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:28 -msgid "Go to last page of list" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:22 -msgid "Go to next page of list" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:6 -msgid "Go to page 1 of list" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:12 -msgid "Go to previous page of list" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:93 -msgid "Google OAuth2" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:284 -msgid "Grafana API Key" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:269 -msgid "Grafana URL" -msgstr "" - -#: client/src/teams/teams.form.js:170 -#: client/src/users/users.form.js:222 -msgid "Grant Permission" -msgstr "" - -#: client/src/notifications/add/add.controller.js:84 -#: client/src/notifications/edit/edit.controller.js:147 -msgid "Gray" -msgstr "" - -#: client/src/notifications/add/add.controller.js:85 -#: client/src/notifications/edit/edit.controller.js:148 -msgid "Green" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:51 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:52 -msgid "Group Variables" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:111 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:89 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:23 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:88 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:22 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:113 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:122 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:38 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:145 -msgid "Groups" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:61 -msgid "HH24" -msgstr "" - -#: client/lib/services/base-string.service.js:69 -#: client/src/templates/survey-maker/surveys/init.factory.js:499 -msgid "HIDE" -msgstr "" - -#: client/lib/components/components.strings.js:44 -msgid "HINT: Drag and drop private file on the field below." -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:41 -#: client/src/inventories-hosts/hosts/hosts.partial.html:9 -#: client/src/inventories-hosts/hosts/main.js:81 -#: client/src/inventories-hosts/inventories/inventories.partial.html:15 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.route.js:18 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js:17 -msgid "HOSTS" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:382 -#: client/src/notifications/notificationTemplates.form.js:383 -msgid "HTTP Headers" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:399 -#: client/src/notifications/notificationTemplates.form.js:400 -msgid "HTTP Method" -msgstr "" - -#: client/lib/components/components.strings.js:12 -msgid "Hide" -msgstr "" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "Hide Activity Stream" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:23 -msgid "High" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:13 -msgid "High Risk" -msgstr "" - -#: client/src/credentials/credentials.form.js:139 -#: client/src/notifications/notificationTemplates.form.js:83 -msgid "Host" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:52 -#: client/src/credentials/factories/kind-change.factory.js:108 -msgid "Host (Authentication URL)" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:387 -#: client/src/templates/job_templates/job-template.form.js:396 -msgid "Host Config Key" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:39 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:39 -msgid "Host Enabled" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:304 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:306 -msgid "Host Filter" -msgstr "" - -#: client/features/output/output.strings.js:66 -msgid "Host Limit Error" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:45 -#: client/src/inventories-hosts/hosts/host.form.js:56 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:44 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:55 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:46 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:57 -msgid "Host Name" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:78 -msgid "Host Variables" -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is available" -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is available. Click to toggle." -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is not available" -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is not available. Click to toggle." -msgstr "" - -#: client/features/output/output.strings.js:13 -msgid "Host status information for this job is unavailable." -msgstr "" - -#: client/features/output/output.strings.js:119 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:39 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:98 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:64 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:149 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:155 -msgid "Hosts" -msgstr "" - -#: client/src/license/license.partial.html:52 -#: client/src/license/license.partial.html:58 -msgid "Hosts Available" -msgstr "" - -#: client/src/license/license.partial.html:68 -msgid "Hosts Remaining" -msgstr "" - -#: client/src/license/license.partial.html:62 -msgid "Hosts Used" -msgstr "" - -#: client/features/output/output.strings.js:129 -msgid "ID" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:297 -msgid "ID of the Dashboard (optional)" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:305 -msgid "ID of the Panel (optional)" -msgstr "" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:14 -msgid "INITIATED BY" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.route.js:7 -msgid "INSIGHTS" -msgstr "" - -#: client/src/instance-groups/instance-groups.list.js:6 -#: client/src/instance-groups/instance-groups.list.js:7 -#: client/src/instance-groups/instance-groups.strings.js:10 -#: client/src/instance-groups/instance-groups.strings.js:19 -msgid "INSTANCE GROUPS" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:11 -#: client/src/instance-groups/instance-groups.strings.js:30 -msgid "INSTANCES" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:14 -#: client/src/inventories-hosts/hosts/hosts.partial.html:8 -#: client/src/inventories-hosts/inventories/inventories.partial.html:14 -#: client/src/inventories-hosts/inventories/inventories.route.js:8 -#: client/src/inventories-hosts/inventories/inventory.list.js:14 -#: client/src/inventories-hosts/inventories/inventory.list.js:15 -#: client/src/organizations/linkout/organizations-linkout.route.js:138 -#: client/src/organizations/list/organizations-list.controller.js:69 -msgid "INVENTORIES" -msgstr "" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:138 -msgid "INVENTORY" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.form.js:23 -msgid "INVENTORY SCRIPT" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:35 -#: client/src/inventory-scripts/inventory-scripts.list.js:12 -#: client/src/inventory-scripts/main.js:65 -msgid "INVENTORY SCRIPTS" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:496 -msgid "IRC Nick" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:485 -msgid "IRC Server Address" -msgstr "" - -#: client/src/notifications/shared/type-change.service.js:72 -msgid "IRC Server Password" -msgstr "" - -#: client/src/notifications/shared/type-change.service.js:71 -msgid "IRC Server Port" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:21 -msgid "ISOLATED" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:79 -msgid "ISSUE: {{report.rule.description}}" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:43 -msgid "ITEMS" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:439 -#: client/src/notifications/notificationTemplates.form.js:471 -msgid "Icon URL" -msgstr "" - -#: client/src/login/authenticationServices/timer.factory.js:157 -msgid "Idle Session" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:354 -msgid "If checked, all variables for child groups and hosts will be removed and replaced by those found on the external source." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:343 -msgid "If checked, any hosts and groups that were previously present on the external source but are now removed will be removed from the Tower inventory. Hosts and groups that were not managed by the inventory source will be promoted to the next manually created group or if there is no manually created group to promote them into, they will be left in the \"all\" default group for the inventory." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:324 -msgid "If enabled, run this playbook as an administrator." -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:121 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "" - -#: client/features/templates/templates.strings.js:51 -#: client/src/templates/job_templates/job-template.form.js:309 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:356 -msgid "If enabled, simultaneous runs of this job template will be allowed." -msgstr "" - -#: client/src/templates/workflows.form.js:160 -msgid "If enabled, simultaneous runs of this workflow job template will be allowed." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:366 -msgid "If enabled, use cached facts if available and store discovered facts in the cache." -msgstr "" - -#: client/src/credentials/credentials.form.js:52 -msgid "If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization." -msgstr "" - -#: client/src/license/license.partial.html:74 -msgid "If you are ready to upgrade, please contact us by clicking the button below" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:34 -#: client/src/inventories-hosts/hosts/host.list.js:35 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:32 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:33 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:30 -#: client/src/inventories-hosts/inventory-hosts.strings.js:32 -msgid "Indicates if a host is available and should be included in running jobs." -msgstr "" - -#: client/src/activity-stream/activity-detail.form.js:31 -#: client/src/activity-stream/streams.list.js:33 -msgid "Initiated by" -msgstr "" - -#: client/src/credential-types/credential-types.form.js:53 -#: client/src/credential-types/credential-types.form.js:61 -msgid "Injector Configuration" -msgstr "" - -#: client/src/credential-types/credential-types.form.js:39 -#: client/src/credential-types/credential-types.form.js:47 -msgid "Input Configuration" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:119 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:129 -msgid "Insights" -msgstr "" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:52 -msgid "Insights Credential" -msgstr "" - -#: client/features/output/output.strings.js:67 -#: client/src/instance-groups/instance-groups.strings.js:43 -msgid "Instance Group" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:71 -msgid "Instance Group parameter is missing." -msgstr "" - -#: client/lib/components/components.strings.js:86 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:54 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:57 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:61 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:64 -#: client/src/organizations/organizations.form.js:38 -#: client/src/organizations/organizations.form.js:41 -#: client/src/templates/job_templates/job-template.form.js:268 -#: client/src/templates/job_templates/job-template.form.js:271 -msgid "Instance Groups" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:37 -msgid "Instance Groups Help" -msgstr "" - -#: client/lib/components/components.strings.js:85 -#: client/src/instance-groups/instance-groups.strings.js:20 -msgid "Instances" -msgstr "" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "Insufficient Permissions" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:18 -msgid "Integer" -msgstr "" - -#: client/src/license/license.partial.html:11 -msgid "Invalid License" -msgstr "" - -#: client/src/license/license.controller.js:109 -#: client/src/license/license.controller.js:117 -msgid "Invalid file format. Please upload valid JSON." -msgstr "" - -#: client/lib/components/components.strings.js:16 -msgid "Invalid input for this type." -msgstr "" - -#: client/features/output/output.strings.js:111 -msgid "Invalid search filter provided." -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:46 -msgid "Invalid username and/or password. Please try again." -msgstr "" - -#: client/lib/components/components.strings.js:77 -#: client/lib/models/models.strings.js:16 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:121 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:52 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/organizations/linkout/organizations-linkout.route.js:147 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "Inventories" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:43 -msgid "Inventories with sources cannot be copied" -msgstr "" - -#: client/features/jobs/jobs.strings.js:14 -#: client/features/output/output.strings.js:69 -#: client/features/templates/templates.strings.js:19 -#: client/features/templates/templates.strings.js:28 -#: client/src/inventories-hosts/hosts/host.list.js:75 -#: client/src/inventories-hosts/inventories/inventory.list.js:85 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/templates/job_templates/job-template.form.js:66 -#: client/src/templates/job_templates/job-template.form.js:80 -#: client/src/templates/workflows.form.js:72 -#: client/src/templates/workflows.form.js:82 -#: client/src/workflow-results/workflow-results.controller.js:78 -msgid "Inventory" -msgstr "" - -#: client/lib/services/base-string.service.js:148 -msgid "Inventory (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:149 -msgid "Inventory (Descending)" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:109 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:123 -msgid "Inventory File" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:79 -msgid "Inventory Limit" -msgstr "" - -#: client/lib/components/components.strings.js:82 -#: client/lib/models/models.strings.js:20 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 -msgid "Inventory Scripts" -msgstr "" - -#: client/lib/models/models.strings.js:25 -msgid "Inventory Sources" -msgstr "" - -#: client/features/templates/templates.strings.js:118 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:52 -#: client/src/workflow-results/workflow-results.controller.js:99 -msgid "Inventory Sync" -msgstr "" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:55 -msgid "Inventory Sync Failures" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:75 -msgid "Inventory Variables" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:72 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:67 -msgid "Inventory contains 0 hosts." -msgstr "" - -#: client/features/output/output.strings.js:47 -msgid "Isolated" -msgstr "" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "JOB ID" -msgstr "" - -#: client/features/output/output.strings.js:109 -msgid "JOB IS STILL RUNNING" -msgstr "" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:4 -msgid "JOB STATUS" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:22 -msgid "JOB TEMPLATE" -msgstr "" - -#: client/features/portalMode/portalMode.strings.js:8 -#: client/features/templates/routes/organizationsTemplatesList.route.js:28 -#: client/features/templates/routes/projectsTemplatesList.route.js:29 -#: client/src/organizations/list/organizations-list.controller.js:83 -msgid "JOB TEMPLATES" -msgstr "" - -#: client/features/jobs/jobs.strings.js:8 -#: client/features/jobs/routes/instanceGroupJobs.route.js:13 -#: client/features/jobs/routes/instanceGroupJobs.route.js:75 -#: client/features/jobs/routes/instanceJobs.route.js:13 -#: client/features/jobs/routes/inventoryCompletedJobs.route.js:29 -#: client/features/jobs/routes/jobs.route.js:12 -#: client/features/portalMode/portalMode.strings.js:9 -#: client/src/activity-stream/get-target-title.factory.js:32 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:115 -#: client/src/instance-groups/instance-groups.strings.js:31 -msgid "JOBS" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:14 -#: client/lib/services/base-string.service.js:73 -msgid "JSON" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:157 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:181 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:205 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:280 -msgid "JSON:" -msgstr "" - -#: client/features/jobs/jobs.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:118 -msgid "Job" -msgstr "" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Job Not Found" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:277 -msgid "Job Slicing" -msgstr "" - -#: client/features/output/output.strings.js:72 -#: client/features/templates/templates.strings.js:54 -#: client/src/templates/job_templates/job-template.form.js:206 -#: client/src/templates/job_templates/job-template.form.js:213 -msgid "Job Tags" -msgstr "" - -#: client/features/jobs/jobs.strings.js:13 -#: client/features/output/output.strings.js:73 -#: client/features/templates/templates.strings.js:116 -#: client/features/templates/templates.strings.js:13 -#: client/src/templates/templates.list.js:61 -msgid "Job Template" -msgstr "" - -#: client/lib/models/models.strings.js:30 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:102 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:36 -#: client/src/projects/projects.form.js:334 -msgid "Job Templates" -msgstr "" - -#: client/features/output/output.strings.js:75 -#: client/features/templates/templates.strings.js:58 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:35 -#: client/src/templates/job_templates/job-template.form.js:47 -#: client/src/templates/job_templates/job-template.form.js:55 -msgid "Job Type" -msgstr "" - -#: client/src/workflow-results/workflow-results.service.js:100 -msgid "Job has completed. Unable to be canceled." -msgstr "" - -#: client/features/output/output.strings.js:30 -msgid "Job is one of several from a JT that slices on inventory" -msgstr "" - -#: client/features/jobs/jobs.strings.js:20 -msgid "Job {{status}}. Click for details." -msgstr "" - -#: client/features/templates/templates.strings.js:125 -#: client/lib/components/components.strings.js:71 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 -#: client/src/configuration/settings.partial.html:5 -#: client/src/instance-groups/instance-groups.strings.js:60 -msgid "Jobs" -msgstr "" - -#: client/features/output/output.strings.js:107 -#: client/features/templates/templates.strings.js:111 -#: client/src/workflow-results/workflow-results.controller.js:101 -msgid "KEY" -msgstr "" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:61 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:153 -#: client/src/shared/smart-search/smart-search.partial.html:14 -msgid "Key" -msgstr "" - -#: client/src/credential-types/credential-types.list.js:31 -#: client/src/credentials/credentials.list.js:33 -msgid "Kind" -msgstr "" - -#: client/features/applications/applications.strings.js:31 -#: client/features/projects/projects.strings.js:12 -msgid "LAST MODIFIED" -msgstr "" - -#: client/features/projects/projects.strings.js:13 -#: client/features/users/tokens/tokens.strings.js:38 -msgid "LAST USED" -msgstr "" - -#: client/features/templates/templates.strings.js:34 -#: client/lib/components/components.strings.js:112 -msgid "LAUNCH" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:94 -msgid "LDAP" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:102 -msgid "LDAP 1 (Optional)" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:103 -msgid "LDAP 2 (Optional)" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:104 -msgid "LDAP 3 (Optional)" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:105 -msgid "LDAP 4 (Optional)" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:106 -msgid "LDAP 5 (Optional)" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:18 -msgid "LDAP Server" -msgstr "" - -#: client/src/license/license.route.js:18 -msgid "LICENSE" -msgstr "" - -#: client/features/output/output.strings.js:76 -#: client/src/templates/job_templates/job-template.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:244 -#: client/src/templates/templates.list.js:43 -#: client/src/templates/workflows.form.js:121 -#: client/src/templates/workflows.form.js:125 -#: client/src/workflow-results/workflow-results.controller.js:73 -msgid "Labels" -msgstr "" - -#: client/features/templates/templates.strings.js:22 -msgid "Last Modified" -msgstr "" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 -#: client/src/teams/teams.form.js:105 -#: client/src/users/users.form.js:35 -#: client/src/users/users.list.js:37 -msgid "Last Name" -msgstr "" - -#: client/features/templates/templates.strings.js:23 -msgid "Last Ran" -msgstr "" - -#: client/lib/services/base-string.service.js:134 -msgid "Last Run (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:135 -msgid "Last Run (Descending)" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:56 -msgid "Last Sync" -msgstr "" - -#: client/src/projects/projects.list.js:62 -msgid "Last Updated" -msgstr "" - -#: client/lib/services/base-string.service.js:136 -msgid "Last Used (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:137 -msgid "Last Used (Descending)" -msgstr "" - -#: client/src/shared/form-generator.js:1402 -msgid "Last logged in:" -msgstr "" - -#: client/src/organizations/organizations.form.js:137 -msgid "Last name" -msgstr "" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:33 -#: client/src/shared/form-generator.js:1660 -msgid "Launch" -msgstr "" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:49 -msgid "Launch Configuration" -msgstr "" - -#: client/src/management-jobs/card/card.partial.html:21 -#: client/src/management-jobs/card/card.partial.html:24 -msgid "Launch Management Job" -msgstr "" - -#: client/features/jobs/jobs.strings.js:12 -#: client/features/output/output.strings.js:77 -#: client/src/workflow-results/workflow-results.controller.js:70 -msgid "Launched By" -msgstr "" - -#: client/lib/services/base-string.service.js:146 -msgid "Launched By (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:147 -msgid "Launched By (Descending)" -msgstr "" - -#: client/features/templates/templates.strings.js:42 -msgid "Launching this job requires the passwords listed below. Enter each password before continuing." -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:32 -msgid "Leaving this field blank will result in the creation of a Personal Access Token which is not linked to an Application." -msgstr "" - -#: client/features/credentials/legacy.credentials.js:350 -msgid "Legacy state configuration for does not exist" -msgstr "" - -#: client/lib/components/components.strings.js:98 -#: client/src/configuration/settings.partial.html:14 -#: client/src/license/license.controller.js:47 -#: client/src/license/license.partial.html:109 -#: client/src/license/license.partial.html:8 -msgid "License" -msgstr "" - -#: client/features/output/output.strings.js:78 -msgid "License Error" -msgstr "" - -#: client/src/license/license.partial.html:33 -msgid "License Key" -msgstr "" - -#: client/src/license/license.controller.js:49 -msgid "License Management" -msgstr "" - -#: client/src/license/license.partial.html:21 -msgid "License Type" -msgstr "" - -#: client/features/output/output.strings.js:79 -#: client/features/templates/templates.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:45 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:55 -#: client/src/templates/job_templates/job-template.form.js:175 -#: client/src/templates/job_templates/job-template.form.js:179 -#: client/src/templates/workflows.form.js:93 -#: client/src/templates/workflows.form.js:97 -msgid "Limit" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:51 -msgid "Limited to first 10" -msgstr "" - -#: client/src/shared/socket/socket.service.js:225 -msgid "Live events: attempting to connect to the server." -msgstr "" - -#: client/src/shared/socket/socket.service.js:229 -msgid "Live events: connected. Pages containing job status information will automatically update in real-time." -msgstr "" - -#: client/src/shared/socket/socket.service.js:233 -msgid "Live events: error connecting to the server." -msgstr "" - -#: client/src/shared/form-generator.js:1935 -msgid "Loading..." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:136 -#: client/src/scheduler/scheduler.strings.js:26 -msgid "Local Time Zone" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:588 -msgid "Local time" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:228 -msgid "Log aggregator test failed.
Detail:" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:218 -msgid "Log aggregator test sent successfully." -msgstr "" - -#: client/lib/components/components.strings.js:67 -msgid "Logged in as" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:85 -msgid "Logging" -msgstr "" - -#: client/lib/components/components.strings.js:69 -#: client/lib/components/layout/layout.partial.html:39 -msgid "Logout" -msgstr "" - -#: client/src/shared/form-generator.js:1258 -msgid "Lookup field" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:35 -msgid "Low" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:15 -msgid "Low Risk" -msgstr "" - -#: client/src/management-jobs/card/card.partial.html:6 -#: client/src/management-jobs/card/card.route.js:19 -msgid "MANAGEMENT JOBS" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:18 -msgid "MANUAL" -msgstr "" - -#: client/features/credentials/credentials.strings.js:32 -msgid "METADATA" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:62 -msgid "MM" -msgstr "" - -#: client/features/output/output.strings.js:132 -msgid "MODULE" -msgstr "" - -#: client/features/portalMode/routes/portalModeTemplatesList.route.js:13 -msgid "MY VIEW" -msgstr "" - -#: client/src/credentials/credentials.form.js:67 -msgid "Machine" -msgstr "" - -#: client/features/output/output.strings.js:80 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:60 -msgid "Machine Credential" -msgstr "" - -#: client/src/license/license.partial.html:240 -msgid "Managed Nodes" -msgstr "" - -#: client/lib/components/components.strings.js:84 -msgid "Management Jobs" -msgstr "" - -#: client/features/projects/projects.strings.js:20 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:45 -#: client/src/projects/edit/projects-edit.controller.js:126 -msgid "Manual projects do not require an SCM update" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:250 -#: client/src/templates/workflows.form.js:131 -msgid "Max 512 characters per label." -msgstr "" - -#: client/src/organizations/organizations.form.js:68 -#: client/src/organizations/organizations.form.js:75 -msgid "Max Hosts" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:161 -msgid "Maximum" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:119 -#: client/src/templates/survey-maker/shared/question-definition.form.js:140 -#: client/src/templates/survey-maker/shared/question-definition.form.js:98 -msgid "Maximum Length" -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:40 -msgid "Maximum per-user sessions reached. Please sign in." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:181 -msgid "Maximum<" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:29 -msgid "Medium" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:14 -msgid "Medium Risk" -msgstr "" - -#: client/src/shared/stateDefinitions.factory.js:607 -msgid "Member" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:156 -#: client/src/templates/survey-maker/shared/question-definition.form.js:176 -msgid "Minimum" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:113 -#: client/src/templates/survey-maker/shared/question-definition.form.js:134 -#: client/src/templates/survey-maker/shared/question-definition.form.js:92 -msgid "Minimum Length" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:83 -msgid "Misc. System" -msgstr "" - -#: client/src/templates/workflows.form.js:35 -msgid "Missing Job Templates found in the Workflow Editor" -msgstr "" - -#: client/lib/services/base-string.service.js:130 -msgid "Modified (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:131 -msgid "Modified (Descending)" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:22 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:30 -msgid "Module" -msgstr "" - -#: client/features/output/output.strings.js:81 -msgid "Module Args" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:414 -#: client/src/scheduler/scheduler.strings.js:37 -msgid "Mon" -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:25 -msgid "Most recent job failed. Click to view jobs." -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:29 -msgid "Most recent job successful. Click to view jobs." -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:17 -msgid "Multiple Choice (multiple select)" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:16 -msgid "Multiple Choice (single select)" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:77 -msgid "Multiple Choice Options" -msgstr "" - -#: client/features/portalMode/index.view.html:26 -msgid "My Jobs" -msgstr "" - -#: client/lib/components/components.strings.js:73 -msgid "My View" -msgstr "" - -#: client/features/applications/applications.strings.js:24 -msgid "NAME" -msgstr "" - -#: client/features/applications/applications.strings.js:20 -msgid "NEW APPLICATION" -msgstr "" - -#: client/features/credentials/credentials.strings.js:40 -msgid "NEW CREDENTIAL" -msgstr "" - -#: client/src/credential-types/credential-types.form.js:16 -msgid "NEW CREDENTIAL TYPE" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.form.js:16 -msgid "NEW CUSTOM INVENTORY" -msgstr "" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:17 -msgid "NEW INVENTORY" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:19 -msgid "NEW JOB TEMPLATE" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:16 -msgid "NEW NOTIFICATION TEMPLATE" -msgstr "" - -#: client/src/organizations/organizations.form.js:18 -msgid "NEW ORGANIZATION" -msgstr "" - -#: client/src/projects/projects.form.js:17 -msgid "NEW PROJECT" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:10 -msgid "NEW SMART INVENTORY" -msgstr "" - -#: client/src/teams/teams.form.js:16 -msgid "NEW TEAM" -msgstr "" - -#: client/src/users/users.form.js:16 -msgid "NEW USER" -msgstr "" - -#: client/src/templates/workflows.form.js:17 -msgid "NEW WORKFLOW JOB TEMPLATE" -msgstr "" - -#: client/lib/services/base-string.service.js:67 -msgid "NEXT" -msgstr "" - -#: client/src/inventories-hosts/hosts/hosts.partial.html:38 -msgid "NO HOSTS HAVE BEEN CREATED" -msgstr "" - -#: client/features/output/output.strings.js:142 -msgid "NO JOBS FINISHED" -msgstr "" - -#: client/lib/components/components.strings.js:40 -msgid "NO OPTIONS AVAILABLE" -msgstr "" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:117 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:120 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:123 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:127 -msgid "NONE SELECTED" -msgstr "" - -#: client/src/projects/projects.form.js:139 -msgid "NOTE: This field assumes the remote name is \"origin\"." -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:102 -msgid "NOTICE" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:21 -msgid "NOTIFICATION TEMPLATE" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:26 -#: client/src/notifications/notificationTemplates.list.js:14 -msgid "NOTIFICATION TEMPLATES" -msgstr "" - -#: client/lib/components/components.strings.js:131 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js:9 -#: client/src/management-jobs/notifications/notification.route.js:59 -#: client/src/notifications/main.js:44 -#: client/src/notifications/main.js:95 -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "NOTIFICATIONS" -msgstr "" - -#: client/features/output/output.strings.js:82 -#: client/src/credential-types/credential-types.form.js:27 -#: client/src/credential-types/credential-types.list.js:24 -#: client/src/credentials/credentials.form.js:32 -#: client/src/credentials/credentials.list.js:26 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:15 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:15 -#: client/src/instance-groups/instance-groups.list.js:15 -#: client/src/inventories-hosts/hosts/host.list.js:68 -#: client/src/inventories-hosts/inventories/inventory.list.js:52 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:33 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:37 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:21 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:28 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:45 -#: client/src/inventory-scripts/inventory-scripts.form.js:28 -#: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 -#: client/src/notifications/notificationTemplates.form.js:32 -#: client/src/notifications/notificationTemplates.list.js:37 -#: client/src/notifications/notifications.list.js:27 -#: client/src/organizations/organizations.form.js:26 -#: client/src/projects/projects.form.js:30 -#: client/src/projects/projects.list.js:43 -#: client/src/scheduler/scheduled-jobs.list.js:36 -#: client/src/scheduler/scheduler.strings.js:21 -#: client/src/scheduler/schedules.list.js:48 -#: client/src/teams/teams.form.js:135 -#: client/src/teams/teams.form.js:28 -#: client/src/teams/teams.list.js:23 -#: client/src/templates/job_templates/job-template.form.js:34 -#: client/src/templates/templates.list.js:24 -#: client/src/templates/workflows.form.js:42 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:119 -#: client/src/users/users.form.js:143 -#: client/src/users/users.form.js:171 -#: client/src/users/users.form.js:199 -msgid "Name" -msgstr "" - -#: client/lib/services/base-string.service.js:126 -msgid "Name (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:127 -msgid "Name (Descending)" -msgstr "" - -#: client/lib/components/layout/layout.partial.html:4 -msgid "Navigate to dashboard" -msgstr "" - -#: client/features/output/details.partial.html:244 -msgid "Navigate to inventory sync job" -msgstr "" - -#: client/features/output/details.partial.html:212 -msgid "Navigate to project sync job" -msgstr "" - -#: client/features/output/details.partial.html:164 -msgid "Navigate to workflow job" -msgstr "" - -#: client/src/credentials/credentials.form.js:71 -msgid "Network" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:70 -msgid "New Group" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:147 -msgid "New Host" -msgstr "" - -#: client/src/users/add/users-add.controller.js:93 -msgid "New user successfully created!" -msgstr "" - -#: client/src/scheduler/scheduled-jobs.list.js:56 -#: client/src/scheduler/schedules.list.js:58 -msgid "Next Run" -msgstr "" - -#: client/src/credentials/credentials.list.js:21 -msgid "No Credentials Have Been Created" -msgstr "" - -#: client/features/templates/templates.strings.js:74 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:15 -msgid "No Credentials Matching This Type Have Been Created" -msgstr "" - -#: client/features/output/host-event/host-event-codemirror.partial.html:3 -msgid "No JSON data returned by the module" -msgstr "" - -#: client/src/license/license.controller.js:158 -msgid "No Licenses Found" -msgstr "" - -#: client/src/projects/projects.list.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:64 -msgid "No Projects Have Been Created" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:50 -msgid "No Remediation Playbook Available" -msgstr "" - -#: client/features/projects/projects.strings.js:32 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "No SCM Configuration" -msgstr "" - -#: client/features/projects/projects.strings.js:38 -#: client/src/projects/factories/get-project-tool-tip.factory.js:9 -msgid "No SCM updates have run for this project" -msgstr "" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:17 -msgid "No Teams exist" -msgstr "" - -#: client/features/projects/projects.strings.js:29 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "No Updates Available" -msgstr "" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:18 -msgid "No Users to add" -msgstr "" - -#: client/features/credentials/credentials.strings.js:36 -msgid "No credential selected" -msgstr "" - -#: client/features/templates/templates.strings.js:37 -msgid "No credentials selected" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:63 -msgid "No data is available. There are no issues to report." -msgstr "" - -#: client/features/credentials/credentials.strings.js:34 -msgid "No external credentials available." -msgstr "" - -#: client/src/license/license.controller.js:44 -msgid "No file selected." -msgstr "" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js:48 -msgid "No groups to add" -msgstr "" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js:45 -msgid "No hosts to add" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:68 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:64 -msgid "No hosts with failures. Click for details." -msgstr "" - -#: client/features/templates/templates.strings.js:38 -msgid "No inventory selected" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:51 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:52 -msgid "No inventory sync failures. Click for details." -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:16 -msgid "No job data" -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:75 -msgid "No job data available." -msgstr "" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:54 -msgid "No job templates were recently used." -msgstr "" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:51 -msgid "No jobs were recently run." -msgstr "" - -#: client/src/teams/teams.form.js:132 -#: client/src/users/users.form.js:196 -msgid "No permissions have been granted" -msgstr "" - -#: client/features/templates/templates.strings.js:147 -msgid "No promptable values were provided when this node was created." -msgstr "" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:17 -msgid "No recent job data available for this host." -msgstr "" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:98 -msgid "No recent job data available for this inventory." -msgstr "" - -#: client/src/notifications/notification-templates-list/list.controller.js:86 -msgid "No recent notifications." -msgstr "" - -#: client/features/credentials/credentials.strings.js:33 -#: client/src/inventories-hosts/hosts/hosts.partial.html:36 -#: client/src/shared/form-generator.js:1833 -#: client/src/shared/list-generator/list-generator.factory.js:240 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:25 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:62 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:92 -msgid "No records matched your search." -msgstr "" - -#: client/features/output/output.strings.js:133 -msgid "No result found" -msgstr "" - -#: client/src/scheduler/scheduled-jobs.list.js:16 -msgid "No schedules exist" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:71 -msgid "No sync data" -msgstr "" - -#: client/src/organizations/linkout/addUsers/addUsers.controller.js:60 -msgid "No users available to add as adminstrators" -msgstr "" - -#: client/src/users/add/users-add.controller.js:10 -#: client/src/users/edit/users-edit.controller.js:10 -#: client/src/users/list/users-list.controller.js:10 -msgid "Normal User" -msgstr "" - -#: client/features/output/output.strings.js:48 -#: client/src/workflow-results/workflow-results.controller.js:84 -msgid "Not Finished" -msgstr "" - -#: client/features/output/output.strings.js:49 -#: client/src/workflow-results/workflow-results.controller.js:85 -msgid "Not Started" -msgstr "" - -#: client/features/projects/projects.strings.js:37 -msgid "Not configured for SCM" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:58 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:56 -msgid "Not configured for inventory sync." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -msgid "Note that only hosts directly in this group can be disassociated. Hosts in sub-groups must be disassociated directly from the sub-group level that they belong." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:343 -#: client/src/notifications/notificationTemplates.form.js:344 -#: client/src/notifications/notificationTemplates.form.js:540 -#: client/src/notifications/notificationTemplates.form.js:541 -msgid "Notification Color" -msgstr "" - -#: client/src/notifications/notification-templates-list/list.controller.js:140 -msgid "Notification Failed." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:332 -msgid "Notification Label" -msgstr "" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 -msgid "Notification Templates" -msgstr "" - -#: client/src/notifications/notification-templates-list/list.controller.js:157 -msgid "Notification timed out." -msgstr "" - -#: client/lib/components/components.strings.js:83 -#: client/src/management-jobs/notifications/notification.route.js:21 -#: client/src/notifications/notifications.list.js:17 -msgid "Notifications" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:357 -msgid "Notify Channel" -msgstr "" - -#: client/lib/services/base-string.service.js:71 -msgid "OFF" -msgstr "" - -#: client/index.template.ejs:71 -#: client/lib/services/base-string.service.js:65 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -msgid "OK" -msgstr "" - -#: client/lib/services/base-string.service.js:70 -msgid "ON" -msgstr "" - -#: client/lib/components/components.strings.js:10 -msgid "OPTIONS" -msgstr "" - -#: client/src/license/license.partial.html:121 -msgid "OR" -msgstr "" - -#: client/features/applications/applications.strings.js:30 -msgid "ORG" -msgstr "" - -#: client/features/projects/projects.strings.js:11 -msgid "ORGANIZATION" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:29 -#: client/src/organizations/list/organizations-list.partial.html:6 -#: client/src/organizations/main.js:55 -msgid "ORGANIZATIONS" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:507 -msgid "Occurrence(s)" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:567 -#: client/src/scheduler/scheduler.strings.js:45 -msgid "Occurrences" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:396 -msgid "On Days" -msgstr "" - -#: client/features/templates/templates.strings.js:113 -#: client/src/workflow-results/workflow-results.controller.js:96 -msgid "On Failure" -msgstr "" - -#: client/features/templates/templates.strings.js:112 -#: client/src/workflow-results/workflow-results.controller.js:95 -msgid "On Success" -msgstr "" - -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.partial.html:3 -msgid "Open Galaxy credentials" -msgstr "" - -#: client/src/templates/job_templates/multi-credential/multi-credential.partial.html:4 -msgid "Open credential lookup" -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:42 -msgid "Open host filter" -msgstr "" - -#: client/src/shared/instance-groups-multiselect/instance-groups.partial.html:3 -msgid "Open instance groups" -msgstr "" - -#: client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html:4 -msgid "Open webhook credential lookup" -msgstr "" - -#: client/src/credentials/credentials.form.js:378 -msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:246 -#: client/src/templates/workflows.form.js:127 -msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:472 -msgid "Optionally, select the credential to use to send status updates back to the webhook service" -msgstr "" - -#: client/src/templates/workflows.form.js:245 -msgid "Optionally, select the credential to use to send status updates back to the webhook service." -msgstr "" - -#: client/src/partials/logviewer.html:7 -#: client/src/templates/job_templates/job-template.form.js:317 -#: client/src/templates/workflows.form.js:153 -msgid "Options" -msgstr "" - -#: client/features/applications/add-applications.controller.js:31 -#: client/features/templates/templates.strings.js:16 -#: client/src/credentials/credentials.form.js:46 -#: client/src/credentials/credentials.form.js:53 -#: client/src/inventories-hosts/inventories/inventory.list.js:65 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:33 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:40 -#: client/src/inventory-scripts/inventory-scripts.list.js:27 -#: client/src/notifications/notificationTemplates.form.js:44 -#: client/src/projects/projects.form.js:42 -#: client/src/projects/projects.form.js:48 -#: client/src/teams/teams.form.js:40 -#: client/src/teams/teams.list.js:30 -#: client/src/templates/workflows.form.js:55 -#: client/src/templates/workflows.form.js:61 -#: client/src/users/users.form.js:41 -msgid "Organization" -msgstr "" - -#: client/lib/services/base-string.service.js:152 -msgid "Organization (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:153 -msgid "Organization (Descending)" -msgstr "" - -#: client/lib/components/components.strings.js:79 -#: client/lib/models/models.strings.js:35 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:135 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:64 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 -#: client/src/users/users.form.js:133 -msgid "Organizations" -msgstr "" - -#: client/features/templates/templates.strings.js:31 -msgid "Other Prompts" -msgstr "" - -#: client/src/credentials/credentials.form.js:79 -msgid "Others (Cloud Providers)" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:276 -msgid "Override variables found in azure_rm.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:242 -msgid "Override variables found in cloudforms.ini and used by the inventory update script. For an example variable configuration" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:177 -msgid "Override variables found in ec2.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:259 -msgid "Override variables found in foreman.ini and used by the inventory update script. For an example variable configuration" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:225 -msgid "Override variables found in openstack.yml and used by the inventory update script. For an example variable configuration" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:201 -msgid "Override variables found in vmware.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "" - -#: client/features/output/output.strings.js:83 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:340 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:345 -msgid "Overwrite" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:351 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:356 -msgid "Overwrite Variables" -msgstr "" - -#: client/features/output/output.strings.js:84 -msgid "Overwrite Vars" -msgstr "" - -#: client/src/credentials/credentials.list.js:40 -msgid "Owners" -msgstr "" - -#: client/src/license/license.partial.html:136 -#: client/src/login/loginModal/loginModal.partial.html:80 -msgid "PASSWORD" -msgstr "" - -#: client/features/credentials/legacy.credentials.js:117 -msgid "PERMISSIONS" -msgstr "" - -#: client/features/output/output.strings.js:130 -msgid "PLAY" -msgstr "" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:146 -msgid "PLAYBOOK" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:42 -msgid "PLEASE ADD A SURVEY PROMPT." -msgstr "" - -#: client/src/organizations/list/organizations-list.partial.html:38 -#: client/src/shared/form-generator.js:1839 -#: client/src/shared/list-generator/list-generator.factory.js:248 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:27 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:94 -msgid "PLEASE ADD ITEMS TO THIS LIST" -msgstr "" - -#: client/src/notifications/add/add.controller.js:106 -#: client/src/notifications/edit/edit.controller.js:160 -msgid "POST" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:40 -msgid "PREVIEW" -msgstr "" - -#: client/src/workflow-results/workflow-results.service.js:105 -msgid "PROCEED" -msgstr "" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:142 -msgid "PROJECT" -msgstr "" - -#: client/features/projects/projects.strings.js:8 -#: client/features/projects/routes/projectsList.route.js:13 -#: client/src/activity-stream/get-target-title.factory.js:8 -#: client/src/organizations/linkout/organizations-linkout.route.js:182 -#: client/src/organizations/list/organizations-list.controller.js:76 -#: client/src/projects/projects.list.js:14 -#: client/src/projects/projects.list.js:15 -msgid "PROJECTS" -msgstr "" - -#: client/features/templates/templates.strings.js:30 -msgid "PROMPT" -msgstr "" - -#: client/src/notifications/add/add.controller.js:107 -#: client/src/notifications/edit/edit.controller.js:161 -msgid "PUT" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:33 -msgid "Page" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:236 -msgid "Pagerduty subdomain" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:486 -msgid "Pass extra command line variables to the playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "" - -#: client/src/templates/workflows.form.js:142 -msgid "Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:139 -msgid "Pass extra command line variables. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." -msgstr "" - -#: client/src/credentials/credentials.form.js:226 -#: client/src/credentials/factories/become-method-change.factory.js:21 -#: client/src/credentials/factories/become-method-change.factory.js:40 -#: client/src/credentials/factories/become-method-change.factory.js:48 -#: client/src/credentials/factories/become-method-change.factory.js:68 -#: client/src/credentials/factories/become-method-change.factory.js:78 -#: client/src/credentials/factories/become-method-change.factory.js:88 -#: client/src/credentials/factories/kind-change.factory.js:104 -#: client/src/credentials/factories/kind-change.factory.js:124 -#: client/src/credentials/factories/kind-change.factory.js:134 -#: client/src/credentials/factories/kind-change.factory.js:144 -#: client/src/credentials/factories/kind-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:77 -#: client/src/credentials/factories/kind-change.factory.js:96 -#: client/src/notifications/shared/type-change.service.js:31 -#: client/src/templates/survey-maker/surveys/init.factory.js:15 -#: client/src/users/users.form.js:69 -msgid "Password" -msgstr "" - -#: client/src/credentials/factories/kind-change.factory.js:57 -msgid "Password (API Key)" -msgstr "" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:23 -msgid "Past 24 Hours" -msgstr "" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:16 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:29 -msgid "Past Month" -msgstr "" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:26 -msgid "Past Week" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:85 -msgid "Paste the contents of the PEM file associated with the service account email." -msgstr "" - -#: client/src/credentials/factories/kind-change.factory.js:50 -msgid "Paste the contents of the SSH private key file." -msgstr "" - -#: client/src/credentials/factories/kind-change.factory.js:25 -msgid "Paste the contents of the SSH private key file.%s or click to close%s" -msgstr "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:133 -#: client/src/shared/list-generator/list-generator.factory.js:415 -msgid "Pending Delete" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js:60 -msgid "Perform a search above to define a host filter" -msgstr "" - -#: client/lib/components/components.strings.js:49 -msgid "Perform lookup" -msgstr "" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:8 -msgid "Period" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:35 -#: client/src/templates/main.js:128 -#: client/src/templates/main.js:367 -#: client/src/users/add/users-add.controller.js:45 -msgid "Permission Error" -msgstr "" - -#: client/features/credentials/credentials.strings.js:14 -#: client/features/credentials/legacy.credentials.js:63 -#: client/src/credentials/credentials.form.js:438 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:104 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:101 -#: client/src/organizations/organizations.form.js:152 -#: client/src/projects/projects.form.js:278 -#: client/src/teams/teams.form.js:128 -#: client/src/templates/job_templates/job-template.form.js:532 -#: client/src/templates/workflows.form.js:287 -#: client/src/users/users.form.js:192 -msgid "Permissions" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:41 -msgid "Personal Access Token" -msgstr "" - -#: client/features/output/output.strings.js:85 -#: client/src/shared/form-generator.js:1044 -#: client/src/templates/job_templates/job-template.form.js:123 -#: client/src/templates/job_templates/job-template.form.js:134 -msgid "Playbook" -msgstr "" - -#: client/src/projects/projects.form.js:91 -msgid "Playbook Directory" -msgstr "" - -#: client/features/templates/templates.strings.js:70 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:58 -msgid "Playbook Run" -msgstr "" - -#: client/features/output/output.strings.js:117 -msgid "Plays" -msgstr "" - -#: client/lib/components/components.strings.js:116 -msgid "Please add items to this list." -msgstr "" - -#: client/src/users/users.form.js:127 -msgid "Please add user to an Organization." -msgstr "" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:99 -msgid "Please assign roles to the selected resources" -msgstr "" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:60 -msgid "Please assign roles to the selected users/teams" -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "Please check the server and make sure the directory exists and file permissions are set correctly." -msgstr "" - -#: client/features/templates/templates.strings.js:144 -msgid "Please click on an available node to form a new link." -msgstr "" - -#: client/src/license/license.partial.html:91 -msgid "Please click the button below to visit Ansible's website to get a Tower license key." -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:40 -msgid "Please click the icon to edit the host filter." -msgstr "" - -#: client/features/templates/templates.strings.js:126 -msgid "Please click the start button to build your workflow." -msgstr "" - -#: client/lib/services/base-string.service.js:98 -msgid "Please confirm that you would like to remove {{ role }} access from the team {{ name }}. This will affect all members of the team. If you would like to only remove access for this particular user, please remove them from the team." -msgstr "" - -#: client/lib/services/base-string.service.js:104 -msgid "Please confirm that you would like to remove {{ role }} access from {{ name }}." -msgstr "" - -#: client/src/shared/form-generator.js:833 -#: client/src/shared/form-generator.js:925 -msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:183 -msgid "Please enter a larger float." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:163 -msgid "Please enter a larger integer." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:246 -msgid "Please enter a maximum default of {{float_max}}." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:232 -msgid "Please enter a maximum default of {{int_max}}." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:245 -msgid "Please enter a minimum default of {{float_min}}." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:231 -msgid "Please enter a minimum default of {{int_min}}." -msgstr "" - -#: client/src/shared/form-generator.js:1134 -msgid "Please enter a number greater than %d and less than %d." -msgstr "" - -#: client/src/shared/form-generator.js:1136 -msgid "Please enter a number greater than %d." -msgstr "" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:151 -msgid "Please enter a number greater than or equal to 0." -msgstr "" - -#: client/src/shared/form-generator.js:1128 -msgid "Please enter a number." -msgstr "" - -#: client/features/templates/templates.strings.js:43 -#: client/src/login/loginModal/loginModal.partial.html:90 -msgid "Please enter a password." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:178 -msgid "Please enter a smaller float." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:158 -msgid "Please enter a smaller integer." -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:70 -msgid "Please enter a username." -msgstr "" - -#: client/src/shared/form-generator.js:823 -#: client/src/shared/form-generator.js:915 -msgid "Please enter a valid email address." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:177 -#: client/src/templates/survey-maker/shared/question-definition.form.js:182 -#: client/src/templates/survey-maker/shared/question-definition.form.js:244 -msgid "Please enter a valid float." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:157 -#: client/src/templates/survey-maker/shared/question-definition.form.js:162 -#: client/src/templates/survey-maker/shared/question-definition.form.js:230 -msgid "Please enter a valid integer." -msgstr "" - -#: client/lib/components/components.strings.js:15 -#: client/src/shared/form-generator.js:818 -#: client/src/shared/form-generator.js:910 -#: client/src/shared/form-generator.js:982 -msgid "Please enter a value." -msgstr "" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:36 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "Please enter an answer between" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:199 -msgid "Please enter an answer from the choices listed." -msgstr "" - -#: client/features/templates/templates.strings.js:69 -msgid "Please enter an answer that is a decimal number." -msgstr "" - -#: client/features/templates/templates.strings.js:68 -msgid "Please enter an answer that is a valid integer." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:47 -msgid "Please enter an answer variable name." -msgstr "" - -#: client/features/templates/templates.strings.js:66 -msgid "Please enter an answer." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:216 -msgid "Please enter an answer/answers from the choices listed." -msgstr "" - -#: client/index.template.ejs:149 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "" - -#: client/index.template.ejs:132 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "" - -#: client/index.template.ejs:105 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:47 -msgid "Please enter at least one search term to create a new Smart Inventory." -msgstr "" - -#: client/features/templates/templates.strings.js:127 -msgid "Please hover over a template for additional options." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:175 -msgid "Please input a number greater than 1." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:538 -#: client/src/scheduler/scheduler.strings.js:47 -msgid "Please provide a valid date." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:208 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:521 -#: client/src/scheduler/scheduler.strings.js:30 -msgid "Please provide a value between 1 and 999." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:48 -msgid "Please remove the illegal character from the survey question variable name." -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:169 -msgid "Please save before adding a survey to this job template." -msgstr "" - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:53 -msgid "Please save before adding a survey to this workflow." -msgstr "" - -#: client/src/notifications/notifications.list.js:15 -msgid "Please save before adding notifications." -msgstr "" - -#: client/src/organizations/organizations.form.js:104 -#: client/src/teams/teams.form.js:72 -msgid "Please save before adding users." -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:100 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:97 -#: client/src/organizations/organizations.form.js:144 -#: client/src/projects/projects.form.js:270 -#: client/src/teams/teams.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:525 -#: client/src/templates/workflows.form.js:280 -msgid "Please save before assigning permissions." -msgstr "" - -#: client/src/users/users.form.js:125 -#: client/src/users/users.form.js:188 -msgid "Please save before assigning to organizations." -msgstr "" - -#: client/src/users/users.form.js:155 -msgid "Please save before assigning to teams." -msgstr "" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:142 -msgid "Please save before creating groups." -msgstr "" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:152 -msgid "Please save before creating hosts." -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:108 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:86 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:110 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:119 -msgid "Please save before defining groups." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:94 -msgid "Please save before defining hosts." -msgstr "" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:161 -msgid "Please save before defining inventory sources." -msgstr "" - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:52 -msgid "Please save before defining the workflow graph." -msgstr "" - -#: client/lib/components/components.strings.js:111 -msgid "Please save before launching this template." -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:117 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:127 -msgid "Please save before viewing Insights." -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:101 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:103 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:112 -msgid "Please save before viewing facts." -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:146 -msgid "Please save before viewing hosts." -msgstr "" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 -msgid "Please select Users / Teams from the lists below." -msgstr "" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 -msgid "Please select Users from the list below." -msgstr "" - -#: client/src/shared/form-generator.js:1169 -msgid "Please select a number between" -msgstr "" - -#: client/src/shared/form-generator.js:1165 -msgid "Please select a number." -msgstr "" - -#: client/features/templates/templates.strings.js:67 -msgid "Please select a value" -msgstr "" - -#: client/src/shared/form-generator.js:1056 -#: client/src/shared/form-generator.js:1125 -#: client/src/shared/form-generator.js:1298 -msgid "Please select a value." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:77 -msgid "Please select an Inventory or check the Prompt on launch option." -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:39 -msgid "Please select an organization before editing the host filter." -msgstr "" - -#: client/src/shared/form-generator.js:1162 -msgid "Please select at least one value." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:476 -#: client/src/scheduler/scheduler.strings.js:43 -msgid "Please select one or more days." -msgstr "" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:30 -msgid "Please select resources from the lists below." -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:77 -msgid "Pod Spec Override" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Populate the hosts for this inventory by using a search filter." -msgstr "" - -#: client/src/notifications/shared/type-change.service.js:30 -msgid "Port" -msgstr "" - -#: client/features/templates/templates.strings.js:33 -msgid "Preview" -msgstr "" - -#: client/src/credentials/credentials.form.js:257 -#: client/src/credentials/factories/kind-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:44 -msgid "Private Key" -msgstr "" - -#: client/features/templates/templates.strings.js:46 -#: client/src/credentials/credentials.form.js:264 -msgid "Private Key Passphrase" -msgstr "" - -#: client/src/credentials/credentials.form.js:279 -#: client/src/credentials/credentials.form.js:283 -msgid "Privilege Escalation" -msgstr "" - -#: client/features/templates/templates.strings.js:47 -#: client/src/credentials/credentials.form.js:304 -msgid "Privilege Escalation Password" -msgstr "" - -#: client/src/credentials/credentials.form.js:294 -msgid "Privilege Escalation Username" -msgstr "" - -#: client/features/jobs/jobs.strings.js:15 -#: client/features/output/output.strings.js:86 -#: client/features/templates/templates.strings.js:20 -#: client/src/credentials/factories/become-method-change.factory.js:30 -#: client/src/credentials/factories/kind-change.factory.js:86 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:92 -#: client/src/templates/job_templates/job-template.form.js:100 -#: client/src/templates/job_templates/job-template.form.js:113 -#: client/src/templates/job_templates/job-template.form.js:91 -msgid "Project" -msgstr "" - -#: client/lib/services/base-string.service.js:150 -msgid "Project (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:151 -msgid "Project (Descending)" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:53 -#: client/src/credentials/factories/kind-change.factory.js:109 -msgid "Project (Tenant Name)" -msgstr "" - -#: client/src/projects/projects.form.js:77 -#: client/src/projects/projects.form.js:85 -msgid "Project Base Path" -msgstr "" - -#: client/src/credentials/credentials.form.js:364 -msgid "Project Name" -msgstr "" - -#: client/src/projects/projects.form.js:102 -msgid "Project Path" -msgstr "" - -#: client/features/templates/templates.strings.js:117 -#: client/src/workflow-results/workflow-results.controller.js:98 -msgid "Project Sync" -msgstr "" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:66 -msgid "Project Sync Failures" -msgstr "" - -#: client/lib/components/components.strings.js:74 -#: client/lib/models/models.strings.js:40 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:114 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:47 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/organizations/linkout/organizations-linkout.route.js:190 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "Projects" -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:18 -msgid "Promote group" -msgid_plural "Promote groups" -msgstr[0] "" -msgstr[1] "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:20 -msgid "Promote host" -msgid_plural "Promote hosts" -msgstr[0] "" -msgstr[1] "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:10 -msgid "Promote {{ group }} and {{ host }}" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:54 -#: client/src/templates/survey-maker/shared/question-definition.form.js:27 -msgid "Prompt" -msgstr "" - -#: client/lib/components/components.strings.js:35 -#: client/src/templates/job_templates/job-template.form.js:116 -#: client/src/templates/job_templates/job-template.form.js:157 -#: client/src/templates/job_templates/job-template.form.js:184 -#: client/src/templates/job_templates/job-template.form.js:201 -#: client/src/templates/job_templates/job-template.form.js:218 -#: client/src/templates/job_templates/job-template.form.js:235 -#: client/src/templates/job_templates/job-template.form.js:312 -#: client/src/templates/job_templates/job-template.form.js:493 -#: client/src/templates/job_templates/job-template.form.js:60 -#: client/src/templates/job_templates/job-template.form.js:86 -#: client/src/templates/workflows.form.js:102 -#: client/src/templates/workflows.form.js:116 -#: client/src/templates/workflows.form.js:148 -#: client/src/templates/workflows.form.js:88 -msgid "Prompt on launch" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:49 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:48 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:50 -msgid "Provide a host name, ip address, or ip address:port. Examples include:" -msgstr "" - -#: client/features/templates/templates.strings.js:57 -#: client/src/templates/job_templates/job-template.form.js:178 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns." -msgstr "" - -#: client/src/templates/workflows.form.js:96 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the workflow. This limit is applied to all job template nodes that prompt for a limit. Refer to Ansible documentation for more information and examples on patterns." -msgstr "" - -#: client/features/credentials/credentials.strings.js:22 -msgid "Provide account information using Google Compute Engine JSON credentials file." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:155 -msgid "Provide environment variables to pass to the custom inventory script." -msgstr "" - -#: client/src/license/license.partial.html:128 -msgid "Provide your Red Hat customer credentials and you can choose from a list of your available licenses. The credentials you use will be stored for future use in retrieving renewal or expanded licenses. You can update or remove them in SETTINGS > SYSTEM." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:374 -#: client/src/templates/job_templates/job-template.form.js:382 -msgid "Provisioning Callback URL" -msgstr "" - -#: client/src/notifications/add/add.controller.js:86 -#: client/src/notifications/edit/edit.controller.js:149 -msgid "Purple" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:95 -msgid "RADIUS" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:55 -msgid "RAM" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:15 -msgid "READ ONLY" -msgstr "" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:4 -msgid "RECENT JOB RUNS" -msgstr "" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:47 -msgid "RECENTLY RUN JOBS" -msgstr "" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:50 -msgid "RECENTLY USED JOB TEMPLATES" -msgstr "" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:4 -msgid "RECENTLY USED TEMPLATES" -msgstr "" - -#: client/src/activity-stream/streams.list.js:54 -#: client/src/inventories-hosts/hosts/host.list.js:108 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:51 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:52 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:58 -#: client/src/projects/projects.list.js:76 -#: client/src/scheduler/schedules.list.js:76 -msgid "REFRESH" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:23 -msgid "REFRESH TOKEN" -msgstr "" - -#: client/src/shared/smart-search/smart-search.partial.html:45 -msgid "RELATED FIELDS:" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:91 -msgid "REMEDIATE INVENTORY" -msgstr "" - -#: client/lib/services/base-string.service.js:79 -#: client/src/access/permissions-list.controller.js:57 -#: client/src/access/permissions-list.controller.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:84 -#: client/src/shared/directives.js:94 -#: client/src/templates/labels/labelsList.directive.js:96 -msgid "REMOVE" -msgstr "" - -#: client/lib/services/base-string.service.js:103 -msgid "REMOVE ACCESS" -msgstr "" - -#: client/lib/services/base-string.service.js:97 -msgid "REMOVE TEAM ACCESS" -msgstr "" - -#: client/features/output/output.strings.js:8 -msgid "RESULTS" -msgstr "" - -#: client/features/templates/templates.strings.js:39 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:51 -msgid "REVERT" -msgstr "" - -#: client/features/projects/projects.strings.js:10 -msgid "REVISION" -msgstr "" - -#: client/src/inventories-hosts/inventories/main.js:301 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:49 -msgid "ROOT GROUPS" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:25 -#: client/src/credentials/factories/kind-change.factory.js:81 -msgid "RSA Private Key" -msgstr "" - -#: client/features/templates/templates.strings.js:130 -#: client/lib/services/base-string.service.js:66 -msgid "RUN" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.route.js:45 -msgid "RUN COMMAND" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:62 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:45 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:118 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:61 -msgid "RUN COMMANDS" -msgstr "" - -#: client/src/notifications/add/add.controller.js:89 -#: client/src/notifications/edit/edit.controller.js:152 -msgid "Random" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:30 -msgid "Read" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:179 -msgid "Read only view of extra variables added to the workflow." -msgstr "" - -#: client/features/output/output.strings.js:17 -msgid "Read-only view of artifacts added to the job template" -msgstr "" - -#: client/features/output/output.strings.js:24 -msgid "Read-only view of extra variables added to the job template" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:51 -msgid "Read-only view of extra variables added to the job template." -msgstr "" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Failed Jobs" -msgstr "" - -#: client/src/notifications/notificationTemplates.list.js:28 -msgid "Recent Notifications" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Successful Jobs" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:98 -msgid "Recipient List" -msgstr "" - -#: client/src/notifications/add/add.controller.js:87 -#: client/src/notifications/edit/edit.controller.js:150 -msgid "Red" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Refer to the Ansible Tower documentation for further syntax and examples." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "Refer to the Ansible documentation for details about the configuration file." -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Refresh" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:8 -msgid "Refresh Insights" -msgstr "" - -#: client/src/configuration/settings.service.js:44 -msgid "Refresh Token Expiration" -msgstr "" - -#: client/src/activity-stream/streams.list.js:51 -#: client/src/bread-crumb/bread-crumb.partial.html:6 -#: client/src/inventories-hosts/hosts/host.list.js:104 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:47 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:126 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:48 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:54 -#: client/src/projects/projects.list.js:72 -#: client/src/scheduler/schedules.list.js:72 -msgid "Refresh the page" -msgstr "" - -#: client/features/output/output.strings.js:88 -msgid "Refspec" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:308 -msgid "Regular expression where only matching host names will be imported. The filter is applied as a post-processing step after any inventory plugin filters are applied." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:81 -msgid "Related Groups" -msgstr "" - -#: client/lib/components/components.strings.js:104 -msgid "Relaunch On" -msgstr "" - -#: client/src/workflow-results/workflow-results.partial.html:26 -msgid "Relaunch job" -msgstr "" - -#: client/lib/components/components.strings.js:103 -msgid "Relaunch using host parameters" -msgstr "" - -#: client/lib/components/components.strings.js:102 -#: client/src/workflow-results/workflow-results.controller.js:55 -msgid "Relaunch using the same parameters" -msgstr "" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:176 -msgid "Remediate Inventory" -msgstr "" - -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:106 -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:107 -#: client/src/teams/teams.form.js:157 -#: client/src/users/users.form.js:231 -msgid "Remove" -msgstr "" - -#: client/src/templates/labels/labelsList.directive.js:93 -msgid "Remove Label from" -msgstr "" - -#: client/src/projects/projects.form.js:178 -msgid "Remove any local modifications prior to performing an update." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:81 -msgid "Remove host from" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:152 -#: client/src/scheduler/scheduler.strings.js:27 -msgid "Repeat frequency" -msgstr "" - -#: client/lib/components/components.strings.js:7 -msgid "Replace" -msgstr "" - -#: client/src/license/license.strings.js:7 -msgid "Replace password" -msgstr "" - -#: client/lib/components/components.strings.js:139 -msgid "Replace secret" -msgstr "" - -#: client/src/license/license.partial.html:96 -msgid "Request License" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:291 -msgid "Required" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:154 -msgid "Reset" -msgstr "" - -#: client/lib/components/components.strings.js:92 -msgid "Resources" -msgstr "" - -#: client/features/templates/templates.strings.js:97 -#: client/src/scheduler/schedules.list.js:25 -msgid "Resources are missing from this template." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:318 -msgid "Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified using dot notation, e.g: 'foo.bar'" -msgstr "" - -#: client/lib/services/base-string.service.js:111 -msgid "Return" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:26 -msgid "Returned status:" -msgstr "" - -#: client/lib/components/components.strings.js:8 -#: client/src/shared/form-generator.js:658 -msgid "Revert" -msgstr "" - -#: client/src/configuration/forms/auth-form/sub-forms/auth-azure.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-org.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-team.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-google-oauth2.form.js:59 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap1.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap2.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap3.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap4.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap5.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-radius.form.js:34 -#: client/src/configuration/forms/auth-form/sub-forms/auth-saml.form.js:121 -#: client/src/configuration/forms/auth-form/sub-forms/auth-tacacs.form.js:47 -#: client/src/configuration/forms/jobs-form/configuration-jobs.form.js:110 -#: client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js:26 -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:74 -#: client/src/configuration/forms/system-form/sub-forms/system-misc.form.js:95 -#: client/src/configuration/forms/ui-form/configuration-ui.form.js:36 -msgid "Revert all to default" -msgstr "" - -#: client/features/output/output.strings.js:90 -#: client/src/projects/projects.list.js:56 -msgid "Revision" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:159 -#: client/src/projects/edit/projects-edit.controller.js:280 -msgid "Revision #" -msgstr "" - -#: client/features/credentials/legacy.credentials.js:85 -#: client/src/credentials/credentials.form.js:461 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:130 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:127 -#: client/src/organizations/organizations.form.js:174 -#: client/src/projects/projects.form.js:301 -#: client/src/teams/teams.form.js:109 -#: client/src/teams/teams.form.js:148 -#: client/src/templates/workflows.form.js:311 -#: client/src/users/users.form.js:212 -msgid "Role" -msgstr "" - -#: client/lib/services/base-string.service.js:102 -msgid "Role access removal" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:440 -#: client/src/templates/job_templates/job-template.form.js:444 -#: client/src/templates/workflows.form.js:213 -#: client/src/templates/workflows.form.js:217 -msgid "Rotate Webhook Key" -msgstr "" - -#: client/src/instance-groups/instance-groups.list.js:26 -#: client/src/instance-groups/instance-groups.strings.js:22 -#: client/src/instance-groups/instance-groups.strings.js:61 -msgid "Running Jobs" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:96 -msgid "SAML" -msgstr "" - -#: client/lib/services/base-string.service.js:63 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:17 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:17 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:17 -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:18 -#: client/src/partials/survey-maker-modal.html:84 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:18 -msgid "SAVE" -msgstr "" - -#: client/features/templates/templates.strings.js:152 -msgid "SAVE & EXIT" -msgstr "" - -#: client/src/scheduler/scheduled-jobs.list.js:13 -#: client/src/scheduler/scheduled-jobs.list.js:14 -msgid "SCHEDULED JOBS" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:38 -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js:9 -#: client/src/management-jobs/scheduler/main.js:28 -#: client/src/management-jobs/scheduler/main.js:34 -#: client/src/scheduler/schedules.route.js:102 -#: client/src/scheduler/schedules.route.js:14 -#: client/src/scheduler/schedules.route.js:189 -#: client/src/scheduler/schedules.route.js:283 -msgid "SCHEDULES" -msgstr "" - -#: client/features/templates/templates.strings.js:71 -#: client/src/projects/add/projects-add.controller.js:130 -#: client/src/projects/edit/projects-edit.controller.js:252 -#: client/src/projects/projects.form.js:130 -#: client/src/templates/job_templates/job-template.form.js:107 -#: client/src/templates/workflows.form.js:107 -#: client/src/templates/workflows.form.js:111 -#: client/src/workflow-results/workflow-results.controller.js:80 -msgid "SCM Branch" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:150 -#: client/src/projects/edit/projects-edit.controller.js:271 -msgid "SCM Branch/Tag/Commit" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:171 -#: client/src/projects/edit/projects-edit.controller.js:292 -msgid "SCM Branch/Tag/Revision" -msgstr "" - -#: client/src/projects/projects.form.js:179 -msgid "SCM Clean" -msgstr "" - -#: client/src/projects/projects.form.js:190 -msgid "SCM Delete" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:76 -msgid "SCM Private Key" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:131 -#: client/src/projects/edit/projects-edit.controller.js:253 -#: client/src/projects/projects.form.js:146 -msgid "SCM Refspec" -msgstr "" - -#: client/src/projects/projects.form.js:57 -msgid "SCM Type" -msgstr "" - -#: client/src/projects/projects.form.js:108 -#: client/src/projects/projects.form.js:119 -msgid "SCM URL" -msgstr "" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:55 -#: client/src/projects/projects.form.js:200 -msgid "SCM Update" -msgstr "" - -#: client/features/projects/projects.strings.js:30 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "SCM Update Cancel" -msgstr "" - -#: client/src/projects/projects.form.js:170 -msgid "SCM Update Options" -msgstr "" - -#: client/features/projects/projects.strings.js:19 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:126 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:36 -#: client/src/projects/edit/projects-edit.controller.js:122 -msgid "SCM update currently running" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:39 -msgid "SCOPE" -msgstr "" - -#: client/features/output/output.strings.js:108 -msgid "SEARCH" -msgstr "" - -#: client/features/templates/templates.strings.js:132 -#: client/lib/services/base-string.service.js:64 -#: client/src/license/license.partial.html:260 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:137 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:186 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:75 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:155 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:194 -msgid "SELECT" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:76 -msgid "SELECT A CREDENTIAL" -msgstr "" - -#: client/features/credentials/credentials.strings.js:20 -msgid "SELECT A CREDENTIAL TYPE" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:19 -msgid "SELECT AN APPLICATION" -msgstr "" - -#: client/features/applications/applications.strings.js:36 -#: client/features/credentials/credentials.strings.js:19 -msgid "SELECT AN ORGANIZATION" -msgstr "" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:6 -msgid "SELECT GROUPS" -msgstr "" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:6 -msgid "SELECT HOSTS" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:42 -msgid "SELECT INSTANCE" -msgstr "" - -#: client/features/templates/templates.strings.js:36 -msgid "SELECTED" -msgstr "" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:18 -msgid "SELECTED:" -msgstr "" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:22 -msgid "SETTING CATEGORY" -msgstr "" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:26 -msgid "SETTING NAME" -msgstr "" - -#: client/src/configuration/settings.route.js:10 -msgid "SETTINGS" -msgstr "" - -#: client/lib/services/base-string.service.js:68 -#: client/src/templates/survey-maker/surveys/init.factory.js:502 -msgid "SHOW" -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:114 -msgid "SIGN IN" -msgstr "" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html:2 -msgid "SIGN IN WITH" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.list.js:116 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:14 -msgid "SMART INVENTORY" -msgstr "" - -#: client/lib/components/components.strings.js:122 -msgid "SORT BY" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js:27 -msgid "SOURCES" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:63 -msgid "SS" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:89 -#: client/src/credentials/factories/kind-change.factory.js:145 -msgid "SSH Key" -msgstr "" - -#: client/features/templates/templates.strings.js:45 -msgid "SSH Password" -msgstr "" - -#: client/src/credentials/credentials.form.js:255 -msgid "SSH key description" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:523 -msgid "SSL Connection" -msgstr "" - -#: client/features/templates/templates.strings.js:134 -msgid "START" -msgstr "" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "STATUS" -msgstr "" - -#: client/src/credentials/credentials.form.js:119 -#: client/src/credentials/credentials.form.js:127 -msgid "STS Token" -msgstr "" - -#: client/features/output/output.strings.js:140 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:56 -msgid "SUCCESSFUL" -msgstr "" - -#: client/src/partials/survey-maker-modal.html:24 -msgid "SURVEY" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:66 -msgid "SYNC ALL" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:464 -#: client/src/scheduler/scheduler.strings.js:42 -msgid "Sat" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:70 -#: client/src/credentials/factories/kind-change.factory.js:126 -msgid "Satellite 6 URL" -msgstr "" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:113 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:192 -#: client/src/credentials/credentials.form.js:416 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:158 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:630 -#: client/src/scheduler/scheduler.strings.js:57 -#: client/src/shared/form-generator.js:1644 -msgid "Save" -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:416 -msgid "Save Complete" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:199 -msgid "Save and enable log aggregation before testing the log aggregator." -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:66 -#: client/src/configuration/forms/settings-form.controller.js:454 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:63 -msgid "Save changes" -msgstr "" - -#: client/src/license/license.partial.html:200 -msgid "Save successful!" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:558 -#: client/src/scheduler/scheduler.strings.js:50 -msgid "Schedule Description" -msgstr "" - -#: client/src/management-jobs/card/card.partial.html:28 -#: client/src/management-jobs/card/card.partial.html:30 -msgid "Schedule Management Job" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:7 -msgid "Schedule inventory syncs" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:14 -msgid "Schedule is active." -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:15 -msgid "Schedule is active. Click to stop." -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:16 -msgid "Schedule is stopped." -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:17 -msgid "Schedule is stopped. Click to activate." -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:60 -msgid "Schedule name" -msgstr "" - -#: client/lib/components/components.strings.js:72 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:424 -#: client/src/projects/projects.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:578 -#: client/src/templates/workflows.form.js:333 -msgid "Schedules" -msgstr "" - -#: client/features/users/tokens/users-tokens-add.controller.js:38 -msgid "Scope" -msgstr "" - -#: client/src/shared/smart-search/smart-search.controller.js:127 -#: client/src/shared/smart-search/smart-search.controller.js:169 -msgid "Search" -msgstr "" - -#: client/src/credentials/credentials.form.js:104 -msgid "Secret Key" -msgstr "" - -#: client/src/credentials/credentials.form.js:124 -msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." -msgstr "" - -#: client/src/shared/form-generator.js:1648 -#: client/src/shared/lookup/lookup-modal.directive.js:59 -#: client/src/shared/lookup/lookup-modal.partial.html:20 -msgid "Select" -msgstr "" - -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:5 -msgid "Select Galaxy Credentials" -msgstr "" - -#: client/src/organizations/organizations.form.js:61 -msgid "Select Galaxy credentials. The selection order sets the order in which Tower will download roles/collections using `ansible-galaxy`." -msgstr "" - -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:5 -msgid "Select Instance Groups" -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:58 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:100 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:84 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:108 -msgid "Select Webhook Credential" -msgstr "" - -#: client/src/templates/workflows.form.js:110 -msgid "Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch." -msgstr "" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:73 -msgid "Select a credential" -msgstr "" - -#: client/index.template.ejs:139 -msgid "Select a frequency for snapshot retention" -msgstr "" - -#: client/src/license/license.partial.html:214 -msgid "Select a license" -msgstr "" - -#: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:70 -msgid "Select a role" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:29 -msgid "Select a scope" -msgstr "" - -#: client/index.template.ejs:122 -msgid "Select a time period after which to remove old facts" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:413 -#: client/src/templates/workflows.form.js:186 -msgid "Select a webhook service." -msgstr "" - -#: client/src/templates/workflows.form.js:81 -msgid "Select an inventory for the workflow. This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:59 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or a selection of multiple groups." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:42 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:115 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:58 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:127 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single host or a selection of multiple hosts." -msgstr "" - -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:107 -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:132 -#: client/src/configuration/forms/ui-form/configuration-ui.controller.js:94 -msgid "Select commands" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:151 -msgid "Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking \"Prompt on launch\" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check \"Prompt on launch\", the selected credential(s) become the defaults that can be updated at run time." -msgstr "" - -#: client/src/scheduler/schedulerDatePicker.partial.html:2 -msgid "Select date" -msgstr "" - -#: client/lib/components/components.strings.js:21 -msgid "Select file" -msgstr "" - -#: client/src/projects/projects.form.js:100 -msgid "Select from the list of directories found in the Project Base Path. Together the base path and the playbook directory provide the full path used to locate playbooks." -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:317 -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:336 -msgid "Select group types" -msgstr "" - -#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:24 -msgid "Select roles" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:56 -msgid "Select the Instance Groups for this Inventory to run on." -msgstr "" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:63 -msgid "Select the Instance Groups for this Inventory to run on. Refer to the Ansible Tower documentation for more detail." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:270 -msgid "Select the Instance Groups for this Job Template to run on." -msgstr "" - -#: client/src/organizations/organizations.form.js:40 -msgid "Select the Instance Groups for this Organization to run on." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:65 -msgid "Select the custom Python virtual environment for this inventory source sync to run on." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:260 -msgid "Select the custom Python virtual environment for this job template to run on." -msgstr "" - -#: client/src/organizations/organizations.form.js:51 -msgid "Select the custom Python virtual environment for this organization to run on." -msgstr "" - -#: client/src/projects/projects.form.js:242 -msgid "Select the custom Python virtual environment for this project to run on." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:79 -msgid "Select the inventory containing the hosts you want this job to manage." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:121 -msgid "Select the inventory file to be synced by this source. You can select from the dropdown or enter a file within the input." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:132 -msgid "Select the playbook to be executed by this job.You can select from the dropdown or enter a file within the input." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:99 -msgid "Select the project containing the playbook you want this job to execute." -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:188 -msgid "Select types" -msgstr "" - -#: client/src/license/license.partial.html:153 -msgid "Selected" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:202 -msgid "Send a test log message to the configured log aggregator." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:110 -msgid "Sender Email" -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:24 -#: client/src/credentials/factories/kind-change.factory.js:80 -msgid "Service Account Email Address" -msgstr "" - -#: client/features/credentials/credentials.strings.js:21 -msgid "Service Account JSON File" -msgstr "" - -#: client/features/credentials/credentials.strings.js:30 -msgid "Set Input Source" -msgstr "" - -#: client/index.template.ejs:102 -msgid "Set how many days of data should be retained." -msgstr "" - -#: client/src/configuration/settings.partial.html:12 -msgid "Set preferences for data collection, logos, and logins" -msgstr "" - -#: client/lib/components/components.strings.js:88 -msgid "Settings" -msgstr "" - -#: client/lib/components/components.strings.js:11 -#: client/src/shared/form-generator.js:845 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:24 -msgid "Show" -msgstr "" - -#: client/features/templates/templates.strings.js:50 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:115 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:118 -#: client/src/templates/job_templates/job-template.form.js:303 -#: client/src/templates/job_templates/job-template.form.js:306 -msgid "Show Changes" -msgstr "" - -#: client/features/output/output.strings.js:50 -#: client/src/workflow-results/workflow-results.controller.js:86 -msgid "Show Less" -msgstr "" - -#: client/features/output/output.strings.js:51 -#: client/src/workflow-results/workflow-results.controller.js:87 -msgid "Show More" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:34 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:8 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:104 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:125 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:136 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:28 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:44 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:6 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:61 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:83 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:138 -msgid "Show help text" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html:1 -msgid "Show host summary" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:51 -msgid "Show page size options" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html:1 -msgid "Show source summary" -msgstr "" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:33 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:44 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:55 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:76 -msgid "Sign in with %s" -msgstr "" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:63 -msgid "Sign in with %s Organizations" -msgstr "" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:61 -msgid "Sign in with %s Teams" -msgstr "" - -#: client/features/output/output.strings.js:91 -#: client/features/templates/templates.strings.js:52 -#: client/src/templates/job_templates/job-template.form.js:223 -#: client/src/templates/job_templates/job-template.form.js:230 -msgid "Skip Tags" -msgstr "" - -#: client/features/templates/templates.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:229 -msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "" - -#: client/features/jobs/jobs.strings.js:21 -#: client/features/output/output.strings.js:74 -msgid "Slice Job" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:283 -msgid "Slice Job Count" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:75 -msgid "Slice Job Template" -msgstr "" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:48 -msgid "Smart Host Filter" -msgstr "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:90 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/shared/form-generator.js:1406 -msgid "Smart Inventory" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:44 -msgid "Solvable With Playbook" -msgstr "" - -#: client/features/output/output.strings.js:92 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:50 -msgid "Source" -msgstr "" - -#: client/src/credentials/credentials.form.js:75 -msgid "Source Control" -msgstr "" - -#: client/features/output/output.strings.js:93 -msgid "Source Credential" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:33 -#: client/src/projects/projects.form.js:26 -msgid "Source Details" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:196 -#: client/src/notifications/notificationTemplates.form.js:197 -msgid "Source Phone Number" -msgstr "" - -#: client/features/output/output.strings.js:70 -msgid "Source Project" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:168 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:175 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:192 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:199 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:216 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:223 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:233 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:240 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:250 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:257 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:267 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:274 -msgid "Source Variables" -msgstr "" - -#: client/src/partials/logviewer.html:9 -msgid "Source Vars" -msgstr "" - -#: client/features/output/output.strings.js:94 -#: client/src/workflow-results/workflow-results.controller.js:77 -msgid "Source Workflow" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:39 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:163 -msgid "Sources" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:392 -msgid "Specify HTTP Headers in JSON format. Refer to the Ansible Tower documentation for example syntax." -msgstr "" - -#: client/src/credentials/credentials.form.js:284 -msgid "Specify a method for %s operations. This is equivalent to specifying the %s parameter, where %s could be %s" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:546 -msgid "Specify a notification color. Acceptable colors are hex color code (example: #3af or #789abc) ." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:347 -msgid "Specify a notification color. Acceptable colors are: yellow, green, red purple, gray or random." -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:20 -msgid "Specify a scope for the token's access" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:404 -msgid "Specify an HTTP method for the webhook. Acceptable choices are: POST or PUT" -msgstr "" - -#: client/features/output/output.strings.js:135 -msgid "Standard Error" -msgstr "" - -#: client/features/output/output.strings.js:134 -#: client/src/partials/logviewer.html:5 -msgid "Standard Out" -msgstr "" - -#: client/src/notifications/notifications.list.js:53 -msgid "Start" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:42 -#: client/src/scheduler/scheduler.strings.js:23 -msgid "Start Date" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:569 -msgid "Start Message" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:580 -msgid "Start Message Body" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 -#: client/src/scheduler/scheduler.strings.js:24 -msgid "Start Time" -msgstr "" - -#: client/lib/services/base-string.service.js:140 -msgid "Start Time (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:141 -msgid "Start Time (Descending)" -msgstr "" - -#: client/lib/components/components.strings.js:110 -msgid "Start a job using this template" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:6 -msgid "Start sync process" -msgstr "" - -#: client/features/jobs/jobs.strings.js:9 -#: client/features/output/output.strings.js:95 -#: client/src/workflow-results/workflow-results.controller.js:71 -msgid "Started" -msgstr "" - -#: client/features/output/output.strings.js:96 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:55 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:55 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:43 -#: client/src/notifications/notification-templates-list/list.controller.js:71 -#: client/src/partials/logviewer.html:4 -#: client/src/workflow-results/workflow-results.controller.js:74 -msgid "Status" -msgstr "" - -#: client/src/license/license.partial.html:203 -msgid "Submit" -msgstr "" - -#: client/features/output/output.strings.js:112 -msgid "Submit search" -msgstr "" - -#: client/src/license/license.partial.html:27 -msgid "Subscription" -msgstr "" - -#: client/src/credentials/credentials.form.js:151 -#: client/src/credentials/credentials.form.js:162 -msgid "Subscription ID" -msgstr "" - -#: client/src/credentials/credentials.form.js:161 -msgid "Subscription ID is an Azure construct, which is mapped to a username." -msgstr "" - -#: client/src/notifications/notifications.list.js:65 -msgid "Success" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:592 -msgid "Success Message" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:603 -msgid "Success Message Body" -msgstr "" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:83 -msgid "Successful" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:404 -#: client/src/scheduler/scheduler.strings.js:36 -msgid "Sun" -msgstr "" - -#: client/features/templates/templates.strings.js:32 -msgid "Survey" -msgstr "" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:73 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:478 -msgid "Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch." -msgstr "" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:79 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:186 -msgid "Sync Status" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:62 -msgid "Sync all inventory sources" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:29 -msgid "Sync canceled. Click to view log." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:35 -msgid "Sync completed. Click to view log." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:32 -msgid "Sync failed. Click to view log." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "Sync not performed. Click" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:38 -msgid "Sync pending." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:45 -msgid "Sync running" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:46 -msgid "Sync running. Click to view log." -msgstr "" - -#: client/lib/components/components.strings.js:96 -#: client/src/configuration/settings.partial.html:8 -msgid "System" -msgstr "" - -#: client/src/users/add/users-add.controller.js:12 -#: client/src/users/edit/users-edit.controller.js:12 -#: client/src/users/list/users-list.controller.js:12 -msgid "System Administrator" -msgstr "" - -#: client/src/shared/form-generator.js:1846 -msgid "System Administrators have access to all s" -msgstr "" - -#: client/src/users/add/users-add.controller.js:11 -#: client/src/users/edit/users-edit.controller.js:11 -#: client/src/users/list/users-list.controller.js:11 -msgid "System Auditor" -msgstr "" - -#: client/src/configuration/forms/settings-form.partial.html:3 -msgid "System auditors have read-only permissions in this section." -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:97 -msgid "TACACS+" -msgstr "" - -#: client/features/output/output.strings.js:131 -msgid "TASK" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:23 -#: client/src/organizations/linkout/organizations-linkout.route.js:95 -#: client/src/organizations/list/organizations-list.controller.js:62 -#: client/src/teams/main.js:65 -#: client/src/teams/teams.list.js:14 -#: client/src/teams/teams.list.js:15 -msgid "TEAMS" -msgstr "" - -#: client/features/templates/routes/templatesList.route.js:12 -#: client/features/templates/templates.strings.js:12 -#: client/features/templates/templates.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:44 -#: client/src/templates/templates.list.js:15 -#: client/src/templates/templates.list.js:16 -msgid "TEMPLATES" -msgstr "" - -#: client/lib/services/base-string.service.js:78 -msgid "TEST" -msgstr "" - -#: client/src/instance-groups/instance-groups.list.js:8 -msgid "THERE ARE CURRENTLY NO INSTANCE GROUPS DEFINED" -msgstr "" - -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:103 -msgid "TIME" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:22 -msgid "TOKEN" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:21 -msgid "TOKEN INFORMATION" -msgstr "" - -#: client/features/applications/applications.strings.js:11 -#: client/features/users/tokens/tokens.strings.js:10 -#: client/features/users/tokens/tokens.strings.js:8 -#: client/features/users/tokens/users-tokens-list.route.js:24 -#: client/src/activity-stream/get-target-title.factory.js:50 -msgid "TOKENS" -msgstr "" - -#: client/features/templates/templates.strings.js:122 -msgid "TOTAL NODES" -msgstr "" - -#: client/features/templates/templates.strings.js:55 -#: client/src/templates/job_templates/job-template.form.js:212 -msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:314 -msgid "Tags for the Annotation" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:313 -msgid "Tags for the Annotation (optional)" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:364 -#: client/src/notifications/notificationTemplates.form.js:414 -#: client/src/notifications/notificationTemplates.form.js:453 -msgid "Target URL" -msgstr "" - -#: client/features/output/output.strings.js:118 -msgid "Tasks" -msgstr "" - -#: client/features/credentials/legacy.credentials.js:91 -#: client/src/credentials/credentials.form.js:467 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:136 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:133 -#: client/src/organizations/organizations.form.js:180 -#: client/src/projects/projects.form.js:307 -#: client/src/templates/workflows.form.js:317 -msgid "Team Roles" -msgstr "" - -#: client/lib/services/base-string.service.js:96 -msgid "Team access removal" -msgstr "" - -#: client/lib/components/components.strings.js:81 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:36 -#: client/src/organizations/linkout/organizations-linkout.route.js:103 -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/users/users.form.js:162 -msgid "Teams" -msgstr "" - -#: client/features/templates/templates.strings.js:120 -#: client/src/templates/templates.list.js:14 -#: client/src/workflow-results/workflow-results.controller.js:69 -msgid "Template" -msgstr "" - -#: client/features/templates/templates.strings.js:79 -msgid "Template parameter is missing." -msgstr "" - -#: client/lib/components/components.strings.js:78 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:37 -msgid "Templates" -msgstr "" - -#: client/src/credentials/credentials.form.js:336 -msgid "Tenant ID" -msgstr "" - -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:80 -msgid "Test" -msgstr "" - -#: client/features/credentials/credentials.strings.js:26 -msgid "Test External Credential" -msgstr "" - -#: client/features/credentials/credentials.strings.js:45 -msgid "Test failed." -msgstr "" - -#: client/src/notifications/notificationTemplates.list.js:82 -msgid "Test notification" -msgstr "" - -#: client/features/credentials/credentials.strings.js:44 -msgid "Test passed." -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:13 -msgid "Text" -msgstr "" - -#: client/src/templates/survey-maker/surveys/init.factory.js:14 -msgid "Textarea" -msgstr "" - -#: client/src/shared/form-generator.js:1306 -#: client/src/shared/form-generator.js:1312 -msgid "That value was not found. Please enter or select a valid value." -msgstr "" - -#: client/lib/components/components.strings.js:48 -msgid "That value was not found. Please enter or select a valid value." -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:66 -msgid "The Insights Credential for {{inventory.name}} was not found." -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:32 -#: client/src/credentials/factories/kind-change.factory.js:88 -msgid "The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:" -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "The Project selected has a status of" -msgstr "" - -#: client/src/projects/edit/projects-edit.controller.js:339 -msgid "The SCM update process is running." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:150 -msgid "The amount of time (in seconds) before the email notification stops trying to reach the host and times out. Ranges from 1 to 120 seconds." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:299 -msgid "The amount of time (in seconds) to run before the task is canceled. Defaults to 0 for no job timeout." -msgstr "" - -#: client/features/templates/templates.strings.js:154 -msgid "The amount of time to wait before this approval step is automatically denied. Defaults to 0 for no timeout." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:201 -#: client/src/templates/survey-maker/shared/question-definition.form.js:260 -#: client/src/templates/survey-maker/shared/question-definition.form.js:281 -msgid "The answer is longer than the maximum length. Please make the answer shorter." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:200 -#: client/src/templates/survey-maker/shared/question-definition.form.js:259 -#: client/src/templates/survey-maker/shared/question-definition.form.js:280 -msgid "The answer is shorter than the minimium length. Please make the answer longer." -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:271 -msgid "The base URL of the Grafana server - the /api/annotations endpoint will be added automatically to the base Grafana URL." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:241 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:328 -#: client/src/scheduler/scheduler.strings.js:32 -msgid "The day must be between 1 and 31." -msgstr "" - -#: client/src/configuration/settings.service.js:39 -msgid "The duration (in seconds) access tokens remain valid since their creation." -msgstr "" - -#: client/src/configuration/settings.service.js:47 -msgid "The duration (in seconds) authorization codes remain valid since their creation." -msgstr "" - -#: client/src/configuration/settings.service.js:43 -msgid "The duration (in seconds) refresh tokens remain valid after the expiration of their associated access token." -msgstr "" - -#: client/src/credentials/credentials.form.js:190 -msgid "The email address assigned to the Google Compute Engine %sservice account." -msgstr "" - -#: client/src/projects/projects.form.js:143 -msgid "The first fetches all references. The second fetches the Github pull request number 62, in this example the branch needs to be `pull/62/head`." -msgstr "" - -#: client/features/templates/templates.strings.js:146 -msgid "The following promptable values were provided when this node was created:" -msgstr "" - -#: client/features/output/output.strings.js:12 -msgid "The host status bar will update when the job is complete." -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:62 -#: client/src/credentials/factories/kind-change.factory.js:118 -msgid "The host to authenticate with." -msgstr "" - -#: client/src/credentials/factories/kind-change.factory.js:59 -msgid "The host value" -msgstr "" - -#: client/features/templates/templates.strings.js:137 -msgid "The inventory of this node will be overridden by the parent workflow inventory." -msgstr "" - -#: client/features/templates/templates.strings.js:139 -msgid "The inventory of this node will be overridden if a parent workflow inventory is provided at launch." -msgstr "" - -#: client/features/templates/templates.strings.js:138 -msgid "The inventory of this node will not be overridden by the parent workflow inventory." -msgstr "" - -#: client/features/templates/templates.strings.js:140 -msgid "The inventory of this node will not be overridden if a parent workflow inventory is provided at launch." -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:153 -msgid "The inventory will be in a pending status until the final delete is processed." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:100 -#: client/src/templates/survey-maker/shared/question-definition.form.js:121 -#: client/src/templates/survey-maker/shared/question-definition.form.js:142 -msgid "The maximum length is too low. Please enter a number larger than the minimum length you set." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:120 -#: client/src/templates/survey-maker/shared/question-definition.form.js:141 -#: client/src/templates/survey-maker/shared/question-definition.form.js:99 -msgid "The maximum length you entered is not a valid number. Please enter a whole number." -msgstr "" - -#: client/src/organizations/organizations.form.js:78 -msgid "The maximum number of hosts allowed to be managed by this organization. Value defaults to 0 which means no limit. Refer to the Ansible documentation for more details." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:115 -#: client/src/templates/survey-maker/shared/question-definition.form.js:136 -#: client/src/templates/survey-maker/shared/question-definition.form.js:94 -msgid "The minimium length is too high. Please enter a lower number." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:116 -#: client/src/templates/survey-maker/shared/question-definition.form.js:137 -#: client/src/templates/survey-maker/shared/question-definition.form.js:95 -msgid "The minimum length is too low. Please enter a positive number." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:114 -#: client/src/templates/survey-maker/shared/question-definition.form.js:135 -#: client/src/templates/survey-maker/shared/question-definition.form.js:93 -msgid "The minimum length you entered is not a valid number. Please enter a whole number." -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. An empty value, or a value less than 1 will use the Ansible default which is usually 5. The default number of forks can be overwritten with a change to" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:105 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. Inputting no value will use the default value from the %sansible configuration file%s." -msgstr "" - -#: client/src/credentials/factories/kind-change.factory.js:58 -msgid "The project value" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:552 -msgid "The scheduler options are invalid or incomplete." -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:49 -msgid "The scheduler options are invalid, incomplete, or a date is in the past." -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "The selected project has a status of" -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings and then run an update." -msgstr "" - -#: client/features/projects/projects.strings.js:23 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:52 -msgid "The suggested format for variable names is lowercase and underscore-separated (for example, foo_bar, user_id, host_name, etc.). Variable names with spaces are not allowed." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:126 -#: client/src/scheduler/scheduler.strings.js:25 -msgid "The time must be in HH24:MM:SS format." -msgstr "" - -#: client/lib/services/base-string.service.js:90 -msgid "The {{ resourceType }} is currently being used by other resources." -msgstr "" - -#: client/src/activity-stream/streams.list.js:17 -msgid "There are no events to display at this time" -msgstr "" - -#: client/lib/components/components.strings.js:127 -msgid "There are no jobs awaiting approval" -msgstr "" - -#: client/features/jobs/jobs.strings.js:18 -msgid "There are no running jobs." -msgstr "" - -#: client/features/projects/projects.strings.js:22 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:127 -msgid "There was an error deleting inventory source groups. Returned status:" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:117 -msgid "There was an error deleting inventory source hosts. Returned status:" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:154 -msgid "There was an error deleting inventory source. Returned status:" -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:286 -msgid "There was an error resetting value. Returned status:" -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:615 -msgid "There was an error resetting values. Returned status:" -msgstr "" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:235 -msgid "There was an error testing the log aggregator. Returned status:" -msgstr "" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:29 -msgid "These are the modules that {{BRAND_NAME}} supports running commands against." -msgstr "" - -#: client/features/templates/templates.strings.js:106 -msgid "This Job Template has a credential that requires a password. Credentials requiring passwords on launch are not permitted on workflow nodes." -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:59 -msgid "This Job Template has a default credential that requires a password before launch. Adding or editing schedules is prohibited while this credential is selected. To add or edit a schedule, credentials that require a password must be removed from the Job Template." -msgstr "" - -#: client/features/templates/templates.strings.js:105 -msgid "This Job Template is missing a default inventory or project. This must be addressed in the Job Template form before this node can be saved." -msgstr "" - -#: client/src/credential-types/credential-types.strings.js:8 -msgid "This credential type is currently being used by one or more credentials. Credentials that use this credential type must be deleted before the credential type can be deleted." -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:14 -msgid "This feature is currently in tech preview and is subject to change in a future release. Click here for documentation." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:328 -msgid "This field is ignored unless an Enabled Variable is set. If the enabled variable matches this value, the host will be enabled on import." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:25 -msgid "This group contains at least one group or host" -msgstr "" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:50 -#: client/src/templates/workflows.form.js:74 -msgid "This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:174 -msgid "This is not a valid number." -msgstr "" - -#: client/src/credentials/factories/become-method-change.factory.js:59 -#: client/src/credentials/factories/kind-change.factory.js:115 -msgid "This is the tenant name. This value is usually the same as the username." -msgstr "" - -#: client/features/templates/templates.strings.js:75 -msgid "This job template has a default {{typeLabel}} credential which must be included or replaced before proceeding." -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "This list is populated by inventories added from the" -msgstr "" - -#: client/src/notifications/notifications.list.js:21 -msgid "This list is populated by notification templates added from the %sNotifications%s section" -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "This list is populated by projects added from the" -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -msgid "This list is populated by teams added from the" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:4 -msgid "This machine has not checked in with Insights in {{last_check_in}} hours" -msgstr "" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:49 -msgid "This question variable is already in use. Please enter a different variable name." -msgstr "" - -#: client/src/shared/form-generator.js:707 -msgid "This setting has been set manually in a settings file and is now disabled." -msgstr "" - -#: client/src/users/users.form.js:167 -msgid "This user is not a member of any teams" -msgstr "" - -#: client/src/shared/form-generator.js:828 -#: client/src/shared/form-generator.js:920 -msgid "This value does not match the password you entered previously. Please confirm that password." -msgstr "" - -#: client/src/configuration/forms/settings-form.controller.js:488 -msgid "This will reset all configuration values to their factory defaults. Are you sure you want to proceed?" -msgstr "" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:51 -msgid "This workflow job template has a default inventory which must be included or replaced before proceeding." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:444 -#: client/src/scheduler/scheduler.strings.js:40 -msgid "Thu" -msgstr "" - -#: client/src/activity-stream/streams.list.js:25 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:18 -#: client/src/notifications/notification-templates-list/list.controller.js:72 -msgid "Time" -msgstr "" - -#: client/src/license/license.partial.html:45 -msgid "Time Remaining" -msgstr "" - -#: client/src/projects/projects.form.js:228 -msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:395 -msgid "Time in seconds to consider an inventory sync to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest sync. If it is older than Cache Timeout, it is not considered current, and a new inventory sync will be performed." -msgstr "" - -#: client/features/templates/templates.strings.js:156 -#: client/src/notifications/notificationTemplates.form.js:136 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/templates/job_templates/job-template.form.js:290 -#: client/src/templates/job_templates/job-template.form.js:296 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:137 -msgid "Timeout" -msgstr "" - -#: client/src/credentials/credentials.form.js:125 -msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." -msgstr "" - -#: client/features/output/output.strings.js:120 -msgid "Toggle expanded output" -msgstr "" - -#: client/src/shared/form-generator.js:850 -msgid "Toggle the display of plaintext." -msgstr "" - -#: client/src/notifications/shared/type-change.service.js:37 -#: client/src/notifications/shared/type-change.service.js:46 -msgid "Token" -msgstr "" - -#: client/features/applications/applications.strings.js:16 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 -#: client/src/users/users.form.js:242 -msgid "Tokens" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:10 -msgid "Total Issues" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:23 -msgid "Total Jobs" -msgstr "" - -#: client/src/workflow-results/workflow-results.controller.js:91 -msgid "Total Nodes" -msgstr "" - -#: client/src/partials/logviewer.html:6 -msgid "Traceback" -msgstr "" - -#: client/src/license/license.partial.html:176 -msgid "Tracking and Analytics" -msgstr "" - -#: client/src/license/license.partial.html:233 -msgid "Trial" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:424 -#: client/src/scheduler/scheduler.strings.js:38 -msgid "Tue" -msgstr "" - -#: client/src/credentials/credentials.form.js:60 -#: client/src/credentials/credentials.form.js:84 -#: client/src/inventories-hosts/inventories/inventory.list.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:45 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:44 -#: client/src/notifications/notifications.list.js:33 -#: client/src/projects/projects.list.js:50 -#: client/src/scheduler/scheduled-jobs.list.js:47 -#: client/src/teams/teams.form.js:142 -#: client/src/templates/templates.list.js:31 -#: client/src/users/users.form.js:206 -msgid "Type" -msgstr "" - -#: client/features/credentials/credentials.strings.js:18 -#: client/src/credentials/credentials.form.js:23 -#: client/src/notifications/notificationTemplates.form.js:26 -msgid "Type Details" -msgstr "" - -#: client/features/templates/templates.strings.js:145 -msgid "UNLINK" -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:190 -#: client/src/projects/edit/projects-edit.controller.js:311 -msgid "URL popover text" -msgstr "" - -#: client/src/license/license.partial.html:132 -#: client/src/login/loginModal/loginModal.partial.html:61 -msgid "USERNAME" -msgstr "" - -#: client/src/activity-stream/get-target-title.factory.js:20 -#: client/src/organizations/linkout/organizations-linkout.route.js:43 -#: client/src/organizations/list/organizations-list.controller.js:55 -#: client/src/users/users.list.js:18 -#: client/src/users/users.list.js:19 -#: client/src/users/users.route.js:8 -msgid "USERS" -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:597 -msgid "UTC" -msgstr "" - -#: client/lib/services/base-string.service.js:144 -msgid "UUID (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:145 -msgid "UUID (Descending)" -msgstr "" - -#: client/lib/components/components.strings.js:25 -msgid "Unable to Submit" -msgstr "" - -#: client/features/templates/templates.strings.js:96 -msgid "Unable to copy template." -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:67 -msgid "Unable to delete instance group." -msgstr "" - -#: client/features/templates/templates.strings.js:92 -msgid "Unable to delete template." -msgstr "" - -#: client/features/templates/templates.strings.js:94 -msgid "Unable to determine template type." -msgstr "" - -#: client/features/templates/templates.strings.js:81 -msgid "Unable to determine this template's type while copying." -msgstr "" - -#: client/features/templates/templates.strings.js:82 -msgid "Unable to determine this template's type while deleting." -msgstr "" - -#: client/features/templates/templates.strings.js:83 -msgid "Unable to determine this template's type while editing." -msgstr "" - -#: client/features/templates/templates.strings.js:84 -msgid "Unable to determine this template's type while launching." -msgstr "" - -#: client/features/templates/templates.strings.js:85 -msgid "Unable to determine this template's type while scheduling." -msgstr "" - -#: client/features/templates/templates.strings.js:91 -msgid "Unable to edit template." -msgstr "" - -#: client/src/shared/stateDefinitions.factory.js:231 -msgid "Unable to get resource:" -msgstr "" - -#: client/features/templates/templates.strings.js:93 -msgid "Unable to launch template." -msgstr "" - -#: client/features/templates/templates.strings.js:95 -msgid "Unable to schedule job." -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:49 -msgid "Unavailable" -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:48 -msgid "Unavailable to run jobs." -msgstr "" - -#: client/lib/components/components.strings.js:27 -msgid "Unexpected Error" -msgstr "" - -#: client/lib/components/components.strings.js:26 -msgid "Unexpected server error. View the console for more information" -msgstr "" - -#: client/src/license/license.partial.html:59 -msgid "Unlimited" -msgstr "" - -#: client/lib/components/components.strings.js:39 -msgid "Unsupported display model type" -msgstr "" - -#: client/lib/components/components.strings.js:31 -msgid "Unsupported input type" -msgstr "" - -#: client/features/projects/projects.strings.js:33 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Update Not Found" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:334 -msgid "Update Options" -msgstr "" - -#: client/src/projects/projects.form.js:197 -msgid "Update Revision on Launch" -msgstr "" - -#: client/features/projects/projects.strings.js:44 -#: client/src/projects/factories/get-project-tool-tip.factory.js:30 -msgid "Update canceled. Click for details" -msgstr "" - -#: client/features/projects/projects.strings.js:42 -#: client/src/projects/factories/get-project-tool-tip.factory.js:24 -msgid "Update failed. Click for details" -msgstr "" - -#: client/src/projects/edit/projects-edit.controller.js:339 -msgid "Update in Progress" -msgstr "" - -#: client/features/projects/projects.strings.js:43 -#: client/src/projects/factories/get-project-tool-tip.factory.js:27 -msgid "Update missing. Click for details" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:362 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:367 -msgid "Update on Launch" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:373 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:379 -msgid "Update on Project Update" -msgstr "" - -#: client/features/projects/projects.strings.js:39 -#: client/src/projects/factories/get-project-tool-tip.factory.js:14 -msgid "Update queued. Click for details" -msgstr "" - -#: client/features/projects/projects.strings.js:40 -#: client/src/projects/factories/get-project-tool-tip.factory.js:18 -msgid "Update running. Click for details" -msgstr "" - -#: client/src/configuration/settings.partial.html:6 -msgid "Update settings pertaining to Jobs within Tower" -msgstr "" - -#: client/features/projects/projects.strings.js:41 -#: client/src/projects/factories/get-project-tool-tip.factory.js:21 -msgid "Update succeeded. Click for details" -msgstr "" - -#: client/src/license/license.partial.html:75 -msgid "Upgrade" -msgstr "" - -#: client/src/license/license.partial.html:111 -msgid "Upload a license file" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:62 -#: client/src/organizations/organizations.form.js:48 -#: client/src/projects/projects.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:257 -msgid "Use Default Environment" -msgstr "" - -#: client/src/notifications/add/add.controller.js:98 -#: client/src/notifications/edit/edit.controller.js:139 -msgid "Use SSL" -msgstr "" - -#: client/src/notifications/add/add.controller.js:97 -#: client/src/notifications/edit/edit.controller.js:138 -msgid "Use TLS" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:558 -msgid "Use custom messages to change the content of notifications sent when a job starts, succeeds, or fails. Use curly braces to access information about the job: {{ job_friendly_name }}, {{ url }}, or attributes of the job such as {{ job.status }}. You may apply a number of possible variables in the message. Refer to the Ansible Tower documentation for more details." -msgstr "" - -#: client/src/instance-groups/instance-groups.strings.js:24 -#: client/src/instance-groups/instance-groups.strings.js:50 -msgid "Used Capacity" -msgstr "" - -#: client/src/credentials/credentials.form.js:76 -msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." -msgstr "" - -#: client/features/credentials/legacy.credentials.js:80 -#: client/src/credentials/credentials.form.js:456 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:125 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:122 -#: client/src/organizations/organizations.form.js:128 -#: client/src/organizations/organizations.form.js:169 -#: client/src/projects/projects.form.js:296 -#: client/src/teams/teams.form.js:96 -#: client/src/templates/workflows.form.js:306 -msgid "User" -msgstr "" - -#: client/lib/components/components.strings.js:97 -#: client/src/configuration/settings.partial.html:11 -msgid "User Interface" -msgstr "" - -#: client/src/users/users.form.js:96 -msgid "User Type" -msgstr "" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 -#: client/src/credentials/factories/become-method-change.factory.js:17 -#: client/src/credentials/factories/become-method-change.factory.js:38 -#: client/src/credentials/factories/kind-change.factory.js:16 -#: client/src/credentials/factories/kind-change.factory.js:40 -#: client/src/credentials/factories/kind-change.factory.js:73 -#: client/src/credentials/factories/kind-change.factory.js:94 -#: client/src/notifications/notificationTemplates.form.js:425 -#: client/src/notifications/notificationTemplates.form.js:464 -#: client/src/notifications/notificationTemplates.form.js:64 -#: client/src/users/users.form.js:59 -#: client/src/users/users.list.js:29 -msgid "Username" -msgstr "" - -#: client/lib/services/base-string.service.js:138 -msgid "Username (Ascending)" -msgstr "" - -#: client/lib/services/base-string.service.js:139 -msgid "Username (Descending)" -msgstr "" - -#: client/src/credentials/credentials.form.js:80 -msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for smart inventory sources and for cloud provisioning and deployment in playbook runs." -msgstr "" - -#: client/lib/components/components.strings.js:80 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:38 -#: client/src/organizations/organizations.form.js:110 -#: client/src/teams/teams.form.js:78 -msgid "Users" -msgstr "" - -#: client/src/scheduler/schedulerList.controller.js:46 -msgid "Using a credential that requires a password on launch is prohibited when creating a Job Template schedule" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:11 -msgid "VARIABLES" -msgstr "" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:7 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:7 -msgid "VIEW ALL" -msgstr "" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:90 -msgid "VIEW DATA IN INSIGHTS" -msgstr "" - -#: client/lib/components/components.strings.js:59 -msgid "VIEW LESS" -msgstr "" - -#: client/features/templates/templates.strings.js:143 -msgid "VIEW LINK" -msgstr "" - -#: client/lib/components/components.strings.js:58 -msgid "VIEW MORE" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:48 -msgid "VIEW PER PAGE" -msgstr "" - -#: client/src/license/license.partial.html:10 -msgid "Valid License" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:67 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:46 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:47 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:68 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:63 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:70 -msgid "Variables" -msgstr "" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:25 -#: client/src/templates/prompt/steps/credential/prompt-credential.directive.js:37 -msgid "Vault ID" -msgstr "" - -#: client/features/templates/templates.strings.js:48 -#: client/src/credentials/credentials.form.js:390 -msgid "Vault Password" -msgstr "" - -#: client/features/output/output.strings.js:97 -#: client/features/templates/templates.strings.js:60 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:82 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:91 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:290 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:297 -#: client/src/templates/job_templates/job-template.form.js:189 -#: client/src/templates/job_templates/job-template.form.js:196 -msgid "Verbosity" -msgstr "" - -#: client/src/license/license.partial.html:15 -msgid "Version" -msgstr "" - -#: client/src/activity-stream/streams.list.js:63 -#: client/src/credential-types/credential-types.list.js:64 -#: client/src/credentials/credentials.list.js:82 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:64 -#: client/src/inventories-hosts/inventories/inventory.list.js:118 -#: client/src/inventory-scripts/inventory-scripts.list.js:70 -#: client/src/notifications/notificationTemplates.list.js:96 -#: client/src/scheduler/schedules.list.js:101 -#: client/src/teams/teams.list.js:64 -#: client/src/templates/templates.list.js:101 -#: client/src/users/users.list.js:70 -msgid "View" -msgstr "" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "View Activity Stream" -msgstr "" - -#: client/lib/components/components.strings.js:68 -msgid "View Documentation" -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:52 -msgid "View Insights" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:102 -#: client/src/inventories-hosts/inventory-hosts.strings.js:27 -msgid "View Insights Data" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:161 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:185 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:209 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:284 -msgid "View JSON examples at" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:77 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:76 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:84 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:73 -msgid "View JSON examples at %s" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:13 -msgid "View Less" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:11 -msgid "View More" -msgstr "" - -#: client/src/organizations/list/organizations-list.partial.html:64 -msgid "View Organization" -msgstr "" - -#: client/features/output/output.strings.js:28 -#: client/features/output/output.strings.js:32 -msgid "View Project checkout results" -msgstr "" - -#: client/src/shared/form-generator.js:1672 -#: client/src/templates/job_templates/job-template.form.js:588 -#: client/src/templates/workflows.form.js:343 -msgid "View Survey" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:162 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:186 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:210 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:285 -msgid "View YAML examples at" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.form.js:78 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:77 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:88 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:74 -msgid "View YAML examples at %s" -msgstr "" - -#: client/src/configuration/settings.partial.html:15 -msgid "View and edit your license information" -msgstr "" - -#: client/src/credentials/credentials.list.js:84 -msgid "View credential" -msgstr "" - -#: client/src/credential-types/credential-types.list.js:66 -msgid "View credential type" -msgstr "" - -#: client/lib/components/layout/layout.partial.html:29 -msgid "View documentation" -msgstr "" - -#: client/src/activity-stream/streams.list.js:67 -msgid "View event details" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:92 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:96 -msgid "View group" -msgstr "" - -#: client/src/inventories-hosts/hosts/host.list.js:95 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:96 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:109 -#: client/src/inventories-hosts/inventory-hosts.strings.js:26 -msgid "View host" -msgstr "" - -#: client/src/inventories-hosts/inventories/inventory.list.js:120 -msgid "View inventory" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.list.js:72 -msgid "View inventory script" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:83 -msgid "View job" -msgstr "" - -#: client/src/notifications/notificationTemplates.list.js:98 -msgid "View notification" -msgstr "" - -#: client/src/scheduler/schedules.list.js:103 -msgid "View schedule" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:114 -msgid "View source" -msgstr "" - -#: client/src/teams/teams.list.js:67 -msgid "View team" -msgstr "" - -#: client/src/templates/templates.list.js:103 -msgid "View template" -msgstr "" - -#: client/features/output/output.strings.js:22 -#: client/lib/components/components.strings.js:63 -msgid "View the Credential" -msgstr "" - -#: client/features/output/output.strings.js:26 -msgid "View the Inventory" -msgstr "" - -#: client/features/output/output.strings.js:29 -msgid "View the Job Template" -msgstr "" - -#: client/features/output/output.strings.js:27 -#: client/features/output/output.strings.js:31 -msgid "View the Project" -msgstr "" - -#: client/features/output/output.strings.js:33 -msgid "View the Schedule" -msgstr "" - -#: client/features/output/output.strings.js:35 -msgid "View the User" -msgstr "" - -#: client/src/projects/projects.list.js:115 -msgid "View the project" -msgstr "" - -#: client/src/scheduler/scheduled-jobs.list.js:79 -msgid "View the schedule" -msgstr "" - -#: client/features/output/output.strings.js:34 -#: client/src/workflow-results/workflow-results.controller.js:63 -msgid "View the source Workflow Job" -msgstr "" - -#: client/features/output/output.strings.js:41 -msgid "View the webhook configuration on the job template." -msgstr "" - -#: client/features/output/output.strings.js:42 -#: client/src/workflow-results/workflow-results.controller.js:65 -msgid "View the webhook configuration on the workflow job template." -msgstr "" - -#: client/src/users/users.list.js:73 -msgid "View user" -msgstr "" - -#: client/lib/components/components.strings.js:91 -msgid "Views" -msgstr "" - -#: client/features/templates/templates.strings.js:148 -msgid "WARNING: UNSAVED CHANGES" -msgstr "" - -#: client/src/templates/workflows.form.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js:47 -msgid "WORKFLOW" -msgstr "" - -#: client/features/templates/templates.strings.js:136 -msgid "WORKFLOW VISUALIZER" -msgstr "" - -#: client/features/templates/templates.strings.js:115 -msgid "Wait For Approval" -msgstr "" - -#: client/features/templates/templates.strings.js:121 -#: client/src/scheduler/scheduler.strings.js:58 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:369 -msgid "Warning" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:52 -#: client/src/configuration/forms/settings-form.controller.js:444 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:50 -msgid "Warning: Unsaved Changes" -msgstr "" - -#: client/src/license/license.controller.js:159 -msgid "We were unable to locate licenses associated with this account" -msgstr "" - -#: client/features/jobs/jobs.strings.js:17 -#: client/features/output/output.strings.js:53 -#: client/src/workflow-results/workflow-results.controller.js:88 -msgid "Webhook" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:462 -#: client/src/templates/job_templates/job-template.form.js:473 -#: client/src/templates/workflows.form.js:235 -#: client/src/templates/workflows.form.js:246 -msgid "Webhook Credential" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:430 -#: client/src/templates/job_templates/job-template.form.js:456 -#: client/src/templates/workflows.form.js:203 -#: client/src/templates/workflows.form.js:229 -msgid "Webhook Key" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:405 -#: client/src/templates/job_templates/job-template.form.js:414 -#: client/src/templates/workflows.form.js:178 -#: client/src/templates/workflows.form.js:187 -msgid "Webhook Service" -msgstr "" - -#: client/src/templates/job_templates/job-template.form.js:419 -#: client/src/templates/job_templates/job-template.form.js:425 -#: client/src/templates/workflows.form.js:192 -#: client/src/templates/workflows.form.js:198 -msgid "Webhook URL" -msgstr "" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:78 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:69 -msgid "Webhook services can launch jobs with this job template by making a POST request to this URL." -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:47 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:79 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:70 -msgid "Webhook services can use this as a shared secret." -msgstr "" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:434 -#: client/src/scheduler/scheduler.strings.js:39 -msgid "Wed" -msgstr "" - -#: client/src/license/license.partial.html:82 -msgid "Welcome to Ansible Tower! Please complete the steps below to acquire a license." -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:23 -msgid "Welcome to Ansible {{BRAND_NAME}}!  Please sign in." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:355 -msgid "When not checked, a merge will be performed, combining local variables with those found on the external source." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:344 -msgid "When not checked, local child hosts and groups not found on the external source will remain untouched by the inventory update process." -msgstr "" - -#: client/features/output/output.strings.js:25 -msgid "When this field is true, the job's inventory belongs to an organization that has exceeded it's limit of hosts as defined by the system administrator." -msgstr "" - -#: client/src/projects/projects.form.js:50 -msgid "When this project is used by a Job Template, Organization cannot be changed." -msgstr "" - -#: client/features/templates/templates.strings.js:119 -#: client/src/workflow-results/workflow-results.controller.js:100 -msgid "Workflow" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:638 -msgid "Workflow Approved Message" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:649 -msgid "Workflow Approved Message Body" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:661 -msgid "Workflow Denied Message" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:672 -msgid "Workflow Denied Message Body" -msgstr "" - -#: client/features/jobs/jobs.strings.js:11 -msgid "Workflow Job" -msgstr "" - -#: client/lib/models/models.strings.js:49 -msgid "Workflow Job Template Nodes" -msgstr "" - -#: client/lib/models/models.strings.js:45 -msgid "Workflow Job Templates" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:684 -msgid "Workflow Pending Approval Message" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:695 -msgid "Workflow Pending Approval Message Body" -msgstr "" - -#: client/features/templates/templates.strings.js:14 -#: client/lib/components/components.strings.js:132 -#: client/src/templates/templates.list.js:66 -msgid "Workflow Template" -msgstr "" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:41 -msgid "Workflow Templates" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:707 -msgid "Workflow Timed Out Message" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:718 -msgid "Workflow Timed Out Message Body" -msgstr "" - -#: client/src/shared/form-generator.js:1676 -#: client/src/templates/workflows.form.js:367 -msgid "Workflow Visualizer" -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:31 -msgid "Write" -msgstr "" - -#: client/lib/components/code-mirror/code-mirror.strings.js:13 -#: client/lib/services/base-string.service.js:72 -msgid "YAML" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:159 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:183 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:207 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:282 -msgid "YAML:" -msgstr "" - -#: client/lib/services/base-string.service.js:76 -msgid "YES" -msgstr "" - -#: client/src/notifications/add/add.controller.js:88 -#: client/src/notifications/edit/edit.controller.js:151 -msgid "Yellow" -msgstr "" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:57 -msgid "You can create a job template here." -msgstr "" - -#: client/features/templates/templates.strings.js:101 -msgid "You do not have access to all resources used by this workflow. Resources that you don't have access to will not be copied and will result in an incomplete workflow." -msgstr "" - -#: client/src/projects/factories/get-project-path.factory.js:56 -msgid "You do not have access to view this property" -msgstr "" - -#: client/src/templates/main.js:128 -msgid "You do not have permission to add a job template, or there are no projects available." -msgstr "" - -#: client/src/projects/add/projects-add.controller.js:35 -msgid "You do not have permission to add a project." -msgstr "" - -#: client/src/users/add/users-add.controller.js:45 -msgid "You do not have permission to add a user." -msgstr "" - -#: client/src/templates/main.js:367 -msgid "You do not have permission to add a workflow job template." -msgstr "" - -#: client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js:190 -msgid "You do not have permission to manage this user" -msgstr "" - -#: client/features/templates/templates.strings.js:80 -msgid "You do not have permission to perform this action." -msgstr "" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "You do not have permission to view this job." -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:41 -msgid "You do not have sufficient permissions to edit the host filter." -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:34 -msgid "You have been logged out. Please sign in." -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:51 -#: client/src/configuration/forms/settings-form.controller.js:443 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:49 -msgid "You have unsaved changes. Would you like to proceed without saving?" -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook." -msgstr "" - -#: client/features/projects/projects.strings.js:21 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "Your request to cancel the update was submitted to the task manager." -msgstr "" - -#: client/src/login/loginModal/loginModal.partial.html:28 -msgid "Your session timed out due to inactivity. Please sign in." -msgstr "" - -#: client/index.template.ejs:32 -msgid "Your session will expire in 60 seconds, would you like to continue?" -msgstr "" - -#: client/src/shared/form-generator.js:1169 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "and" -msgstr "" - -#: client/src/activity-stream/factories/build-description.factory.js:133 -msgid "approved" -msgstr "" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "button to view the latest status." -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:27 -msgid "by" -msgstr "" - -#: client/features/jobs/jobs.strings.js:29 -msgid "canceled" -msgstr "" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "characters long." -msgstr "" - -#: client/src/activity-stream/factories/build-description.factory.js:138 -msgid "denied" -msgstr "" - -#: client/features/output/output.strings.js:104 -#: client/src/shared/smart-search/smart-search.partial.html:50 -msgid "documentation" -msgstr "" - -#: client/features/jobs/jobs.strings.js:28 -msgid "error" -msgstr "" - -#: client/features/jobs/jobs.strings.js:27 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -msgid "failed" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "from the" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -#: client/src/inventories-hosts/inventory-hosts.strings.js:8 -msgid "group" -msgid_plural "groups" -msgstr[0] "" -msgstr[1] "" - -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:49 -msgid "groups with sync failures. Click for details" -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:9 -msgid "host" -msgid_plural "hosts" -msgstr[0] "" -msgstr[1] "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:64 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:61 -msgid "hosts with failures. Click for details." -msgstr "" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:146 -msgid "min" -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "missing" -msgstr "" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:21 -msgid "name" -msgstr "" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "never updated" -msgstr "" - -#: client/features/jobs/jobs.strings.js:22 -msgid "new" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:34 -#: client/src/shared/paginate/paginate.partial.html:45 -msgid "of" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:34 -msgid "on" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:31 -msgid "on day" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:35 -msgid "on days" -msgstr "" - -#: client/src/scheduler/scheduler.strings.js:33 -msgid "on the" -msgstr "" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:24 -msgid "organization" -msgstr "" - -#: client/features/jobs/jobs.strings.js:23 -msgid "pending" -msgstr "" - -#: client/src/shared/form-generator.js:1044 -msgid "playbook" -msgstr "" - -#: client/features/jobs/jobs.strings.js:25 -msgid "running" -msgstr "" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:150 -msgid "sec" -msgstr "" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "section" -msgstr "" - -#: client/features/credentials/credentials.strings.js:35 -msgid "selected" -msgstr "" - -#: client/src/credentials/credentials.form.js:138 -#: client/src/credentials/credentials.form.js:363 -msgid "set in helpers/credentials" -msgstr "" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:47 -msgid "sources with sync failures. Click for details" -msgstr "" - -#: client/features/jobs/jobs.strings.js:26 -msgid "successful" -msgstr "" - -#: client/src/activity-stream/factories/build-description.factory.js:136 -msgid "timed out" -msgstr "" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "to" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "to start it now." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "to update." -msgstr "" - -#: client/src/activity-stream/factories/build-description.factory.js:141 -msgid "updated" -msgstr "" - -#: client/src/credentials/credentials.form.js:380 -msgid "v2 URLs%s - leave blank" -msgstr "" - -#: client/src/credentials/credentials.form.js:381 -msgid "v3 default%s - set to 'default'" -msgstr "" - -#: client/src/credentials/credentials.form.js:382 -msgid "v3 multi-domain%s - your domain name" -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:278 -msgid "view azure_rm.ini in the Ansible community.general github repo." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -msgid "view cloudforms.ini in the Ansible Collections github repo." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:179 -msgid "view ec2.ini in the community.aws repo." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:261 -msgid "view foreman.ini in the Ansible Collections github repo." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:227 -msgid "view openstack.yml in the Openstack github repo." -msgstr "" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:203 -msgid "view vmware_inventory.ini in the vmware community repo." -msgstr "" - -#: client/features/jobs/jobs.strings.js:24 -msgid "waiting" -msgstr "" - -#: client/index.template.ejs:158 -msgid "working..." -msgstr "" - -#: client/features/users/tokens/tokens.strings.js:42 -msgid "{{ appName }} Token" -msgstr "" - -#: client/lib/services/base-string.service.js:158 -msgid "{{ header }} {{ body }}" -msgstr "" - -#: client/lib/services/base-string.service.js:80 -msgid "{{ resource }} successfully created" -msgstr "" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:31 -msgid "{{ str1 }}

{{ str2 }}

" -msgstr "" - -#: client/lib/components/cards/card.partial.html:2 -msgid "{{ title }}" -msgstr "" - -#: client/src/instance-groups/container-groups/add-container-group.view.html:24 -msgid "{{ vm.form.extraVars.toggleLabel }}" -msgstr "" - -#: client/src/configuration/forms/settings-form.partial.html:10 -#: client/src/configuration/forms/settings-form.route.js:15 -msgid "{{ vm.getCurrentFormTitle() }}" -msgstr "" - -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:5 -msgid "{{:: vm.strings.get('prompt.JOB_TYPE') }}" -msgstr "" - -#: client/lib/components/input/label.partial.html:5 -msgid "{{::state._hint}}" -msgstr "" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:6 -#: client/src/configuration/forms/system-form/configuration-system.partial.html:5 -msgid "{{opt.label}}" -msgstr "" - -#: client/src/shared/paginate/paginate.partial.html:56 -msgid "{{pageSize}}" -msgstr "" diff --git a/awx/ui/po/es.po b/awx/ui/po/es.po deleted file mode 100644 index fdc1229418..0000000000 --- a/awx/ui/po/es.po +++ /dev/null @@ -1,8185 +0,0 @@ -msgid "" -msgstr "" -"Language: es \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" - -#: client/src/projects/add/projects-add.controller.js:166 -#: client/src/projects/edit/projects-edit.controller.js:287 -msgid "%sNote:%s Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." -msgstr "%sNote:%s Mercurial no admite autentificación de contraseña para SSH. No introduzca el nombre de usuario y la clave en la URL. Si utiliza Bitbucket y SSH, no indique su nombre de usuario de Bitbucket." - -#: client/src/projects/add/projects-add.controller.js:145 -#: client/src/projects/edit/projects-edit.controller.js:266 -msgid "%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." -msgstr "%sNote:%s Si utiliza el protocolo SSH para GitHub o Bitbucket, ingrese solo la clave de SSH; no ingrese un nombre de usuario (distinto de git). Además, GitHub y Bitbucket no admiten la autentificación de contraseña cuando se utiliza SSH. El protocolo de solo lectura de GIT (git://) no utiliza información de nombre de usuario o contraseña." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:62 -msgid "(HH24:MM:SS UTC)" -msgstr "(HH24:MM:SS UTC)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:57 -msgid "(HH24:MM:SS)" -msgstr "(HH24:MM:SS)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:568 -msgid "(Limited to first 10)" -msgstr "(Limitado a los primeros 10)" - -#: client/src/credentials/credentials.form.js:286 -msgid "(defaults to %s)" -msgstr "(valores predeterminados a %s)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -msgid "(seconds)" -msgstr "(segundos)" - -#: client/src/shared/paginate/paginate.partial.html:67 -msgid "100" -msgstr "100" - -#: client/src/shared/paginate/paginate.partial.html:61 -msgid "20" -msgstr "20" - -#: client/src/shared/paginate/paginate.partial.html:64 -msgid "50" -msgstr "50" - -#: client/src/license/license.partial.html:193 -msgid "Automation analytics: This data is used to enhance future releases of the Tower Software and to provide Automation Analytics to Tower subscribers." -msgstr "Automation Analytics: estos datos se utilizan para mejorar futuras versiones del software de Tower y ofrecer Automation Analytics a los suscriptores de Tower." - -#: client/src/license/license.partial.html:171 -msgid "I agree to the End User License Agreement" -msgstr "Yo acepto el Acuerdo de licencia de usuario final" - -#: client/src/license/license.partial.html:187 -msgid "User analytics: This data is used to enhance future releases of the Tower Software and help streamline customer experience and success." -msgstr "Análisis de usuarios: estos datos se utilizan para mejorar futuras versiones del software de Tower y ayudar a optimizar el éxito y la experiencia del cliente." - -#: client/src/login/loginModal/loginModal.partial.html:32 -msgid "" -"\n" -"
\n" -" You have been logged out. Please sign in.\n" -"
" -msgstr "\n" -"
\n" -" Se ha cerrado su sesión. Inicie sesión.\n" -"
" - -#: client/lib/components/code-mirror/code-mirror.strings.js:19 -msgid "" -"

\n" -" Enter inventory variables using either JSON or YAML\n" -" syntax. Use the radio button to toggle between the two.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" View YAML examples at\n" -" \n" -" docs.ansible.com\n" -"

" -msgstr "

\n" -" Ingrese las variables del inventario usando la sintaxis de JSON o YAML. Utilice el botón de opción para alternar entre los dos.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" Vea los ejemplos de JSON en\n" -" www.json.org\n" -"

\n" -"

\n" -" Vea los ejemplos de YAML en\n" -" \n" -" docs.ansible.com\n" -"

" - -#: client/features/templates/templates.strings.js:65 -msgid "

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" -msgstr "

Traslade variables de línea de comando adicionales al cuaderno de estrategias. Este es el parámetro de línea de comando -e o --extra vars para el cuaderno de estrategias de Ansible. Proporcione pares de claves/valores utilizando YAML o JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:213 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:222 -msgid "A NEW WEBHOOK KEY WILL BE GENERATED ON SAVE" -msgstr "SE GENERARÁ UNA NUEVA CLAVE DE WEBHOOK AL GUARDAR" - -#: client/src/projects/projects.form.js:138 -msgid "A refspec to fetch (passed to the Ansible git module). This parameter allows access to references via the branch field not otherwise available." -msgstr "Un refspec para buscar (pasado al módulo git de Ansible). Este parámetro permite el acceso a las referencias a través del campo de rama no disponible de otra manera." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 -#: client/src/scheduler/scheduler.strings.js:22 -msgid "A schedule name is required." -msgstr "Un nombre para el planificador es necesario." - -#: client/src/users/add/users-add.controller.js:104 -msgid "A value is required" -msgstr "Un valor es necesario" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:173 -msgid "A value is required." -msgstr "Un valor es necesario." - -#: client/src/about/about.route.js:10 -msgid "ABOUT" -msgstr "ACERCA DE" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:18 -msgid "ACTION" -msgstr "ACCIÓN" - -#: client/src/activity-stream/activity-detail.form.js:23 -msgid "ACTIVITY DETAIL" -msgstr "DETALLES DE ACTIVIDAD" - -#: client/src/activity-stream/activitystream.route.js:28 -#: client/src/activity-stream/streams.list.js:14 -#: client/src/activity-stream/streams.list.js:15 -msgid "ACTIVITY STREAM" -msgstr "FLUJO DE ACTIVIDAD" - -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:7 -msgid "ADD" -msgstr "AÑADIR" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:3 -msgid "ADD A NEW TEMPLATE" -msgstr "AÑADIR UNA NUEVA PLANTILLA" - -#: client/features/templates/templates.strings.js:123 -msgid "ADD A NODE" -msgstr "AÑADIR UN NODO" - -#: client/features/templates/templates.strings.js:141 -msgid "ADD LINK" -msgstr "AGREGAR ENLACE" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:16 -msgid "ADD SURVEY PROMPT" -msgstr "AGREGAR AVISO DE ENCUESTA" - -#: client/src/shared/smart-search/smart-search.partial.html:48 -msgid "ADDITIONAL INFORMATION" -msgstr "INFORMACIÓN ADICIONAL" - -#: client/features/output/output.strings.js:101 -msgid "ADDITIONAL_INFORMATION" -msgstr "ADDITIONAL_INFORMATION" - -#: client/src/organizations/linkout/organizations-linkout.route.js:241 -#: client/src/organizations/list/organizations-list.controller.js:90 -msgid "ADMINS" -msgstr "ADMINS" - -#: client/src/activity-stream/get-target-title.factory.js:4 -msgid "ALL ACTIVITY" -msgstr "TODA LA ACTIVIDAD" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:44 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js:47 -msgid "ALL GROUPS" -msgstr "TODOS LOS GRUPOS" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "ANY" -msgstr "CUALQUIERA" - -#: client/src/credentials/credentials.form.js:198 -msgid "API Key" -msgstr "Clave API" - -#: client/src/notifications/notificationTemplates.form.js:263 -msgid "API Service/Integration Key" -msgstr "Servicio API/Clave de integración" - -#: client/src/notifications/shared/type-change.service.js:66 -msgid "API Token" -msgstr "Token API" - -#: client/src/notifications/notificationTemplates.form.js:348 -msgid "API URL" -msgstr "URL DE API" - -#: client/features/users/tokens/tokens.strings.js:40 -msgid "APPLICATION" -msgstr "APLICACIÓN" - -#: client/features/applications/applications.strings.js:23 -msgid "APPLICATION INFORMATION" -msgstr "INFORMACIÓN DE LA APLICACIÓN" - -#: client/features/applications/applications.strings.js:28 -#: client/features/applications/applications.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:47 -msgid "APPLICATIONS" -msgstr "APLICACIONES" - -#: client/lib/components/components.strings.js:126 -msgid "APPROVAL" -msgstr "APROBACIÓN" - -#: client/features/templates/templates.strings.js:155 -msgid "APPROVAL TIMED OUT" -msgstr "TIEMPO DE APROBACIÓN AGOTADO" - -#: client/lib/components/components.strings.js:128 -msgid "APPROVE" -msgstr "APROBAR" - -#: client/features/templates/templates.strings.js:157 -msgid "APPROVED" -msgstr "APROBADO" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js:19 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js:19 -msgid "ASSOCIATED GROUPS" -msgstr "GRUPOS ASOCIADOS" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js:19 -msgid "ASSOCIATED HOSTS" -msgstr "HOSTS ASOCIADOS" - -#: client/lib/components/components.strings.js:89 -#: client/lib/components/layout/layout.partial.html:24 -msgid "About" -msgstr "Acerca de" - -#: client/lib/components/components.strings.js:93 -msgid "Access" -msgstr "Acceso" - -#: client/src/credentials/credentials.form.js:91 -msgid "Access Key" -msgstr "Clave de acceso" - -#: client/src/configuration/settings.service.js:40 -msgid "Access Token Expiration" -msgstr "Expiración del token de acceso" - -#: client/src/notifications/notificationTemplates.form.js:241 -msgid "Account SID" -msgstr "Cuenta SID" - -#: client/src/notifications/notificationTemplates.form.js:200 -msgid "Account Token" -msgstr "Cuenta Token" - -#: client/src/activity-stream/activity-detail.form.js:36 -msgid "Action" -msgstr "Acción" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:21 -#: client/src/inventories-hosts/hosts/hosts.partial.html:49 -#: client/src/shared/form-generator.js:1872 -#: client/src/shared/list-generator/list-generator.factory.js:571 -msgid "Actions" -msgstr "Acciones" - -#: client/features/templates/templates.strings.js:18 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:18 -#: client/src/templates/templates.list.js:36 -msgid "Activity" -msgstr "Actividad" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:84 -msgid "Activity Stream" -msgstr "Flujo de actividad" - -#: client/features/credentials/legacy.credentials.js:70 -#: client/src/credentials/credentials.form.js:446 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:113 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:110 -#: client/src/organizations/organizations.form.js:108 -#: client/src/organizations/organizations.form.js:150 -#: client/src/projects/projects.form.js:285 -#: client/src/teams/teams.form.js:169 -#: client/src/teams/teams.form.js:85 -#: client/src/templates/workflows.form.js:295 -#: client/src/users/users.form.js:221 -msgid "Add" -msgstr "Añadir" - -#: client/src/instance-groups/instance-groups.strings.js:74 -msgid "Add Container Group" -msgstr "Agregar grupo de contenedores" - -#: client/src/instance-groups/instance-groups.strings.js:75 -msgid "Add Credential" -msgstr "Agregar credencial" - -#: client/src/credentials/credentials.list.js:14 -msgid "Add Credentials" -msgstr "Añadir credencial" - -#: client/src/inventories-hosts/inventories/inventory.list.js:13 -msgid "Add Inventories" -msgstr "Añadir inventarios" - -#: client/src/shared/stateDefinitions.factory.js:304 -msgid "Add Permissions" -msgstr "Añadir permisos" - -#: client/src/projects/projects.list.js:13 -msgid "Add Project" -msgstr "Añadir proyecto" - -#: client/src/shared/form-generator.js:1664 -#: client/src/templates/job_templates/job-template.form.js:596 -#: client/src/templates/workflows.form.js:351 -msgid "Add Survey" -msgstr "Añadir cuestionario" - -#: client/src/teams/teams.list.js:13 -msgid "Add Team" -msgstr "Añadir equipo" - -#: client/src/teams/teams.form.js:86 -msgid "Add User" -msgstr "Añadir usuario" - -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/shared/stateDefinitions.factory.js:594 -#: client/src/users/users.list.js:17 -msgid "Add Users" -msgstr "Añadir usuarios" - -#: client/src/organizations/organizations.form.js:109 -msgid "Add Users to this organization." -msgstr "Añadir usuarios a la organización." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:58 -msgid "Add a group" -msgstr "Agregar un grupo" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:135 -msgid "Add a host" -msgstr "Agregar un host" - -#: client/src/instance-groups/instance-groups.strings.js:44 -msgid "Add a new instance" -msgstr "Agregar una nueva instancia" - -#: client/src/instance-groups/instance-groups.strings.js:25 -msgid "Add a new instance group" -msgstr "Agregar un nuevo grupo de instancias" - -#: client/src/organizations/list/organizations-list.partial.html:20 -msgid "Add a new organization" -msgstr "Agregar una nueva organización" - -#: client/features/projects/projects.strings.js:14 -msgid "Add a new project" -msgstr "Agregar un nuevo proyecto" - -#: client/src/scheduler/schedules.list.js:81 -msgid "Add a new schedule" -msgstr "Añadir un nuevo planificador" - -#: client/features/templates/templates.strings.js:24 -msgid "Add a new template" -msgstr "Agregar una nueva plantilla" - -#: client/features/users/tokens/tokens.strings.js:43 -msgid "Add a new token" -msgstr "Agregar un nuevo token" - -#: client/features/credentials/legacy.credentials.js:71 -#: client/src/credentials/credentials.form.js:447 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:115 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:112 -#: client/src/organizations/organizations.form.js:151 -#: client/src/projects/projects.form.js:286 -#: client/src/templates/job_templates/job-template.form.js:541 -#: client/src/templates/workflows.form.js:296 -msgid "Add a permission" -msgstr "Añadir un permiso" - -#: client/src/organizations/linkout/organizations-linkout.route.js:63 -msgid "Add existing user to organization" -msgstr "Añada un usuario existente a la organización." - -#: client/src/organizations/linkout/organizations-linkout.route.js:256 -msgid "Add existing user to organization as administrator" -msgstr "Añada un usuario existente como administrador." - -#: client/src/shared/form-generator.js:1394 -msgid "Admin" -msgstr "Admin" - -#: client/lib/components/components.strings.js:94 -msgid "Administration" -msgstr "Administración" - -#: client/src/organizations/linkout/organizations-linkout.route.js:262 -msgid "Admins" -msgstr "Administradores" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -msgid "After every project update where the SCM revision changes, refresh the inventory from the selected source before executing job tasks. This is intended for static content, like the Ansible inventory .ini file format." -msgstr "Luego de cada actualización del proyecto en el que se modifique la revisión SCM, actualice el inventario del origen seleccionado antes de llevar a cabo tareas de trabajo. Esto está orientado a contenidos estáticos, como el formato de archivo .ini del inventario Ansible." - -#: client/features/templates/templates.strings.js:160 -#: client/lib/components/components.strings.js:105 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:41 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:49 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:72 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:80 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "All" -msgstr "Todos" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 -msgid "All Activity" -msgstr "Todas las actividades" - -#: client/features/portalMode/index.view.html:33 -msgid "All Jobs" -msgstr "Todos los trabajos" - -#: client/src/projects/projects.form.js:208 -#: client/src/projects/projects.form.js:211 -msgid "Allow branch override" -msgstr "Permitir la invalidación de la rama" - -#: client/src/projects/projects.form.js:210 -msgid "Allow changing the SCM branch or revision in a job template that uses this project." -msgstr "Permitir el cambio de la rama o revisión del SCM en una plantilla de trabajo que utilice este proyecto." - -#: client/features/templates/templates.strings.js:114 -#: client/src/workflow-results/workflow-results.controller.js:97 -msgid "Always" -msgstr "Siempre" - -#: client/features/projects/projects.strings.js:25 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "An SCM update does not appear to be running for project:" -msgstr "Parece que una actualización de SCM no se está ejecutando para el proyecto:" - -#: client/lib/services/base-string.service.js:83 -msgid "Ansible AWX Logo" -msgstr "Logotipo de Ansible AWX" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:66 -#: client/src/organizations/organizations.form.js:47 -#: client/src/organizations/organizations.form.js:52 -#: client/src/projects/projects.form.js:238 -#: client/src/projects/projects.form.js:243 -#: client/src/templates/job_templates/job-template.form.js:255 -#: client/src/templates/job_templates/job-template.form.js:261 -msgid "Ansible Environment" -msgstr "Entorno de Ansible" - -#: client/src/projects/projects.form.js:145 -msgid "Ansible Tower Documentation" -msgstr "Documentación de Ansible Tower" - -#: client/lib/services/base-string.service.js:84 -msgid "Ansible Tower Logo" -msgstr "Logotipo de Ansible Tower" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:62 -#: client/src/templates/survey-maker/shared/question-definition.form.js:68 -msgid "Answer Type" -msgstr "Tipo de respuesta" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:44 -#: client/src/templates/survey-maker/shared/question-definition.form.js:53 -msgid "Answer Variable Name" -msgstr "Nombre de la variable" - -#: client/features/templates/templates.strings.js:161 -msgid "Any" -msgstr "Cualquiera" - -#: client/features/users/tokens/users-tokens-add.controller.js:15 -msgid "Application" -msgstr "Aplicación" - -#: client/lib/components/components.strings.js:87 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 -msgid "Applications" -msgstr "Aplicaciones" - -#: client/features/templates/templates.strings.js:153 -#: client/src/notifications/notifications.list.js:40 -msgid "Approval" -msgstr "Aprobación" - -#: client/src/workflow-results/workflow-results.service.js:87 -msgid "Are you sure you want to cancel this workflow job?" -msgstr "¿Está seguro de que desea cancelar esta tarea de flujo de trabajo?" - -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:110 -msgid "Are you sure you want to delete this job?" -msgstr "¿Está seguro de que desea eliminar este trabajo?" - -#: client/src/notifications/notification-templates-list/list.controller.js:233 -msgid "Are you sure you want to delete this notification template?" -msgstr "¿Está seguro de que quiere eliminar esta plantilla de notificación?" - -#: client/src/scheduler/factories/delete-schedule.factory.js:58 -msgid "Are you sure you want to delete this schedule?" -msgstr "¿Está seguro de que desea eliminar este programa?" - -#: client/src/teams/list/teams-list.controller.js:80 -msgid "Are you sure you want to delete this team?" -msgstr "¿Está seguro de que desea eliminar este equipo?" - -#: client/src/users/list/users-list.controller.js:93 -msgid "Are you sure you want to delete this user?" -msgstr "¿Está seguro de que desea eliminar este usuario?" - -#: client/features/templates/templates.strings.js:110 -msgid "Are you sure you want to delete this workflow node?" -msgstr "¿Está seguro de que desea eliminar este nodo de flujo de trabajo?" - -#: client/src/workflow-results/workflow-results.service.js:42 -msgid "Are you sure you want to delete this workflow?" -msgstr "¿Está seguro de que desea eliminar este flujo de trabajo?" - -#: client/lib/services/base-string.service.js:92 -msgid "Are you sure you want to delete this {{ resourceType }}?" -msgstr "¿Está seguro de que desea eliminar este {{ resourceType }}?" - -#: client/src/partials/survey-maker-modal.html:13 -msgid "Are you sure you want to delete this {{deleteMode}}?" -msgstr "¿Esta seguro de que desea eliminar este {{deleteMode}}?" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:26 -msgid "Are you sure you want to disassociate the group below from" -msgstr "¿Está seguro de que quiere desasociar el siguiente grupo de" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:24 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:27 -msgid "Are you sure you want to disassociate the host below from" -msgstr "¿Está seguro de que quiere desasociar el host indicado de" - -#: client/features/templates/templates.strings.js:149 -msgid "Are you sure you want to exit the Workflow Creator without saving your changes?" -msgstr "¿Está seguro de que desea salir del Creador de flujo de trabajo sin guardar los cambios?" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:46 -msgid "Are you sure you want to permanently delete the group below from the inventory?" -msgstr "¿Está seguro de que quiere eliminar permanentemente el grupo indicado del inventario?" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:104 -msgid "Are you sure you want to permanently delete the host below from the inventory?" -msgstr "¿Está seguro de que quiere eliminar permanentemente el host indicado del inventario?" - -#: client/src/projects/edit/projects-edit.controller.js:242 -msgid "Are you sure you want to remove the %s below from %s?" -msgstr "¿Esa seguro que quiere eliminar el siguiente %s de %s?" - -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:67 -msgid "Are you sure you want to remove the following administrator from this organization?" -msgstr "¿Está seguro de que desea eliminar el siguiente administrador de esta organización?" - -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:66 -msgid "Are you sure you want to remove the following user from this organization?" -msgstr "¿Está seguro de que desea borrar el siguiente usuario de esta organización?" - -#: client/lib/services/base-string.service.js:109 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:109 -msgid "Are you sure you want to submit the request to cancel this job?" -msgstr "¿Está seguro de que desea enviar la solicitud para cancelar este trabajo?" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:39 -msgid "Arguments" -msgstr "Argumentos" - -#: client/features/output/output.strings.js:59 -msgid "Artifacts" -msgstr "Artefactos" - -#: client/src/credentials/credentials.form.js:232 -#: client/src/credentials/credentials.form.js:271 -#: client/src/credentials/credentials.form.js:310 -#: client/src/credentials/credentials.form.js:396 -msgid "Ask at runtime?" -msgstr "¿Preguntar durante la ejecución?" - -#: client/src/instance-groups/instance-groups.strings.js:36 -msgid "Associate an existing Instance" -msgstr "Asociar una instancia existente" - -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:74 -msgid "Associate an existing group" -msgstr "Asociar un grupo existente" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:56 -msgid "Associate this host with a new group" -msgstr "Asociar este host a un nuevo grupo" - -#: client/src/shared/form-generator.js:1396 -msgid "Auditor" -msgstr "Auditor" - -#: client/lib/components/components.strings.js:95 -#: client/src/configuration/settings.partial.html:2 -msgid "Authentication" -msgstr "Identificación" - -#: client/src/credentials/credentials.form.js:72 -msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." -msgstr "Identificación para el acceso a dispositivos de red. Puede incluir claves SSH, usuarios, contraseñas, e información de autorización. Las credenciales de Red son utilizadas al lanzar trabajos que ejecutan playbooks sobre dispositivos de red." - -#: client/src/credentials/credentials.form.js:68 -msgid "Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts." -msgstr "Identificación para máquinas remotas. Puede incluir claves SSH, usuarios, contraseñas e información de sudo. Las credenciales de máquina son utilizadas al lanzar trabajos que ejecutan playbooks contra servidores remotos." - -#: client/src/configuration/settings.service.js:48 -msgid "Authorization Code Expiration" -msgstr "Expiración del código de autorización" - -#: client/src/credentials/credentials.form.js:342 -msgid "Authorize" -msgstr "Autorizar" - -#: client/src/credentials/credentials.form.js:350 -msgid "Authorize Password" -msgstr "Contraseña de autorización" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:241 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:253 -msgid "Availability Zone:" -msgstr "Zona de disponibilidad:" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:91 -msgid "Azure AD" -msgstr "Azure AD" - -#: client/src/shared/directives.js:91 -msgid "BROWSE" -msgstr "NAVEGAR" - -#: client/features/output/output.strings.js:124 -msgid "Back to Top" -msgstr "Volver a la parte superior" - -#: client/src/projects/projects.form.js:82 -msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." -msgstr "Directorio base utilizado para encontrar playbooks. Los directorios encontrados dentro de este directorio serán listados en el desplegable correspondiente a la lista de playbook. Junto a la ruta base y el el directorio del playbook seleccionado se creará la ruta completa para encontrar los playbooks." - -#: client/src/notifications/shared/type-change.service.js:56 -msgid "Basic Auth Password" -msgstr "Contraseña de autenticación básica" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:129 -msgid "Become Privilege Escalation" -msgstr "Activar la escalada de privilegios" - -#: client/features/output/output.strings.js:87 -msgid "Branch" -msgstr "Rama" - -#: client/src/projects/projects.form.js:129 -msgid "Branch to checkout. In addition to branches, you can input tags, commit hashes, and arbitrary refs. Some commit hashes and refs may not be availble unless you also provide a custom refspec." -msgstr "Rama para comprobar. Además de las ramas, puede introducir etiquetas, confirmar hashes y referencias arbitrarias. Algunos hashes y refs de confirmación pueden no estar disponibles, a menos que usted también proporcione un refspec personalizado." - -#: client/features/templates/templates.strings.js:72 -#: client/src/templates/job_templates/job-template.form.js:112 -msgid "Branch to use in job run. Project default used if blank." -msgstr "Rama para usar en la ejecución del trabajo. Se utiliza el proyecto predeterminado si está en blanco." - -#: client/src/license/license.partial.html:113 -msgid "Browse" -msgstr "Navegar" - -#: client/src/license/license.partial.html:180 -msgid "By default, Tower collects and transmits analytics data on Tower usage to Red Hat. There are two categories of data collected by Tower. For more information, see this Tower documentation page. Uncheck the following boxes to disable this feature." -msgstr "De manera predeterminada, Tower recopila y transmite datos analíticos sobre el uso de Tower a Red Hat. Hay dos categorías de datos recopilados por Tower. Para obtener más información, consulte esta página de documentación de Tower. Desmarque las siguientes casillas para deshabilitar esta función." - -#: client/features/templates/templates.strings.js:151 -#: client/lib/services/base-string.service.js:61 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:29 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:50 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:23 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:16 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:16 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:16 -#: client/src/license/license.partial.html:259 -#: client/src/partials/survey-maker-modal.html:17 -#: client/src/partials/survey-maker-modal.html:82 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:17 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:131 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:180 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:68 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:149 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:188 -msgid "CANCEL" -msgstr "CANCELAR" - -#: client/index.template.ejs:116 -msgid "CAUTION: Setting both numerical variables to \"0\" will delete all facts." -msgstr "CUIDADO: al configurar ambas variables numéricas como \"0\" eliminará todos los datos." - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:30 -msgid "CHANGES" -msgstr "MODIFICACIONES" - -#: client/features/templates/templates.strings.js:131 -msgid "CHECK" -msgstr "COMPROBAR" - -#: client/lib/components/components.strings.js:20 -msgid "CHOOSE A FILE" -msgstr "ELEGIR UN ARCHIVO" - -#: client/features/output/output.strings.js:103 -#: client/src/shared/smart-search/smart-search.partial.html:26 -msgid "CLEAR ALL" -msgstr "LIMPIAR TODO" - -#: client/features/applications/applications.strings.js:21 -msgid "CLIENT ID" -msgstr "ID DE CLIENTE" - -#: client/features/applications/applications.strings.js:22 -msgid "CLIENT SECRET" -msgstr "SECRETO DEL CLIENTE" - -#: client/lib/services/base-string.service.js:62 -#: client/lib/services/base-string.service.js:77 -#: client/src/partials/survey-maker-modal.html:83 -msgid "CLOSE" -msgstr "CERRAR" - -#: client/features/jobs/routes/hostCompletedJobs.route.js:27 -#: client/features/jobs/routes/templateCompletedJobs.route.js:28 -#: client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js:28 -msgid "COMPLETED JOBS" -msgstr "TRABAJOS COMPLETADOS" - -#: client/features/templates/templates.strings.js:35 -#: client/src/scheduler/scheduler.strings.js:68 -msgid "CONFIRM" -msgstr "CONFIRMAR" - -#: client/lib/services/base-string.service.js:75 -msgid "COPY" -msgstr "COPIAR" - -#: client/features/users/tokens/tokens.strings.js:25 -msgid "COULD NOT CREATE TOKEN" -msgstr "NO SE PUDO CREAR EL TOKEN" - -#: client/src/instance-groups/instance-groups.strings.js:54 -msgid "CPU" -msgstr "CPU" - -#: client/src/shared/stateDefinitions.factory.js:161 -msgid "CREATE %s" -msgstr "CREAR %s" - -#: client/features/applications/applications.strings.js:9 -msgid "CREATE APPLICATION" -msgstr "CREAR APLICACIÓN" - -#: client/src/instance-groups/instance-groups.strings.js:13 -msgid "CREATE CONTAINER GROUP" -msgstr "CREAR GRUPO DE CONTENEDORES" - -#: client/features/credentials/credentials.strings.js:8 -#: client/src/credentials/credentials.form.js:16 -msgid "CREATE CREDENTIAL" -msgstr "CREAR CREDENCIAL" - -#: client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:16 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:16 -msgid "CREATE GROUP" -msgstr "CREAR GRUPO" - -#: client/src/inventories-hosts/hosts/host.form.js:17 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:17 -#: client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:17 -msgid "CREATE HOST" -msgstr "CREAR HOST" - -#: client/src/instance-groups/instance-groups.strings.js:12 -msgid "CREATE INSTANCE GROUP" -msgstr "CREAR GRUPO DE INSTANCIA" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:8 -msgid "CREATE INVENTORY SOURCE" -msgstr "CREAR FUENTE DE INVENTARIO" - -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js:9 -#: client/src/scheduler/scheduler.strings.js:8 -#: client/src/scheduler/schedules.route.js:161 -#: client/src/scheduler/schedules.route.js:242 -#: client/src/scheduler/schedules.route.js:73 -msgid "CREATE SCHEDULE" -msgstr "CREAR PROGRAMACIÓN" - -#: client/src/management-jobs/scheduler/main.js:83 -msgid "CREATE SCHEDULED JOB" -msgstr "CREAR TRABAJO PROGRAMADO" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:18 -msgid "CREATE SOURCE" -msgstr "CREAR FUENTE" - -#: client/features/users/tokens/tokens.strings.js:18 -#: client/features/users/tokens/tokens.strings.js:9 -#: client/features/users/tokens/users-tokens-add.route.js:49 -msgid "CREATE TOKEN" -msgstr "CREAR TOKEN" - -#: client/features/output/output.strings.js:128 -msgid "CREATED" -msgstr "CREADO" - -#: client/features/credentials/credentials.strings.js:31 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:150 -msgid "CREDENTIAL" -msgstr "CREDENCIAL" - -#: client/src/credential-types/credential-types.form.js:21 -msgid "CREDENTIAL TYPE" -msgstr "TIPO DE CREDENCIAL" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:60 -msgid "CREDENTIAL TYPE:" -msgstr "TIPO DE CREDENCIAL:" - -#: client/src/activity-stream/get-target-title.factory.js:11 -#: client/src/credential-types/credential-types.list.js:12 -#: client/src/credential-types/main.js:44 -msgid "CREDENTIAL TYPES" -msgstr "TIPOS DE CREDENCIAL" - -#: client/features/credentials/legacy.credentials.js:11 -#: client/src/activity-stream/get-target-title.factory.js:17 -#: client/src/credentials/credentials.list.js:15 -#: client/src/credentials/credentials.list.js:16 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:5 -msgid "CREDENTIALS" -msgstr "CREDENCIALES" - -#: client/features/credentials/credentials.strings.js:49 -msgid "CREDENTIALS PERMISSIONS" -msgstr "PERMISOS DE CREDENCIAL" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:408 -#: client/src/projects/projects.form.js:231 -msgid "Cache Timeout" -msgstr "Tiempo de espera de la caché" - -#: client/src/projects/projects.form.js:220 -msgid "Cache Timeout%s (seconds)%s" -msgstr "Tiempo de espera de la caché%s (seconds)%s" - -#: client/src/users/list/users-list.controller.js:85 -msgid "Call to %s failed. DELETE returned status:" -msgstr "Fallo en la llamada a %s. ELIMINAR estado devuelto:" - -#: client/src/projects/edit/projects-edit.controller.js:236 -msgid "Call to %s failed. POST returned status:" -msgstr "Fallo en la llamada a %s. PUBLICAR estado devuelto:" - -#: client/src/management-jobs/card/card.controller.js:29 -msgid "Call to %s failed. Return status: %d" -msgstr "Fallo en la llamada a %s. Estado devuelto: %d" - -#: client/lib/services/base-string.service.js:116 -msgid "Call to {{ path }} failed. {{ action }} returned status: {{ status }}." -msgstr "Llamada a {{ path }} fallida. {{ action }} estado devuelto: {{ status }}." - -#: client/features/output/output.strings.js:18 -#: client/lib/services/base-string.service.js:108 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:187 -#: client/src/configuration/forms/settings-form.controller.js:473 -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:24 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:624 -#: client/src/scheduler/scheduler.strings.js:56 -#: client/src/shared/form-generator.js:1652 -#: client/src/shared/lookup/lookup-modal.partial.html:19 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:33 -#: client/src/workflow-results/workflow-results.controller.js:56 -msgid "Cancel" -msgstr "Cancelar" - -#: client/features/output/output.strings.js:54 -#: client/lib/services/base-string.service.js:110 -msgid "Cancel Job" -msgstr "Cancelar tarea" - -#: client/features/projects/projects.strings.js:31 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Cancel Not Allowed" -msgstr "Cancelación no permitida." - -#: client/src/workflow-results/workflow-results.service.js:84 -msgid "Cancel Workflow" -msgstr "Cancelar el flujo de trabajo" - -#: client/src/workflow-results/workflow-results.partial.html:39 -msgid "Cancel job" -msgstr "Cancelar tarea" - -#: client/src/license/license.strings.js:8 -msgid "Cancel license lookup" -msgstr "Cancelar búsqueda de licencia" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:104 -msgid "Cancel sync process" -msgstr "Cancelar proceso de sincronización" - -#: client/src/projects/projects.list.js:128 -msgid "Cancel the SCM update" -msgstr "Cancelar la actualización de SCM" - -#: client/lib/services/base-string.service.js:122 -msgid "Cancel the {{resourceType}}" -msgstr "Cancelar el {{resourceType}}" - -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:34 -msgid "Cancel unsaved changes" -msgstr "Cancelar cambios no guardados" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:32 -msgid "Canceled. Click for details" -msgstr "Cancelado. Haga clic para mostrar más detalles." - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Cannot find job." -msgstr "No se encontró el trabajo" - -#: client/src/shared/smart-search/smart-search.controller.js:167 -msgid "Cannot search running job" -msgstr "Imposible buscar en trabajos en ejecución." - -#: client/src/instance-groups/instance-groups.list.js:22 -msgid "Capacity" -msgstr "Capacidad" - -#: client/lib/services/base-string.service.js:154 -msgid "Capacity (Ascending)" -msgstr "Capacidad (ascendente)" - -#: client/lib/services/base-string.service.js:155 -msgid "Capacity (Descending)" -msgstr "Capacidad (descendente)" - -#: client/src/projects/projects.form.js:84 -msgid "Change %s when deploying {{BRAND_NAME}} to change this location." -msgstr "Cambie %s al implementar {{BRAND_NAME}} para cambiar esta ubicación." - -#: client/src/activity-stream/activity-detail.form.js:41 -msgid "Changes" -msgstr "Cambios" - -#: client/src/notifications/notificationTemplates.form.js:460 -msgid "Channel" -msgstr "Canal" - -#: client/features/templates/templates.strings.js:73 -msgid "Check" -msgstr "Comprobar" - -#: client/src/shared/form-generator.js:1046 -msgid "Choose a %s" -msgstr "Elegir un %s" - -#: client/src/templates/job_templates/job-template.form.js:407 -#: client/src/templates/workflows.form.js:180 -msgid "Choose a Webhook Service" -msgstr "Elegir un servicio de Webhook" - -#: client/features/templates/templates.strings.js:62 -msgid "Choose a job type" -msgstr "Seleccionar un tipo de tarea" - -#: client/src/templates/job_templates/job-template.form.js:125 -msgid "Choose a playbook" -msgstr "Elegir un cuaderno de estrategias" - -#: client/features/templates/templates.strings.js:63 -msgid "Choose a verbosity" -msgstr "Elegir un nivel de detalle" - -#: client/src/projects/projects.form.js:60 -msgid "Choose an SCM Type" -msgstr "Elija un tipo de SCM" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:64 -msgid "Choose an answer type" -msgstr "Elegir un tipo de respuesta" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:67 -msgid "Choose an answer type or format you want as the prompt for the user. Refer to the Ansible Tower Documentation for more additional information about each option." -msgstr "Especifique el tipo de respuesta o el formato que desee como indicador para el usuario. Consulte la documentación de Ansible Tower para obtener más información sobre cada una de las opciones." - -#: client/src/notifications/notificationTemplates.form.js:560 -msgid "Choose an email option" -msgstr "Elegir una opción de correo electrónico" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:111 -msgid "Choose an inventory file" -msgstr "Escoja un archivo del inventario." - -#: client/src/shared/directives.js:92 -msgid "Choose file" -msgstr "Escoger fichero" - -#: client/src/license/license.partial.html:104 -msgid "Choose your license file, agree to the End User License Agreement, and click submit." -msgstr "Escoja su fichero de licencia, aceptando el Acuerdo de licencia de usuario final, y pulse sobre validar." - -#: client/src/projects/projects.form.js:176 -msgid "Clean" -msgstr "Limpiar" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:299 -msgid "Clear" -msgstr "Borrar" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:64 -msgid "Click for details" -msgstr "Hacer clic para obtener más información" - -#: client/src/shared/list-generator/list-actions.partial.html:59 -#: client/src/shared/list-generator/list-actions.partial.html:66 -msgid "Click for help" -msgstr "Hacer clic para obtener ayuda" - -#: client/features/templates/templates.strings.js:15 -msgid "Click here to open the workflow visualizer" -msgstr "Haga clic aquí para abrir el visualizador de flujos de trabajo" - -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:477 -msgid "Click here to open the workflow visualizer." -msgstr "Haga clic aquí para abrir el visualizador de flujos de trabajo." - -#: client/src/inventories-hosts/inventories/inventory.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new inventory." -msgstr "Haga clic en una fila para seleccionarla, y haga clic en Finalizado una vez terminado. Haga clic en el botón %s para crear un nuevo inventario." - -#: client/src/teams/teams.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new team." -msgstr "Haga clic en una fila para seleccionarla, y haga clic en Finalizado una vez terminado. Haga clic en el botón %s para crear un nuevo equipo." - -#: client/src/templates/templates.list.js:17 -msgid "Click on a row to select it, and click Finished when done. Use the %s button to create a new job template." -msgstr "Haga clic en una fila para seleccionarla, y haga clic en Finalizado una vez terminado. Haga clic en el botón %s para crear una nueva plantilla de trabajo." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:137 -msgid "Click on the regions field to see a list of regions for your cloud provider. You can select multiple regions, or choose" -msgstr "Haga clic en el campo de regiones para ver una lista de regiones para su proveedor de nube. Puede seleccionar varias regiones o elegir" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Click the" -msgstr "Haga clic en" - -#: client/features/templates/templates.strings.js:128 -msgid "Click to edit link" -msgstr "Haga clic aquí para editar el enlace" - -#: client/src/scheduler/scheduler.strings.js:13 -msgid "Click to edit schedule." -msgstr "Haga clic para editar el cronograma." - -#: client/features/templates/templates.strings.js:129 -msgid "Click to view link" -msgstr "Haga clic para ver el enlace" - -#: client/src/credentials/credentials.form.js:320 -msgid "Client ID" -msgstr "ID del cliente" - -#: client/src/notifications/notificationTemplates.form.js:274 -msgid "Client Identifier" -msgstr "Identificador del cliente" - -#: client/src/credentials/credentials.form.js:329 -msgid "Client Secret" -msgstr "Pregunta secreta del cliente" - -#: client/lib/components/code-mirror/modal/code-mirror-modal.partial.html:67 -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:92 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:618 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:7 -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:11 -#: client/src/partials/survey-maker-modal.html:28 -#: client/src/partials/survey-maker-modal.html:7 -#: client/src/scheduler/scheduler.strings.js:55 -#: client/src/scheduler/schedulerForm.partial.html:7 -#: client/src/shared/form-generator.js:1656 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:8 -#: client/src/shared/lookup/lookup-modal.partial.html:9 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:10 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:11 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:61 -msgid "Close" -msgstr "Cerrar" - -#: client/lib/components/components.strings.js:135 -msgid "Close Approvals" -msgstr "Cerrar aprobaciones" - -#: client/features/output/output.strings.js:136 -msgid "Close host event modal" -msgstr "Cerrar modal de evento de host" - -#: client/lib/components/code-mirror/code-mirror.strings.js:7 -msgid "Close variables modal" -msgstr "Cerrar modal de variables" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:26 -msgid "Cloud source not configured." -msgstr "Fuente de nube no configurada." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "Cloud source not configured. Click" -msgstr "Fuente de nube no configurada. Haga clic en" - -#: client/src/credentials/factories/become-method-change.factory.js:80 -#: client/src/credentials/factories/kind-change.factory.js:136 -msgid "CloudForms URL" -msgstr "URL CloudForms" - -#: client/features/output/output.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:201 -msgid "Collapse Output" -msgstr "Colapsar salida" - -#: client/lib/components/components.strings.js:120 -msgid "Compact" -msgstr "Compacto" - -#: client/src/inventories-hosts/hosts/host.form.js:125 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:135 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:155 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:168 -#: client/src/templates/job_templates/job-template.form.js:573 -#: client/src/templates/workflows.form.js:328 -msgid "Completed Jobs" -msgstr "Tareas completadas" - -#: client/src/management-jobs/card/card.partial.html:34 -#: client/src/management-jobs/card/card.partial.html:37 -msgid "Configure Notifications" -msgstr "Configurar las notificaciones" - -#: client/src/users/users.form.js:82 -msgid "Confirm Password" -msgstr "Confirmar la contraseña" - -#: client/src/configuration/forms/settings-form.controller.js:480 -msgid "Confirm Reset" -msgstr "Confirmar la reinicialización" - -#: client/src/configuration/forms/settings-form.controller.js:489 -msgid "Confirm factory reset" -msgstr "Confirmar la reinicialización a valores de fábrica" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "Confirm the removal of the" -msgstr "Confirmar la eliminación de" - -#: client/src/teams/teams.form.js:24 -#: client/src/users/users.form.js:25 -msgid "Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams." -msgstr "Entre en contacto con su Administrador de sistema para que le otorgue los permisos adecuados para añadir y editar Usuarios y Equipos." - -#: client/features/output/output.strings.js:68 -#: client/src/instance-groups/instance-groups.strings.js:78 -msgid "Container Group" -msgstr "Grupo de contenedores" - -#: client/src/instance-groups/instance-groups.strings.js:38 -msgid "Container Groups Help" -msgstr "Ayuda de Grupos de contenedores" - -#: client/lib/components/components.strings.js:130 -msgid "Continue workflow job?" -msgstr "¿Continuar con el trabajo del flujo de trabajo?" - -#: client/features/templates/templates.strings.js:61 -#: client/src/templates/job_templates/job-template.form.js:195 -msgid "Control the level of output ansible will produce as the playbook executes." -msgstr "Controlar el nivel de salida que ansible producirá al ejecutar playbooks." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:336 -msgid "Control the level of output ansible will produce for inventory source update jobs." -msgstr "Controle el nivel de salida que Ansible producirá para las tareas de actualización de fuentes de inventario." - -#: client/features/templates/templates.strings.js:159 -msgid "Convergence" -msgstr "Convergencia" - -#: client/lib/components/components.strings.js:54 -msgid "Copied to clipboard." -msgstr "Copiado al portapapeles." - -#: client/src/credentials/credentials.list.js:73 -#: client/src/inventories-hosts/inventories/inventory.list.js:109 -#: client/src/inventory-scripts/inventory-scripts.list.js:61 -#: client/src/notifications/notificationTemplates.list.js:87 -#: client/src/projects/projects.list.js:106 -#: client/src/templates/templates.list.js:93 -msgid "Copy" -msgstr "Copiar" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:55 -msgid "Copy Inventory" -msgstr "Copiar inventario" - -#: client/src/credentials/credentials.list.js:76 -msgid "Copy credential" -msgstr "Copiar credencial" - -#: client/lib/components/components.strings.js:53 -msgid "Copy full revision to clipboard." -msgstr "Copie la revisión completa al portapapeles." - -#: client/src/inventory-scripts/inventory-scripts.list.js:64 -msgid "Copy inventory script" -msgstr "Copiar script de inventario" - -#: client/src/notifications/notificationTemplates.list.js:90 -msgid "Copy notification" -msgstr "Copiar notificación" - -#: client/src/projects/projects.list.js:109 -msgid "Copy project" -msgstr "Copiar proyecto" - -#: client/src/templates/templates.list.js:96 -msgid "Copy template" -msgstr "Copiar plantilla" - -#: client/lib/services/base-string.service.js:120 -msgid "Copy {{resourceType}}" -msgstr "Copiar {{resourceType}}" - -#: client/src/about/about.partial.html:31 -msgid "" -"Copyright © 2019 Red Hat, Inc.
\n" -" Visit Ansible.com for more information.
" -msgstr "Copyright © 2019 Red Hat, Inc.
\n" -" Visite Ansible.com para obtener más información.
" - -#: client/lib/components/components.strings.js:90 -msgid "Copyright © 2019 Red Hat, Inc." -msgstr "Copyright © 2019 Red Hat, Inc." - -#: client/src/workflow-results/workflow-results.service.js:78 -msgid "Could not cancel workflow. Returned status:" -msgstr "No se pudo cancelar el flujo de trabajo. Estado devuelto:" - -#: client/src/workflow-results/workflow-results.service.js:58 -msgid "Could not delete job. Returned status:" -msgstr "No se pudo eliminar el trabajo. Estado devuelto:" - -#: client/src/users/users.list.js:44 -msgid "Create New" -msgstr "Crear nuevo" - -#: client/features/applications/applications.strings.js:32 -msgid "Create a new Application" -msgstr "Crear una nueva aplicación" - -#: client/src/instance-groups/instance-groups.strings.js:35 -msgid "Create a new Instance Group" -msgstr "Crear un nuevo grupo de instancia" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:48 -msgid "Create a new Smart Inventory from search results.

Note: changing the organization of the Smart Inventory could change the hosts included in the Smart Inventory." -msgstr "Cree un nuevo Smart Inventory de los resultados de búsqueda.

Nota: Cambiar la organización del Smart Inventory podría cambiar los hosts incluidos en el Smart Inventory." - -#: client/src/credentials/credentials.list.js:52 -msgid "Create a new credential" -msgstr "Crear una nueva credencial" - -#: client/src/credential-types/credential-types.list.js:42 -msgid "Create a new credential type" -msgstr "Crear un nuevo tipo de credencial" - -#: client/src/inventory-scripts/inventory-scripts.list.js:40 -msgid "Create a new custom inventory" -msgstr "Crear un nuevo inventario personalizado" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:75 -msgid "Create a new group" -msgstr "Crear un nuevo grupo" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:139 -msgid "Create a new host" -msgstr "Crear un nuevo host" - -#: client/src/inventories-hosts/inventories/inventory.list.js:80 -msgid "Create a new inventory" -msgstr "Crear un nuevo inventario" - -#: client/src/notifications/notificationTemplates.list.js:57 -msgid "Create a new notification template" -msgstr "Crear una nueva plantilla de notificación" - -#: client/src/organizations/list/organizations-list.partial.html:22 -msgid "Create a new organization" -msgstr "Crear una nueva organización" - -#: client/src/projects/projects.list.js:81 -msgid "Create a new project" -msgstr "Crear un nuevo proyecto" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:72 -msgid "Create a new source" -msgstr "Crear una nueva fuente" - -#: client/src/teams/teams.list.js:43 -msgid "Create a new team" -msgstr "Crear un nuevo equipo" - -#: client/src/templates/templates.list.js:56 -msgid "Create a new template" -msgstr "Crear una nueva plantilla" - -#: client/src/users/users.list.js:48 -msgid "Create a new user" -msgstr "Crear un nuevo usuario" - -#: client/lib/services/base-string.service.js:128 -msgid "Created (Ascending)" -msgstr "Creados (ascendente)" - -#: client/lib/services/base-string.service.js:129 -msgid "Created (Descending)" -msgstr "Creados (descendente)" - -#: client/features/output/output.strings.js:60 -#: client/features/templates/templates.strings.js:29 -#: client/src/instance-groups/container-groups/add-container-group.controller.js:24 -#: client/src/instance-groups/container-groups/edit-container-group.controller.js:38 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:73 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:73 -#: client/src/projects/add/projects-add.controller.js:140 -#: client/src/projects/add/projects-add.controller.js:153 -#: client/src/projects/add/projects-add.controller.js:162 -#: client/src/projects/add/projects-add.controller.js:181 -#: client/src/projects/edit/projects-edit.controller.js:263 -#: client/src/projects/edit/projects-edit.controller.js:274 -#: client/src/projects/edit/projects-edit.controller.js:283 -#: client/src/projects/edit/projects-edit.controller.js:302 -msgid "Credential" -msgstr "Credencial" - -#: client/features/templates/templates.strings.js:40 -msgid "Credential Type" -msgstr "Tipo de credencial" - -#: client/lib/components/components.strings.js:76 -#: client/lib/models/models.strings.js:12 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 -msgid "Credential Types" -msgstr "Tipos de credencial" - -#: client/src/instance-groups/instance-groups.strings.js:80 -msgid "Credential to authenticate with Kubernetes or OpenShift.  Must be of type \"Kubernetes/OpenShift API Bearer Token”." -msgstr "Credencial para autenticarse con Kubernetes u OpenShift. Debe ser del tipo \"Kubernetes/OpenShift API Bearer Token\"." - -#: client/features/jobs/jobs.strings.js:16 -#: client/features/templates/templates.strings.js:21 -#: client/lib/components/components.strings.js:75 -#: client/lib/models/models.strings.js:8 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:128 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:58 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 -#: client/src/templates/job_templates/job-template.form.js:140 -#: client/src/templates/job_templates/job-template.form.js:152 -msgid "Credentials" -msgstr "Credenciales" - -#: client/features/templates/templates.strings.js:41 -msgid "Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:" -msgstr "No se permiten las credenciales que requieran contraseñas durante el lanzamiento para programaciones de plantillas y nodos de flujo de trabajo. Para continuar, se deben eliminar o sustituir las siguientes credenciales:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:17 -msgid "Critical" -msgstr "Crítico" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:12 -msgid "Critical Risk" -msgstr "Riesgo crítico" - -#: client/src/shared/directives.js:93 -msgid "Current Image:" -msgstr "Script personalizado" - -#: client/features/output/output.strings.js:40 -msgid "Currently following output as it arrives. Click to unfollow" -msgstr "Actualmente siguiendo el resultado a medida que se descarga. Haga clic para dejar de seguir" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:170 -msgid "Custom Inventory Script" -msgstr "Script de inventario personalizado" - -#: client/lib/services/base-string.service.js:85 -msgid "Custom Logo" -msgstr "Logo personalizado" - -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 -msgid "Custom Script" -msgstr "Script personalizado" - -#: client/src/instance-groups/instance-groups.strings.js:79 -msgid "Customize Pod Spec" -msgstr "Personalizar especificaciones de pod" - -#: client/src/notifications/notificationTemplates.form.js:577 -msgid "Customize messages…" -msgstr "Personalizar mensajes." - -#: client/src/home/home.route.js:16 -msgid "DASHBOARD" -msgstr "PANEL DE CONTROL" - -#: client/features/users/tokens/tokens.strings.js:28 -#: client/lib/services/base-string.service.js:74 -#: client/src/credential-types/list/list.controller.js:110 -#: client/src/credentials/list/credentials-list.controller.js:155 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:160 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:51 -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:131 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:184 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:24 -#: client/src/inventory-scripts/list/list.controller.js:130 -#: client/src/notifications/notification-templates-list/list.controller.js:235 -#: client/src/organizations/edit/organizations-edit.controller.js:164 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:69 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:68 -#: client/src/organizations/list/organizations-list.controller.js:202 -#: client/src/partials/survey-maker-modal.html:18 -#: client/src/projects/edit/projects-edit.controller.js:244 -#: client/src/scheduler/factories/delete-schedule.factory.js:60 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -#: client/src/teams/list/teams-list.controller.js:82 -#: client/src/users/list/users-list.controller.js:95 -#: client/src/workflow-results/workflow-results.service.js:62 -msgid "DELETE" -msgstr "ELIMINAR" - -#: client/src/partials/survey-maker-modal.html:81 -msgid "DELETE SURVEY" -msgstr "BORRAR ENCUESTA" - -#: client/features/templates/templates.strings.js:133 -msgid "DELETED" -msgstr "ELIMINADO" - -#: client/features/templates/templates.strings.js:158 -msgid "DENIED" -msgstr "DENEGADO" - -#: client/lib/components/components.strings.js:129 -msgid "DENY" -msgstr "DENEGAR" - -#: client/features/projects/projects.strings.js:9 -#: client/features/users/tokens/tokens.strings.js:36 -msgid "DESCRIPTION" -msgstr "DESCRIPCIÓN" - -#: client/features/templates/templates.strings.js:135 -#: client/src/instance-groups/instance-groups.strings.js:29 -#: client/src/workflow-results/workflow-results.controller.js:83 -msgid "DETAILS" -msgstr "DETALLES" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:32 -msgid "DISASSOCIATE" -msgstr "DISOCIAR" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:5 -msgid "DYNAMIC HOSTS" -msgstr "HOSTS DINÁMICOS" - -#: client/lib/components/components.strings.js:70 -msgid "Dashboard" -msgstr "Panel de control" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:576 -#: client/src/scheduler/scheduler.strings.js:52 -msgid "Date format" -msgstr "Formato de fecha" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:170 -#: client/src/scheduler/scheduler.strings.js:64 -msgid "Days of data to keep" -msgstr "Días de datos para mantener" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:101 -msgid "Default" -msgstr "Predeterminado" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:196 -#: client/src/templates/survey-maker/shared/question-definition.form.js:213 -#: client/src/templates/survey-maker/shared/question-definition.form.js:228 -#: client/src/templates/survey-maker/shared/question-definition.form.js:242 -#: client/src/templates/survey-maker/shared/question-definition.form.js:256 -#: client/src/templates/survey-maker/shared/question-definition.form.js:272 -msgid "Default Answer" -msgstr "Respuesta predeterminada" - -#: client/src/configuration/settings.partial.html:9 -msgid "Define system-level features and functions" -msgstr "Defina características y funciones a nivel del sistema" - -#: client/features/output/output.strings.js:20 -#: client/lib/services/base-string.service.js:89 -#: client/src/credential-types/credential-types.list.js:73 -#: client/src/credential-types/list/list.controller.js:106 -#: client/src/credentials/credentials.list.js:92 -#: client/src/credentials/list/credentials-list.controller.js:151 -#: client/src/inventories-hosts/inventories/inventory.list.js:125 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:156 -#: client/src/inventory-scripts/inventory-scripts.list.js:79 -#: client/src/inventory-scripts/list/list.controller.js:126 -#: client/src/notifications/notification-templates-list/list.controller.js:231 -#: client/src/notifications/notificationTemplates.list.js:105 -#: client/src/organizations/edit/organizations-edit.controller.js:161 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:66 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:65 -#: client/src/organizations/list/organizations-list.controller.js:198 -#: client/src/projects/edit/projects-edit.controller.js:241 -#: client/src/scheduler/schedules.list.js:108 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:37 -#: client/src/teams/list/teams-list.controller.js:78 -#: client/src/teams/teams.list.js:72 -#: client/src/templates/templates.list.js:109 -#: client/src/users/list/users-list.controller.js:91 -#: client/src/users/users.list.js:79 -#: client/src/workflow-results/workflow-results.controller.js:57 -msgid "Delete" -msgstr "ELIMINAR" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:6 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:6 -msgid "Delete Group" -msgstr "Eliminar grupo" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:128 -msgid "Delete Host" -msgstr "Borrar un host" - -#: client/features/output/output.strings.js:55 -#: client/src/workflow-results/workflow-results.service.js:39 -msgid "Delete Job" -msgstr "Eliminar tarea" - -#: client/src/organizations/list/organizations-list.partial.html:73 -msgid "Delete Organization" -msgstr "Eliminar organización" - -#: client/src/templates/survey-maker/surveys/init.factory.js:23 -msgid "Delete Question" -msgstr "Eliminar pregunta" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:180 -msgid "Delete Source" -msgstr "Eliminar fuente" - -#: client/src/credentials/credentials.list.js:94 -msgid "Delete credential" -msgstr "Eliminar la credencial." - -#: client/src/credential-types/credential-types.list.js:75 -msgid "Delete credential type" -msgstr "Eliminar tipo de credencial" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:107 -#: client/src/inventories-hosts/inventory-hosts.strings.js:19 -msgid "Delete group" -msgid_plural "Delete groups" -msgstr[0] "Eliminar grupo" -msgstr[1] "Eliminar grupos" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:116 -#: client/src/inventories-hosts/inventory-hosts.strings.js:21 -msgid "Delete host" -msgid_plural "Delete hosts" -msgstr[0] "Eliminar host" -msgstr[1] "Eliminar hosts" - -#: client/src/inventories-hosts/inventories/inventory.list.js:127 -msgid "Delete inventory" -msgstr "Eliminar el inventario" - -#: client/src/inventory-scripts/inventory-scripts.list.js:81 -msgid "Delete inventory script" -msgstr "Eliminar el script de inventario." - -#: client/src/workflow-results/workflow-results.partial.html:52 -msgid "Delete job" -msgstr "Eliminar tarea" - -#: client/src/notifications/notificationTemplates.list.js:107 -msgid "Delete notification" -msgstr "Eliminar la notificación" - -#: client/src/projects/projects.form.js:186 -msgid "Delete on Update" -msgstr "Eliminar la actualización" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:26 -msgid "Delete or promote the group's children?" -msgstr "¿Desea eliminar o promover los elementos secundarios del grupo?" - -#: client/src/partials/survey-maker-modal.html:67 -msgid "Delete question" -msgstr "Eliminar pregunta" - -#: client/src/scheduler/schedules.list.js:111 -msgid "Delete schedule" -msgstr "Eliminar planificación" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:121 -msgid "Delete source" -msgstr "Eliminar fuente" - -#: client/src/teams/teams.list.js:76 -msgid "Delete team" -msgstr "Eliminar el equipo" - -#: client/src/templates/templates.list.js:112 -msgid "Delete template" -msgstr "Eliminar la plantilla" - -#: client/src/projects/projects.form.js:188 -msgid "Delete the local repository in its entirety prior to performing an update." -msgstr "Eliminar el repositorio local en su totalidad antes de realizar la actualización." - -#: client/src/projects/projects.list.js:122 -msgid "Delete the project" -msgstr "Eliminar el proyecto" - -#: client/src/scheduler/scheduled-jobs.list.js:86 -msgid "Delete the schedule" -msgstr "Eliminar la programación" - -#: client/lib/services/base-string.service.js:121 -msgid "Delete the {{resourceType}}" -msgstr "Eliminar el {{resourceType}}" - -#: client/src/users/users.list.js:83 -msgid "Delete user" -msgstr "Eliminar el usuario" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:14 -msgid "Delete {{ group }} and {{ host }}" -msgstr "Eliminar {{ group }} y {{ host }}" - -#: client/lib/services/base-string.service.js:91 -msgid "Deleting this {{ resourceType }} will make the following resources unavailable." -msgstr "Al eliminar este {{ resourceType }}, los siguientes recursos dejarán de estar disponibles." - -#: client/src/projects/projects.form.js:188 -msgid "Depending on the size of the repository this may significantly increase the amount of time required to complete an update." -msgstr "Según el tamaño del repositorio, esto podría incrementar significativamente el tiempo necesario para completar una actualización." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "Describe Instances documentation" -msgstr "Documentación de descripción de las instancias" - -#: client/features/applications/add-applications.controller.js:36 -#: client/features/templates/templates.strings.js:17 -#: client/features/users/tokens/users-tokens-add.controller.js:26 -#: client/src/credential-types/credential-types.form.js:34 -#: client/src/credentials/credentials.form.js:39 -#: client/src/inventories-hosts/hosts/host.form.js:62 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:39 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:61 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:74 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:63 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:72 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:28 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:36 -#: client/src/inventory-scripts/inventory-scripts.form.js:35 -#: client/src/notifications/notificationTemplates.form.js:39 -#: client/src/organizations/organizations.form.js:33 -#: client/src/projects/projects.form.js:37 -#: client/src/teams/teams.form.js:35 -#: client/src/templates/job_templates/job-template.form.js:41 -#: client/src/templates/survey-maker/shared/question-definition.form.js:36 -#: client/src/templates/workflows.form.js:49 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:128 -#: client/src/users/users.form.js:147 -#: client/src/users/users.form.js:175 -msgid "Description" -msgstr "Descripción" - -#: client/src/notifications/notificationTemplates.form.js:156 -#: client/src/notifications/notificationTemplates.form.js:160 -#: client/src/notifications/notificationTemplates.form.js:172 -#: client/src/notifications/notificationTemplates.form.js:176 -msgid "Destination Channels" -msgstr "Canales destinatarios" - -#: client/src/notifications/notificationTemplates.form.js:535 -#: client/src/notifications/notificationTemplates.form.js:539 -msgid "Destination Channels or Users" -msgstr "Canales destinatarios o usuarios" - -#: client/src/notifications/notificationTemplates.form.js:225 -#: client/src/notifications/notificationTemplates.form.js:226 -msgid "Destination SMS Number" -msgstr "Número SMS del destinatario" - -#: client/features/applications/applications.strings.js:15 -#: client/features/credentials/credentials.strings.js:13 -#: client/features/output/output.strings.js:46 -#: client/features/users/tokens/tokens.strings.js:14 -#: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1431 -msgid "Details" -msgstr "Detalles" - -#: client/src/notifications/notificationTemplates.form.js:341 -#: client/src/notifications/notificationTemplates.form.js:403 -#: client/src/notifications/notificationTemplates.form.js:474 -#: client/src/notifications/notificationTemplates.form.js:506 -msgid "Disable SSL Verification" -msgstr "Deshabilite la verificación de SSL" - -#: client/src/templates/survey-maker/surveys/init.factory.js:21 -msgid "Disable Survey" -msgstr "Deshabilitar la encuesta" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Disable survey" -msgstr "Desactivar la encuesta" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Group From Group" -msgstr "Desasociar un grupo de otro grupo" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:6 -msgid "Disassociate Host" -msgstr "Disociar host" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:6 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Host From Group" -msgstr "Desasociar un host de un grupo" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:70 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:103 -msgid "Disassociate group" -msgstr "Disociar grupo" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:104 -msgid "Disassociate host" -msgstr "Disociar host" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:54 -#: client/src/configuration/forms/settings-form.controller.js:446 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:52 -msgid "Discard changes" -msgstr "Descartar cambios" - -#: client/src/teams/teams.form.js:161 -msgid "Dissassociate permission from team" -msgstr "Desasociar permiso de un equipo." - -#: client/src/users/users.form.js:234 -msgid "Dissassociate permission from user" -msgstr "Desasociar permiso del usuario." - -#: client/src/templates/job_templates/job-template.form.js:286 -msgid "Divide the work done by this job template into the specified number of job slices, each running the same tasks against a portion of the inventory." -msgstr "Divida el trabajo realizado por esta plantilla de trabajo en la cantidad especificada de fracciones de trabajo, cada una ejecutando las mismas tareas en una fracción de inventario." - -#: client/src/credentials/credentials.form.js:383 -#: client/src/credentials/factories/become-method-change.factory.js:54 -#: client/src/credentials/factories/kind-change.factory.js:110 -msgid "Domain Name" -msgstr "Nombre de dominio" - -#: client/features/output/output.strings.js:21 -msgid "Download Output" -msgstr "Descargar salida" - -#: client/src/inventory-scripts/inventory-scripts.form.js:59 -msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. Refer to the Ansible Tower documentation for example syntax." -msgstr "Arrastre y suelte el archivo personalizado del script de inventario aquí o cree uno en el campo para importar el inventario personalizado. Consulte la documentación de Ansible Tower para acceder a ejemplos de sintaxis." - -#: client/src/templates/survey-maker/surveys/init.factory.js:24 -msgid "Drag to reorder question" -msgstr "Arrastrar hasta reordenar pregunta" - -#: client/src/partials/survey-maker-modal.html:74 -msgid "Drop question here to reorder" -msgstr "Arrastre y suelte una pregunta aquí para reordenar" - -#: client/features/applications/applications.strings.js:10 -msgid "EDIT APPLICATION" -msgstr "EDITAR APLICACIÓN" - -#: client/features/credentials/credentials.strings.js:9 -msgid "EDIT CREDENTIAL" -msgstr "EDITAR CREDENCIAL" - -#: client/features/templates/templates.strings.js:142 -msgid "EDIT LINK" -msgstr "EDITAR ENLACE" - -#: client/src/scheduler/scheduler.strings.js:9 -msgid "EDIT SCHEDULE" -msgstr "EDITAR PROGRAMA" - -#: client/src/management-jobs/scheduler/main.js:97 -msgid "EDIT SCHEDULED JOB" -msgstr "MODIFICAR UN TRABAJO PLANIFICADO" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:17 -msgid "EDIT SURVEY PROMPT" -msgstr "EDITAR AVISO DE ENCUESTA" - -#: client/features/templates/templates.strings.js:124 -msgid "EDIT TEMPLATE" -msgstr "EDITAR PLANTILLA" - -#: client/lib/components/components.strings.js:9 -msgid "ENCRYPTED" -msgstr "CIFRADO" - -#: client/features/output/output.strings.js:105 -msgid "EXAMPLES" -msgstr "EJEMPLOS" - -#: client/src/shared/smart-search/smart-search.partial.html:36 -msgid "EXAMPLES:" -msgstr "EJEMPLOS:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:15 -msgid "EXECUTE COMMAND" -msgstr "EJECUTAR COMANDO" - -#: client/features/templates/templates.strings.js:150 -msgid "EXIT" -msgstr "SALIR" - -#: client/lib/components/code-mirror/code-mirror.strings.js:12 -msgid "EXPAND" -msgstr "EXPANDIR" - -#: client/features/applications/applications.strings.js:29 -#: client/features/users/tokens/tokens.strings.js:37 -msgid "EXPIRATION" -msgstr "EXPIRACIÓN" - -#: client/features/users/tokens/tokens.strings.js:24 -msgid "EXPIRES" -msgstr "EXPIRA" - -#: client/lib/components/code-mirror/code-mirror.strings.js:10 -#: client/lib/components/code-mirror/code-mirror.strings.js:50 -msgid "EXTRA VARIABLES" -msgstr "VARIABLES ADICIONALES" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:375 -msgid "Each time a job runs using this inventory, refresh the inventory from the selected source before executing job tasks." -msgstr "Cada vez que se ejecuta un trabajo con este inventario, actualice el inventario de la fuente seleccionada antes de ejecutar tareas de trabajo." - -#: client/src/projects/projects.form.js:199 -msgid "Each time a job runs using this project, update the revision of the project prior to starting the job." -msgstr "Cada vez que una tarea se ejecuta usando este proyecto, deberá actualizar la revisión del proyecto antes de iniciar dicha tarea." - -#: client/src/credential-types/credential-types.list.js:56 -#: client/src/credentials/credentials.list.js:66 -#: client/src/inventories-hosts/inventories/inventory.list.js:102 -#: client/src/inventory-scripts/inventory-scripts.list.js:54 -#: client/src/notifications/notificationTemplates.list.js:71 -#: client/src/notifications/notificationTemplates.list.js:80 -#: client/src/scheduler/schedules.list.js:93 -#: client/src/teams/teams.list.js:55 -#: client/src/templates/templates.list.js:80 -#: client/src/users/users.list.js:60 -msgid "Edit" -msgstr "Editar" - -#: client/src/organizations/list/organizations-list.partial.html:55 -msgid "Edit Organization" -msgstr "Editar organización" - -#: client/src/templates/survey-maker/surveys/init.factory.js:22 -msgid "Edit Question" -msgstr "Editar pregunta" - -#: client/src/shared/form-generator.js:1668 -#: client/src/templates/job_templates/job-template.form.js:602 -#: client/src/templates/workflows.form.js:357 -msgid "Edit Survey" -msgstr "Editar el cuestionario" - -#: client/src/credentials/credentials.list.js:68 -msgid "Edit credential" -msgstr "Editar credenciales" - -#: client/src/credential-types/credential-types.list.js:58 -msgid "Edit credential type" -msgstr "Editar el tipo de credencial" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:91 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:85 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:89 -msgid "Edit group" -msgstr "Editar grupo" - -#: client/src/inventories-hosts/hosts/host.list.js:89 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:95 -#: client/src/inventories-hosts/inventory-hosts.strings.js:25 -msgid "Edit host" -msgstr "Editar el servidor" - -#: client/src/inventories-hosts/inventories/inventory.list.js:104 -msgid "Edit inventory" -msgstr "Editar el inventario" - -#: client/src/inventory-scripts/inventory-scripts.list.js:56 -msgid "Edit inventory script" -msgstr "Editar el script de inventario" - -#: client/src/notifications/notificationTemplates.list.js:73 -msgid "Edit notification" -msgstr "Editar la notificación" - -#: client/src/partials/survey-maker-modal.html:64 -msgid "Edit question" -msgstr "Editar pregunta" - -#: client/src/scheduler/schedules.list.js:96 -msgid "Edit schedule" -msgstr "Editar la programación" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:87 -msgid "Edit source" -msgstr "Editar fuente" - -#: client/src/teams/teams.list.js:59 -msgid "Edit team" -msgstr "Editar el equipo" - -#: client/src/templates/templates.list.js:82 -msgid "Edit template" -msgstr "Editar la plantilla" - -#: client/src/workflow-results/workflow-results.controller.js:62 -msgid "Edit the inventory" -msgstr "Editar el inventario" - -#: client/src/projects/projects.list.js:93 -msgid "Edit the project" -msgstr "Editar el proyecto" - -#: client/src/scheduler/scheduled-jobs.list.js:72 -#: client/src/workflow-results/workflow-results.controller.js:61 -msgid "Edit the schedule" -msgstr "Editar la planificación" - -#: client/src/workflow-results/workflow-results.controller.js:60 -msgid "Edit the slice job template" -msgstr "Editar la plantilla de fracción de trabajo" - -#: client/src/workflow-results/workflow-results.controller.js:58 -msgid "Edit the user" -msgstr "Edite el usuario" - -#: client/src/workflow-results/workflow-results.controller.js:59 -msgid "Edit the workflow job template" -msgstr "Edite la plantilla de tareas para el flujo de trabajo" - -#: client/src/users/users.list.js:64 -msgid "Edit user" -msgstr "Editar el usuario" - -#: client/features/projects/projects.strings.js:24 -msgid "Either you do not have access or the SCM update process completed" -msgstr "No tiene acceso o el proceso de actualización de SCM ha finalizado" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Either you do not have access or the SCM update process completed. Click the" -msgstr "No tiene acceso o el proceso de actualización de SCM ha finalizado. Haga clic en" - -#: client/features/output/output.strings.js:116 -#: client/src/workflow-results/workflow-results.controller.js:92 -msgid "Elapsed" -msgstr "Tiempo transcurrido" - -#: client/src/credentials/credentials.form.js:191 -#: client/src/users/users.form.js:52 -msgid "Email" -msgstr "Correo electrónico" - -#: client/src/notifications/notificationTemplates.form.js:558 -#: client/src/notifications/notificationTemplates.form.js:559 -msgid "Email Options" -msgstr "Opciones de correo electrónico" - -#: client/src/templates/job_templates/job-template.form.js:353 -#: client/src/templates/job_templates/job-template.form.js:358 -#: client/src/templates/workflows.form.js:157 -#: client/src/templates/workflows.form.js:162 -msgid "Enable Concurrent Jobs" -msgstr "Activar los trabajos concurrentes" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:31 -msgid "Enable External Logging" -msgstr "Habilitar registro externo" - -#: client/src/templates/job_templates/job-template.form.js:363 -#: client/src/templates/job_templates/job-template.form.js:368 -msgid "Enable Fact Cache" -msgstr "Habilitar caché de hechos" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:326 -msgid "Enable Privilege Escalation" -msgstr "Activar la elevación de privilegios" - -#: client/src/templates/job_templates/job-template.form.js:331 -#: client/src/templates/job_templates/job-template.form.js:338 -msgid "Enable Provisioning Callbacks" -msgstr "Habilitar devoluciones de llamadas de aprovisionamiento" - -#: client/src/templates/job_templates/job-template.form.js:343 -#: client/src/templates/job_templates/job-template.form.js:348 -#: client/src/templates/workflows.form.js:167 -#: client/src/templates/workflows.form.js:172 -msgid "Enable Webhook" -msgstr "Habilitar Webhook" - -#: client/src/configuration/settings.partial.html:3 -msgid "Enable simplified login for your Tower applications" -msgstr "Activar inicio de sesión simplificado para sus aplicaciones de Tower." - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Enable survey" -msgstr "Habilitar encuesta" - -#: client/src/templates/job_templates/job-template.form.js:346 -msgid "Enable webhook for this job template." -msgstr "Habilitar webhook para esta plantilla de trabajo." - -#: client/src/templates/workflows.form.js:170 -msgid "Enable webhook for this workflow job template." -msgstr "Habilitar webhook para esta plantilla de trabajo del flujo de trabajo." - -#: client/src/templates/job_templates/job-template.form.js:335 -msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact {{BRAND_NAME}} and request a configuration update using this job template." -msgstr "Habilitar la creación de una URL para una devolución de llamadas de aprovisionamiento. Mediante la URL, un host puede contactar a {{BRAND_NAME}} y solicitar la actualización de la configuración utilizando esta plantilla de trabajo." - -#: client/src/credentials/factories/credential-form-save.factory.js:73 -msgid "Encrypted credentials are not supported." -msgstr "Las credenciales cifradas no están admitidas." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:487 -#: client/src/scheduler/scheduler.strings.js:44 -msgid "End" -msgstr "Fin" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:532 -#: client/src/scheduler/scheduler.strings.js:46 -msgid "End Date" -msgstr "Fecha de terminación" - -#: client/src/scheduler/scheduler.strings.js:48 -msgid "End Time" -msgstr "Hora de terminación" - -#: client/src/license/license.partial.html:163 -msgid "End User License Agreement" -msgstr "Acuerdo de licencia de usuario final" - -#: client/src/inventories-hosts/hosts/host.form.js:72 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:71 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:73 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:68 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "Introduzca variables del inventario usando sintaxis JSON o YAML. Utilice el botón de selección para elegir entre los dos." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:74 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Ingrese variables de inventario por medio del uso de sintaxis JSON o YAML. Utilice el botón de selección para alternar entre los dos. Consulte la documentación de Ansible Tower para acceder a ejemplos de sintaxis." - -#: client/src/notifications/notificationTemplates.form.js:335 -msgid "Enter one Annotation Tag per line, without commas." -msgstr "Ingrese una etiqueta de anotación por línea sin comas." - -#: client/src/notifications/notificationTemplates.form.js:175 -msgid "Enter one HipChat channel per line. The pound symbol (#) is not required." -msgstr "Ingrese un canal de HipChat por línea. El símbolo numeral (#) no es necesario." - -#: client/src/notifications/notificationTemplates.form.js:538 -msgid "Enter one IRC channel or username per line. The pound symbol (#) for channels, and the at (@) symbol for users, are not required." -msgstr "Ingrese un canal de IRC o nombre de usuario por línea. El símbolo numeral (#) para canales y el símbolo arroba (@) para usuarios no son necesarios." - -#: client/src/notifications/notificationTemplates.form.js:159 -msgid "Enter one Slack channel per line. The pound symbol (#) is required for channels." -msgstr "Ingrese un canal de Slack por línea. El símbolo numeral (#) es necesario para los canales." - -#: client/src/notifications/notificationTemplates.form.js:97 -msgid "Enter one email address per line to create a recipient list for this type of notification." -msgstr "Ingrese una dirección de correo electrónico por línea para crear una lista de destinatarios para este tipo de notificación." - -#: client/src/notifications/notificationTemplates.form.js:229 -msgid "Enter one phone number per line to specify where to route SMS messages." -msgstr "Ingrese un número de teléfono por línea para especificar adónde enviar los mensajes de SMS." - -#: client/src/credentials/factories/become-method-change.factory.js:81 -#: client/src/credentials/factories/kind-change.factory.js:137 -msgid "Enter the URL for the virtual machine which %scorresponds to your CloudForms instance. %sFor example, %s" -msgstr "Ingrese la URL para la máquina virtual que %scorresponde a su instancia de CloudForms. %sPor ejemplo, %s" - -#: client/src/credentials/factories/become-method-change.factory.js:71 -#: client/src/credentials/factories/kind-change.factory.js:127 -msgid "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor example, %s" -msgstr "Ingrese la URL que corresponda a su servidor %sRed Hat Satellite 6. %sPor ejemplo, %s" - -#: client/src/credentials/factories/become-method-change.factory.js:49 -#: client/src/credentials/factories/kind-change.factory.js:105 -msgid "Enter the hostname or IP address which corresponds to your VMware vCenter." -msgstr "Ingrese el nombre de host o dirección IP que corresponda a su VMWare vCenter." - -#: client/src/notifications/notificationTemplates.form.js:215 -msgid "Enter the number associated with the \"Messaging Service\" in Twilio in the format +18005550199." -msgstr "Ingrese el número asociado con el \"Servicio de mensajería\" en Twilio con el formato +18005550199." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:196 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:220 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:319 -msgid "Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "Ingrese variables con sintaxis JSON o YAML. Use el botón de selección para alternar entre los dos." - -#: client/features/output/output.strings.js:61 -msgid "Environment" -msgstr "Entorno" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:186 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:193 -msgid "Environment Variables" -msgstr "Variables del entorno" - -#: client/src/license/license.controller.js:232 -msgid "Error Applying License" -msgstr "Error al aplicar la licencia" - -#: client/features/output/output.strings.js:89 -msgid "Error Details" -msgstr "Detalles del error" - -#: client/src/license/license.controller.js:166 -msgid "Error Fetching Licenses" -msgstr "Error al buscar licencias" - -#: client/src/notifications/notificationTemplates.form.js:643 -msgid "Error Message" -msgstr "Mensaje de error" - -#: client/src/notifications/notificationTemplates.form.js:654 -msgid "Error Message Body" -msgstr "Cuerpo del mensaje de error" - -#: client/lib/services/base-string.service.js:115 -#: client/src/app.js:228 -#: client/src/configuration/forms/settings-form.controller.js:285 -#: client/src/configuration/forms/settings-form.controller.js:429 -#: client/src/configuration/forms/settings-form.controller.js:554 -#: client/src/configuration/forms/settings-form.controller.js:614 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:234 -#: client/src/credentials/factories/credential-form-save.factory.js:77 -#: client/src/credentials/factories/credential-form-save.factory.js:93 -#: client/src/home/home.controller.js:104 -#: client/src/home/home.controller.js:223 -#: client/src/home/home.controller.js:233 -#: client/src/home/home.controller.js:242 -#: client/src/home/home.controller.js:29 -#: client/src/home/home.controller.js:43 -#: client/src/home/home.controller.js:78 -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:34 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:37 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:47 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:116 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:126 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:153 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:203 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:222 -#: client/src/login/loginModal/loginModal.controller.js:143 -#: client/src/management-jobs/card/card.controller.js:122 -#: client/src/management-jobs/card/card.controller.js:28 -#: client/src/management-jobs/card/card.controller.js:58 -#: client/src/organizations/main.js:111 -#: client/src/organizations/main.js:124 -#: client/src/organizations/main.js:139 -#: client/src/projects/add/projects-add.controller.js:120 -#: client/src/projects/edit/projects-edit.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:220 -#: client/src/projects/edit/projects-edit.controller.js:236 -#: client/src/projects/main.js:121 -#: client/src/shared/stateDefinitions.factory.js:230 -#: client/src/templates/main.js:102 -#: client/src/templates/main.js:116 -#: client/src/templates/main.js:132 -#: client/src/templates/main.js:143 -#: client/src/templates/main.js:177 -#: client/src/templates/main.js:194 -#: client/src/templates/main.js:219 -#: client/src/templates/main.js:245 -#: client/src/templates/main.js:257 -#: client/src/templates/main.js:270 -#: client/src/templates/main.js:281 -#: client/src/templates/main.js:295 -#: client/src/templates/main.js:312 -#: client/src/templates/main.js:341 -#: client/src/templates/main.js:355 -#: client/src/templates/main.js:371 -#: client/src/templates/main.js:409 -#: client/src/templates/main.js:423 -#: client/src/templates/main.js:436 -#: client/src/templates/main.js:449 -#: client/src/templates/main.js:473 -#: client/src/templates/main.js:490 -#: client/src/templates/main.js:71 -#: client/src/templates/main.js:88 -#: client/src/users/add/users-add.controller.js:101 -#: client/src/users/edit/users-edit.controller.js:171 -#: client/src/users/list/users-list.controller.js:84 -#: client/src/workflow-results/workflow-results.service.js:57 -#: client/src/workflow-results/workflow-results.service.js:77 -#: client/src/workflow-results/workflow-results.service.js:99 -msgid "Error!" -msgstr "¡Error!" - -#: client/src/activity-stream/streams.list.js:40 -msgid "Event" -msgstr "Evento" - -#: client/src/activity-stream/factories/build-description.factory.js:157 -msgid "Event summary not available" -msgstr "Resumen del evento no disponible." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:190 -#: client/src/scheduler/scheduler.strings.js:29 -msgid "Every" -msgstr "Cada" - -#: client/src/projects/add/projects-add.controller.js:142 -#: client/src/projects/edit/projects-edit.controller.js:264 -msgid "Example URLs for GIT SCM include:" -msgstr "Ejemplos de URLs para SCM GIT :" - -#: client/src/projects/add/projects-add.controller.js:163 -#: client/src/projects/edit/projects-edit.controller.js:284 -msgid "Example URLs for Mercurial SCM include:" -msgstr "Ejemplos de URLs para SCM Mercurial :" - -#: client/src/projects/add/projects-add.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:275 -msgid "Example URLs for Subversion SCM include:" -msgstr "Ejemplos de URLs para SCM Subversion :" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Example: ansible_facts.ansible_distribution:\"RedHat\"" -msgstr "Ejemplo: ansible_facts.ansible_distribution:\"RedHat\"" - -#: client/src/projects/projects.form.js:140 -msgid "Examples include:" -msgstr "Los ejemplos incluyen:" - -#: client/features/output/output.strings.js:62 -msgid "Execution Node" -msgstr "Nodo de ejecución" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:65 -msgid "Existing Group" -msgstr "Grupo existente" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:142 -msgid "Existing Host" -msgstr "Host existente" - -#: client/features/output/output.strings.js:23 -#: client/src/workflow-results/workflow-results.controller.js:203 -#: client/src/workflow-results/workflow-results.controller.js:64 -msgid "Expand Output" -msgstr "Extender salida" - -#: client/lib/components/components.strings.js:121 -msgid "Expanded" -msgstr "Expandido" - -#: client/src/license/license.partial.html:246 -msgid "Expires" -msgstr "Expira" - -#: client/lib/services/base-string.service.js:132 -msgid "Expires (Ascending)" -msgstr "Expira (ascendente)" - -#: client/lib/services/base-string.service.js:133 -msgid "Expires (Descending)" -msgstr "Expira (descendente)" - -#: client/src/license/license.partial.html:39 -msgid "Expires On" -msgstr "Fecha de expiración el" - -#: client/lib/components/components.strings.js:133 -msgid "Expires:" -msgstr "Expira:" - -#: client/lib/components/components.strings.js:134 -msgid "Expires: Never" -msgstr "Expira: Nunca" - -#: client/features/output/output.strings.js:71 -#: client/src/workflow-results/workflow-results.controller.js:76 -msgid "Explanation" -msgstr "Explicación" - -#: client/features/output/output.strings.js:63 -#: client/features/templates/templates.strings.js:64 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:133 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:145 -#: client/src/partials/logviewer.html:8 -#: client/src/scheduler/scheduler.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:480 -#: client/src/templates/job_templates/job-template.form.js:487 -#: client/src/templates/workflows.form.js:136 -#: client/src/templates/workflows.form.js:143 -#: client/src/workflow-results/workflow-results.controller.js:180 -msgid "Extra Variables" -msgstr "Variables adicionales" - -#: client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js:7 -msgid "FACTS" -msgstr "EVENTOS" - -#: client/features/output/output.strings.js:141 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:59 -msgid "FAILED" -msgstr "FALLIDO" - -#: client/features/output/output.strings.js:106 -msgid "FIELDS" -msgstr "CAMPOS" - -#: client/src/shared/smart-search/smart-search.partial.html:42 -msgid "FIELDS:" -msgstr "CAMPOS:" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "FINISHED" -msgstr "FINALIZADO" - -#: client/src/inventories-hosts/hosts/host.form.js:103 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:105 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:114 -msgid "Facts" -msgstr "Eventos" - -#: client/lib/components/components.strings.js:106 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:86 -msgid "Failed" -msgstr "Fallido" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:44 -msgid "Failed Hosts" -msgstr "Servidores fallidos" - -#: client/src/projects/factories/get-project-path.factory.js:68 -msgid "Failed to access API config. GET status:" -msgstr "No se pudo acceder al estado GET de la configuración de la API:" - -#: client/src/users/add/users-add.controller.js:101 -msgid "Failed to add new user. POST returned status:" -msgstr "Ha fallado la creación de nuevo usuario. POST ha devuelto el estado:" - -#: client/src/credentials/factories/credential-form-save.factory.js:78 -msgid "Failed to create new Credential. POST status:" -msgstr "Ha fallado la creación de un nuevo Credencial. Estado POST :" - -#: client/src/projects/add/projects-add.controller.js:121 -msgid "Failed to create new project. POST returned status:" -msgstr "Ha fallado la creación de un nuevo proyecto. POST ha devuelto el estado:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:35 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:48 -#: client/src/templates/main.js:144 -#: client/src/templates/main.js:282 -msgid "Failed to get config. GET returned status:" -msgstr "No se pudo obtener el estado devuelto GET de configuración:" - -#: client/src/home/home.controller.js:43 -msgid "Failed to get dashboard graph data:" -msgstr "No se obtuvieron datos de los gráficos del tablero:" - -#: client/src/home/home.controller.js:29 -msgid "Failed to get dashboard host graph data:" -msgstr "No se obtuvieron datos de los gráficos del host del tablero:" - -#: client/src/home/home.controller.js:242 -msgid "Failed to get dashboard job templates list:" -msgstr "No se pudo obtener la lista de plantillas de trabajo del tablero:" - -#: client/src/home/home.controller.js:233 -msgid "Failed to get dashboard jobs list:" -msgstr "No se pudo obtener la lista de trabajos del tablero:" - -#: client/src/home/home.controller.js:223 -msgid "Failed to get dashboard:" -msgstr "No se pudo obtener el tablero:" - -#: client/src/templates/main.js:246 -msgid "Failed to get instance groups. GET returned status:" -msgstr "No se pudo obtener el estado devuelto GET de los grupos de la instancia:" - -#: client/src/templates/main.js:342 -#: client/src/templates/main.js:410 -#: client/src/templates/main.js:72 -msgid "Failed to get inventory info. GET returned status:" -msgstr "No se pudo obtener el estado devuelto GET de información de inventario:" - -#: client/src/templates/main.js:133 -msgid "Failed to get job template options. OPTIONS returned status:" -msgstr "No se pudo obtener el estado debuelto OPTIONS de las opciones de la plantilla de trabajo:" - -#: client/src/templates/main.js:178 -msgid "Failed to get job template. GET returned status:" -msgstr "No se pudo obtener el estado devuelto GET de la plantilla de trabajo:" - -#: client/src/templates/main.js:117 -#: client/src/templates/main.js:258 -#: client/src/templates/main.js:356 -#: client/src/templates/main.js:424 -msgid "Failed to get labels. GET returned status:" -msgstr "No se pudo obtener el estado devuelto GET de las etiquetas:" - -#: client/src/home/home.controller.js:79 -msgid "Failed to get new jobs for dashboard:" -msgstr "Error al obtener nuevas tareas para el panel de control:" - -#: client/src/home/home.controller.js:105 -msgid "Failed to get new templates for dashboard:" -msgstr "Error al obtener nuevas plantillas para el panel de control:" - -#: client/src/organizations/main.js:140 -msgid "Failed to get organizations for which this user is a notification admin. GET returned" -msgstr "No se pudieron obtener las organizaciones para las cuales este usuario es un estado devuelto GET del administrador de notificaciones" - -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:38 -#: client/src/projects/main.js:122 -#: client/src/templates/main.js:296 -#: client/src/templates/main.js:474 -msgid "Failed to get organizations for which this user is a notification administrator. GET returned" -msgstr "No se pudieron obtener las organizaciones para las cuales este usuario es un estado devuelto GET del administrador de notificaciones" - -#: client/src/templates/main.js:103 -#: client/src/templates/main.js:89 -msgid "Failed to get project info. GET returned status:" -msgstr "No se pudo obtener el estado devuelto GET de la información del proyecto:" - -#: client/src/templates/main.js:195 -#: client/src/templates/main.js:220 -msgid "Failed to get project. GET returned status:" -msgstr "No se pudo obtener el estado devuelto GET del proyecto:" - -#: client/src/templates/main.js:313 -#: client/src/templates/main.js:491 -msgid "Failed to get webhook key GET returned" -msgstr "No se pudo obtener el estado devuelto GET de la clave de webhook" - -#: client/src/templates/main.js:271 -#: client/src/templates/main.js:437 -msgid "Failed to get workflow job template labels. GET returned status:" -msgstr "No se pudieron obtener las etiquetas de la plantilla de trabajo del flujo de trabajo. Estado devuelto de GET:" - -#: client/src/templates/main.js:372 -msgid "Failed to get workflow job template options. OPTIONS returned status:" -msgstr "No se pudo obtener el estado devuelto OPTIONS de las opciones de la plantilla de trabajo del flujo de trabajo:" - -#: client/src/templates/main.js:450 -msgid "Failed to get workflow job template. GET returned status:" -msgstr "No se pudo obtener la plantilla de trabajo del flujo de trabajo. Estado devuelto de GET:" - -#: client/src/app.js:229 -#: client/src/login/loginModal/loginModal.controller.js:144 -msgid "Failed to get workflow jobs pending approval. GET returned status:" -msgstr "No se pudo obtener la aprobación pendiente de trabajos del flujo de trabajo. Estado devuelto de GET:" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:223 -msgid "Failed to retrieve job template extra variables." -msgstr "No se pudieron recuperar variables adicionales de la plantilla de trabajo." - -#: client/src/projects/edit/projects-edit.controller.js:155 -msgid "Failed to retrieve project: %s. GET status:" -msgstr "No se pudo recuperar el proyecto: %s. Estado de GET:" - -#: client/src/users/edit/users-edit.controller.js:172 -msgid "Failed to retrieve user: %s. GET status:" -msgstr "No se pudo recuperar el usuario: %s. Estado de GET:" - -#: client/src/configuration/forms/settings-form.controller.js:430 -msgid "Failed to save settings. Returned status:" -msgstr "No se pudieron guardar los ajustes. Estado devuelto:" - -#: client/src/configuration/forms/settings-form.controller.js:555 -msgid "Failed to save toggle settings. Returned status:" -msgstr "Ha fallado el guardado de los ajustes cambiados. Estado devuelto:" - -#: client/src/credentials/factories/credential-form-save.factory.js:94 -msgid "Failed to update Credential. PUT status:" -msgstr "No se pudo actualizar la credencial. Estado de PUT:" - -#: client/src/projects/edit/projects-edit.controller.js:220 -msgid "Failed to update project: %s. PUT status:" -msgstr "No se pudo actualizar el proyecto: %s. Estado de PUT:" - -#: client/features/output/output.strings.js:110 -msgid "Failed to update search results." -msgstr "No se pudieron actualizar los resultados de búsqueda." - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:204 -#: client/src/management-jobs/card/card.controller.js:123 -#: client/src/management-jobs/card/card.controller.js:59 -msgid "Failed updating job %s with variables. POST returned: %d" -msgstr "No se pudo actualizar el trabajo %s con variables. Estado devuelto de POST: %d" - -#: client/src/organizations/main.js:112 -msgid "Failed while checking to see if user is a notification administrator of this organization. GET returned" -msgstr "Error al verificar si el usuario es un administrador de notificaciones de esta organización. Estado devuelto de GET." - -#: client/src/organizations/main.js:125 -msgid "Failed while checking to see if user is an administrator of this organization. GET returned" -msgstr "Error al verificar si el usuario es un administrador del estado GET de esta organización" - -#: client/src/notifications/notifications.list.js:77 -msgid "Failure" -msgstr "Fallo" - -#: client/src/instance-groups/instance-groups.strings.js:81 -msgid "Field for passing a custom Kubernetes or OpenShift Pod specification." -msgstr "Campo para pasar una especificación personalizada de Kubernetes u OpenShift Pod." - -#: client/src/scheduler/schedules.list.js:63 -msgid "Final Run" -msgstr "Última ejecución" - -#: client/lib/services/base-string.service.js:142 -msgid "Finish Time (Ascending)" -msgstr "Hora de finalización (ascendente)" - -#: client/lib/services/base-string.service.js:143 -msgid "Finish Time (Descending)" -msgstr "Hora de finalización (descendente)" - -#: client/features/jobs/jobs.strings.js:10 -#: client/features/output/output.strings.js:52 -#: client/features/output/output.strings.js:64 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:56 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:44 -#: client/src/workflow-results/workflow-results.controller.js:72 -msgid "Finished" -msgstr "Finalizado" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 -#: client/src/teams/teams.form.js:101 -#: client/src/users/users.form.js:29 -#: client/src/users/users.list.js:33 -msgid "First Name" -msgstr "Nombre" - -#: client/src/scheduler/schedules.list.js:53 -msgid "First Run" -msgstr "Primera ejecución" - -#: client/src/organizations/organizations.form.js:124 -msgid "First name" -msgstr "Nombre" - -#: client/src/templates/survey-maker/surveys/init.factory.js:19 -msgid "Float" -msgstr "Decimal corto" - -#: client/features/output/output.strings.js:102 -#: client/src/shared/smart-search/smart-search.partial.html:49 -msgid "For additional information on advanced search syntax please see the Ansible Tower" -msgstr "Para obtener información adicional sobre la sintaxis de búsqueda avanzada, consulte Ansible Tower." - -#: client/src/credentials/factories/become-method-change.factory.js:63 -#: client/src/credentials/factories/kind-change.factory.js:119 -msgid "For example, %s" -msgstr "Por ejemplo, %s" - -#: client/index.template.ejs:113 -msgid "For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept." -msgstr "Para hechos recopilados más antiguos que el período especificado, guarde un escaneo de hechos (instantánea) por ventana de tiempo (frecuencia). Por ejemplo, se purgan los datos con más de 30 días de antigüedad, mientras que se conserva un escaneo de hechos por semana." - -#: client/src/inventories-hosts/hosts/host.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:34 -msgid "For hosts that are part of an external inventory, this flag may be reset by the inventory sync process." -msgstr "Para hosts que son parte de un inventario externo, este indicador se puede restablecer mediante el proceso de sincronización del inventario." - -#: client/src/inventories-hosts/hosts/host.form.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:32 -#: client/src/inventories-hosts/inventory-hosts.strings.js:33 -msgid "For hosts that are part of an external inventory, this may be reset by the inventory sync process." -msgstr "Para hosts que son parte de un inventario externo, esto se puede restablecer mediante el proceso de sincronización del inventario." - -#: client/features/templates/templates.strings.js:59 -#: client/src/templates/job_templates/job-template.form.js:54 -msgid "For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook." -msgstr "En lo que respecta a plantillas de trabajo, seleccione ejecutar para ejecutar el manual. Seleccione marcar para marcar únicamente la sintaxis del manual, probar la configuración del entorno e informar problemas sin ejecutar el manual." - -#: client/src/projects/projects.form.js:145 -msgid "For more information, refer to the" -msgstr "Para obtener más información, consulte la" - -#: client/features/output/output.strings.js:65 -#: client/src/instance-groups/instance-groups.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:110 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:97 -#: client/src/templates/job_templates/job-template.form.js:162 -#: client/src/templates/job_templates/job-template.form.js:168 -msgid "Forks" -msgstr "Forks" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:179 -#: client/src/scheduler/scheduler.strings.js:28 -msgid "Frequency Details" -msgstr "Información sobre la frecuencia" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:454 -#: client/src/scheduler/scheduler.strings.js:41 -msgid "Fri" -msgstr "Vie" - -#: client/src/license/license.partial.html:150 -msgid "GET LICENSES" -msgstr "OBTENER LICENCIAS" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "GO TO NOTIFICATIONS TO" -msgstr "IR A NOTIFICACIONES PARA" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js:45 -msgid "GROUPS" -msgstr "GRUPOS" - -#: client/src/shared/form-generator.js:801 -msgid "Generate field" -msgstr "Generar campo" - -#: client/features/projects/projects.strings.js:18 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:28 -#: client/src/projects/edit/projects-edit.controller.js:119 -msgid "Get latest SCM revision" -msgstr "Utilice la revisión SCM más reciente" - -#: client/features/output/output.strings.js:37 -msgid "Get next page" -msgstr "Obtener página siguiente" - -#: client/features/output/output.strings.js:38 -msgid "Get previous page" -msgstr "Obtener página anterior" - -#: client/src/credential-types/add/add.controller.js:41 -msgid "Getting Started with Credential Types" -msgstr "Inicio con tipos de credenciales" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:92 -msgid "GitHub" -msgstr "GitHub" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:110 -msgid "GitHub (Default)" -msgstr "GitHub (predeterminado)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:31 -msgid "GitHub Category" -msgstr "Categoría de GitHub" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:111 -msgid "GitHub Org" -msgstr "GitHub Org" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:112 -msgid "GitHub Team" -msgstr "Equipo GitHub" - -#: client/src/shared/paginate/paginate.partial.html:18 -msgid "Go to current page of list" -msgstr "Ir a la página actual de la lista" - -#: client/features/output/output.strings.js:36 -msgid "Go to first page" -msgstr "Ir a la primera página" - -#: client/features/output/output.strings.js:39 -msgid "Go to last page of available output" -msgstr "Ir a la última página de resultados disponibles" - -#: client/src/shared/paginate/paginate.partial.html:28 -msgid "Go to last page of list" -msgstr "Ir a la última página de la lista" - -#: client/src/shared/paginate/paginate.partial.html:22 -msgid "Go to next page of list" -msgstr "Ir a la página siguiente de la lista" - -#: client/src/shared/paginate/paginate.partial.html:6 -msgid "Go to page 1 of list" -msgstr "Ir a la página 1 de la lista" - -#: client/src/shared/paginate/paginate.partial.html:12 -msgid "Go to previous page of list" -msgstr "Ir a la página anterior de la lista" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:93 -msgid "Google OAuth2" -msgstr "Google OAuth2" - -#: client/src/notifications/notificationTemplates.form.js:300 -msgid "Grafana API Key" -msgstr "Clave API de Grafana" - -#: client/src/notifications/notificationTemplates.form.js:285 -msgid "Grafana URL" -msgstr "URL de Grafana" - -#: client/src/teams/teams.form.js:170 -#: client/src/users/users.form.js:222 -msgid "Grant Permission" -msgstr "Conceder permiso" - -#: client/src/notifications/add/add.controller.js:84 -#: client/src/notifications/edit/edit.controller.js:147 -msgid "Gray" -msgstr "Gris" - -#: client/src/notifications/add/add.controller.js:85 -#: client/src/notifications/edit/edit.controller.js:148 -msgid "Green" -msgstr "Verde" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:51 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:52 -msgid "Group Variables" -msgstr "Variables de grupo" - -#: client/src/inventories-hosts/hosts/host.form.js:111 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:89 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:23 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:88 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:22 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:113 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:122 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:38 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:145 -msgid "Groups" -msgstr "Grupos" - -#: client/src/scheduler/scheduler.strings.js:61 -msgid "HH24" -msgstr "HH24" - -#: client/lib/services/base-string.service.js:69 -#: client/src/templates/survey-maker/surveys/init.factory.js:499 -msgid "HIDE" -msgstr "OCULTAR" - -#: client/lib/components/components.strings.js:44 -msgid "HINT: Drag and drop private file on the field below." -msgstr "SUGERENCIA: Arrastre y suelte el archivo privado en el siguiente campo." - -#: client/src/activity-stream/get-target-title.factory.js:41 -#: client/src/inventories-hosts/hosts/hosts.partial.html:9 -#: client/src/inventories-hosts/hosts/main.js:81 -#: client/src/inventories-hosts/inventories/inventories.partial.html:15 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.route.js:18 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js:17 -msgid "HOSTS" -msgstr "SERVIDORES" - -#: client/src/notifications/notificationTemplates.form.js:410 -#: client/src/notifications/notificationTemplates.form.js:411 -msgid "HTTP Headers" -msgstr "Cabeceras HTTP" - -#: client/src/notifications/notificationTemplates.form.js:427 -#: client/src/notifications/notificationTemplates.form.js:428 -msgid "HTTP Method" -msgstr "Método HTTP" - -#: client/lib/components/components.strings.js:12 -msgid "Hide" -msgstr "Ocultar" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "Hide Activity Stream" -msgstr "Ocultar flujo de actividad" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:23 -msgid "High" -msgstr "Alto" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:13 -msgid "High Risk" -msgstr "Riesgo alto" - -#: client/src/credentials/credentials.form.js:139 -#: client/src/notifications/notificationTemplates.form.js:83 -msgid "Host" -msgstr "Servidor" - -#: client/src/credentials/factories/become-method-change.factory.js:52 -#: client/src/credentials/factories/kind-change.factory.js:108 -msgid "Host (Authentication URL)" -msgstr "Servidor (URL de autenticación)" - -#: client/src/templates/job_templates/job-template.form.js:387 -#: client/src/templates/job_templates/job-template.form.js:396 -msgid "Host Config Key" -msgstr "Clave de configuración del servidor" - -#: client/src/inventories-hosts/hosts/host.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:39 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:39 -msgid "Host Enabled" -msgstr "Servidor habilitado" - -#: client/features/output/output.strings.js:66 -msgid "Host Limit Error" -msgstr "Error de límite de host" - -#: client/src/inventories-hosts/hosts/host.form.js:45 -#: client/src/inventories-hosts/hosts/host.form.js:56 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:44 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:55 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:46 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:57 -msgid "Host Name" -msgstr "Nombre de Host" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:78 -msgid "Host Variables" -msgstr "Variables de Host" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is available" -msgstr "El host está disponible" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is available. Click to toggle." -msgstr "El host está disponible. Haga clic para alternar." - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is not available" -msgstr "El host no está disponible" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is not available. Click to toggle." -msgstr "El host no está disponible. Haga clic para alternar." - -#: client/features/output/output.strings.js:13 -msgid "Host status information for this job is unavailable." -msgstr "La información de estado del host para esta tarea no se encuentra disponible." - -#: client/features/output/output.strings.js:119 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:39 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:98 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:64 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:149 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:155 -msgid "Hosts" -msgstr "Servidores" - -#: client/src/license/license.partial.html:52 -#: client/src/license/license.partial.html:58 -msgid "Hosts Available" -msgstr "Servidores disponibles" - -#: client/src/license/license.partial.html:68 -msgid "Hosts Remaining" -msgstr "Servidores restantes" - -#: client/src/license/license.partial.html:62 -msgid "Hosts Used" -msgstr "Servidores utilizados" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "Hosts are imported to" -msgstr "Los hosts se importan a" - -#: client/features/output/output.strings.js:129 -msgid "ID" -msgstr "ID" - -#: client/src/notifications/notificationTemplates.form.js:313 -msgid "ID of the Dashboard (optional)" -msgstr "ID de tablero (opcional)" - -#: client/src/notifications/notificationTemplates.form.js:321 -msgid "ID of the Panel (optional)" -msgstr "ID de panel (opcional)" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:14 -msgid "INITIATED BY" -msgstr "INICIALIZADO POR" - -#: client/src/inventories-hosts/inventories/insights/insights.route.js:7 -msgid "INSIGHTS" -msgstr "OBSERVACIONES" - -#: client/src/instance-groups/instance-groups.list.js:6 -#: client/src/instance-groups/instance-groups.list.js:7 -#: client/src/instance-groups/instance-groups.strings.js:10 -#: client/src/instance-groups/instance-groups.strings.js:19 -msgid "INSTANCE GROUPS" -msgstr "GRUPOS DE INSTANCIA" - -#: client/src/instance-groups/instance-groups.strings.js:11 -#: client/src/instance-groups/instance-groups.strings.js:30 -msgid "INSTANCES" -msgstr "INSTANCIAS" - -#: client/src/activity-stream/get-target-title.factory.js:14 -#: client/src/inventories-hosts/hosts/hosts.partial.html:8 -#: client/src/inventories-hosts/inventories/inventories.partial.html:14 -#: client/src/inventories-hosts/inventories/inventories.route.js:8 -#: client/src/inventories-hosts/inventories/inventory.list.js:14 -#: client/src/inventories-hosts/inventories/inventory.list.js:15 -#: client/src/organizations/linkout/organizations-linkout.route.js:138 -#: client/src/organizations/list/organizations-list.controller.js:69 -msgid "INVENTORIES" -msgstr "INVENTARIOS" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:138 -msgid "INVENTORY" -msgstr "INVENTARIO" - -#: client/src/inventory-scripts/inventory-scripts.form.js:23 -msgid "INVENTORY SCRIPT" -msgstr "SCRIPT DE INVENTARIO" - -#: client/src/activity-stream/get-target-title.factory.js:35 -#: client/src/inventory-scripts/inventory-scripts.list.js:12 -#: client/src/inventory-scripts/main.js:65 -msgid "INVENTORY SCRIPTS" -msgstr "SCRIPTS DE INVENTARIO" - -#: client/src/notifications/notificationTemplates.form.js:524 -msgid "IRC Nick" -msgstr "Alias en IRC" - -#: client/src/notifications/notificationTemplates.form.js:513 -msgid "IRC Server Address" -msgstr "Dirección del servidor IRC" - -#: client/src/notifications/shared/type-change.service.js:72 -msgid "IRC Server Password" -msgstr "Contraseña del servidor IRC" - -#: client/src/notifications/shared/type-change.service.js:71 -msgid "IRC Server Port" -msgstr "Puerto del servidor IRC" - -#: client/src/instance-groups/instance-groups.strings.js:21 -msgid "ISOLATED" -msgstr "AISLADO" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:79 -msgid "ISSUE: {{report.rule.description}}" -msgstr "PROBLEMA: {{report.rule.description}}" - -#: client/src/shared/paginate/paginate.partial.html:43 -msgid "ITEMS" -msgstr "ELEMENTOS" - -#: client/src/notifications/notificationTemplates.form.js:467 -#: client/src/notifications/notificationTemplates.form.js:499 -msgid "Icon URL" -msgstr "URL de icono" - -#: client/src/login/authenticationServices/timer.factory.js:157 -msgid "Idle Session" -msgstr "Sesión inactiva" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "If blank, all groups above are created except" -msgstr "Si está en blanco, se crean todos los grupos de arriba, excepto" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:364 -msgid "If checked, all variables for child groups and hosts will be removed and replaced by those found on the external source." -msgstr "Si las opciones están marcadas, todas las variables de los grupos de hijos y hosts se eliminarán y reemplazarán con aquellas que se hallen en la fuente externa." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:353 -msgid "If checked, any hosts and groups that were previously present on the external source but are now removed will be removed from the Tower inventory. Hosts and groups that were not managed by the inventory source will be promoted to the next manually created group or if there is no manually created group to promote them into, they will be left in the \"all\" default group for the inventory." -msgstr "Si las opciones están marcadas, cualquier grupo o host que estuvo presente previamente en la fuente externa pero que ahora se eliminó, se eliminará del inventario de Tower. Los hosts y grupos que no fueron administrados por la fuente del inventario serán promovidos al siguiente grupo creado manualmente o, si no hay un grupo creado manualmente al que puedan ser promovidos, se los dejará en el grupo predeterminado \"Todo\" para el inventario." - -#: client/src/templates/job_templates/job-template.form.js:324 -msgid "If enabled, run this playbook as an administrator." -msgstr "Si se encuentra habilitada la opción, ejecute este manual como administrador." - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:121 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Si se habilita, muestra los cambios realizados por las tareas de Ansible, donde sea compatible. Esto es equivalente al modo --diff de Ansible." - -#: client/features/templates/templates.strings.js:51 -#: client/src/templates/job_templates/job-template.form.js:309 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Si se habilita, muestra los cambios realizados por las tareas de Ansible, donde sea compatible. Esto es equivalente al modo --diff de Ansible." - -#: client/src/templates/job_templates/job-template.form.js:356 -msgid "If enabled, simultaneous runs of this job template will be allowed." -msgstr "Si se habilita esta opción, la ejecución de esta plantilla de trabajo en paralelo será permitida." - -#: client/src/templates/workflows.form.js:160 -msgid "If enabled, simultaneous runs of this workflow job template will be allowed." -msgstr "Si se habilita esta opción, se permitirá la ejecución de esta plantilla de flujo de trabajo en paralelo." - -#: client/src/templates/job_templates/job-template.form.js:366 -msgid "If enabled, use cached facts if available and store discovered facts in the cache." -msgstr "Si se habilita, usa los eventos almacenados en caché, si están disponibles, y almacena los elementos detectados en la caché." - -#: client/src/credentials/credentials.form.js:52 -msgid "If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization." -msgstr "Si no se especifica ninguna organización, el credencial puede ser sólo utilizado por el usuario que ha creado dicho credencial. Administradores de organización y administradores de sistema pueden asignar una organización para que los roles puedan permitir que los credenciales puedan ser asignados a usuarios y equipos en esa organización" - -#: client/src/license/license.partial.html:74 -msgid "If you are ready to upgrade, please contact us by clicking the button below" -msgstr "Si usted está listo para la actualización, por favor contáctenos pulsando el siguiente botón" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:242 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:254 -msgid "Image ID:" -msgstr "ID de la imagen:" - -#: client/src/inventories-hosts/hosts/host.form.js:34 -#: client/src/inventories-hosts/hosts/host.list.js:35 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:32 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:33 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:30 -#: client/src/inventories-hosts/inventory-hosts.strings.js:32 -msgid "Indicates if a host is available and should be included in running jobs." -msgstr "Indica si el servidor está disponible y debe ser incluído en trabajos en ejecución." - -#: client/src/activity-stream/activity-detail.form.js:31 -#: client/src/activity-stream/streams.list.js:33 -msgid "Initiated by" -msgstr "Inicializado por" - -#: client/src/credential-types/credential-types.form.js:53 -#: client/src/credential-types/credential-types.form.js:61 -msgid "Injector Configuration" -msgstr "Configuración del inyector" - -#: client/src/credential-types/credential-types.form.js:39 -#: client/src/credential-types/credential-types.form.js:47 -msgid "Input Configuration" -msgstr "Configuración de entrada" - -#: client/src/inventories-hosts/hosts/host.form.js:119 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:129 -msgid "Insights" -msgstr "Insights" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:52 -msgid "Insights Credential" -msgstr "Credencial de Insights" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:144 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:147 -msgid "Instance Filters" -msgstr "Filtros de instancias" - -#: client/features/output/output.strings.js:67 -#: client/src/instance-groups/instance-groups.strings.js:43 -msgid "Instance Group" -msgstr "Grupo de instancias" - -#: client/src/instance-groups/instance-groups.strings.js:71 -msgid "Instance Group parameter is missing." -msgstr "Falta el parámetro del Grupo de instancias." - -#: client/lib/components/components.strings.js:86 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:54 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:57 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:61 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:64 -#: client/src/organizations/organizations.form.js:38 -#: client/src/organizations/organizations.form.js:41 -#: client/src/templates/job_templates/job-template.form.js:268 -#: client/src/templates/job_templates/job-template.form.js:271 -msgid "Instance Groups" -msgstr "Grupos de instancias" - -#: client/src/instance-groups/instance-groups.strings.js:37 -msgid "Instance Groups Help" -msgstr "Ayuda para grupos de instancias" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "Instance ID" -msgstr "ID de instancia" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:243 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:255 -msgid "Instance ID:" -msgstr "ID de instancia:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:244 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:256 -msgid "Instance Type:" -msgstr "Tipo de instancia:" - -#: client/lib/components/components.strings.js:85 -#: client/src/instance-groups/instance-groups.strings.js:20 -msgid "Instances" -msgstr "Instancias" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "Insufficient Permissions" -msgstr "Permisos insuficientes" - -#: client/src/templates/survey-maker/surveys/init.factory.js:18 -msgid "Integer" -msgstr "Entero" - -#: client/src/license/license.partial.html:11 -msgid "Invalid License" -msgstr "Licencia no valida" - -#: client/src/license/license.controller.js:109 -#: client/src/license/license.controller.js:117 -msgid "Invalid file format. Please upload valid JSON." -msgstr "Formato de fichero inválido. Por favor cargue un JSON válido." - -#: client/lib/components/components.strings.js:16 -msgid "Invalid input for this type." -msgstr "Entrada no válida para este tipo." - -#: client/features/output/output.strings.js:111 -msgid "Invalid search filter provided." -msgstr "Se introdujo un filtro de búsqueda no válido." - -#: client/src/login/loginModal/loginModal.partial.html:46 -msgid "Invalid username and/or password. Please try again." -msgstr "Nombre de usuario o contraseña inválido. Por favor intente de nuevo." - -#: client/lib/components/components.strings.js:77 -#: client/lib/models/models.strings.js:16 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:121 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:52 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/organizations/linkout/organizations-linkout.route.js:147 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "Inventories" -msgstr "Inventarios" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:43 -msgid "Inventories with sources cannot be copied" -msgstr "No se pueden copiar los inventarios con fuentes" - -#: client/features/jobs/jobs.strings.js:14 -#: client/features/output/output.strings.js:69 -#: client/features/templates/templates.strings.js:19 -#: client/features/templates/templates.strings.js:28 -#: client/src/inventories-hosts/hosts/host.list.js:75 -#: client/src/inventories-hosts/inventories/inventory.list.js:85 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/templates/job_templates/job-template.form.js:66 -#: client/src/templates/job_templates/job-template.form.js:80 -#: client/src/templates/workflows.form.js:72 -#: client/src/templates/workflows.form.js:82 -#: client/src/workflow-results/workflow-results.controller.js:78 -msgid "Inventory" -msgstr "Inventario" - -#: client/lib/services/base-string.service.js:148 -msgid "Inventory (Ascending)" -msgstr "Inventario (ascendente)" - -#: client/lib/services/base-string.service.js:149 -msgid "Inventory (Descending)" -msgstr "Inventario (descendente)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:109 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:123 -msgid "Inventory File" -msgstr "Archivo de inventario" - -#: client/src/workflow-results/workflow-results.controller.js:79 -msgid "Inventory Limit" -msgstr "Límite de inventario" - -#: client/lib/components/components.strings.js:82 -#: client/lib/models/models.strings.js:20 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 -msgid "Inventory Scripts" -msgstr "Scripts de inventario" - -#: client/lib/models/models.strings.js:25 -msgid "Inventory Sources" -msgstr "Fuentes de inventario" - -#: client/features/templates/templates.strings.js:118 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:52 -#: client/src/workflow-results/workflow-results.controller.js:99 -msgid "Inventory Sync" -msgstr "Sincronización de inventario" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:55 -msgid "Inventory Sync Failures" -msgstr "Errores de sincronización de inventario" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:75 -msgid "Inventory Variables" -msgstr "Variables de inventario" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:72 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:67 -msgid "Inventory contains 0 hosts." -msgstr "El inventario contiene 0 hosts." - -#: client/features/output/output.strings.js:47 -msgid "Isolated" -msgstr "Aislada" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "JOB ID" -msgstr "ID DE TAREA" - -#: client/features/output/output.strings.js:109 -msgid "JOB IS STILL RUNNING" -msgstr "EL TRABAJO AÚN SE ESTÁ EJECUTANDO" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:4 -msgid "JOB STATUS" -msgstr "ESTADO DEL TRABAJO" - -#: client/src/templates/job_templates/job-template.form.js:22 -msgid "JOB TEMPLATE" -msgstr "PLANTILLA DE TRABAJO" - -#: client/features/portalMode/portalMode.strings.js:8 -#: client/features/templates/routes/organizationsTemplatesList.route.js:28 -#: client/features/templates/routes/projectsTemplatesList.route.js:29 -#: client/src/organizations/list/organizations-list.controller.js:83 -msgid "JOB TEMPLATES" -msgstr "PLANTILLAS DE TRABAJO" - -#: client/features/jobs/jobs.strings.js:8 -#: client/features/jobs/routes/instanceGroupJobs.route.js:13 -#: client/features/jobs/routes/instanceGroupJobs.route.js:75 -#: client/features/jobs/routes/instanceJobs.route.js:13 -#: client/features/jobs/routes/inventoryCompletedJobs.route.js:29 -#: client/features/jobs/routes/jobs.route.js:12 -#: client/features/portalMode/portalMode.strings.js:9 -#: client/src/activity-stream/get-target-title.factory.js:32 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:115 -#: client/src/instance-groups/instance-groups.strings.js:31 -msgid "JOBS" -msgstr "TRABAJOS" - -#: client/lib/components/code-mirror/code-mirror.strings.js:14 -#: client/lib/services/base-string.service.js:73 -msgid "JSON" -msgstr "JSON" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:197 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:221 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:245 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:320 -msgid "JSON:" -msgstr "JSON:" - -#: client/features/jobs/jobs.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:118 -msgid "Job" -msgstr "Tarea" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Job Not Found" -msgstr "Trabajo no encontrado" - -#: client/src/templates/job_templates/job-template.form.js:277 -msgid "Job Slicing" -msgstr "Fraccionamiento de trabajos" - -#: client/features/output/output.strings.js:72 -#: client/features/templates/templates.strings.js:54 -#: client/src/templates/job_templates/job-template.form.js:206 -#: client/src/templates/job_templates/job-template.form.js:213 -msgid "Job Tags" -msgstr "Etiquetas de trabajo" - -#: client/features/jobs/jobs.strings.js:13 -#: client/features/output/output.strings.js:73 -#: client/features/templates/templates.strings.js:116 -#: client/features/templates/templates.strings.js:13 -#: client/src/templates/templates.list.js:61 -msgid "Job Template" -msgstr "Plantilla de trabajo" - -#: client/lib/models/models.strings.js:30 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:102 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:36 -#: client/src/projects/projects.form.js:334 -msgid "Job Templates" -msgstr "Plantillas de trabajo" - -#: client/features/output/output.strings.js:75 -#: client/features/templates/templates.strings.js:58 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:35 -#: client/src/templates/job_templates/job-template.form.js:47 -#: client/src/templates/job_templates/job-template.form.js:55 -msgid "Job Type" -msgstr "Tipo de trabajo" - -#: client/src/workflow-results/workflow-results.service.js:100 -msgid "Job has completed. Unable to be canceled." -msgstr "Se ha terminado el trabajo. No se pudo cancelar." - -#: client/features/output/output.strings.js:30 -msgid "Job is one of several from a JT that slices on inventory" -msgstr "El trabajo es uno de varios de un JT que se segmenta en el inventario" - -#: client/features/jobs/jobs.strings.js:20 -msgid "Job {{status}}. Click for details." -msgstr "Trabajo {{status}}. Haga clic para obtener detalles." - -#: client/features/templates/templates.strings.js:125 -#: client/lib/components/components.strings.js:71 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 -#: client/src/configuration/settings.partial.html:5 -#: client/src/instance-groups/instance-groups.strings.js:60 -msgid "Jobs" -msgstr "Trabajos" - -#: client/features/output/output.strings.js:107 -#: client/features/templates/templates.strings.js:111 -#: client/src/workflow-results/workflow-results.controller.js:101 -msgid "KEY" -msgstr "CLAVE" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:61 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:153 -#: client/src/shared/smart-search/smart-search.partial.html:14 -msgid "Key" -msgstr "Clave" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:245 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:257 -msgid "Key Name:" -msgstr "Nombre de la clave:" - -#: client/src/credential-types/credential-types.list.js:31 -#: client/src/credentials/credentials.list.js:33 -msgid "Kind" -msgstr "Tipo" - -#: client/features/applications/applications.strings.js:31 -#: client/features/projects/projects.strings.js:12 -msgid "LAST MODIFIED" -msgstr "ÚLTIMO MODIFICADO" - -#: client/features/projects/projects.strings.js:13 -#: client/features/users/tokens/tokens.strings.js:38 -msgid "LAST USED" -msgstr "ÚLTIMO UTILIZADO" - -#: client/features/templates/templates.strings.js:34 -#: client/lib/components/components.strings.js:112 -msgid "LAUNCH" -msgstr "LANZAMIENTO" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:94 -msgid "LDAP" -msgstr "LDAP" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:102 -msgid "LDAP 1 (Optional)" -msgstr "LDAP 1 (Opcional)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:103 -msgid "LDAP 2 (Optional)" -msgstr "LDAP 2 (Opcional)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:104 -msgid "LDAP 3 (Optional)" -msgstr "LDAP 3 (Opcional)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:105 -msgid "LDAP 4 (Optional)" -msgstr "LDAP 4 (Opcional)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:106 -msgid "LDAP 5 (Optional)" -msgstr "LDAP 5 (Opcional)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:18 -msgid "LDAP Server" -msgstr "Servidor LDAP" - -#: client/src/license/license.route.js:18 -msgid "LICENSE" -msgstr "LICENCIA" - -#: client/features/output/output.strings.js:76 -#: client/src/templates/job_templates/job-template.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:244 -#: client/src/templates/templates.list.js:43 -#: client/src/templates/workflows.form.js:121 -#: client/src/templates/workflows.form.js:125 -#: client/src/workflow-results/workflow-results.controller.js:73 -msgid "Labels" -msgstr "Etiquetas" - -#: client/features/templates/templates.strings.js:22 -msgid "Last Modified" -msgstr "Último modificado" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 -#: client/src/teams/teams.form.js:105 -#: client/src/users/users.form.js:35 -#: client/src/users/users.list.js:37 -msgid "Last Name" -msgstr "Apellido" - -#: client/features/templates/templates.strings.js:23 -msgid "Last Ran" -msgstr "Último ejecutado" - -#: client/lib/services/base-string.service.js:134 -msgid "Last Run (Ascending)" -msgstr "Última ejecución (ascendente)" - -#: client/lib/services/base-string.service.js:135 -msgid "Last Run (Descending)" -msgstr "Última ejecución (descendente)" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:56 -msgid "Last Sync" -msgstr "Última sincronización" - -#: client/src/projects/projects.list.js:62 -msgid "Last Updated" -msgstr "Última actualización" - -#: client/lib/services/base-string.service.js:136 -msgid "Last Used (Ascending)" -msgstr "Usada por última vez (ascendente)" - -#: client/lib/services/base-string.service.js:137 -msgid "Last Used (Descending)" -msgstr "Usada por última vez (descendente)" - -#: client/src/shared/form-generator.js:1402 -msgid "Last logged in:" -msgstr "Última sesión:" - -#: client/src/organizations/organizations.form.js:128 -msgid "Last name" -msgstr "Apellido" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:33 -#: client/src/shared/form-generator.js:1660 -msgid "Launch" -msgstr "Ejecutar" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:49 -msgid "Launch Configuration" -msgstr "Ejecutar configuración" - -#: client/src/management-jobs/card/card.partial.html:21 -#: client/src/management-jobs/card/card.partial.html:24 -msgid "Launch Management Job" -msgstr "Ejecutar trabajo de gestión" - -#: client/features/jobs/jobs.strings.js:12 -#: client/features/output/output.strings.js:77 -#: client/src/workflow-results/workflow-results.controller.js:70 -msgid "Launched By" -msgstr "Ejecutado por" - -#: client/lib/services/base-string.service.js:146 -msgid "Launched By (Ascending)" -msgstr "Ejecutado por (ascendente)" - -#: client/lib/services/base-string.service.js:147 -msgid "Launched By (Descending)" -msgstr "Ejecutado por (descendente)" - -#: client/features/templates/templates.strings.js:42 -msgid "Launching this job requires the passwords listed below. Enter each password before continuing." -msgstr "Ejecutar esta tarea requiere las siguientes contraseñas. Ingrese cada contraseña antes de continuar." - -#: client/features/users/tokens/tokens.strings.js:32 -msgid "Leaving this field blank will result in the creation of a Personal Access Token which is not linked to an Application." -msgstr "Si deja este campo en blanco, se creará un token de acceso personal que no está vinculado a una aplicación." - -#: client/features/credentials/legacy.credentials.js:350 -msgid "Legacy state configuration for does not exist" -msgstr "No existe la configuración del estado heredado de" - -#: client/lib/components/components.strings.js:98 -#: client/src/configuration/settings.partial.html:14 -#: client/src/license/license.controller.js:47 -#: client/src/license/license.partial.html:109 -#: client/src/license/license.partial.html:8 -msgid "License" -msgstr "Licencia" - -#: client/features/output/output.strings.js:78 -msgid "License Error" -msgstr "Error de licencia" - -#: client/src/license/license.partial.html:33 -msgid "License Key" -msgstr "Clave de licencia" - -#: client/src/license/license.controller.js:49 -msgid "License Management" -msgstr "Gestión de licencia" - -#: client/src/license/license.partial.html:21 -msgid "License Type" -msgstr "Tipo de licencia" - -#: client/features/output/output.strings.js:79 -#: client/features/templates/templates.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:45 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:55 -#: client/src/templates/job_templates/job-template.form.js:175 -#: client/src/templates/job_templates/job-template.form.js:179 -#: client/src/templates/workflows.form.js:93 -#: client/src/templates/workflows.form.js:97 -msgid "Limit" -msgstr "Límite" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:255 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:268 -msgid "Limit to hosts having a tag:" -msgstr "Se limita a hosts que tengan una etiqueta:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:257 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:270 -msgid "Limit to hosts using either key pair:" -msgstr "Se limita a hosts que utilicen un par de claves:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "Limit to hosts where the Name tag begins with" -msgstr "Se limita a hosts en los que la etiqueta Nombre comience con" - -#: client/src/scheduler/scheduler.strings.js:51 -msgid "Limited to first 10" -msgstr "Limitado a los primeros 10" - -#: client/src/shared/socket/socket.service.js:225 -msgid "Live events: attempting to connect to the server." -msgstr "Eventos en directo: intentando conectar al servidor." - -#: client/src/shared/socket/socket.service.js:229 -msgid "Live events: connected. Pages containing job status information will automatically update in real-time." -msgstr "Eventos en directo: Páginas que contienen información del estado de un trabajo serán actualizados automáticamente en tiempo real." - -#: client/src/shared/socket/socket.service.js:233 -msgid "Live events: error connecting to the server." -msgstr "Eventos en directo: error al conectar al servidor." - -#: client/src/shared/form-generator.js:1935 -msgid "Loading..." -msgstr "Cargando..." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:136 -#: client/src/scheduler/scheduler.strings.js:26 -msgid "Local Time Zone" -msgstr "Huso horario local" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:588 -msgid "Local time" -msgstr "Hora local" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:228 -msgid "Log aggregator test failed.
Detail:" -msgstr "Error en la prueba del agregador de registros.
Detalles:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:218 -msgid "Log aggregator test sent successfully." -msgstr "Se envió correctamente la prueba del agregador de registros." - -#: client/lib/components/components.strings.js:67 -msgid "Logged in as" -msgstr "Conectado como" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:85 -msgid "Logging" -msgstr "Registros" - -#: client/lib/components/components.strings.js:69 -#: client/lib/components/layout/layout.partial.html:39 -msgid "Logout" -msgstr "Finalización de la sesión" - -#: client/src/shared/form-generator.js:1258 -msgid "Lookup field" -msgstr "Campo de búsqueda" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:35 -msgid "Low" -msgstr "Bajo" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:15 -msgid "Low Risk" -msgstr "Riesgo bajo" - -#: client/src/management-jobs/card/card.partial.html:6 -#: client/src/management-jobs/card/card.route.js:19 -msgid "MANAGEMENT JOBS" -msgstr "TAREAS DE GESTIÓN" - -#: client/src/instance-groups/instance-groups.strings.js:18 -msgid "MANUAL" -msgstr "MANUAL" - -#: client/features/credentials/credentials.strings.js:32 -msgid "METADATA" -msgstr "METADATOS" - -#: client/src/scheduler/scheduler.strings.js:62 -msgid "MM" -msgstr "MM" - -#: client/features/output/output.strings.js:132 -msgid "MODULE" -msgstr "MÓDULO" - -#: client/features/portalMode/routes/portalModeTemplatesList.route.js:13 -msgid "MY VIEW" -msgstr "MI VISTA" - -#: client/src/credentials/credentials.form.js:67 -msgid "Machine" -msgstr "Máquina" - -#: client/features/output/output.strings.js:80 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:60 -msgid "Machine Credential" -msgstr "Credenciales de máquina" - -#: client/src/license/license.partial.html:240 -msgid "Managed Nodes" -msgstr "Nodos gestionados" - -#: client/lib/components/components.strings.js:84 -msgid "Management Jobs" -msgstr "Trabajos de gestión" - -#: client/features/projects/projects.strings.js:20 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:45 -#: client/src/projects/edit/projects-edit.controller.js:126 -msgid "Manual projects do not require an SCM update" -msgstr "Los proyectos manuales no necesitan una actualización del SCM" - -#: client/src/templates/job_templates/job-template.form.js:250 -#: client/src/templates/workflows.form.js:131 -msgid "Max 512 characters per label." -msgstr "Máx. 512 caracteres por etiqueta." - -#: client/src/organizations/organizations.form.js:59 -#: client/src/organizations/organizations.form.js:66 -msgid "Max Hosts" -msgstr "Número máximo de hosts" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:161 -msgid "Maximum" -msgstr "Máximo" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:119 -#: client/src/templates/survey-maker/shared/question-definition.form.js:140 -#: client/src/templates/survey-maker/shared/question-definition.form.js:98 -msgid "Maximum Length" -msgstr "Longitud máxima" - -#: client/src/login/loginModal/loginModal.partial.html:40 -msgid "Maximum per-user sessions reached. Please sign in." -msgstr "Máximo número de sesiones por usuario alcanzado. Por favor identifíquese." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:181 -msgid "Maximum<" -msgstr "Máximo" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:29 -msgid "Medium" -msgstr "Medio" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:14 -msgid "Medium Risk" -msgstr "Riesgo medio" - -#: client/src/shared/stateDefinitions.factory.js:607 -msgid "Member" -msgstr "Miembro" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:156 -#: client/src/templates/survey-maker/shared/question-definition.form.js:176 -msgid "Minimum" -msgstr "Mínimo" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:113 -#: client/src/templates/survey-maker/shared/question-definition.form.js:134 -#: client/src/templates/survey-maker/shared/question-definition.form.js:92 -msgid "Minimum Length" -msgstr "Longitud mínima" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:83 -msgid "Misc. System" -msgstr "Sistema de varios" - -#: client/src/templates/workflows.form.js:35 -msgid "Missing Job Templates found in the Workflow Editor" -msgstr "Plantillas de trabajo faltantes encontradas en el Editor de flujo de trabajo" - -#: client/lib/services/base-string.service.js:130 -msgid "Modified (Ascending)" -msgstr "Modificado (ascendente)" - -#: client/lib/services/base-string.service.js:131 -msgid "Modified (Descending)" -msgstr "Modificado (descendente)" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:22 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:30 -msgid "Module" -msgstr "Módulo" - -#: client/features/output/output.strings.js:81 -msgid "Module Args" -msgstr "Argumentos del módulo" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:414 -#: client/src/scheduler/scheduler.strings.js:37 -msgid "Mon" -msgstr "Lun" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:25 -msgid "Most recent job failed. Click to view jobs." -msgstr "Error en la tarea más reciente. Haga clic para ver las tareas." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:29 -msgid "Most recent job successful. Click to view jobs." -msgstr "La tarea más reciente se completó correctamente. Haga clic para ver las tareas." - -#: client/src/templates/survey-maker/surveys/init.factory.js:17 -msgid "Multiple Choice (multiple select)" -msgstr "Opciones de selección múltiple" - -#: client/src/templates/survey-maker/surveys/init.factory.js:16 -msgid "Multiple Choice (single select)" -msgstr "Selección múltiple" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:77 -msgid "Multiple Choice Options" -msgstr "Opciones de selección múltiple" - -#: client/features/portalMode/index.view.html:26 -msgid "My Jobs" -msgstr "Mis trabajos" - -#: client/lib/components/components.strings.js:73 -msgid "My View" -msgstr "Mi vista" - -#: client/features/applications/applications.strings.js:24 -msgid "NAME" -msgstr "NOMBRE" - -#: client/features/applications/applications.strings.js:20 -msgid "NEW APPLICATION" -msgstr "NUEVA APLICACIÓN" - -#: client/features/credentials/credentials.strings.js:40 -msgid "NEW CREDENTIAL" -msgstr "NUEVA CREDENCIAL" - -#: client/src/credential-types/credential-types.form.js:16 -msgid "NEW CREDENTIAL TYPE" -msgstr "NUEVO TIPO DE CREDENCIAL" - -#: client/src/inventory-scripts/inventory-scripts.form.js:16 -msgid "NEW CUSTOM INVENTORY" -msgstr "NUEVO INVENTARIO PERSONALIZADO" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:17 -msgid "NEW INVENTORY" -msgstr "NUEVO INVENTARIO" - -#: client/src/templates/job_templates/job-template.form.js:19 -msgid "NEW JOB TEMPLATE" -msgstr "NEVA PLANTILLA DE TRABAJO" - -#: client/src/notifications/notificationTemplates.form.js:16 -msgid "NEW NOTIFICATION TEMPLATE" -msgstr "NUEVA PLANTILLA DE NOTIFICACION" - -#: client/src/organizations/organizations.form.js:18 -msgid "NEW ORGANIZATION" -msgstr "NUEVA ORGANIZACION" - -#: client/src/projects/projects.form.js:17 -msgid "NEW PROJECT" -msgstr "NUEVO PROYECTO" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:10 -msgid "NEW SMART INVENTORY" -msgstr "NUEVO INVENTARIO INTELIGENTE" - -#: client/src/teams/teams.form.js:16 -msgid "NEW TEAM" -msgstr "NUEVO EQUIPO" - -#: client/src/users/users.form.js:16 -msgid "NEW USER" -msgstr "NUEVO USUARIO" - -#: client/src/templates/workflows.form.js:17 -msgid "NEW WORKFLOW JOB TEMPLATE" -msgstr "NUEVA PLANTILLA DE FLUJO DE TRABAJO" - -#: client/lib/services/base-string.service.js:67 -msgid "NEXT" -msgstr "SIGUIENTE" - -#: client/src/inventories-hosts/hosts/hosts.partial.html:38 -msgid "NO HOSTS HAVE BEEN CREATED" -msgstr "NO SE CREARON HOSTS" - -#: client/features/output/output.strings.js:142 -msgid "NO JOBS FINISHED" -msgstr "NINGÚN TRABAJO FINALIZADO" - -#: client/lib/components/components.strings.js:40 -msgid "NO OPTIONS AVAILABLE" -msgstr "NO HAY OPCIONES DISPONIBLES" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:117 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:120 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:123 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:127 -msgid "NONE SELECTED" -msgstr "NO SE SELECCIONÓ NINGUNO" - -#: client/src/projects/projects.form.js:139 -msgid "NOTE: This field assumes the remote name is \"origin\"." -msgstr "NOTA: Este campo asume que el nombre remoto es \"origen\"." - -#: client/src/login/loginModal/loginModal.partial.html:101 -msgid "NOTICE" -msgstr "AVISO" - -#: client/src/notifications/notificationTemplates.form.js:21 -msgid "NOTIFICATION TEMPLATE" -msgstr "PLANTILLA DE NOTIFICACIÓN" - -#: client/src/activity-stream/get-target-title.factory.js:26 -#: client/src/notifications/notificationTemplates.list.js:14 -msgid "NOTIFICATION TEMPLATES" -msgstr "PLANTILLAS DE NOTIFICACIÓN" - -#: client/lib/components/components.strings.js:131 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js:9 -#: client/src/management-jobs/notifications/notification.route.js:46 -#: client/src/notifications/main.js:44 -#: client/src/notifications/main.js:95 -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "NOTIFICATIONS" -msgstr "NOTIFICACIONES" - -#: client/features/output/output.strings.js:82 -#: client/src/credential-types/credential-types.form.js:27 -#: client/src/credential-types/credential-types.list.js:24 -#: client/src/credentials/credentials.form.js:32 -#: client/src/credentials/credentials.list.js:26 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:15 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:15 -#: client/src/instance-groups/instance-groups.list.js:15 -#: client/src/inventories-hosts/hosts/host.list.js:68 -#: client/src/inventories-hosts/inventories/inventory.list.js:52 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:33 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:37 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:21 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:28 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:45 -#: client/src/inventory-scripts/inventory-scripts.form.js:28 -#: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 -#: client/src/notifications/notificationTemplates.form.js:32 -#: client/src/notifications/notificationTemplates.list.js:37 -#: client/src/notifications/notifications.list.js:27 -#: client/src/organizations/organizations.form.js:26 -#: client/src/projects/projects.form.js:30 -#: client/src/projects/projects.list.js:43 -#: client/src/scheduler/scheduled-jobs.list.js:36 -#: client/src/scheduler/scheduler.strings.js:21 -#: client/src/scheduler/schedules.list.js:48 -#: client/src/teams/teams.form.js:135 -#: client/src/teams/teams.form.js:28 -#: client/src/teams/teams.list.js:23 -#: client/src/templates/job_templates/job-template.form.js:34 -#: client/src/templates/templates.list.js:24 -#: client/src/templates/workflows.form.js:42 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:119 -#: client/src/users/users.form.js:143 -#: client/src/users/users.form.js:171 -#: client/src/users/users.form.js:199 -msgid "Name" -msgstr "Nombre" - -#: client/lib/services/base-string.service.js:126 -msgid "Name (Ascending)" -msgstr "Nombre (ascendente)" - -#: client/lib/services/base-string.service.js:127 -msgid "Name (Descending)" -msgstr "Nombre (descendente)" - -#: client/lib/components/layout/layout.partial.html:4 -msgid "Navigate to dashboard" -msgstr "Navegar al panel de control" - -#: client/features/output/details.partial.html:244 -msgid "Navigate to inventory sync job" -msgstr "Navegar a la tarea de sincronización del inventario" - -#: client/features/output/details.partial.html:212 -msgid "Navigate to project sync job" -msgstr "Navegar a la tarea de sincronización del proyecto" - -#: client/features/output/details.partial.html:164 -msgid "Navigate to workflow job" -msgstr "Navegar a la tarea de flujo de trabajo" - -#: client/src/credentials/credentials.form.js:71 -msgid "Network" -msgstr "Red" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:70 -msgid "New Group" -msgstr "Nuevo grupo" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:147 -msgid "New Host" -msgstr "Nuevo host" - -#: client/src/users/add/users-add.controller.js:93 -msgid "New user successfully created!" -msgstr "¡Nuevo usuario creado correctamente!" - -#: client/src/scheduler/scheduled-jobs.list.js:56 -#: client/src/scheduler/schedules.list.js:58 -msgid "Next Run" -msgstr "Siguiente ejecución" - -#: client/src/credentials/credentials.list.js:21 -msgid "No Credentials Have Been Created" -msgstr "Ningún credencial ha sido creado" - -#: client/features/templates/templates.strings.js:74 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:15 -msgid "No Credentials Matching This Type Have Been Created" -msgstr "No se crearon credenciales que coincidan con este tipo" - -#: client/features/output/host-event/host-event-codemirror.partial.html:3 -msgid "No JSON data returned by the module" -msgstr "El módulo no arrojó datos JSON" - -#: client/src/license/license.controller.js:158 -msgid "No Licenses Found" -msgstr "No se encontraron licencias" - -#: client/src/projects/projects.list.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:64 -msgid "No Projects Have Been Created" -msgstr "No se crearon proyectos" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:50 -msgid "No Remediation Playbook Available" -msgstr "No hay un playbook de reparación disponible" - -#: client/features/projects/projects.strings.js:32 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "No SCM Configuration" -msgstr "Ninguna configuración SCM" - -#: client/features/projects/projects.strings.js:38 -#: client/src/projects/factories/get-project-tool-tip.factory.js:9 -msgid "No SCM updates have run for this project" -msgstr "Ninguna actualización SCM ha sido ejecutada para este proyecto" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:17 -msgid "No Teams exist" -msgstr "No existe ningún equipo" - -#: client/features/projects/projects.strings.js:29 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "No Updates Available" -msgstr "No existen actualizaciones disponibles" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:18 -msgid "No Users to add" -msgstr "No hay usuarios para añadir" - -#: client/features/credentials/credentials.strings.js:36 -msgid "No credential selected" -msgstr "No se seleccionó ninguna credencial" - -#: client/features/templates/templates.strings.js:37 -msgid "No credentials selected" -msgstr "No se seleccionaron credenciales" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:63 -msgid "No data is available. There are no issues to report." -msgstr "No hay datos disponibles. No hay problemas para informar." - -#: client/features/credentials/credentials.strings.js:34 -msgid "No external credentials available." -msgstr "No hay credenciales externas disponibles." - -#: client/src/license/license.controller.js:44 -msgid "No file selected." -msgstr "Ningún fichero seleccionado." - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js:48 -msgid "No groups to add" -msgstr "No hay grupos para añadir" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js:45 -msgid "No hosts to add" -msgstr "No hay hosts para añadir" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:68 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:64 -msgid "No hosts with failures. Click for details." -msgstr "No hay hosts con fallos. Haga clic para obtener más información." - -#: client/features/templates/templates.strings.js:38 -msgid "No inventory selected" -msgstr "Sin inventario seleccionado" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:51 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:52 -msgid "No inventory sync failures. Click for details." -msgstr "No hay fallos en la sincronización de inventario. Haga clic para obtener más información." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:16 -msgid "No job data" -msgstr "No hay datos de tareas" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:75 -msgid "No job data available." -msgstr "No hay datos de tareas disponibles." - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:54 -msgid "No job templates were recently used." -msgstr "Ninguna plantilla de trabajo fue recientemente utilizada." - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:51 -msgid "No jobs were recently run." -msgstr "Ningún trabajo ha sido recientemente ejecutado." - -#: client/src/teams/teams.form.js:132 -#: client/src/users/users.form.js:196 -msgid "No permissions have been granted" -msgstr "Ningún permiso concedido" - -#: client/features/templates/templates.strings.js:147 -msgid "No promptable values were provided when this node was created." -msgstr "No se proporcionaron valores indicadores cuando se creó este nodo." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:17 -msgid "No recent job data available for this host." -msgstr "No hay datos de tareas recientes disponibles para este host." - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:98 -msgid "No recent job data available for this inventory." -msgstr "No hay datos de tareas recientes disponibles para este inventario." - -#: client/src/notifications/notification-templates-list/list.controller.js:86 -msgid "No recent notifications." -msgstr "No hay notificaciones recientes" - -#: client/features/credentials/credentials.strings.js:33 -#: client/src/inventories-hosts/hosts/hosts.partial.html:36 -#: client/src/shared/form-generator.js:1833 -#: client/src/shared/list-generator/list-generator.factory.js:240 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:25 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:62 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:92 -msgid "No records matched your search." -msgstr "No existe registros que coincidan con su búsqueda." - -#: client/features/output/output.strings.js:133 -msgid "No result found" -msgstr "No se encontraron resultados" - -#: client/src/scheduler/scheduled-jobs.list.js:16 -msgid "No schedules exist" -msgstr "No existen planificaciones" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:71 -msgid "No sync data" -msgstr "Sin datos de sincronización" - -#: client/src/organizations/linkout/addUsers/addUsers.controller.js:60 -msgid "No users available to add as adminstrators" -msgstr "No hay usuarios disponibles para añadir como administradores" - -#: client/src/users/add/users-add.controller.js:10 -#: client/src/users/edit/users-edit.controller.js:10 -#: client/src/users/list/users-list.controller.js:10 -msgid "Normal User" -msgstr "Usuario normal" - -#: client/features/output/output.strings.js:48 -#: client/src/workflow-results/workflow-results.controller.js:84 -msgid "Not Finished" -msgstr "No finalizado" - -#: client/features/output/output.strings.js:49 -#: client/src/workflow-results/workflow-results.controller.js:85 -msgid "Not Started" -msgstr "No iniciado" - -#: client/features/projects/projects.strings.js:37 -msgid "Not configured for SCM" -msgstr "No configurado para SCM" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:58 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:56 -msgid "Not configured for inventory sync." -msgstr "No configurado para la sincronización de inventario." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -msgid "Note that only hosts directly in this group can be disassociated. Hosts in sub-groups must be disassociated directly from the sub-group level that they belong." -msgstr "Tenga en cuenta que solo se pueden desasociar los hosts asociados directamente a este grupo. Los hosts en subgrupos deben ser desasociados del nivel de subgrupo al que pertenecen." - -#: client/src/notifications/notificationTemplates.form.js:371 -#: client/src/notifications/notificationTemplates.form.js:372 -#: client/src/notifications/notificationTemplates.form.js:568 -#: client/src/notifications/notificationTemplates.form.js:569 -msgid "Notification Color" -msgstr "Color de notificación" - -#: client/src/notifications/notification-templates-list/list.controller.js:140 -msgid "Notification Failed." -msgstr "Notificación fallida" - -#: client/src/notifications/notificationTemplates.form.js:360 -msgid "Notification Label" -msgstr "Etiqueta de Notificación" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 -msgid "Notification Templates" -msgstr "Plantillas de notificación" - -#: client/src/notifications/notification-templates-list/list.controller.js:157 -msgid "Notification timed out." -msgstr "Caducó el tiempo de la notificación" - -#: client/lib/components/components.strings.js:83 -#: client/src/management-jobs/notifications/notification.route.js:21 -#: client/src/notifications/notifications.list.js:17 -msgid "Notifications" -msgstr "Notificación" - -#: client/src/notifications/notificationTemplates.form.js:385 -msgid "Notify Channel" -msgstr "Notificar canal" - -#: client/lib/services/base-string.service.js:71 -msgid "OFF" -msgstr "OFF" - -#: client/index.template.ejs:71 -#: client/lib/services/base-string.service.js:65 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -msgid "OK" -msgstr "OK" - -#: client/lib/services/base-string.service.js:70 -msgid "ON" -msgstr "ON" - -#: client/lib/components/components.strings.js:10 -msgid "OPTIONS" -msgstr "OPCIONES" - -#: client/src/license/license.partial.html:121 -msgid "OR" -msgstr "O" - -#: client/features/applications/applications.strings.js:30 -msgid "ORG" -msgstr "ORG" - -#: client/features/projects/projects.strings.js:11 -msgid "ORGANIZATION" -msgstr "ORGANIZACIÓN" - -#: client/src/activity-stream/get-target-title.factory.js:29 -#: client/src/organizations/list/organizations-list.partial.html:6 -#: client/src/organizations/main.js:51 -msgid "ORGANIZATIONS" -msgstr "ORGANIZACIONES" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:507 -msgid "Occurrence(s)" -msgstr "Ocurrencia(s)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:567 -#: client/src/scheduler/scheduler.strings.js:45 -msgid "Occurrences" -msgstr "Ocurrencias" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:396 -msgid "On Days" -msgstr "En días" - -#: client/features/templates/templates.strings.js:113 -#: client/src/workflow-results/workflow-results.controller.js:96 -msgid "On Failure" -msgstr "Con error" - -#: client/features/templates/templates.strings.js:112 -#: client/src/workflow-results/workflow-results.controller.js:95 -msgid "On Success" -msgstr "Con éxito" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:156 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:161 -msgid "Only Group By" -msgstr "Agrupar solo por" - -#: client/src/templates/job_templates/multi-credential/multi-credential.partial.html:4 -msgid "Open credential lookup" -msgstr "Abrir búsqueda de credenciales" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:42 -msgid "Open host filter" -msgstr "Abrir filtro de host" - -#: client/src/shared/instance-groups-multiselect/instance-groups.partial.html:3 -msgid "Open instance groups" -msgstr "Abrir grupos de instancias" - -#: client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html:4 -msgid "Open webhook credential lookup" -msgstr "Abrir búsqueda de credenciales de Webhook" - -#: client/src/credentials/credentials.form.js:378 -msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" -msgstr "Los dominios OpenStack definen los límites administrativos. Sólo es necesario para las direcciones URLs en el uso de autentificación para KeyStone v3. Los escenarios más habituales:" - -#: client/src/templates/job_templates/job-template.form.js:246 -#: client/src/templates/workflows.form.js:127 -msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs." -msgstr "Etiquetas opcionales que describen esta plantilla de trabajo, como puede ser 'dev' o 'test'. Las etiquetas pueden ser utilizadas para agrupar y filtrar plantillas de trabajo y tareas completadas." - -#: client/src/templates/job_templates/job-template.form.js:472 -msgid "Optionally, select the credential to use to send status updates back to the webhook service" -msgstr "Opcionalmente, seleccione la credencial que utilizará para devolver actualizaciones de estado al servicio de webhook" - -#: client/src/templates/workflows.form.js:245 -msgid "Optionally, select the credential to use to send status updates back to the webhook service." -msgstr "Opcionalmente, seleccione la credencial que se usará para devolver las actualizaciones de estado al servicio de Webhook." - -#: client/src/partials/logviewer.html:7 -#: client/src/templates/job_templates/job-template.form.js:317 -#: client/src/templates/workflows.form.js:153 -msgid "Options" -msgstr "Opciones" - -#: client/features/applications/add-applications.controller.js:31 -#: client/features/templates/templates.strings.js:16 -#: client/src/credentials/credentials.form.js:46 -#: client/src/credentials/credentials.form.js:53 -#: client/src/inventories-hosts/inventories/inventory.list.js:65 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:33 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:40 -#: client/src/inventory-scripts/inventory-scripts.list.js:27 -#: client/src/notifications/notificationTemplates.form.js:44 -#: client/src/projects/projects.form.js:42 -#: client/src/projects/projects.form.js:48 -#: client/src/teams/teams.form.js:40 -#: client/src/teams/teams.list.js:30 -#: client/src/templates/workflows.form.js:55 -#: client/src/templates/workflows.form.js:61 -#: client/src/users/users.form.js:41 -msgid "Organization" -msgstr "Organización" - -#: client/lib/services/base-string.service.js:152 -msgid "Organization (Ascending)" -msgstr "Organización (ascendente)" - -#: client/lib/services/base-string.service.js:153 -msgid "Organization (Descending)" -msgstr "Organización (descendente)" - -#: client/lib/components/components.strings.js:79 -#: client/lib/models/models.strings.js:35 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:135 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:64 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 -#: client/src/users/users.form.js:133 -msgid "Organizations" -msgstr "Organizaciones" - -#: client/features/templates/templates.strings.js:31 -msgid "Other Prompts" -msgstr "Otros avisos" - -#: client/src/credentials/credentials.form.js:79 -msgid "Others (Cloud Providers)" -msgstr "Otros (Proveedores Cloud)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:316 -msgid "Override variables found in azure_rm.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Variables de invalidación halladas en azure_rm.ini y utilizadas por el script de actualización del inventario. Para ver una descripción detallada de estas variables" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:282 -msgid "" -"Override variables found in cloudforms.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view cloudforms.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Variables de invalidación halladas en cloudforms.ini y usadas en el script de actualización del inventario. Para ver un ejemplo de configuración variable, \n" -" \n" -" vea cloudforms.ini en el repositorio github de Ansible Collections. Ingrese variables de inventario con sintaxis de JSON o YAML. Use el botón de opción para alternar entre los dos. Consulte la documentación de Ansible Tower para ver ejemplos de sintaxis." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:217 -msgid "Override variables found in ec2.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Variables de invalidación halladas en ec2.ini y utilizadas en el script de actualización del inventario. Para ver una descripción detallada de estas variables" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:299 -msgid "" -"Override variables found in foreman.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view foreman.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Variables de invalidación halladas en foreman.ini y usadas en el script de actualización del inventario. Para ver un ejemplo de configuración variable, vea foreman.ini en el repositorio github de Ansible Collections. Ingrese variables de inventario con sintaxis de JSON o YAML. Use el botón de opción para alternar entre los dos. Consulte la documentación de Ansible Tower para ver ejemplos de sintaxis." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:265 -msgid "" -"Override variables found in openstack.yml and used by the inventory update script. For an example variable configuration\n" -" \n" -" view openstack.yml in the Openstack github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Variables de invalidación halladas en openstack.yml y usadas en el script de actualización del inventario. Para ver un ejemplo de configuración de variable, vea openstack.yml en el repositorio github de Openstack. Ingrese variables de inventario con la sintaxis de JSON o YAML. Use el botón de opción para alternar entre los dos. Consulte la documentación de Ansible Tower para ver ejemplos de sintaxis." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:241 -msgid "Override variables found in vmware.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Variables de invalidación halladas en vmware.ini y utilizadas en el script de actualización del inventario. Para ver una descripción detallada de estas variables" - -#: client/features/output/output.strings.js:83 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:350 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:355 -msgid "Overwrite" -msgstr "Anular" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:361 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:366 -msgid "Overwrite Variables" -msgstr "Anular variables" - -#: client/features/output/output.strings.js:84 -msgid "Overwrite Vars" -msgstr "Sobrescribir variables" - -#: client/src/credentials/credentials.list.js:40 -msgid "Owners" -msgstr "Propietarios" - -#: client/src/license/license.partial.html:136 -#: client/src/login/loginModal/loginModal.partial.html:80 -msgid "PASSWORD" -msgstr "CONTRASEÑA" - -#: client/features/credentials/legacy.credentials.js:117 -msgid "PERMISSIONS" -msgstr "PERMISOS" - -#: client/features/output/output.strings.js:130 -msgid "PLAY" -msgstr "REPRODUCIR" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:146 -msgid "PLAYBOOK" -msgstr "PLAYBOOK" - -#: client/src/partials/survey-maker-modal.html:42 -msgid "PLEASE ADD A SURVEY PROMPT." -msgstr "AGREGAR UN AVISO DE ENCUESTA." - -#: client/src/organizations/list/organizations-list.partial.html:38 -#: client/src/shared/form-generator.js:1839 -#: client/src/shared/list-generator/list-generator.factory.js:248 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:27 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:94 -msgid "PLEASE ADD ITEMS TO THIS LIST" -msgstr "Por favor añada elementos a la lista" - -#: client/src/notifications/add/add.controller.js:106 -#: client/src/notifications/edit/edit.controller.js:160 -msgid "POST" -msgstr "PUBLICAR" - -#: client/src/partials/survey-maker-modal.html:40 -msgid "PREVIEW" -msgstr "VISTA PREVIA" - -#: client/src/workflow-results/workflow-results.service.js:105 -msgid "PROCEED" -msgstr "PROCEDER" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:142 -msgid "PROJECT" -msgstr "PROYECTO" - -#: client/features/projects/projects.strings.js:8 -#: client/features/projects/routes/projectsList.route.js:13 -#: client/src/activity-stream/get-target-title.factory.js:8 -#: client/src/organizations/linkout/organizations-linkout.route.js:182 -#: client/src/organizations/list/organizations-list.controller.js:76 -#: client/src/projects/projects.list.js:14 -#: client/src/projects/projects.list.js:15 -msgid "PROJECTS" -msgstr "PROYECTOS" - -#: client/features/templates/templates.strings.js:30 -msgid "PROMPT" -msgstr "AVISO" - -#: client/src/notifications/add/add.controller.js:107 -#: client/src/notifications/edit/edit.controller.js:161 -msgid "PUT" -msgstr "COLOCAR" - -#: client/src/shared/paginate/paginate.partial.html:33 -msgid "Page" -msgstr "Página" - -#: client/src/notifications/notificationTemplates.form.js:252 -msgid "Pagerduty subdomain" -msgstr "Subdominio Pagerduty" - -#: client/src/templates/job_templates/job-template.form.js:486 -msgid "Pass extra command line variables to the playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "Traslade variables de línea de comando adicionales al manual. Proporcione claves/pares de valores utilizando YAML o JSON. Consulte la documentación de Ansible Tower para acceder a ejemplos de sintaxis." - -#: client/src/templates/workflows.form.js:142 -msgid "Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "Traslade variables de línea de comando adicionales al cuaderno de estrategias. Este es el parámetro de línea de comando -e o --extra-vars para el cuaderno de estrategias de Ansible. Proporcione pares de claves/valores utilizando YAML o JSON. Consulte la documentación de Ansible Tower para ver ejemplos de sintaxis." - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:139 -msgid "Pass extra command line variables. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." -msgstr "Transmitir variables adicionales en la línea de comandos a los cuaderno de estrategias. Este es el parámetro de línea de comandos %s o %s para %s. Introduzca pares de claves/valores utilizando YAML o JSON." - -#: client/src/credentials/credentials.form.js:226 -#: client/src/credentials/factories/become-method-change.factory.js:21 -#: client/src/credentials/factories/become-method-change.factory.js:40 -#: client/src/credentials/factories/become-method-change.factory.js:48 -#: client/src/credentials/factories/become-method-change.factory.js:68 -#: client/src/credentials/factories/become-method-change.factory.js:78 -#: client/src/credentials/factories/become-method-change.factory.js:88 -#: client/src/credentials/factories/kind-change.factory.js:104 -#: client/src/credentials/factories/kind-change.factory.js:124 -#: client/src/credentials/factories/kind-change.factory.js:134 -#: client/src/credentials/factories/kind-change.factory.js:144 -#: client/src/credentials/factories/kind-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:77 -#: client/src/credentials/factories/kind-change.factory.js:96 -#: client/src/notifications/shared/type-change.service.js:31 -#: client/src/templates/survey-maker/surveys/init.factory.js:15 -#: client/src/users/users.form.js:69 -msgid "Password" -msgstr "Contraseña" - -#: client/src/credentials/factories/kind-change.factory.js:57 -msgid "Password (API Key)" -msgstr "Contraseña (clave API)" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:23 -msgid "Past 24 Hours" -msgstr "Últimas 24 horas" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:16 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:29 -msgid "Past Month" -msgstr "Mes pasado" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:26 -msgid "Past Week" -msgstr "Semana pasada" - -#: client/src/credentials/factories/become-method-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:85 -msgid "Paste the contents of the PEM file associated with the service account email." -msgstr "Pegue el contenido del fichero PEM asociado al correo de la cuenta de servicio." - -#: client/src/credentials/factories/kind-change.factory.js:50 -msgid "Paste the contents of the SSH private key file." -msgstr "Pegue el contenido del archivo de clave privada de SSH." - -#: client/src/credentials/factories/kind-change.factory.js:25 -msgid "Paste the contents of the SSH private key file.%s or click to close%s" -msgstr "Pegue el contenido del archivo de clave privada de SSH .%s o haga clic en cerrar%s" - -#: client/src/inventories-hosts/inventories/inventory.list.js:133 -#: client/src/shared/list-generator/list-generator.factory.js:415 -msgid "Pending Delete" -msgstr "Eliminación pendiente" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js:60 -msgid "Perform a search above to define a host filter" -msgstr "Realice una búsqueda anterior para definir un filtro de host" - -#: client/lib/components/components.strings.js:49 -msgid "Perform lookup" -msgstr "Realizar búsqueda" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:8 -msgid "Period" -msgstr "Periodo" - -#: client/src/projects/add/projects-add.controller.js:35 -#: client/src/templates/main.js:128 -#: client/src/templates/main.js:367 -#: client/src/users/add/users-add.controller.js:45 -msgid "Permission Error" -msgstr "Error de permiso" - -#: client/features/credentials/credentials.strings.js:14 -#: client/features/credentials/legacy.credentials.js:63 -#: client/src/credentials/credentials.form.js:438 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:104 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:101 -#: client/src/organizations/organizations.form.js:143 -#: client/src/projects/projects.form.js:278 -#: client/src/teams/teams.form.js:128 -#: client/src/templates/job_templates/job-template.form.js:532 -#: client/src/templates/workflows.form.js:287 -#: client/src/users/users.form.js:192 -msgid "Permissions" -msgstr "Permisos" - -#: client/features/users/tokens/tokens.strings.js:41 -msgid "Personal Access Token" -msgstr "Token de acceso personal" - -#: client/features/output/output.strings.js:85 -#: client/src/shared/form-generator.js:1044 -#: client/src/templates/job_templates/job-template.form.js:123 -#: client/src/templates/job_templates/job-template.form.js:134 -msgid "Playbook" -msgstr "Playbook" - -#: client/src/projects/projects.form.js:91 -msgid "Playbook Directory" -msgstr "Directorio de playbook" - -#: client/features/templates/templates.strings.js:70 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:58 -msgid "Playbook Run" -msgstr "Ejecución de playbook" - -#: client/features/output/output.strings.js:117 -msgid "Plays" -msgstr "Jugadas" - -#: client/lib/components/components.strings.js:116 -msgid "Please add items to this list." -msgstr "Añada elementos a esta lista." - -#: client/src/users/users.form.js:127 -msgid "Please add user to an Organization." -msgstr "Por favor añada un usuario a su organización." - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:99 -msgid "Please assign roles to the selected resources" -msgstr "Por favor asigne roles a los recursos seleccionados" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:60 -msgid "Please assign roles to the selected users/teams" -msgstr "Por favor asigne roles a los usuarios/equipos seleccionados" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "Please check the server and make sure the directory exists and file permissions are set correctly." -msgstr "Verifique el servidor y asegúrese de que el directorio exista y que los permisos de archivos estén configurados de manera correcta." - -#: client/features/templates/templates.strings.js:144 -msgid "Please click on an available node to form a new link." -msgstr "Haga clic en un nodo disponible para formar un nuevo enlace." - -#: client/src/license/license.partial.html:91 -msgid "Please click the button below to visit Ansible's website to get a Tower license key." -msgstr "Por favor pulse sobre el siguiente botón para visitar la página web de Ansible para obtener una clave de licencia Tower." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:40 -msgid "Please click the icon to edit the host filter." -msgstr "Haga clic en el icono para editar el filtro del host." - -#: client/features/templates/templates.strings.js:126 -msgid "Please click the start button to build your workflow." -msgstr "Haga clic en el botón de inicio para desarrollar su flujo de trabajo." - -#: client/lib/services/base-string.service.js:98 -msgid "Please confirm that you would like to remove {{ role }} access from the team {{ name }}. This will affect all members of the team. If you would like to only remove access for this particular user, please remove them from the team." -msgstr "Confirme que desea quitar el acceso de {{ role }} del equipo {{ name }}. Esto afectará a todos los miembros del equipo. Si solo desea quitar el acceso para este usuario en particular, quítelo del equipo." - -#: client/lib/services/base-string.service.js:104 -msgid "Please confirm that you would like to remove {{ role }} access from {{ name }}." -msgstr "Confirme que le gustaría quitar el acceso de {{ role }} de {{ name }}." - -#: client/src/shared/form-generator.js:833 -#: client/src/shared/form-generator.js:925 -msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." -msgstr "Por favor introduzca una URL que inicie por ssh, http o https. La URL no puede contener el caracter '@'." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:183 -msgid "Please enter a larger float." -msgstr "Ingrese un decimal corto mayor." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:163 -msgid "Please enter a larger integer." -msgstr "Ingrese un número entero mayor." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:246 -msgid "Please enter a maximum default of {{float_max}}." -msgstr "Ingrese un valor predeterminado máximo de {{float_max}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:232 -msgid "Please enter a maximum default of {{int_max}}." -msgstr "Ingrese un valor predeterminado máximo de {{int_max}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:245 -msgid "Please enter a minimum default of {{float_min}}." -msgstr "Ingrese un valor predeterminado mínimo de {{float_min}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:231 -msgid "Please enter a minimum default of {{int_min}}." -msgstr "Ingrese un valor predeterminado mínimo de {{int_min}}." - -#: client/src/shared/form-generator.js:1134 -msgid "Please enter a number greater than %d and less than %d." -msgstr "Ingrese un número mayor que %d y menor que %d." - -#: client/src/shared/form-generator.js:1136 -msgid "Please enter a number greater than %d." -msgstr "Ingrese un número mayor que %d." - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:151 -msgid "Please enter a number greater than or equal to 0." -msgstr "Ingrese un número mayor o igual que 0." - -#: client/src/shared/form-generator.js:1128 -msgid "Please enter a number." -msgstr "Por favor introduzca un número." - -#: client/features/templates/templates.strings.js:43 -#: client/src/login/loginModal/loginModal.partial.html:90 -msgid "Please enter a password." -msgstr "Por favor introduzca una contraseña." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:178 -msgid "Please enter a smaller float." -msgstr "Ingrese un decimal corto menor." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:158 -msgid "Please enter a smaller integer." -msgstr "Ingrese un número entero menor." - -#: client/src/login/loginModal/loginModal.partial.html:70 -msgid "Please enter a username." -msgstr "Por favor introduzca un usuario." - -#: client/src/shared/form-generator.js:823 -#: client/src/shared/form-generator.js:915 -msgid "Please enter a valid email address." -msgstr "Por favor introduzca una dirección de correo válida." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:177 -#: client/src/templates/survey-maker/shared/question-definition.form.js:182 -#: client/src/templates/survey-maker/shared/question-definition.form.js:244 -msgid "Please enter a valid float." -msgstr "Introduzca un decimal corto válido." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:157 -#: client/src/templates/survey-maker/shared/question-definition.form.js:162 -#: client/src/templates/survey-maker/shared/question-definition.form.js:230 -msgid "Please enter a valid integer." -msgstr "Ingrese un número entero válido." - -#: client/lib/components/components.strings.js:15 -#: client/src/shared/form-generator.js:818 -#: client/src/shared/form-generator.js:910 -#: client/src/shared/form-generator.js:982 -msgid "Please enter a value." -msgstr "Por favor introduzca un valor." - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:36 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "Please enter an answer between" -msgstr "Ingrese una respuesta entre" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:199 -msgid "Please enter an answer from the choices listed." -msgstr "Ingrese una respuesta de las opciones enumeradas." - -#: client/features/templates/templates.strings.js:69 -msgid "Please enter an answer that is a decimal number." -msgstr "Ingrese una respuesta que sea un número decimal." - -#: client/features/templates/templates.strings.js:68 -msgid "Please enter an answer that is a valid integer." -msgstr "Ingrese una respuesta que sea un valor entero válido." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:47 -msgid "Please enter an answer variable name." -msgstr "Ingrese un nombre de la variable de respuesta." - -#: client/features/templates/templates.strings.js:66 -msgid "Please enter an answer." -msgstr "Ingrese una respuesta." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:216 -msgid "Please enter an answer/answers from the choices listed." -msgstr "Ingrese una o varias respuestas de las opciones enumeradas." - -#: client/index.template.ejs:149 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Ingrese un número entero that is not negative que sea menor que 9999." - -#: client/index.template.ejs:132 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Ingrese un número entero that is not negative que sea menor 9999." - -#: client/index.template.ejs:105 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Ingrese un número entero that is not negative que sea menor de 9999." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:47 -msgid "Please enter at least one search term to create a new Smart Inventory." -msgstr "Ingrese al menos un término de búsqueda para crear un nuevo Smart Inventory." - -#: client/features/templates/templates.strings.js:127 -msgid "Please hover over a template for additional options." -msgstr "Coloque el cursos sobre la plantilla para opciones adicionales." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:175 -msgid "Please input a number greater than 1." -msgstr "Introducir un número superior a 1." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:538 -#: client/src/scheduler/scheduler.strings.js:47 -msgid "Please provide a valid date." -msgstr "Provea una fecha válida." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:208 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:521 -#: client/src/scheduler/scheduler.strings.js:30 -msgid "Please provide a value between 1 and 999." -msgstr "Introduzca un valor entre 1 y 9999." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:48 -msgid "Please remove the illegal character from the survey question variable name." -msgstr "Elimine el caracter ilegal de este nombre de variable de pregunta de la encuesta." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:169 -msgid "Please save before adding a survey to this job template." -msgstr "Guarde antes de agregar una encuesta a esta plantilla de trabajo." - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:53 -msgid "Please save before adding a survey to this workflow." -msgstr "Guarde antes de agregar una encuesta a este flujo de trabajo." - -#: client/src/notifications/notifications.list.js:15 -msgid "Please save before adding notifications." -msgstr "Guarde antes de agregar notificaciones." - -#: client/src/organizations/organizations.form.js:95 -#: client/src/teams/teams.form.js:72 -msgid "Please save before adding users." -msgstr "Guarde antes de agregar usuarios." - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:100 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:97 -#: client/src/organizations/organizations.form.js:135 -#: client/src/projects/projects.form.js:270 -#: client/src/teams/teams.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:525 -#: client/src/templates/workflows.form.js:280 -msgid "Please save before assigning permissions." -msgstr "Guarde antes de asignar permisos." - -#: client/src/users/users.form.js:125 -#: client/src/users/users.form.js:188 -msgid "Please save before assigning to organizations." -msgstr "Guarde antes de asignar a organizaciones" - -#: client/src/users/users.form.js:155 -msgid "Please save before assigning to teams." -msgstr "Guarde antes de asignar a equipos." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:142 -msgid "Please save before creating groups." -msgstr "Guarde antes de crear grupos." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:152 -msgid "Please save before creating hosts." -msgstr "Guarde antes de crear hosts." - -#: client/src/inventories-hosts/hosts/host.form.js:108 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:86 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:110 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:119 -msgid "Please save before defining groups." -msgstr "Guarde antes de definir grupos." - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:94 -msgid "Please save before defining hosts." -msgstr "Guarde antes de definir hosts." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:161 -msgid "Please save before defining inventory sources." -msgstr "Guarde antes de definir fuentes de inventario." - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:52 -msgid "Please save before defining the workflow graph." -msgstr "Guarde antes de definir un gráfico de flujo de trabajo." - -#: client/lib/components/components.strings.js:111 -msgid "Please save before launching this template." -msgstr "Guarde antes de iniciar esta plantilla." - -#: client/src/inventories-hosts/hosts/host.form.js:117 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:127 -msgid "Please save before viewing Insights." -msgstr "Guarde antes de ver Insights." - -#: client/src/inventories-hosts/hosts/host.form.js:101 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:103 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:112 -msgid "Please save before viewing facts." -msgstr "Guarde antes de ver eventos." - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:146 -msgid "Please save before viewing hosts." -msgstr "Guarde antes de ver los hosts." - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 -msgid "Please select Users / Teams from the lists below." -msgstr "Por favor seleccione Usuarios / Equipos de la siguiente lista." - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 -msgid "Please select Users from the list below." -msgstr "Por favor seleccione Usuarios de la siguiente lista.." - -#: client/src/shared/form-generator.js:1169 -msgid "Please select a number between" -msgstr "Por favor seleccione un número entre" - -#: client/src/shared/form-generator.js:1165 -msgid "Please select a number." -msgstr "Por favor seleccione un número." - -#: client/features/templates/templates.strings.js:67 -msgid "Please select a value" -msgstr "Seleccione un valor." - -#: client/src/shared/form-generator.js:1056 -#: client/src/shared/form-generator.js:1125 -#: client/src/shared/form-generator.js:1298 -msgid "Please select a value." -msgstr "Por favor seleccione un valor." - -#: client/src/templates/job_templates/job-template.form.js:77 -msgid "Please select an Inventory or check the Prompt on launch option." -msgstr "Por favor seleccione un inventario o seleccione la opción Preguntar al ejecutar." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:39 -msgid "Please select an organization before editing the host filter." -msgstr "Seleccione una organización antes de editar el filtro del host." - -#: client/src/shared/form-generator.js:1162 -msgid "Please select at least one value." -msgstr "Por favor seleccione al menos un valor." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:476 -#: client/src/scheduler/scheduler.strings.js:43 -msgid "Please select one or more days." -msgstr "Seleccione uno o más días." - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:30 -msgid "Please select resources from the lists below." -msgstr "Por favor seleccione recursos de la lista siguiente." - -#: client/src/instance-groups/instance-groups.strings.js:77 -msgid "Pod Spec Override" -msgstr "Anulación de las especificaciones de Pod" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Populate the hosts for this inventory by using a search filter." -msgstr "Complete los hosts de este inventario por medio del filtro de búsqueda." - -#: client/src/notifications/shared/type-change.service.js:30 -msgid "Port" -msgstr "Puerto" - -#: client/features/templates/templates.strings.js:33 -msgid "Preview" -msgstr "Vista previa" - -#: client/src/credentials/credentials.form.js:257 -#: client/src/credentials/factories/kind-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:44 -msgid "Private Key" -msgstr "Clave privada" - -#: client/features/templates/templates.strings.js:46 -#: client/src/credentials/credentials.form.js:264 -msgid "Private Key Passphrase" -msgstr "Frase de contraseña para la clave privada" - -#: client/src/credentials/credentials.form.js:279 -#: client/src/credentials/credentials.form.js:283 -msgid "Privilege Escalation" -msgstr "Elevación de privilegios" - -#: client/features/templates/templates.strings.js:47 -#: client/src/credentials/credentials.form.js:304 -msgid "Privilege Escalation Password" -msgstr "Contraseña para la elevación de privilegios" - -#: client/src/credentials/credentials.form.js:294 -msgid "Privilege Escalation Username" -msgstr "Usuario para la elevación de privilegios" - -#: client/features/jobs/jobs.strings.js:15 -#: client/features/output/output.strings.js:86 -#: client/features/templates/templates.strings.js:20 -#: client/src/credentials/factories/become-method-change.factory.js:30 -#: client/src/credentials/factories/kind-change.factory.js:86 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:92 -#: client/src/templates/job_templates/job-template.form.js:100 -#: client/src/templates/job_templates/job-template.form.js:113 -#: client/src/templates/job_templates/job-template.form.js:91 -msgid "Project" -msgstr "Proyecto" - -#: client/lib/services/base-string.service.js:150 -msgid "Project (Ascending)" -msgstr "Proyecto (ascendente)" - -#: client/lib/services/base-string.service.js:151 -msgid "Project (Descending)" -msgstr "Proyecto (descendente)" - -#: client/src/credentials/factories/become-method-change.factory.js:53 -#: client/src/credentials/factories/kind-change.factory.js:109 -msgid "Project (Tenant Name)" -msgstr "Proyecto (Nombre del inquilino [Tenant])" - -#: client/src/projects/projects.form.js:77 -#: client/src/projects/projects.form.js:85 -msgid "Project Base Path" -msgstr "Ruta base del proyecto" - -#: client/src/credentials/credentials.form.js:364 -msgid "Project Name" -msgstr "Nombre del proyecto" - -#: client/src/projects/projects.form.js:102 -msgid "Project Path" -msgstr "Ruta del proyecto" - -#: client/features/templates/templates.strings.js:117 -#: client/src/workflow-results/workflow-results.controller.js:98 -msgid "Project Sync" -msgstr "Sincronización del proyecto" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:66 -msgid "Project Sync Failures" -msgstr "Errores de sincronización del proyecto" - -#: client/lib/components/components.strings.js:74 -#: client/lib/models/models.strings.js:40 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:114 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:47 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/organizations/linkout/organizations-linkout.route.js:190 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "Projects" -msgstr "Proyectos" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:18 -msgid "Promote group" -msgid_plural "Promote groups" -msgstr[0] "Promover grupo" -msgstr[1] "Promover grupos" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:20 -msgid "Promote host" -msgid_plural "Promote hosts" -msgstr[0] "Promover host" -msgstr[1] "Promover hosts" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:10 -msgid "Promote {{ group }} and {{ host }}" -msgstr "Promover {{ group }} y {{ host }}" - -#: client/src/scheduler/scheduler.strings.js:54 -#: client/src/templates/survey-maker/shared/question-definition.form.js:27 -msgid "Prompt" -msgstr "Aviso" - -#: client/lib/components/components.strings.js:35 -#: client/src/templates/job_templates/job-template.form.js:116 -#: client/src/templates/job_templates/job-template.form.js:157 -#: client/src/templates/job_templates/job-template.form.js:184 -#: client/src/templates/job_templates/job-template.form.js:201 -#: client/src/templates/job_templates/job-template.form.js:218 -#: client/src/templates/job_templates/job-template.form.js:235 -#: client/src/templates/job_templates/job-template.form.js:312 -#: client/src/templates/job_templates/job-template.form.js:493 -#: client/src/templates/job_templates/job-template.form.js:60 -#: client/src/templates/job_templates/job-template.form.js:86 -#: client/src/templates/workflows.form.js:102 -#: client/src/templates/workflows.form.js:116 -#: client/src/templates/workflows.form.js:148 -#: client/src/templates/workflows.form.js:88 -msgid "Prompt on launch" -msgstr "Preguntar al ejecutar" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:253 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:266 -msgid "Provide a comma-separated list of filter expressions." -msgstr "Proporcione una lista de expresiones de filtrado separadas por coma." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:269 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:284 -msgid "Provide a comma-separated list of filter expressions. Hosts are imported when all of the filters match. Refer to Ansible Tower documentation for more detail." -msgstr "Proporcione una lista de expresiones de filtrado separadas por coma. Los hosts se importan cuando coinciden todos los filtros. Consulte la documentación de Ansible Tower para obtener más información detallada." - -#: client/src/inventories-hosts/hosts/host.form.js:49 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:48 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:50 -msgid "Provide a host name, ip address, or ip address:port. Examples include:" -msgstr "Provea un nombre de host, dirección ip, ó dirección:puerto. Por ejemplo:" - -#: client/features/templates/templates.strings.js:57 -#: client/src/templates/job_templates/job-template.form.js:178 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns." -msgstr "Proporcione un patrón de host para limitar aun más la lista de hosts que se encontrarán bajo la administración del manual o se verán afectados por él. Se permiten distintos patrones. Consulte la documentación de Ansible para obtener más información y ejemplos relacionados con los patrones." - -#: client/src/templates/workflows.form.js:96 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the workflow. This limit is applied to all job template nodes that prompt for a limit. Refer to Ansible documentation for more information and examples on patterns." -msgstr "Proporcione un patrón de host para limitar aún más la lista de hosts que será administrados por el flujo de trabajo o que se verán afectados por este. Este límite se aplica a todos los nodos de la plantilla de trabajo que solicitan un límite. Consulte la documentación de Ansible para obtener más información y ejemplos relacionados con los patrones." - -#: client/features/credentials/credentials.strings.js:22 -msgid "Provide account information using Google Compute Engine JSON credentials file." -msgstr "Introduzca información de la cuenta usando el archivo de credenciales Google Compute Engine JSON." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:195 -msgid "Provide environment variables to pass to the custom inventory script." -msgstr "Proporcione variables del entorno para trasladar al script del inventario personalizado." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:272 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:287 -msgid "Provide the named URL encoded name or id of the remote Tower inventory to be imported." -msgstr "Indique la URL, el nombre cifrado o id del inventario remoto de Tower para importarlos." - -#: client/src/license/license.partial.html:128 -msgid "Provide your Red Hat customer credentials and you can choose from a list of your available licenses. The credentials you use will be stored for future use in retrieving renewal or expanded licenses. You can update or remove them in SETTINGS > SYSTEM." -msgstr "Proporcione sus credenciales de cliente de Red Hat y podrá elegir de una lista de sus licencias disponibles. Las credenciales que utilice se almacenarán para su uso futuro en la recuperación de las licencias de renovación o ampliadas. Puede actualizarlas o eliminarlas en CONFIGURACIÓN > SISTEMA." - -#: client/src/templates/job_templates/job-template.form.js:374 -#: client/src/templates/job_templates/job-template.form.js:382 -msgid "Provisioning Callback URL" -msgstr "Dirección URL para las llamadas callback" - -#: client/src/notifications/add/add.controller.js:86 -#: client/src/notifications/edit/edit.controller.js:149 -msgid "Purple" -msgstr "Púrpura" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:95 -msgid "RADIUS" -msgstr "RADIUS" - -#: client/src/instance-groups/instance-groups.strings.js:55 -msgid "RAM" -msgstr "RAM" - -#: client/lib/components/code-mirror/code-mirror.strings.js:15 -msgid "READ ONLY" -msgstr "SOLO LECTURA" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:4 -msgid "RECENT JOB RUNS" -msgstr "TRABAJOS EJECUTADOS RECIENTEMENTE" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:47 -msgid "RECENTLY RUN JOBS" -msgstr "TRABAJOS EJECUTADOS RECIENTEMENTE" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:50 -msgid "RECENTLY USED JOB TEMPLATES" -msgstr "PLANTILLAS DE TRABAJO USADOS RECIENTEMENTE" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:4 -msgid "RECENTLY USED TEMPLATES" -msgstr "PLANTILLAS USADAS RECIENTEMENTE" - -#: client/src/activity-stream/streams.list.js:54 -#: client/src/inventories-hosts/hosts/host.list.js:108 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:51 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:52 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:58 -#: client/src/projects/projects.list.js:76 -#: client/src/scheduler/schedules.list.js:76 -msgid "REFRESH" -msgstr "ACTUALIZAR" - -#: client/features/users/tokens/tokens.strings.js:23 -msgid "REFRESH TOKEN" -msgstr "ACTUALIZAR TOKEN" - -#: client/src/shared/smart-search/smart-search.partial.html:45 -msgid "RELATED FIELDS:" -msgstr "CAMPOS RELACIONADOS:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:91 -msgid "REMEDIATE INVENTORY" -msgstr "REPARAR INVENTARIO" - -#: client/lib/services/base-string.service.js:79 -#: client/src/access/permissions-list.controller.js:57 -#: client/src/access/permissions-list.controller.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:84 -#: client/src/shared/directives.js:94 -#: client/src/templates/labels/labelsList.directive.js:96 -msgid "REMOVE" -msgstr "ELIMINAR" - -#: client/lib/services/base-string.service.js:103 -msgid "REMOVE ACCESS" -msgstr "QUITAR ACCESO" - -#: client/lib/services/base-string.service.js:97 -msgid "REMOVE TEAM ACCESS" -msgstr "ELIMINAR ACCESO DEL EQUIPO" - -#: client/features/output/output.strings.js:8 -msgid "RESULTS" -msgstr "RESULTADOS" - -#: client/features/templates/templates.strings.js:39 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:50 -msgid "REVERT" -msgstr "REVERTIR" - -#: client/features/projects/projects.strings.js:10 -msgid "REVISION" -msgstr "REVISIÓN" - -#: client/src/inventories-hosts/inventories/main.js:301 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:49 -msgid "ROOT GROUPS" -msgstr "GRUPOS RAÍZ" - -#: client/src/credentials/factories/become-method-change.factory.js:25 -#: client/src/credentials/factories/kind-change.factory.js:81 -msgid "RSA Private Key" -msgstr "Clave privada RSA" - -#: client/features/templates/templates.strings.js:130 -#: client/lib/services/base-string.service.js:66 -msgid "RUN" -msgstr "EJECUTAR" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.route.js:45 -msgid "RUN COMMAND" -msgstr "EJECUTAR COMANDO" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:62 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:45 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:118 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:61 -msgid "RUN COMMANDS" -msgstr "EJECUTAR COMANDOS" - -#: client/src/notifications/add/add.controller.js:89 -#: client/src/notifications/edit/edit.controller.js:152 -msgid "Random" -msgstr "Aleatorio" - -#: client/features/users/tokens/tokens.strings.js:30 -msgid "Read" -msgstr "Lectura" - -#: client/src/workflow-results/workflow-results.controller.js:179 -msgid "Read only view of extra variables added to the workflow." -msgstr "Vista de sólo lectura de las variables adicionales añadidas al flujo de trabajo." - -#: client/features/output/output.strings.js:17 -msgid "Read-only view of artifacts added to the job template" -msgstr "Vista de solo lectura de artefactos añadidos a la plantilla de trabajo" - -#: client/features/output/output.strings.js:24 -msgid "Read-only view of extra variables added to the job template" -msgstr "Vista de solo lectura de variables adicionales agregadas a la plantilla de trabajo" - -#: client/lib/components/code-mirror/code-mirror.strings.js:51 -msgid "Read-only view of extra variables added to the job template." -msgstr "Vista de solo lectura de las variables adicionales añadidas a la plantilla de trabajo." - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Failed Jobs" -msgstr "Trabajos con errores recientes" - -#: client/src/notifications/notificationTemplates.list.js:28 -msgid "Recent Notifications" -msgstr "Notificaciones recientes" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Successful Jobs" -msgstr "Trabajos exitosos recientes" - -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:98 -msgid "Recipient List" -msgstr "Lista de destinatarios" - -#: client/src/notifications/add/add.controller.js:87 -#: client/src/notifications/edit/edit.controller.js:150 -msgid "Red" -msgstr "Rojo" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Refer to the Ansible Tower documentation for further syntax and examples." -msgstr "Consulte la documentación de Ansible Tower para obtener más ejemplos sobre sintaxis." - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "Refer to the Ansible documentation for details about the configuration file." -msgstr "Consulte la documentación de Ansible para obtener detalles sobre el archivo de configuración." - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Refresh" -msgstr "Actualizar" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:8 -msgid "Refresh Insights" -msgstr "Actualizar Insights" - -#: client/src/configuration/settings.service.js:44 -msgid "Refresh Token Expiration" -msgstr "Actualizar expiración del token" - -#: client/src/activity-stream/streams.list.js:51 -#: client/src/bread-crumb/bread-crumb.partial.html:6 -#: client/src/inventories-hosts/hosts/host.list.js:104 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:47 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:126 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:48 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:54 -#: client/src/projects/projects.list.js:72 -#: client/src/scheduler/schedules.list.js:72 -msgid "Refresh the page" -msgstr "Actualizar la página" - -#: client/features/output/output.strings.js:88 -msgid "Refspec" -msgstr "Refspec" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:246 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:258 -msgid "Region:" -msgstr "Región:" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:130 -msgid "Regions" -msgstr "Regiones" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:81 -msgid "Related Groups" -msgstr "Grupos relacionados" - -#: client/lib/components/components.strings.js:104 -msgid "Relaunch On" -msgstr "Relanzar el" - -#: client/src/workflow-results/workflow-results.partial.html:26 -msgid "Relaunch job" -msgstr "Relanzar tarea" - -#: client/lib/components/components.strings.js:103 -msgid "Relaunch using host parameters" -msgstr "Relanzar utilizando los parámetros de host" - -#: client/lib/components/components.strings.js:102 -#: client/src/workflow-results/workflow-results.controller.js:55 -msgid "Relaunch using the same parameters" -msgstr "Relanzar utilizando los mismos parámetros" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:176 -msgid "Remediate Inventory" -msgstr "Reparar inventario" - -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:106 -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:107 -#: client/src/teams/teams.form.js:157 -#: client/src/users/users.form.js:231 -msgid "Remove" -msgstr "Eliminar" - -#: client/src/templates/labels/labelsList.directive.js:93 -msgid "Remove Label from" -msgstr "Quitar etiqueta de" - -#: client/src/projects/projects.form.js:178 -msgid "Remove any local modifications prior to performing an update." -msgstr "Eliminar cualquier modificación local antes de realizar una actualización." - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:81 -msgid "Remove host from" -msgstr "Borrar host" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:152 -#: client/src/scheduler/scheduler.strings.js:27 -msgid "Repeat frequency" -msgstr "Frecuencia de repetición" - -#: client/lib/components/components.strings.js:7 -msgid "Replace" -msgstr "Reemplazar" - -#: client/src/license/license.strings.js:7 -msgid "Replace password" -msgstr "Reemplazar contraseña" - -#: client/lib/components/components.strings.js:139 -msgid "Replace secret" -msgstr "Reemplazar secreto" - -#: client/src/license/license.partial.html:96 -msgid "Request License" -msgstr "Solicitar una licencia" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:291 -msgid "Required" -msgstr "Obligatorio" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:154 -msgid "Reset" -msgstr "Restablecer" - -#: client/lib/components/components.strings.js:92 -msgid "Resources" -msgstr "Recursos" - -#: client/features/templates/templates.strings.js:97 -#: client/src/scheduler/schedules.list.js:25 -msgid "Resources are missing from this template." -msgstr "Faltan recursos de esta plantilla." - -#: client/lib/services/base-string.service.js:111 -msgid "Return" -msgstr "Volver" - -#: client/features/users/tokens/tokens.strings.js:26 -msgid "Returned status:" -msgstr "Estado devuelto:" - -#: client/lib/components/components.strings.js:8 -#: client/src/shared/form-generator.js:658 -msgid "Revert" -msgstr "Revertir" - -#: client/src/configuration/forms/auth-form/sub-forms/auth-azure.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-org.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-team.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-google-oauth2.form.js:59 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap1.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap2.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap3.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap4.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap5.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-radius.form.js:34 -#: client/src/configuration/forms/auth-form/sub-forms/auth-saml.form.js:121 -#: client/src/configuration/forms/auth-form/sub-forms/auth-tacacs.form.js:47 -#: client/src/configuration/forms/jobs-form/configuration-jobs.form.js:129 -#: client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js:26 -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:74 -#: client/src/configuration/forms/system-form/sub-forms/system-misc.form.js:95 -#: client/src/configuration/forms/ui-form/configuration-ui.form.js:36 -msgid "Revert all to default" -msgstr "Revertir todo a valores por defecto" - -#: client/features/output/output.strings.js:90 -#: client/src/projects/projects.list.js:56 -msgid "Revision" -msgstr "Revisión" - -#: client/src/projects/add/projects-add.controller.js:159 -#: client/src/projects/edit/projects-edit.controller.js:280 -msgid "Revision #" -msgstr "Revisión n°" - -#: client/features/credentials/legacy.credentials.js:85 -#: client/src/credentials/credentials.form.js:461 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:130 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:127 -#: client/src/organizations/organizations.form.js:165 -#: client/src/projects/projects.form.js:301 -#: client/src/teams/teams.form.js:109 -#: client/src/teams/teams.form.js:148 -#: client/src/templates/workflows.form.js:311 -#: client/src/users/users.form.js:212 -msgid "Role" -msgstr "Rol" - -#: client/lib/services/base-string.service.js:102 -msgid "Role access removal" -msgstr "Eliminación de acceso de rol" - -#: client/src/templates/job_templates/job-template.form.js:440 -#: client/src/templates/job_templates/job-template.form.js:444 -#: client/src/templates/workflows.form.js:213 -#: client/src/templates/workflows.form.js:217 -msgid "Rotate Webhook Key" -msgstr "Girar clave de Webhook" - -#: client/src/instance-groups/instance-groups.list.js:26 -#: client/src/instance-groups/instance-groups.strings.js:22 -#: client/src/instance-groups/instance-groups.strings.js:61 -msgid "Running Jobs" -msgstr "Tareas en ejecución" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:96 -msgid "SAML" -msgstr "SAML" - -#: client/lib/services/base-string.service.js:63 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:17 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:17 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:17 -#: client/src/partials/survey-maker-modal.html:84 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:18 -msgid "SAVE" -msgstr "GUARDAR" - -#: client/features/templates/templates.strings.js:152 -msgid "SAVE & EXIT" -msgstr "GUARDAR Y SALIR" - -#: client/src/scheduler/scheduled-jobs.list.js:13 -#: client/src/scheduler/scheduled-jobs.list.js:14 -msgid "SCHEDULED JOBS" -msgstr "TRABAJOS PROGRAMADOS" - -#: client/src/activity-stream/get-target-title.factory.js:38 -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js:9 -#: client/src/management-jobs/scheduler/main.js:28 -#: client/src/management-jobs/scheduler/main.js:34 -#: client/src/scheduler/schedules.route.js:102 -#: client/src/scheduler/schedules.route.js:14 -#: client/src/scheduler/schedules.route.js:189 -#: client/src/scheduler/schedules.route.js:283 -msgid "SCHEDULES" -msgstr "PROGRAMACIONES" - -#: client/features/templates/templates.strings.js:71 -#: client/src/projects/add/projects-add.controller.js:130 -#: client/src/projects/edit/projects-edit.controller.js:252 -#: client/src/projects/projects.form.js:130 -#: client/src/templates/job_templates/job-template.form.js:107 -#: client/src/templates/workflows.form.js:107 -#: client/src/templates/workflows.form.js:111 -#: client/src/workflow-results/workflow-results.controller.js:80 -msgid "SCM Branch" -msgstr "Rama SCM" - -#: client/src/projects/add/projects-add.controller.js:150 -#: client/src/projects/edit/projects-edit.controller.js:271 -msgid "SCM Branch/Tag/Commit" -msgstr "Consigna/Etiqueta/Rama SCM" - -#: client/src/projects/add/projects-add.controller.js:171 -#: client/src/projects/edit/projects-edit.controller.js:292 -msgid "SCM Branch/Tag/Revision" -msgstr "Revisión/Etiqueta/Rama SCM" - -#: client/src/projects/projects.form.js:179 -msgid "SCM Clean" -msgstr "Limpiar SCM" - -#: client/src/projects/projects.form.js:190 -msgid "SCM Delete" -msgstr "Eliminar SCM" - -#: client/src/credentials/factories/become-method-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:76 -msgid "SCM Private Key" -msgstr "Clave privada SCM" - -#: client/src/projects/add/projects-add.controller.js:131 -#: client/src/projects/edit/projects-edit.controller.js:253 -#: client/src/projects/projects.form.js:146 -msgid "SCM Refspec" -msgstr "SCM Refspec" - -#: client/src/projects/projects.form.js:57 -msgid "SCM Type" -msgstr "Tipo SCM" - -#: client/src/projects/projects.form.js:108 -#: client/src/projects/projects.form.js:119 -msgid "SCM URL" -msgstr "SCM URL" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:55 -#: client/src/projects/projects.form.js:200 -msgid "SCM Update" -msgstr "Actualizar SCM" - -#: client/features/projects/projects.strings.js:30 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "SCM Update Cancel" -msgstr "Cancelar actualización SCM" - -#: client/src/projects/projects.form.js:170 -msgid "SCM Update Options" -msgstr "Opciones de actualización SCM" - -#: client/features/projects/projects.strings.js:19 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:126 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:36 -#: client/src/projects/edit/projects-edit.controller.js:122 -msgid "SCM update currently running" -msgstr "Actualización SCM actualmente en ejecución" - -#: client/features/users/tokens/tokens.strings.js:39 -msgid "SCOPE" -msgstr "ALCANCE" - -#: client/features/output/output.strings.js:108 -msgid "SEARCH" -msgstr "BÚSQUEDA" - -#: client/features/templates/templates.strings.js:132 -#: client/lib/services/base-string.service.js:64 -#: client/src/license/license.partial.html:260 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:137 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:186 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:74 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:155 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:194 -msgid "SELECT" -msgstr "SELECCIONAR" - -#: client/src/instance-groups/instance-groups.strings.js:76 -msgid "SELECT A CREDENTIAL" -msgstr "SELECCIONAR UNA CREDENCIAL" - -#: client/features/credentials/credentials.strings.js:20 -msgid "SELECT A CREDENTIAL TYPE" -msgstr "SELECCIONAR UN TIPO DE CREDENCIAL" - -#: client/features/users/tokens/tokens.strings.js:19 -msgid "SELECT AN APPLICATION" -msgstr "SELECCIONAR UNA APLICACIÓN" - -#: client/features/applications/applications.strings.js:36 -#: client/features/credentials/credentials.strings.js:19 -msgid "SELECT AN ORGANIZATION" -msgstr "SELECCIONAR UNA ORGANIZACIÓN" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:6 -msgid "SELECT GROUPS" -msgstr "SELECCIONAR GRUPOS" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:6 -msgid "SELECT HOSTS" -msgstr "SELECCIONAR HOSTS" - -#: client/src/instance-groups/instance-groups.strings.js:42 -msgid "SELECT INSTANCE" -msgstr "SELECCIONAR INSTANCIA" - -#: client/features/templates/templates.strings.js:36 -msgid "SELECTED" -msgstr "SELECCIONADO" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:18 -msgid "SELECTED:" -msgstr "SELECCIONADO:" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:22 -msgid "SETTING CATEGORY" -msgstr "CATEGORÍA DE LA CONFIGURACIÓN" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:26 -msgid "SETTING NAME" -msgstr "NOMBRE DE LA CONFIGURACIÓN" - -#: client/src/configuration/settings.route.js:10 -msgid "SETTINGS" -msgstr "AJUSTES" - -#: client/lib/services/base-string.service.js:68 -#: client/src/templates/survey-maker/surveys/init.factory.js:502 -msgid "SHOW" -msgstr "MOSTRAR" - -#: client/src/login/loginModal/loginModal.partial.html:109 -msgid "SIGN IN" -msgstr "CONECTARSE" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html:2 -msgid "SIGN IN WITH" -msgstr "CONECTARSE CON" - -#: client/src/inventories-hosts/hosts/host.list.js:116 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:14 -msgid "SMART INVENTORY" -msgstr "INVENTARIO INTELIGENTE" - -#: client/lib/components/components.strings.js:122 -msgid "SORT BY" -msgstr "ORDENAR POR" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js:27 -msgid "SOURCES" -msgstr "FUENTES" - -#: client/src/scheduler/scheduler.strings.js:63 -msgid "SS" -msgstr "SS" - -#: client/src/credentials/factories/become-method-change.factory.js:89 -#: client/src/credentials/factories/kind-change.factory.js:145 -msgid "SSH Key" -msgstr "Clave SSH" - -#: client/features/templates/templates.strings.js:45 -msgid "SSH Password" -msgstr "Contraseña de SSH" - -#: client/src/credentials/credentials.form.js:255 -msgid "SSH key description" -msgstr "Descripción de la clave SSH" - -#: client/src/notifications/notificationTemplates.form.js:551 -msgid "SSL Connection" -msgstr "Conexión SSL" - -#: client/features/templates/templates.strings.js:134 -msgid "START" -msgstr "INICIAR" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "STATUS" -msgstr "ESTADO" - -#: client/src/credentials/credentials.form.js:119 -#: client/src/credentials/credentials.form.js:127 -msgid "STS Token" -msgstr "Token STS" - -#: client/features/output/output.strings.js:140 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:56 -msgid "SUCCESSFUL" -msgstr "CORRECTO" - -#: client/src/partials/survey-maker-modal.html:24 -msgid "SURVEY" -msgstr "ENCUESTA" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:66 -msgid "SYNC ALL" -msgstr "SINCRONIZAR TODO" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:464 -#: client/src/scheduler/scheduler.strings.js:42 -msgid "Sat" -msgstr "Sáb" - -#: client/src/credentials/factories/become-method-change.factory.js:70 -#: client/src/credentials/factories/kind-change.factory.js:126 -msgid "Satellite 6 URL" -msgstr "URL Satellite 6" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:113 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:192 -#: client/src/credentials/credentials.form.js:416 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:158 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:630 -#: client/src/scheduler/scheduler.strings.js:57 -#: client/src/shared/form-generator.js:1644 -msgid "Save" -msgstr "Guardar" - -#: client/src/configuration/forms/settings-form.controller.js:416 -msgid "Save Complete" -msgstr "Guardado completo" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:199 -msgid "Save and enable log aggregation before testing the log aggregator." -msgstr "Guarde y habilite la agregación de registros antes de probar el agregador de registros." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:66 -#: client/src/configuration/forms/settings-form.controller.js:454 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:63 -msgid "Save changes" -msgstr "Guardar los cambios" - -#: client/src/license/license.partial.html:200 -msgid "Save successful!" -msgstr "Guardado correctamente" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:558 -#: client/src/scheduler/scheduler.strings.js:50 -msgid "Schedule Description" -msgstr "Descripción de la programación" - -#: client/src/management-jobs/card/card.partial.html:28 -#: client/src/management-jobs/card/card.partial.html:30 -msgid "Schedule Management Job" -msgstr "Planificar trabajo de gestión" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:7 -msgid "Schedule inventory syncs" -msgstr "Programar sincronizaciones de inventario" - -#: client/src/scheduler/scheduler.strings.js:14 -msgid "Schedule is active." -msgstr "La programación está activa." - -#: client/src/scheduler/scheduler.strings.js:15 -msgid "Schedule is active. Click to stop." -msgstr "La programación está activa. Haga clic para detenerla." - -#: client/src/scheduler/scheduler.strings.js:16 -msgid "Schedule is stopped." -msgstr "La programación se detuvo." - -#: client/src/scheduler/scheduler.strings.js:17 -msgid "Schedule is stopped. Click to activate." -msgstr "La programación se detuvo. Haga clic para activarla." - -#: client/src/scheduler/scheduler.strings.js:60 -msgid "Schedule name" -msgstr "Nombre de programa" - -#: client/lib/components/components.strings.js:72 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:434 -#: client/src/projects/projects.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:578 -#: client/src/templates/workflows.form.js:333 -msgid "Schedules" -msgstr "Programaciones" - -#: client/features/users/tokens/users-tokens-add.controller.js:38 -msgid "Scope" -msgstr "Ámbito" - -#: client/src/shared/smart-search/smart-search.controller.js:127 -#: client/src/shared/smart-search/smart-search.controller.js:169 -msgid "Search" -msgstr "Buscar" - -#: client/src/credentials/credentials.form.js:104 -msgid "Secret Key" -msgstr "Clave secreta" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:247 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:259 -msgid "Security Group:" -msgstr "Grupo de seguridad:" - -#: client/src/credentials/credentials.form.js:124 -msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." -msgstr "El Security Token Service (STS) es un servicio web que habilita su solicitud temporalmente y con credenciales con privilegio limitado para usuarios de AWS Identity y Access Management (IAM)." - -#: client/src/shared/form-generator.js:1648 -#: client/src/shared/lookup/lookup-modal.directive.js:59 -#: client/src/shared/lookup/lookup-modal.partial.html:20 -msgid "Select" -msgstr "Seleccionar" - -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:5 -msgid "Select Instance Groups" -msgstr "Seleccionar grupos de instancias" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:58 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:100 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:84 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:108 -msgid "Select Webhook Credential" -msgstr "Seleccione la credencial de Webhook" - -#: client/src/templates/workflows.form.js:110 -msgid "Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch." -msgstr "Seleccione una rama para el flujo de trabajo. Esta rama se aplica a todos los nodos de la plantilla de trabajo que indican una rama." - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:73 -msgid "Select a credential" -msgstr "Seleccionar una credencial" - -#: client/index.template.ejs:139 -msgid "Select a frequency for snapshot retention" -msgstr "Selecciona las frecuencia para la retención de instantáneas (snapshots)" - -#: client/src/license/license.partial.html:214 -msgid "Select a license" -msgstr "Seleccione una licencia" - -#: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:70 -msgid "Select a role" -msgstr "Seleccionar un rol" - -#: client/features/users/tokens/tokens.strings.js:29 -msgid "Select a scope" -msgstr "Seleccionar un alcance" - -#: client/index.template.ejs:122 -msgid "Select a time period after which to remove old facts" -msgstr "Seleccione un periodo en el que después de él se eliminará los facts antiguos." - -#: client/src/templates/job_templates/job-template.form.js:413 -#: client/src/templates/workflows.form.js:186 -msgid "Select a webhook service." -msgstr "Seleccione un servicio de webhook." - -#: client/src/templates/workflows.form.js:81 -msgid "Select an inventory for the workflow. This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "Seleccione un inventario para el flujo de trabajo. Este inventario se aplica a todos los nodos de la plantilla de trabajo que indican un inventario." - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:59 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or a selection of multiple groups." -msgstr "Seleccione una fuente de inventario al hacer clic en la casilla de verificación a su lado. La fuente de inventario puede ser un único grupo o una selección de varios grupos." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:42 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:115 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:58 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups." -msgstr "Seleccione una fuente de inventario al hacer clic en la casilla de verificación a su lado. La fuente de inventario puede ser un único grupo o host, una selección de varios hosts o una selección de varios grupos." - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:127 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single host or a selection of multiple hosts." -msgstr "Seleccione una fuente de inventario al hacer clic en la casilla de verificación a su lado. La fuente de inventario puede ser un único host o una selección de varios hosts." - -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:107 -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:132 -#: client/src/configuration/forms/ui-form/configuration-ui.controller.js:94 -msgid "Select commands" -msgstr "Seleccionar comandos" - -#: client/src/templates/job_templates/job-template.form.js:151 -msgid "Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking \"Prompt on launch\" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check \"Prompt on launch\", the selected credential(s) become the defaults that can be updated at run time." -msgstr "Seleccione las credenciales que le permiten a Tower acceder a los nodos en función de los cuales se ejecutará este trabajo. Solo puede seleccionar una credencial de cada tipo. Para las credenciales de equipo (SSH), si marca \"Preguntar al ejecutar\" sin seleccionar las credenciales, se le pedirá que seleccione una credencial del equipo en el momento de la ejecución. Si selecciona credenciales y marca \"Preguntar al ejecutar\", las credenciales seleccionadas se convierten en las predeterminadas que pueden actualizarse al momento de la ejecución." - -#: client/src/scheduler/schedulerDatePicker.partial.html:2 -msgid "Select date" -msgstr "Seleccionar fecha" - -#: client/lib/components/components.strings.js:21 -msgid "Select file" -msgstr "Seleccionar archivo" - -#: client/src/projects/projects.form.js:100 -msgid "Select from the list of directories found in the Project Base Path. Together the base path and the playbook directory provide the full path used to locate playbooks." -msgstr "Seleccione desde la lista de directorios encontrados en el directorio base del proyecto. Junto al directorio base y el directorio del playbook se construirá la ruta completa utilizada para encontrar playbooks." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:317 -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:336 -msgid "Select group types" -msgstr "Seleccionar un tipo de grupo" - -#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:24 -msgid "Select roles" -msgstr "Seleccionar roles" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:56 -msgid "Select the Instance Groups for this Inventory to run on." -msgstr "Seleccione los grupos de instancias en los que se ejecutará este inventario." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:63 -msgid "Select the Instance Groups for this Inventory to run on. Refer to the Ansible Tower documentation for more detail." -msgstr "Seleccione los Grupos de instancias respecto de los cuales se ejecutará este Inventario. Consulte la documentación de Ansible Tower para obtener más información." - -#: client/src/templates/job_templates/job-template.form.js:270 -msgid "Select the Instance Groups for this Job Template to run on." -msgstr "Seleccione los grupos de instancias en los que se ejecutará esta plantilla de trabajo." - -#: client/src/organizations/organizations.form.js:40 -msgid "Select the Instance Groups for this Organization to run on." -msgstr "Seleccione los grupos de instancias en los que se ejecutará esta organización." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:65 -msgid "Select the custom Python virtual environment for this inventory source sync to run on." -msgstr "Seleccione el entorno virtual Python personalizado en el que se ejecutará esta fuente de inventario." - -#: client/src/templates/job_templates/job-template.form.js:260 -msgid "Select the custom Python virtual environment for this job template to run on." -msgstr "Seleccione el entorno virtual Python personalizado en el que se ejecutará esta plantilla." - -#: client/src/organizations/organizations.form.js:51 -msgid "Select the custom Python virtual environment for this organization to run on." -msgstr "Seleccione el entorno virtual Python personalizado en el que se ejecutará esta organización." - -#: client/src/projects/projects.form.js:242 -msgid "Select the custom Python virtual environment for this project to run on." -msgstr "Seleccione el entorno virtual Python personalizado en el que se ejecutará este proyecto." - -#: client/src/templates/job_templates/job-template.form.js:79 -msgid "Select the inventory containing the hosts you want this job to manage." -msgstr "Seleccione el inventario que contenga los servidores que desea que este trabajo administre." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:121 -msgid "Select the inventory file to be synced by this source. You can select from the dropdown or enter a file within the input." -msgstr "Seleccione el archivo del inventario que sincronizará esta fuente. Puede seleccionar del menú desplegable o ingresar un archivo en la entrada." - -#: client/src/templates/job_templates/job-template.form.js:132 -msgid "Select the playbook to be executed by this job.You can select from the dropdown or enter a file within the input." -msgstr "Seleccione el cuaderno de estrategias que ejecutará este trabajo. Puede seleccionar del menú desplegable o ingresar un archivo en la entrada." - -#: client/src/templates/job_templates/job-template.form.js:99 -msgid "Select the project containing the playbook you want this job to execute." -msgstr "Seleccionar el proyecto que contiene el playbook que desea ejecutar este trabajo." - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:188 -msgid "Select types" -msgstr "Seleccionar los tipos" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:239 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:251 -msgid "Select which groups to create automatically." -msgstr "Seleccione los grupos que se crearán de manera automática." - -#: client/src/license/license.partial.html:153 -msgid "Selected" -msgstr "Seleccionado" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:202 -msgid "Send a test log message to the configured log aggregator." -msgstr "Envíe un mensaje de registro de prueba al agregador de registros configurado." - -#: client/src/notifications/notificationTemplates.form.js:110 -msgid "Sender Email" -msgstr "Dirección de correo del remitente" - -#: client/src/credentials/factories/become-method-change.factory.js:24 -#: client/src/credentials/factories/kind-change.factory.js:80 -msgid "Service Account Email Address" -msgstr "Dirección de correo de cuenta de servicio" - -#: client/features/credentials/credentials.strings.js:21 -msgid "Service Account JSON File" -msgstr "Archivo JSON de cuenta de servicio" - -#: client/features/credentials/credentials.strings.js:30 -msgid "Set Input Source" -msgstr "Establecer fuente de entrada" - -#: client/index.template.ejs:102 -msgid "Set how many days of data should be retained." -msgstr "Establecer cuántos días de datos debería ser retenidos." - -#: client/src/configuration/settings.partial.html:12 -msgid "Set preferences for data collection, logos, and logins" -msgstr "Establezca preferencias para la recopilación de datos, los logotipos y los inicios de sesión" - -#: client/lib/components/components.strings.js:88 -msgid "Settings" -msgstr "Ajustes" - -#: client/lib/components/components.strings.js:11 -#: client/src/shared/form-generator.js:845 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:24 -msgid "Show" -msgstr "Mostrar" - -#: client/features/templates/templates.strings.js:50 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:115 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:118 -#: client/src/templates/job_templates/job-template.form.js:303 -#: client/src/templates/job_templates/job-template.form.js:306 -msgid "Show Changes" -msgstr "Mostrar cambios" - -#: client/features/output/output.strings.js:50 -#: client/src/workflow-results/workflow-results.controller.js:86 -msgid "Show Less" -msgstr "Mostrar menos" - -#: client/features/output/output.strings.js:51 -#: client/src/workflow-results/workflow-results.controller.js:87 -msgid "Show More" -msgstr "Mostrar más" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:34 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:8 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:104 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:125 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:136 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:28 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:44 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:6 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:61 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:83 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:138 -msgid "Show help text" -msgstr "Mostrar texto de ayuda" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html:1 -msgid "Show host summary" -msgstr "Mostrar resumen de host" - -#: client/src/shared/paginate/paginate.partial.html:51 -msgid "Show page size options" -msgstr "Mostrar opciones de tamaño de página" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html:1 -msgid "Show source summary" -msgstr "Mostrar resumen de fuente" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:33 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:44 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:55 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:76 -msgid "Sign in with %s" -msgstr "Iniciar sesión con %s" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:63 -msgid "Sign in with %s Organizations" -msgstr "Iniciar sesión con las organizaciones %s" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:61 -msgid "Sign in with %s Teams" -msgstr "Iniciar sesión con los equipos %s" - -#: client/features/output/output.strings.js:91 -#: client/features/templates/templates.strings.js:52 -#: client/src/templates/job_templates/job-template.form.js:223 -#: client/src/templates/job_templates/job-template.form.js:230 -msgid "Skip Tags" -msgstr "Omitir etiquetas" - -#: client/features/templates/templates.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:229 -msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "La omisión de etiquetas resulta útil cuando tiene un manual de gran tamaño y desea omitir partes específicas de la tarea o la reproducción. Utilice comas para separar las distintas etiquetas. Consulte la documentación de Ansible Tower para obtener información detallada sobre el uso de etiquetas." - -#: client/features/jobs/jobs.strings.js:21 -#: client/features/output/output.strings.js:74 -msgid "Slice Job" -msgstr "Fraccionar trabajo" - -#: client/src/templates/job_templates/job-template.form.js:283 -msgid "Slice Job Count" -msgstr "Fraccionar conteo de trabajo" - -#: client/src/workflow-results/workflow-results.controller.js:75 -msgid "Slice Job Template" -msgstr "Fraccionar plantilla de trabajo" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:48 -msgid "Smart Host Filter" -msgstr "Filtro de host inteligente" - -#: client/src/inventories-hosts/inventories/inventory.list.js:90 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/shared/form-generator.js:1406 -msgid "Smart Inventory" -msgstr "Inventario inteligente" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:44 -msgid "Solvable With Playbook" -msgstr "Se puede solucionar con playbook" - -#: client/features/output/output.strings.js:92 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:50 -msgid "Source" -msgstr "Fuente" - -#: client/src/credentials/credentials.form.js:75 -msgid "Source Control" -msgstr "Fuente de control" - -#: client/features/output/output.strings.js:93 -msgid "Source Credential" -msgstr "Credencial de origen" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:33 -#: client/src/projects/projects.form.js:26 -msgid "Source Details" -msgstr "Detalles de la fuente" - -#: client/src/notifications/notificationTemplates.form.js:212 -#: client/src/notifications/notificationTemplates.form.js:213 -msgid "Source Phone Number" -msgstr "Número de teléfono de la fuente" - -#: client/features/output/output.strings.js:70 -msgid "Source Project" -msgstr "Proyecto de origen" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:135 -msgid "Source Regions" -msgstr "Regiones de fuente" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:208 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:215 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:232 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:239 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:256 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:263 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:273 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:280 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:290 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:297 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:307 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:314 -msgid "Source Variables" -msgstr "Variables de fuente" - -#: client/src/partials/logviewer.html:9 -msgid "Source Vars" -msgstr "Vars de la fuente" - -#: client/features/output/output.strings.js:94 -#: client/src/workflow-results/workflow-results.controller.js:77 -msgid "Source Workflow" -msgstr "Flujo de trabajo fuente" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:39 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:163 -msgid "Sources" -msgstr "Fuentes" - -#: client/src/notifications/notificationTemplates.form.js:420 -msgid "Specify HTTP Headers in JSON format. Refer to the Ansible Tower documentation for example syntax." -msgstr "Especificar los encabezados HTTP en formato JSON. Consulte la documentación de Ansible Tower para obtener ejemplos de sintaxis." - -#: client/src/credentials/credentials.form.js:284 -msgid "Specify a method for %s operations. This is equivalent to specifying the %s parameter, where %s could be %s" -msgstr "Especificar un método para las operaciones %s. Esto es equivalente a especificar el parámetro %s, en el que %s puede ser %s." - -#: client/src/notifications/notificationTemplates.form.js:574 -msgid "Specify a notification color. Acceptable colors are hex color code (example: #3af or #789abc) ." -msgstr "Especificar un color de notificación. Los colores aceptables son el código de color hexadecimal (ejemplo: #3af o #789abc) ." - -#: client/src/notifications/notificationTemplates.form.js:375 -msgid "Specify a notification color. Acceptable colors are: yellow, green, red purple, gray or random." -msgstr "Especifique un color para la notificación. Se aceptan los siguientes colores: amarillo, verde, rojo, púrpura, gris o al azar." - -#: client/features/users/tokens/tokens.strings.js:20 -msgid "Specify a scope for the token's access" -msgstr "Especifique un alcance para el acceso al token" - -#: client/src/notifications/notificationTemplates.form.js:432 -msgid "Specify an HTTP method for the webhook. Acceptable choices are: POST or PUT" -msgstr "Especificar un método HTTP para el webhook. Las opciones aceptables son: POST o PUT" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:268 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:283 -msgid "Specify which groups to create automatically. Group names will be created similar to the options selected. If blank, all groups above are created. Refer to Ansible Tower documentation for more detail." -msgstr "Especifique los grupos que se crearán de manera automática. Los nombres de grupos creados serán similares a los de las opciones seleccionadas. Si la opción se deja en blanco, se crearán todos los grupos de arriba. Consulte la documentación de Ansible Tower para obtener información detallada." - -#: client/features/output/output.strings.js:135 -msgid "Standard Error" -msgstr "Error estándar" - -#: client/features/output/output.strings.js:134 -#: client/src/partials/logviewer.html:5 -msgid "Standard Out" -msgstr "Salida estándar" - -#: client/src/notifications/notifications.list.js:53 -msgid "Start" -msgstr "Iniciar" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:42 -#: client/src/scheduler/scheduler.strings.js:23 -msgid "Start Date" -msgstr "Fecha de inicio" - -#: client/src/notifications/notificationTemplates.form.js:597 -msgid "Start Message" -msgstr "Iniciar mensaje" - -#: client/src/notifications/notificationTemplates.form.js:608 -msgid "Start Message Body" -msgstr "Iniciar el cuerpo del mensaje" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 -#: client/src/scheduler/scheduler.strings.js:24 -msgid "Start Time" -msgstr "Hora de inicio" - -#: client/lib/services/base-string.service.js:140 -msgid "Start Time (Ascending)" -msgstr "Hora de inicio (ascendente)" - -#: client/lib/services/base-string.service.js:141 -msgid "Start Time (Descending)" -msgstr "Hora de inicio (descendente)" - -#: client/lib/components/components.strings.js:110 -msgid "Start a job using this template" -msgstr "Iniciar un trabajo usando esta plantilla" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:6 -msgid "Start sync process" -msgstr "Iniciar proceso de sincronización" - -#: client/features/jobs/jobs.strings.js:9 -#: client/features/output/output.strings.js:95 -#: client/src/workflow-results/workflow-results.controller.js:71 -msgid "Started" -msgstr "Iniciado" - -#: client/features/output/output.strings.js:96 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:55 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:55 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:43 -#: client/src/notifications/notification-templates-list/list.controller.js:71 -#: client/src/partials/logviewer.html:4 -#: client/src/workflow-results/workflow-results.controller.js:74 -msgid "Status" -msgstr "Estado" - -#: client/src/license/license.partial.html:203 -msgid "Submit" -msgstr "Enviar" - -#: client/features/output/output.strings.js:112 -msgid "Submit search" -msgstr "Enviar búsqueda" - -#: client/src/license/license.partial.html:27 -msgid "Subscription" -msgstr "Subscripción" - -#: client/src/credentials/credentials.form.js:151 -#: client/src/credentials/credentials.form.js:162 -msgid "Subscription ID" -msgstr "ID de suscripción" - -#: client/src/credentials/credentials.form.js:161 -msgid "Subscription ID is an Azure construct, which is mapped to a username." -msgstr "El ID de subscripción es un elemento Azure, el cual está asociado al usuario." - -#: client/src/notifications/notifications.list.js:65 -msgid "Success" -msgstr "Correcto" - -#: client/src/notifications/notificationTemplates.form.js:620 -msgid "Success Message" -msgstr "Mensaje de éxito" - -#: client/src/notifications/notificationTemplates.form.js:631 -msgid "Success Message Body" -msgstr "Cuerpo del mensaje de éxito" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:83 -msgid "Successful" -msgstr "Correctamente" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:404 -#: client/src/scheduler/scheduler.strings.js:36 -msgid "Sun" -msgstr "Dom" - -#: client/features/templates/templates.strings.js:32 -msgid "Survey" -msgstr "Encuesta" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:73 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:478 -msgid "Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch." -msgstr "Las encuestas permiten que los usuarios reciban una serie de preguntas relacionadas a la tarea en el momento de su ejecución. Esto permite que se definan las variables que afectan el playbook ejecutado en el lanzamiento." - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:79 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:186 -msgid "Sync Status" -msgstr "Estado de sincronización" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:62 -msgid "Sync all inventory sources" -msgstr "Sincronizar todas las fuentes de inventario" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:29 -msgid "Sync canceled. Click to view log." -msgstr "Sincronización cancelada. Haga clic para ver el registro." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:35 -msgid "Sync completed. Click to view log." -msgstr "Sincronización completada. Haga clic para ver el registro." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:32 -msgid "Sync failed. Click to view log." -msgstr "Error en la sincronización. Haga clic para ver el registro." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "Sync not performed. Click" -msgstr "Sincronización no realizada. Haga clic" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:38 -msgid "Sync pending." -msgstr "Sincronización pendiente." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:45 -msgid "Sync running" -msgstr "Sincronización en ejecución" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:46 -msgid "Sync running. Click to view log." -msgstr "Sincronización en ejecución. Haga clic para ver el registro." - -#: client/lib/components/components.strings.js:96 -#: client/src/configuration/settings.partial.html:8 -msgid "System" -msgstr "Sistema" - -#: client/src/users/add/users-add.controller.js:12 -#: client/src/users/edit/users-edit.controller.js:12 -#: client/src/users/list/users-list.controller.js:12 -msgid "System Administrator" -msgstr "Administrador del sistema" - -#: client/src/shared/form-generator.js:1846 -msgid "System Administrators have access to all s" -msgstr "Los administradores del sistema tienen acceso a todo los s" - -#: client/src/users/add/users-add.controller.js:11 -#: client/src/users/edit/users-edit.controller.js:11 -#: client/src/users/list/users-list.controller.js:11 -msgid "System Auditor" -msgstr "Auditor del sistema" - -#: client/src/configuration/forms/settings-form.partial.html:3 -msgid "System auditors have read-only permissions in this section." -msgstr "Los auditores de sistema tienen permisos sólo de lectura en esta sección." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:97 -msgid "TACACS+" -msgstr "TACACS+" - -#: client/features/output/output.strings.js:131 -msgid "TASK" -msgstr "TAREA" - -#: client/src/activity-stream/get-target-title.factory.js:23 -#: client/src/organizations/linkout/organizations-linkout.route.js:95 -#: client/src/organizations/list/organizations-list.controller.js:62 -#: client/src/teams/main.js:65 -#: client/src/teams/teams.list.js:14 -#: client/src/teams/teams.list.js:15 -msgid "TEAMS" -msgstr "EQUIPOS" - -#: client/features/templates/routes/templatesList.route.js:12 -#: client/features/templates/templates.strings.js:12 -#: client/features/templates/templates.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:44 -#: client/src/templates/templates.list.js:15 -#: client/src/templates/templates.list.js:16 -msgid "TEMPLATES" -msgstr "PLANTILLAS" - -#: client/lib/services/base-string.service.js:78 -msgid "TEST" -msgstr "PRUEBA" - -#: client/src/instance-groups/instance-groups.list.js:8 -msgid "THERE ARE CURRENTLY NO INSTANCE GROUPS DEFINED" -msgstr "NO HAY INSTANCIAS DE GRUPOS DEFINIDAS EN ESTE MOMENTO" - -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:103 -msgid "TIME" -msgstr "DURACIÓN" - -#: client/features/users/tokens/tokens.strings.js:22 -msgid "TOKEN" -msgstr "TOKEN" - -#: client/features/users/tokens/tokens.strings.js:21 -msgid "TOKEN INFORMATION" -msgstr "INFORMACIÓN DE TOKEN" - -#: client/features/applications/applications.strings.js:11 -#: client/features/users/tokens/tokens.strings.js:10 -#: client/features/users/tokens/tokens.strings.js:8 -#: client/features/users/tokens/users-tokens-list.route.js:24 -#: client/src/activity-stream/get-target-title.factory.js:50 -msgid "TOKENS" -msgstr "TOKENS" - -#: client/features/templates/templates.strings.js:122 -msgid "TOTAL NODES" -msgstr "NODOS TOTALES" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:250 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:262 -msgid "Tag None:" -msgstr "Ninguna etiqueta:" - -#: client/features/templates/templates.strings.js:55 -#: client/src/templates/job_templates/job-template.form.js:212 -msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "Las etiquetas resultan útiles cuando tiene un manual de gran tamaño y desea omitir partes específicas de la tarea o la reproducción. Utilice comas para separar las distintas etiquetas. Consulte la documentación de Ansible Tower para obtener información detallada sobre el uso de etiquetas." - -#: client/src/notifications/notificationTemplates.form.js:330 -msgid "Tags for the Annotation" -msgstr "Etiquetas para la anotación" - -#: client/src/notifications/notificationTemplates.form.js:329 -msgid "Tags for the Annotation (optional)" -msgstr "Etiquetas para la anotación (opcional)" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:248 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:260 -msgid "Tags:" -msgstr "Etiquetas:" - -#: client/src/notifications/notificationTemplates.form.js:392 -#: client/src/notifications/notificationTemplates.form.js:442 -#: client/src/notifications/notificationTemplates.form.js:481 -msgid "Target URL" -msgstr "URL destino" - -#: client/features/output/output.strings.js:118 -msgid "Tasks" -msgstr "Tareas" - -#: client/features/credentials/legacy.credentials.js:91 -#: client/src/credentials/credentials.form.js:467 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:136 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:133 -#: client/src/organizations/organizations.form.js:171 -#: client/src/projects/projects.form.js:307 -#: client/src/templates/workflows.form.js:317 -msgid "Team Roles" -msgstr "Roles de equipo" - -#: client/lib/services/base-string.service.js:96 -msgid "Team access removal" -msgstr "Eliminación de acceso al equipo" - -#: client/lib/components/components.strings.js:81 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:36 -#: client/src/organizations/linkout/organizations-linkout.route.js:103 -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/users/users.form.js:162 -msgid "Teams" -msgstr "Equipos" - -#: client/features/templates/templates.strings.js:120 -#: client/src/templates/templates.list.js:14 -#: client/src/workflow-results/workflow-results.controller.js:69 -msgid "Template" -msgstr "Plantilla" - -#: client/features/templates/templates.strings.js:79 -msgid "Template parameter is missing." -msgstr "Falta el parámetro de la plantilla" - -#: client/lib/components/components.strings.js:78 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:37 -msgid "Templates" -msgstr "Plantillas" - -#: client/src/credentials/credentials.form.js:336 -msgid "Tenant ID" -msgstr "ID inquilino [Tenant]" - -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:80 -msgid "Test" -msgstr "Probar" - -#: client/features/credentials/credentials.strings.js:26 -msgid "Test External Credential" -msgstr "Credencial externa de prueba" - -#: client/features/credentials/credentials.strings.js:45 -msgid "Test failed." -msgstr "Falló la prueba." - -#: client/src/notifications/notificationTemplates.list.js:82 -msgid "Test notification" -msgstr "Probar notificación" - -#: client/features/credentials/credentials.strings.js:44 -msgid "Test passed." -msgstr "Prueba pasada." - -#: client/src/templates/survey-maker/surveys/init.factory.js:13 -msgid "Text" -msgstr "Texto" - -#: client/src/templates/survey-maker/surveys/init.factory.js:14 -msgid "Textarea" -msgstr "Area de texto" - -#: client/src/shared/form-generator.js:1306 -#: client/src/shared/form-generator.js:1312 -msgid "That value was not found. Please enter or select a valid value." -msgstr "El valor no fue encontrado. Por favor introduzca o seleccione un valor válido." - -#: client/lib/components/components.strings.js:48 -msgid "That value was not found. Please enter or select a valid value." -msgstr "No se encontró ese valor. Ingrese o seleccione un valor válido." - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:66 -msgid "The Insights Credential for {{inventory.name}} was not found." -msgstr "No se encontró la credencial de Insights para {{inventory.name}}." - -#: client/src/credentials/factories/become-method-change.factory.js:32 -#: client/src/credentials/factories/kind-change.factory.js:88 -msgid "The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:" -msgstr "El ID del proyecto es la identificación asignada de GCE. Se construye como dos palabras seguidas por un número de tres dígitos. Ejemplo:" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "The Project selected has a status of" -msgstr "El proyecto seleccionado tienen un estado de" - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "The SCM update process is running." -msgstr "El proceso de actualización SCM está en ejecución." - -#: client/src/notifications/notificationTemplates.form.js:150 -msgid "The amount of time (in seconds) before the email notification stops trying to reach the host and times out. Ranges from 1 to 120 seconds." -msgstr "La cantidad de tiempo (en segundos) antes de que la notificación de correo electrónico deje de intentar conectarse con el host y caduce el tiempo de espera. Rangos de 1 a 120 segundos." - -#: client/src/templates/job_templates/job-template.form.js:299 -msgid "The amount of time (in seconds) to run before the task is canceled. Defaults to 0 for no job timeout." -msgstr "La cantidad de tiempo (en segundos) para ejecutar antes de que se cancele la tarea. Valores predeterminados en 0 para el tiempo de espera para el trabajo." - -#: client/features/templates/templates.strings.js:154 -msgid "The amount of time to wait before this approval step is automatically denied. Defaults to 0 for no timeout." -msgstr "El tiempo de espera antes de este paso de aprobación se rechaza automáticamente. Valores predeterminados en 0 para no tener tiempo de espera." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:201 -#: client/src/templates/survey-maker/shared/question-definition.form.js:260 -#: client/src/templates/survey-maker/shared/question-definition.form.js:281 -msgid "The answer is longer than the maximum length. Please make the answer shorter." -msgstr "La respuesta ya no tiene la longitud máxima. Reduzca la respuesta." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:200 -#: client/src/templates/survey-maker/shared/question-definition.form.js:259 -#: client/src/templates/survey-maker/shared/question-definition.form.js:280 -msgid "The answer is shorter than the minimium length. Please make the answer longer." -msgstr "La respuesta es más corta que la longitud mínima. Haga la respuesta más extensa." - -#: client/src/notifications/notificationTemplates.form.js:287 -msgid "The base URL of the Grafana server - the /api/annotations endpoint will be added automatically to the base Grafana URL." -msgstr "La URL base del servidor Grafana: el punto de acceso /api/annotations se añadirá automáticamente a la URL base de Grafana." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:241 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:328 -#: client/src/scheduler/scheduler.strings.js:32 -msgid "The day must be between 1 and 31." -msgstr "El día debe tener un valor de entre 1 y 31" - -#: client/src/configuration/settings.service.js:39 -msgid "The duration (in seconds) access tokens remain valid since their creation." -msgstr "La duración (en segundos) de la validez de los tokens de acceso desde su creación." - -#: client/src/configuration/settings.service.js:47 -msgid "The duration (in seconds) authorization codes remain valid since their creation." -msgstr "La duración (en segundos) de la validez de los códigos de autorización desde su creación." - -#: client/src/configuration/settings.service.js:43 -msgid "The duration (in seconds) refresh tokens remain valid after the expiration of their associated access token." -msgstr "La duración (en segundos) de los tokens de actualización sigue siendo válida después de la expiración de su token de acceso asociado." - -#: client/src/credentials/credentials.form.js:190 -msgid "The email address assigned to the Google Compute Engine %sservice account." -msgstr "La dirección de correo electrónico asignada a la cuenta de servicio de Google Compute Engine %s." - -#: client/src/projects/projects.form.js:143 -msgid "The first fetches all references. The second fetches the Github pull request number 62, in this example the branch needs to be `pull/62/head`." -msgstr "El primero busca todas las referencias. El segundo busca el número de solicitud de incorporación de cambios 62 de Github; en este ejemplo la rama debe ser `pull/62/head`." - -#: client/features/templates/templates.strings.js:146 -msgid "The following promptable values were provided when this node was created:" -msgstr "Se proporcionaron los siguientes valores indicadores cuando se creó este nodo:" - -#: client/features/output/output.strings.js:12 -msgid "The host status bar will update when the job is complete." -msgstr "La barra de estado del host se actualizará cuando se complete la tarea." - -#: client/src/credentials/factories/become-method-change.factory.js:62 -#: client/src/credentials/factories/kind-change.factory.js:118 -msgid "The host to authenticate with." -msgstr "El servidor al que autentificarse." - -#: client/src/credentials/factories/kind-change.factory.js:59 -msgid "The host value" -msgstr "El valor del servidor" - -#: client/features/templates/templates.strings.js:137 -msgid "The inventory of this node will be overridden by the parent workflow inventory." -msgstr "El inventario de este nodo se anulará por el inventario del flujo de trabajo principal." - -#: client/features/templates/templates.strings.js:139 -msgid "The inventory of this node will be overridden if a parent workflow inventory is provided at launch." -msgstr "El inventario de este nodo se anulará si se proporciona un inventario del flujo de trabajo principal en la ejecución." - -#: client/features/templates/templates.strings.js:138 -msgid "The inventory of this node will not be overridden by the parent workflow inventory." -msgstr "El inventario de este nodo no será anulado por el inventario del flujo de trabajo principal." - -#: client/features/templates/templates.strings.js:140 -msgid "The inventory of this node will not be overridden if a parent workflow inventory is provided at launch." -msgstr "El inventario de este nodo no se anulará si se proporciona un inventario del flujo de trabajo principal en la ejecución." - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:153 -msgid "The inventory will be in a pending status until the final delete is processed." -msgstr "El inventario estará en un estado pendiente hasta que se procese la eliminación final." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:100 -#: client/src/templates/survey-maker/shared/question-definition.form.js:121 -#: client/src/templates/survey-maker/shared/question-definition.form.js:142 -msgid "The maximum length is too low. Please enter a number larger than the minimum length you set." -msgstr "La longitud máxima es muy baja. Ingrese un número más extenso que la longitud mínima que estableció." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:120 -#: client/src/templates/survey-maker/shared/question-definition.form.js:141 -#: client/src/templates/survey-maker/shared/question-definition.form.js:99 -msgid "The maximum length you entered is not a valid number. Please enter a whole number." -msgstr "La longitud máxima que ingresó no es un número válido. Ingrese un número entero." - -#: client/src/organizations/organizations.form.js:69 -msgid "The maximum number of hosts allowed to be managed by this organization. Value defaults to 0 which means no limit. Refer to the Ansible documentation for more details." -msgstr "La cantidad máxima de hosts que puede administrar esta organización. El valor predeterminado es 0, que significa sin límite. Consulte la documentación de Ansible para obtener más detalles." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:115 -#: client/src/templates/survey-maker/shared/question-definition.form.js:136 -#: client/src/templates/survey-maker/shared/question-definition.form.js:94 -msgid "The minimium length is too high. Please enter a lower number." -msgstr "La longitud mínima es demasiado alta. Ingrese un número inferior." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:116 -#: client/src/templates/survey-maker/shared/question-definition.form.js:137 -#: client/src/templates/survey-maker/shared/question-definition.form.js:95 -msgid "The minimum length is too low. Please enter a positive number." -msgstr "La longitud mínima es demasiado baja. Ingrese un número positivo." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:114 -#: client/src/templates/survey-maker/shared/question-definition.form.js:135 -#: client/src/templates/survey-maker/shared/question-definition.form.js:93 -msgid "The minimum length you entered is not a valid number. Please enter a whole number." -msgstr "La longitud mínima que ingresó no es un número válido. Ingrese un número entero." - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. An empty value, or a value less than 1 will use the Ansible default which is usually 5. The default number of forks can be overwritten with a change to" -msgstr "El número de procesos paralelos o simultáneos para utilizar durante la ejecución del cuaderno de estrategias. Un valor vacío, o un valor menor que 1, usará el valor predeterminado de Ansible que normalmente es 5. El número predeterminado de bifurcaciones puede ser sobrescrito con un cambio a" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:105 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. Inputting no value will use the default value from the %sansible configuration file%s." -msgstr "La cantidad de procesos paralelos o simultáneos para utilizar durante la ejecución del cuaderno de estrategias. Si no ingresa un valor, se utilizará el valor predeterminado desde el %sarchivo de configuración de Ansible%s." - -#: client/src/credentials/factories/kind-change.factory.js:58 -msgid "The project value" -msgstr "El valor del proyecto" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:552 -msgid "The scheduler options are invalid or incomplete." -msgstr "Las opciones del programador no son válidas o están incompletas." - -#: client/src/scheduler/scheduler.strings.js:49 -msgid "The scheduler options are invalid, incomplete, or a date is in the past." -msgstr "Las opciones del programador no son válidas o están incompletas, o hay una fecha en el pasado." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "The selected project has a status of" -msgstr "El proyecto seleccionado tiene un estado de" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings and then run an update." -msgstr "El proyecto seleccionado no está configurado para usar SCM. Para configurar el uso de SCM, edite el proyecto, proporcione los ajustes de SCM y, luego, ejecute una actualización." - -#: client/features/projects/projects.strings.js:23 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." -msgstr "El proyecto seleccionado no está configurado para usar SCM. Para configurar el uso SCM, edita el proyecto y establezca opciones SCM y ejecute una actualización." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:52 -msgid "The suggested format for variable names is lowercase and underscore-separated (for example, foo_bar, user_id, host_name, etc.). Variable names with spaces are not allowed." -msgstr "El formato sugerido para los nombres de variables es minúsculas y guiones bajos (por ejemplo, foo_bar, user_id, host_name, etc.). No están permitidos los nombres de variables con espacios." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:126 -#: client/src/scheduler/scheduler.strings.js:25 -msgid "The time must be in HH24:MM:SS format." -msgstr "La hora debe ser en formato HH24:MM:SS." - -#: client/lib/services/base-string.service.js:90 -msgid "The {{ resourceType }} is currently being used by other resources." -msgstr "Actualmente, otros recursos están usando el {{ resourceType }}." - -#: client/src/activity-stream/streams.list.js:17 -msgid "There are no events to display at this time" -msgstr "No hay eventos a mostrar por el momento" - -#: client/lib/components/components.strings.js:127 -msgid "There are no jobs awaiting approval" -msgstr "No hay trabajos pendientes de aprobación" - -#: client/features/jobs/jobs.strings.js:18 -msgid "There are no running jobs." -msgstr "No hay tareas en ejecución." - -#: client/features/projects/projects.strings.js:22 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "No hay información disponible sobre la actualización de SCM para este proyecto. Aún no se completó una actualización. Si todavía no lo ha hecho, inicie una actualización para este proyecto." - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "No hay información disponible sobre la actualización de SCM para este proyecto. Aún no se completó una actualización. Si todavía no lo ha hecho, inicie una actualización para este proyecto." - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:127 -msgid "There was an error deleting inventory source groups. Returned status:" -msgstr "Se produjo un error al eliminar los grupos de la fuente del inventario. Estado devuelto:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:117 -msgid "There was an error deleting inventory source hosts. Returned status:" -msgstr "Se produjo un error al eliminar los hosts de la fuente del inventario. Estado devuelto:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:154 -msgid "There was an error deleting inventory source. Returned status:" -msgstr "Se produjo un error al eliminar la fuente del inventario. Estado devuelto:" - -#: client/src/configuration/forms/settings-form.controller.js:286 -msgid "There was an error resetting value. Returned status:" -msgstr "Ha habido un error reiniciando el valor. Estado devuelto:" - -#: client/src/configuration/forms/settings-form.controller.js:615 -msgid "There was an error resetting values. Returned status:" -msgstr "Ha habido un error reiniciando valores. Estado devuelto:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:235 -msgid "There was an error testing the log aggregator. Returned status:" -msgstr "Se produjo un error al probar el agregador de registros. Estado devuelto:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:29 -msgid "These are the modules that {{BRAND_NAME}} supports running commands against." -msgstr "Estos son los módulos que {{BRAND_NAME}} admite para ejecutar comandos." - -#: client/features/templates/templates.strings.js:106 -msgid "This Job Template has a credential that requires a password. Credentials requiring passwords on launch are not permitted on workflow nodes." -msgstr "Esta plantilla de trabajo cuenta con una credencial que requiere una contraseña. Las credenciales que requieren contraseña en el inicio no están permitidas en los nodos de flujo de trabajo." - -#: client/src/scheduler/scheduler.strings.js:59 -msgid "This Job Template has a default credential that requires a password before launch. Adding or editing schedules is prohibited while this credential is selected. To add or edit a schedule, credentials that require a password must be removed from the Job Template." -msgstr "Esta plantilla de trabajo cuenta con una credencial predeterminada que requiere contraseña antes del lanzamiento. Queda prohibido añadir o editar programaciones mientras esta credencial está seleccionada. Para añadir o editar una programación, las credenciales que requieren contraseña se deben eliminar de la plantilla de trabajo." - -#: client/features/templates/templates.strings.js:105 -msgid "This Job Template is missing a default inventory or project. This must be addressed in the Job Template form before this node can be saved." -msgstr "A esta plantilla de trabajo le falta un inventario o proyecto predeterminado. Esto se debe abordar en el formulario de Plantilla del trabajo para que se pueda guardar este nodo." - -#: client/src/credential-types/credential-types.strings.js:8 -msgid "This credential type is currently being used by one or more credentials. Credentials that use this credential type must be deleted before the credential type can be deleted." -msgstr "Una o más credenciales están usando este tipo de credencial actualmente. Las credenciales que usan este tipo de credencial se deben eliminar para que se pueda eliminar el tipo de credencial." - -#: client/src/instance-groups/instance-groups.strings.js:14 -msgid "This feature is currently in tech preview and is subject to change in a future release. Click here for documentation." -msgstr "Esta característica se encuentra actualmente en una versión preliminar de demostración y está sujeta a cambios en una versión futura. Haga clic aquí para ver la documentación." - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:25 -msgid "This group contains at least one group or host" -msgstr "Este grupo contiene al menos un grupo o host" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:50 -#: client/src/templates/workflows.form.js:74 -msgid "This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "Este inventario se aplica a todos los nodos de la plantilla de trabajo que indican un inventario." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:174 -msgid "This is not a valid number." -msgstr "Éste no es un número válido." - -#: client/src/credentials/factories/become-method-change.factory.js:59 -#: client/src/credentials/factories/kind-change.factory.js:115 -msgid "This is the tenant name. This value is usually the same as the username." -msgstr "Este es el nombre del inquilino. Este valor normalmente es el mismo que el nombre de usuario." - -#: client/features/templates/templates.strings.js:75 -msgid "This job template has a default {{typeLabel}} credential which must be included or replaced before proceeding." -msgstr "Esta plantilla de trabajo cuenta con una credencial predeterminada {{typeLabel}} que se debe incluir o reemplazar antes de continuar." - -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "This list is populated by inventories added from the" -msgstr "Esta lista se completa con los inventarios agregados desde" - -#: client/src/notifications/notifications.list.js:21 -msgid "This list is populated by notification templates added from the %sNotifications%s section" -msgstr "Esta lista se completa con las plantillas de notificación agregadas desde la sección %sNotificaciones%s" - -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "This list is populated by projects added from the" -msgstr "Esta lista se completa con los proyectos agregados desde el" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -msgid "This list is populated by teams added from the" -msgstr "Esta lista se completa con los equipos agregados desde el" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:4 -msgid "This machine has not checked in with Insights in {{last_check_in}} hours" -msgstr "Esta máquina no se ha registrado en Insights en {{last_check_in}} horas" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:49 -msgid "This question variable is already in use. Please enter a different variable name." -msgstr "Esta variable de pregunta ya está en uso. Ingrese un nombre de variable diferente." - -#: client/src/shared/form-generator.js:707 -msgid "This setting has been set manually in a settings file and is now disabled." -msgstr "Este valor ha sido establecido manualmente en el fichero de configuración y ahora está inhabilitado." - -#: client/src/users/users.form.js:167 -msgid "This user is not a member of any teams" -msgstr "Este usuario no es miembro de ningún equipo." - -#: client/src/shared/form-generator.js:828 -#: client/src/shared/form-generator.js:920 -msgid "This value does not match the password you entered previously. Please confirm that password." -msgstr "Este valor no corresponde con la contraseña introducida anteriormente. Por favor confirme la contraseña." - -#: client/src/configuration/forms/settings-form.controller.js:488 -msgid "This will reset all configuration values to their factory defaults. Are you sure you want to proceed?" -msgstr "Esta operación reiniciará todos los valores de configuración a los valores por defecto de fábrica. ¿Está seguro de querer continuar?" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:51 -msgid "This workflow job template has a default inventory which must be included or replaced before proceeding." -msgstr "Esta plantilla de trabajos del flujo de trabajo tiene un inventario predeterminado que debe incluirse o reemplazarse antes de continuar." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:444 -#: client/src/scheduler/scheduler.strings.js:40 -msgid "Thu" -msgstr "Jue" - -#: client/src/activity-stream/streams.list.js:25 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:18 -#: client/src/notifications/notification-templates-list/list.controller.js:72 -msgid "Time" -msgstr "Duración" - -#: client/src/license/license.partial.html:45 -msgid "Time Remaining" -msgstr "Tiempo restante" - -#: client/src/projects/projects.form.js:228 -msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." -msgstr "Tiempo en segundos a considerar que un proyecto es reciente. Durante la ejecución del trabajo y callbacks la tarea del sistema evaluará la fecha y hora de la última actualización del proyecto. Si es más antigua que el tiempo de expiración de caché, se considera que no es reciente y una nueva actualización del proyecto será llevada a cabo." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:405 -msgid "Time in seconds to consider an inventory sync to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest sync. If it is older than Cache Timeout, it is not considered current, and a new inventory sync will be performed." -msgstr "Tiempo en segundos para que la sincronización del inventario esté actualizada. Durante la ejecución de trabajos y callbacks, el sistema de tareas evaluará la marca de tiempo de la última sincronización. Si es anterior al Tiempo de espera para la ejecución del caché, no se considera actualizada y se llevará a cabo una nueva sincronización del inventario." - -#: client/features/templates/templates.strings.js:156 -#: client/src/notifications/notificationTemplates.form.js:136 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/templates/job_templates/job-template.form.js:290 -#: client/src/templates/job_templates/job-template.form.js:296 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:137 -msgid "Timeout" -msgstr "Tiempo de espera" - -#: client/src/credentials/credentials.form.js:125 -msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." -msgstr "Para conocer más sobre el token de IAM STS, consulte la %sdocumentación de Amazon%s." - -#: client/features/output/output.strings.js:120 -msgid "Toggle expanded output" -msgstr "Conmutar salida expandida" - -#: client/src/shared/form-generator.js:850 -msgid "Toggle the display of plaintext." -msgstr "Alternar la visualización de texto sin formato." - -#: client/src/notifications/shared/type-change.service.js:37 -#: client/src/notifications/shared/type-change.service.js:46 -msgid "Token" -msgstr "Token" - -#: client/features/applications/applications.strings.js:16 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 -#: client/src/users/users.form.js:242 -msgid "Tokens" -msgstr "Tokens" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:10 -msgid "Total Issues" -msgstr "Total de problemas" - -#: client/src/instance-groups/instance-groups.strings.js:23 -msgid "Total Jobs" -msgstr "Tareas totales" - -#: client/src/workflow-results/workflow-results.controller.js:91 -msgid "Total Nodes" -msgstr "Nodos totales" - -#: client/src/partials/logviewer.html:6 -msgid "Traceback" -msgstr "Traceback" - -#: client/src/license/license.partial.html:176 -msgid "Tracking and Analytics" -msgstr "Seguimiento y análitica" - -#: client/src/license/license.partial.html:233 -msgid "Trial" -msgstr "Prueba" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:424 -#: client/src/scheduler/scheduler.strings.js:38 -msgid "Tue" -msgstr "Mar" - -#: client/src/credentials/credentials.form.js:60 -#: client/src/credentials/credentials.form.js:84 -#: client/src/inventories-hosts/inventories/inventory.list.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:45 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:44 -#: client/src/notifications/notifications.list.js:33 -#: client/src/projects/projects.list.js:50 -#: client/src/scheduler/scheduled-jobs.list.js:47 -#: client/src/teams/teams.form.js:142 -#: client/src/templates/templates.list.js:31 -#: client/src/users/users.form.js:206 -msgid "Type" -msgstr "Tipo" - -#: client/features/credentials/credentials.strings.js:18 -#: client/src/credentials/credentials.form.js:23 -#: client/src/notifications/notificationTemplates.form.js:26 -msgid "Type Details" -msgstr "Detalles del tipo" - -#: client/features/templates/templates.strings.js:145 -msgid "UNLINK" -msgstr "DESVINCULAR" - -#: client/src/projects/add/projects-add.controller.js:182 -#: client/src/projects/edit/projects-edit.controller.js:303 -msgid "URL popover text" -msgstr "Texto 'popover' de la URL" - -#: client/src/license/license.partial.html:132 -#: client/src/login/loginModal/loginModal.partial.html:61 -msgid "USERNAME" -msgstr "NOMBRE DE USUARIO" - -#: client/src/activity-stream/get-target-title.factory.js:20 -#: client/src/organizations/linkout/organizations-linkout.route.js:43 -#: client/src/organizations/list/organizations-list.controller.js:55 -#: client/src/users/users.list.js:18 -#: client/src/users/users.list.js:19 -#: client/src/users/users.route.js:8 -msgid "USERS" -msgstr "USUARIOS" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:597 -msgid "UTC" -msgstr "UTC" - -#: client/lib/services/base-string.service.js:144 -msgid "UUID (Ascending)" -msgstr "UUID (ascendente)" - -#: client/lib/services/base-string.service.js:145 -msgid "UUID (Descending)" -msgstr "UUID (descendente)" - -#: client/lib/components/components.strings.js:25 -msgid "Unable to Submit" -msgstr "No se puede enviar" - -#: client/features/templates/templates.strings.js:96 -msgid "Unable to copy template." -msgstr "No es posible copiar la plantilla." - -#: client/src/instance-groups/instance-groups.strings.js:67 -msgid "Unable to delete instance group." -msgstr "No es posible eliminar el grupo de instancias." - -#: client/features/templates/templates.strings.js:92 -msgid "Unable to delete template." -msgstr "No es posible eliminar la plantilla." - -#: client/features/templates/templates.strings.js:94 -msgid "Unable to determine template type." -msgstr "No es posible determinar el tipo de plantilla." - -#: client/features/templates/templates.strings.js:81 -msgid "Unable to determine this template's type while copying." -msgstr "No es posible determinar este tipo de plantilla mientras se copia." - -#: client/features/templates/templates.strings.js:82 -msgid "Unable to determine this template's type while deleting." -msgstr "No es posible determinar este tipo de plantilla mientras se elimina." - -#: client/features/templates/templates.strings.js:83 -msgid "Unable to determine this template's type while editing." -msgstr "No es posible determinar este tipo de plantilla mientras se edita." - -#: client/features/templates/templates.strings.js:84 -msgid "Unable to determine this template's type while launching." -msgstr "No es posible determinar este tipo de plantilla durante su lanzamiento." - -#: client/features/templates/templates.strings.js:85 -msgid "Unable to determine this template's type while scheduling." -msgstr "No es posible determinar este tipo de plantilla mientras se programa." - -#: client/features/templates/templates.strings.js:91 -msgid "Unable to edit template." -msgstr "No es posible editar la plantilla." - -#: client/src/shared/stateDefinitions.factory.js:231 -msgid "Unable to get resource:" -msgstr "No es posible obtener el recurso:" - -#: client/features/templates/templates.strings.js:93 -msgid "Unable to launch template." -msgstr "No es posible lanzar la plantilla." - -#: client/features/templates/templates.strings.js:95 -msgid "Unable to schedule job." -msgstr "No es posible programar la tarea." - -#: client/src/instance-groups/instance-groups.strings.js:49 -msgid "Unavailable" -msgstr "No disponible" - -#: client/src/instance-groups/instance-groups.strings.js:48 -msgid "Unavailable to run jobs." -msgstr "No disponible para ejecutar tareas." - -#: client/lib/components/components.strings.js:27 -msgid "Unexpected Error" -msgstr "Error inesperado" - -#: client/lib/components/components.strings.js:26 -msgid "Unexpected server error. View the console for more information" -msgstr "Error inesperado del servidor. Consulte la consola para obtener más información." - -#: client/src/license/license.partial.html:59 -msgid "Unlimited" -msgstr "Ilimitado" - -#: client/lib/components/components.strings.js:39 -msgid "Unsupported display model type" -msgstr "Tipo de modelo de visualización no compatible" - -#: client/lib/components/components.strings.js:31 -msgid "Unsupported input type" -msgstr "Tipo de entrada no compatible" - -#: client/features/projects/projects.strings.js:33 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Update Not Found" -msgstr "Actualización no encontrada" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:344 -msgid "Update Options" -msgstr "Actualizar opciones" - -#: client/src/projects/projects.form.js:197 -msgid "Update Revision on Launch" -msgstr "Revisión de actualización durante el lanzamiento" - -#: client/features/projects/projects.strings.js:44 -#: client/src/projects/factories/get-project-tool-tip.factory.js:30 -msgid "Update canceled. Click for details" -msgstr "Actualización cancelada. Haga clic para obtener más información." - -#: client/features/projects/projects.strings.js:42 -#: client/src/projects/factories/get-project-tool-tip.factory.js:24 -msgid "Update failed. Click for details" -msgstr "Actualización fallida. Haga clic para obtener más información." - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "Update in Progress" -msgstr "Actualización en curso" - -#: client/features/projects/projects.strings.js:43 -#: client/src/projects/factories/get-project-tool-tip.factory.js:27 -msgid "Update missing. Click for details" -msgstr "Actualización faltante. Haga clic para obtener más información." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:372 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:377 -msgid "Update on Launch" -msgstr "Actualizar al ejecutar" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:383 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:389 -msgid "Update on Project Update" -msgstr "Actualizar en la actualización del proyecto" - -#: client/features/projects/projects.strings.js:39 -#: client/src/projects/factories/get-project-tool-tip.factory.js:14 -msgid "Update queued. Click for details" -msgstr "Actualización en fila. Haga clic para obtener más información." - -#: client/features/projects/projects.strings.js:40 -#: client/src/projects/factories/get-project-tool-tip.factory.js:18 -msgid "Update running. Click for details" -msgstr "Actualización en ejecución. Haga clic para obtener más información." - -#: client/src/configuration/settings.partial.html:6 -msgid "Update settings pertaining to Jobs within Tower" -msgstr "Actualice las configuraciones correspondientes a Trabajos dentro de la Torre" - -#: client/features/projects/projects.strings.js:41 -#: client/src/projects/factories/get-project-tool-tip.factory.js:21 -msgid "Update succeeded. Click for details" -msgstr "Actualización exitosa. Haga clic para obtener más información." - -#: client/src/license/license.partial.html:75 -msgid "Upgrade" -msgstr "Actualizar" - -#: client/src/license/license.partial.html:111 -msgid "Upload a license file" -msgstr "Subir un archivo de licencia" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:62 -#: client/src/organizations/organizations.form.js:48 -#: client/src/projects/projects.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:257 -msgid "Use Default Environment" -msgstr "Utilizar entorno predeterminado" - -#: client/src/notifications/add/add.controller.js:98 -#: client/src/notifications/edit/edit.controller.js:139 -msgid "Use SSL" -msgstr "Utilizar SSL" - -#: client/src/notifications/add/add.controller.js:97 -#: client/src/notifications/edit/edit.controller.js:138 -msgid "Use TLS" -msgstr "Utilizar TLS" - -#: client/src/notifications/notificationTemplates.form.js:586 -msgid "Use custom messages to change the content of notifications sent when a job starts, succeeds, or fails. Use curly braces to access information about the job: {{ job_friendly_name }}, {{ url }}, or attributes of the job such as {{ job.status }}. You may apply a number of possible variables in the message. Refer to the Ansible Tower documentation for more details." -msgstr "Utilice los mensajes personalizados para cambiar el contenido de las notificaciones que se envían cuando un trabajo comienza, tiene éxito o falla. Utilice llaves para acceder a la información sobre el trabajo: {{ job_friendly_name }}, {{ url }}, o atributos del trabajo como {{ job.status }}. Puede aplicar una serie de posibles variables en el mensaje. Consulte la documentación Ansible Tower para ver más detalles." - -#: client/src/instance-groups/instance-groups.strings.js:24 -#: client/src/instance-groups/instance-groups.strings.js:50 -msgid "Used Capacity" -msgstr "Capacidad usada" - -#: client/src/credentials/credentials.form.js:76 -msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." -msgstr "Utilizado para verificar y sincronizar los repositorios playbook con sistema remoto de gestión de código fuente como Git, Subversion (svn) o Mercurial (hg). Estos credenciales son utilizados por proyectos." - -#: client/features/credentials/legacy.credentials.js:80 -#: client/src/credentials/credentials.form.js:456 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:125 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:122 -#: client/src/organizations/organizations.form.js:119 -#: client/src/organizations/organizations.form.js:160 -#: client/src/projects/projects.form.js:296 -#: client/src/teams/teams.form.js:96 -#: client/src/templates/workflows.form.js:306 -msgid "User" -msgstr "Usuario" - -#: client/lib/components/components.strings.js:97 -#: client/src/configuration/settings.partial.html:11 -msgid "User Interface" -msgstr "Interfaz de usuario" - -#: client/src/users/users.form.js:96 -msgid "User Type" -msgstr "Tipo de usuario" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 -#: client/src/credentials/factories/become-method-change.factory.js:17 -#: client/src/credentials/factories/become-method-change.factory.js:38 -#: client/src/credentials/factories/kind-change.factory.js:16 -#: client/src/credentials/factories/kind-change.factory.js:40 -#: client/src/credentials/factories/kind-change.factory.js:73 -#: client/src/credentials/factories/kind-change.factory.js:94 -#: client/src/notifications/notificationTemplates.form.js:453 -#: client/src/notifications/notificationTemplates.form.js:492 -#: client/src/notifications/notificationTemplates.form.js:64 -#: client/src/users/users.form.js:59 -#: client/src/users/users.list.js:29 -msgid "Username" -msgstr "Usuario" - -#: client/lib/services/base-string.service.js:138 -msgid "Username (Ascending)" -msgstr "Nombre de usuario (ascendente)" - -#: client/lib/services/base-string.service.js:139 -msgid "Username (Descending)" -msgstr "Nombre de usuario (descendente)" - -#: client/src/credentials/credentials.form.js:80 -msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for smart inventory sources and for cloud provisioning and deployment in playbook runs." -msgstr "Nombres de usuarios, contraseñas y claves de acceso para la autenticación del proveedor de nube o infraestructura especificado. Estos son utilizados para fuentes de inventario inteligente y para el aprovisionamiento y la implementación de nube cuando se ejecuta un playbook." - -#: client/lib/components/components.strings.js:80 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:38 -#: client/src/organizations/organizations.form.js:101 -#: client/src/teams/teams.form.js:78 -msgid "Users" -msgstr "Usuarios" - -#: client/src/scheduler/schedulerList.controller.js:46 -msgid "Using a credential that requires a password on launch is prohibited when creating a Job Template schedule" -msgstr "El uso de una credencial que requiere una contraseña durante el lanzamiento está prohibido al crear una programación de la Plantilla de trabajo" - -#: client/lib/components/code-mirror/code-mirror.strings.js:11 -msgid "VARIABLES" -msgstr "VARIABLES" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:7 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:7 -msgid "VIEW ALL" -msgstr "VER TODO" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:90 -msgid "VIEW DATA IN INSIGHTS" -msgstr "VER DATOS EN INSIGHTS" - -#: client/lib/components/components.strings.js:59 -msgid "VIEW LESS" -msgstr "VER MENOS" - -#: client/features/templates/templates.strings.js:143 -msgid "VIEW LINK" -msgstr "VER ENLACE" - -#: client/lib/components/components.strings.js:58 -msgid "VIEW MORE" -msgstr "VER MÁS" - -#: client/src/shared/paginate/paginate.partial.html:48 -msgid "VIEW PER PAGE" -msgstr "VISTA POR PÁGINA" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:249 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:261 -msgid "VPC ID:" -msgstr "VPC ID:" - -#: client/src/license/license.partial.html:10 -msgid "Valid License" -msgstr "Licencia válida" - -#: client/src/inventories-hosts/hosts/host.form.js:67 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:46 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:47 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:68 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:63 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:70 -msgid "Variables" -msgstr "Variables" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:25 -#: client/src/templates/prompt/steps/credential/prompt-credential.directive.js:37 -msgid "Vault ID" -msgstr "ID de Vault" - -#: client/features/templates/templates.strings.js:48 -#: client/src/credentials/credentials.form.js:390 -msgid "Vault Password" -msgstr "Contraseña Vault" - -#: client/features/output/output.strings.js:97 -#: client/features/templates/templates.strings.js:60 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:82 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:91 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:330 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:337 -#: client/src/templates/job_templates/job-template.form.js:189 -#: client/src/templates/job_templates/job-template.form.js:196 -msgid "Verbosity" -msgstr "Nivel de detalle" - -#: client/src/license/license.partial.html:15 -msgid "Version" -msgstr "Versión" - -#: client/src/activity-stream/streams.list.js:63 -#: client/src/credential-types/credential-types.list.js:64 -#: client/src/credentials/credentials.list.js:82 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:64 -#: client/src/inventories-hosts/inventories/inventory.list.js:118 -#: client/src/inventory-scripts/inventory-scripts.list.js:70 -#: client/src/notifications/notificationTemplates.list.js:96 -#: client/src/scheduler/schedules.list.js:101 -#: client/src/teams/teams.list.js:64 -#: client/src/templates/templates.list.js:101 -#: client/src/users/users.list.js:70 -msgid "View" -msgstr "Mostrar" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "View Activity Stream" -msgstr "Mostrar el flujo de actividad" - -#: client/lib/components/components.strings.js:68 -msgid "View Documentation" -msgstr "Mostrar la documentación" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:52 -msgid "View Insights" -msgstr "Ver Insights" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:102 -#: client/src/inventories-hosts/inventory-hosts.strings.js:27 -msgid "View Insights Data" -msgstr "Ver datos de Insights" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:201 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:225 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:249 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:324 -msgid "View JSON examples at" -msgstr "Ver ejemplos de JSON en" - -#: client/src/inventories-hosts/hosts/host.form.js:77 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:76 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:84 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:73 -msgid "View JSON examples at %s" -msgstr "Ver ejemplos de JSON en %s" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:13 -msgid "View Less" -msgstr "Ver menos" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:11 -msgid "View More" -msgstr "Ver más" - -#: client/src/organizations/list/organizations-list.partial.html:64 -msgid "View Organization" -msgstr "Ver organización" - -#: client/features/output/output.strings.js:28 -#: client/features/output/output.strings.js:32 -msgid "View Project checkout results" -msgstr "Ver resultados de verificación del proyecto" - -#: client/src/shared/form-generator.js:1672 -#: client/src/templates/job_templates/job-template.form.js:588 -#: client/src/templates/workflows.form.js:343 -msgid "View Survey" -msgstr "Mostrar el cuestionario" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:202 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:226 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:250 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:325 -msgid "View YAML examples at" -msgstr "Ver ejemplos de YAML en" - -#: client/src/inventories-hosts/hosts/host.form.js:78 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:77 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:88 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:74 -msgid "View YAML examples at %s" -msgstr "Ver ejemplos de YAML en %s" - -#: client/src/configuration/settings.partial.html:15 -msgid "View and edit your license information" -msgstr "Ver y editar su información de licencia." - -#: client/src/credentials/credentials.list.js:84 -msgid "View credential" -msgstr "Mostrar credencial" - -#: client/src/credential-types/credential-types.list.js:66 -msgid "View credential type" -msgstr "Ver tipo de credencial" - -#: client/lib/components/layout/layout.partial.html:29 -msgid "View documentation" -msgstr "Ver documentación" - -#: client/src/activity-stream/streams.list.js:67 -msgid "View event details" -msgstr "Mostrar detalles del evento" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:92 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:96 -msgid "View group" -msgstr "Ver grupo" - -#: client/src/inventories-hosts/hosts/host.list.js:95 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:96 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:109 -#: client/src/inventories-hosts/inventory-hosts.strings.js:26 -msgid "View host" -msgstr "Ver host" - -#: client/src/inventories-hosts/inventories/inventory.list.js:120 -msgid "View inventory" -msgstr "Mostrar inventario" - -#: client/src/inventory-scripts/inventory-scripts.list.js:72 -msgid "View inventory script" -msgstr "Mostrar script de inventario" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:83 -msgid "View job" -msgstr "Ver tarea" - -#: client/src/notifications/notificationTemplates.list.js:98 -msgid "View notification" -msgstr "Mostrar notificación" - -#: client/src/scheduler/schedules.list.js:103 -msgid "View schedule" -msgstr "Mostrar el calendario" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:114 -msgid "View source" -msgstr "Ver fuente" - -#: client/src/teams/teams.list.js:67 -msgid "View team" -msgstr "Mostrar equipo" - -#: client/src/templates/templates.list.js:103 -msgid "View template" -msgstr "Mostrar plantilla" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "View the" -msgstr "Ver" - -#: client/features/output/output.strings.js:22 -#: client/lib/components/components.strings.js:63 -msgid "View the Credential" -msgstr "Ver credencial" - -#: client/features/output/output.strings.js:26 -msgid "View the Inventory" -msgstr "Ver inventario" - -#: client/features/output/output.strings.js:29 -msgid "View the Job Template" -msgstr "Ver la plantilla de tareas" - -#: client/features/output/output.strings.js:27 -#: client/features/output/output.strings.js:31 -msgid "View the Project" -msgstr "Ver el proyecto" - -#: client/features/output/output.strings.js:33 -msgid "View the Schedule" -msgstr "Ver la programación" - -#: client/features/output/output.strings.js:35 -msgid "View the User" -msgstr "Ver el usuario" - -#: client/src/projects/projects.list.js:115 -msgid "View the project" -msgstr "Mostrar el proyecto" - -#: client/src/scheduler/scheduled-jobs.list.js:79 -msgid "View the schedule" -msgstr "Mostrar el calendario" - -#: client/features/output/output.strings.js:34 -#: client/src/workflow-results/workflow-results.controller.js:63 -msgid "View the source Workflow Job" -msgstr "Ver la tarea del flujo de trabajo de origen" - -#: client/features/output/output.strings.js:41 -msgid "View the webhook configuration on the job template." -msgstr "Vea la configuración de webhook en la plantilla de trabajo." - -#: client/features/output/output.strings.js:42 -#: client/src/workflow-results/workflow-results.controller.js:65 -msgid "View the webhook configuration on the workflow job template." -msgstr "Vea la configuración de webhook en la plantilla de trabajo del flujo de trabajo." - -#: client/src/users/users.list.js:73 -msgid "View user" -msgstr "Mostrar usuario" - -#: client/lib/components/components.strings.js:91 -msgid "Views" -msgstr "Vistas" - -#: client/features/templates/templates.strings.js:148 -msgid "WARNING: UNSAVED CHANGES" -msgstr "ADVERTENCIA: CAMBIOS NO GUARDADOS" - -#: client/src/templates/workflows.form.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js:47 -msgid "WORKFLOW" -msgstr "FLUJO DE TRABAJO" - -#: client/features/templates/templates.strings.js:136 -msgid "WORKFLOW VISUALIZER" -msgstr "VISUALIZADOR DE FLUJOS DE TRABAJO" - -#: client/features/templates/templates.strings.js:115 -msgid "Wait For Approval" -msgstr "Esperar la aprobación" - -#: client/features/templates/templates.strings.js:121 -#: client/src/scheduler/scheduler.strings.js:58 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:369 -msgid "Warning" -msgstr "Advertencia" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:52 -#: client/src/configuration/forms/settings-form.controller.js:444 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:50 -msgid "Warning: Unsaved Changes" -msgstr "Aviso: modificaciones no guardadas" - -#: client/src/license/license.controller.js:159 -msgid "We were unable to locate licenses associated with this account" -msgstr "No pudimos localizar las licencias asociadas a esta cuenta" - -#: client/features/jobs/jobs.strings.js:17 -#: client/features/output/output.strings.js:53 -#: client/src/workflow-results/workflow-results.controller.js:88 -msgid "Webhook" -msgstr "Webhook" - -#: client/src/templates/job_templates/job-template.form.js:462 -#: client/src/templates/job_templates/job-template.form.js:473 -#: client/src/templates/workflows.form.js:235 -#: client/src/templates/workflows.form.js:246 -msgid "Webhook Credential" -msgstr "Credencial de Webhook" - -#: client/src/templates/job_templates/job-template.form.js:430 -#: client/src/templates/job_templates/job-template.form.js:456 -#: client/src/templates/workflows.form.js:203 -#: client/src/templates/workflows.form.js:229 -msgid "Webhook Key" -msgstr "Clave de Webhook" - -#: client/src/templates/job_templates/job-template.form.js:405 -#: client/src/templates/job_templates/job-template.form.js:414 -#: client/src/templates/workflows.form.js:178 -#: client/src/templates/workflows.form.js:187 -msgid "Webhook Service" -msgstr "Servicio de Webhook" - -#: client/src/templates/job_templates/job-template.form.js:419 -#: client/src/templates/job_templates/job-template.form.js:425 -#: client/src/templates/workflows.form.js:192 -#: client/src/templates/workflows.form.js:198 -msgid "Webhook URL" -msgstr "URL de Webhook" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:78 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:69 -msgid "Webhook services can launch jobs with this job template by making a POST request to this URL." -msgstr "Los servicios de Webhook pueden iniciar trabajos con esta plantilla de trabajo haciendo una solicitud de POST a esta URL." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:47 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:79 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:70 -msgid "Webhook services can use this as a shared secret." -msgstr "Los servicios de Webhook pueden usar esto como un secreto compartido." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:434 -#: client/src/scheduler/scheduler.strings.js:39 -msgid "Wed" -msgstr "Mié" - -#: client/src/license/license.partial.html:82 -msgid "Welcome to Ansible Tower! Please complete the steps below to acquire a license." -msgstr "¡Bienvenido a Ansible Tower! Complete los siguientes pasos para adquirir una licencia." - -#: client/src/login/loginModal/loginModal.partial.html:23 -msgid "Welcome to Ansible {{BRAND_NAME}}!  Please sign in." -msgstr "¡Bienvenido a Ansible {{BRAND_NAME}}!  Inicie sesión." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:365 -msgid "When not checked, a merge will be performed, combining local variables with those found on the external source." -msgstr "Cuando no esté comprobado, se llevará a cabo una fusión, y se combinarán las variables locales con las variables halladas en la fuente externa." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:354 -msgid "When not checked, local child hosts and groups not found on the external source will remain untouched by the inventory update process." -msgstr "Si la opción no está marcada, los hosts hijos y los grupos locales que no se encuentren en la fuente externa no se modificarán a partir del proceso de actualización del inventario." - -#: client/features/output/output.strings.js:25 -msgid "When this field is true, the job's inventory belongs to an organization that has exceeded it's limit of hosts as defined by the system administrator." -msgstr "Cuando este campo es verdadero, el inventario del trabajo pertenece a una organización que ha excedido su límite de hosts según lo define el administrador del sistema." - -#: client/src/projects/projects.form.js:50 -msgid "When this project is used by a Job Template, Organization cannot be changed." -msgstr "Cuando este proyecto es usado por una Plantilla de tarea, no se puede cambiar la Organización." - -#: client/features/templates/templates.strings.js:119 -#: client/src/workflow-results/workflow-results.controller.js:100 -msgid "Workflow" -msgstr "Flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:666 -msgid "Workflow Approved Message" -msgstr "Mensaje aprobado por el flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:677 -msgid "Workflow Approved Message Body" -msgstr "Cuerpo del mensaje aprobado por el flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:689 -msgid "Workflow Denied Message" -msgstr "Mensaje de denegación del flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:700 -msgid "Workflow Denied Message Body" -msgstr "Cuerpo del mensaje denegado por el flujo de trabajo" - -#: client/features/jobs/jobs.strings.js:11 -msgid "Workflow Job" -msgstr "Tarea en flujo de trabajo" - -#: client/lib/models/models.strings.js:49 -msgid "Workflow Job Template Nodes" -msgstr "Nodos de la plantilla de tareas de flujo de trabajo" - -#: client/lib/models/models.strings.js:45 -msgid "Workflow Job Templates" -msgstr "Plantillas de trabajos de flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:712 -msgid "Workflow Pending Approval Message" -msgstr "Mensaje de aprobación pendiente del flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:723 -msgid "Workflow Pending Approval Message Body" -msgstr "Cuerpo del mensaje de aprobación pendiente del flujo de trabajo" - -#: client/features/templates/templates.strings.js:14 -#: client/lib/components/components.strings.js:132 -#: client/src/templates/templates.list.js:66 -msgid "Workflow Template" -msgstr "Plantilla de flujo de trabajo" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:41 -msgid "Workflow Templates" -msgstr "Plantillas de flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:735 -msgid "Workflow Timed Out Message" -msgstr "Mensaje de tiempo de espera agotado del flujo de trabajo" - -#: client/src/notifications/notificationTemplates.form.js:746 -msgid "Workflow Timed Out Message Body" -msgstr "Cuerpo del mensaje de tiempo de espera agotado del flujo de trabajo" - -#: client/src/shared/form-generator.js:1676 -#: client/src/templates/workflows.form.js:367 -msgid "Workflow Visualizer" -msgstr "Visualizador de flujos de trabajo" - -#: client/features/users/tokens/tokens.strings.js:31 -msgid "Write" -msgstr "Escribir" - -#: client/lib/components/code-mirror/code-mirror.strings.js:13 -#: client/lib/services/base-string.service.js:72 -msgid "YAML" -msgstr "YAML" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:199 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:223 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:247 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:322 -msgid "YAML:" -msgstr "YAML:" - -#: client/lib/services/base-string.service.js:76 -msgid "YES" -msgstr "SÍ" - -#: client/src/notifications/add/add.controller.js:88 -#: client/src/notifications/edit/edit.controller.js:151 -msgid "Yellow" -msgstr "Amarillo" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:57 -msgid "You can create a job template here." -msgstr "Puede crear una plantilla de trabajo aquí." - -#: client/features/templates/templates.strings.js:101 -msgid "You do not have access to all resources used by this workflow. Resources that you don't have access to will not be copied and will result in an incomplete workflow." -msgstr "No tiene acceso a todos los recursos utilizados por este flujo de trabajo. Los recursos a los que no tiene acceso no se copiarán y darán como resultado un flujo de trabajo incompleto." - -#: client/src/projects/factories/get-project-path.factory.js:56 -msgid "You do not have access to view this property" -msgstr "Usted no tiene permiso para ver esta propiedad" - -#: client/src/templates/main.js:128 -msgid "You do not have permission to add a job template, or there are no projects available." -msgstr "No tiene permiso para agregar una plantilla de trabajo, o no hay proyectos disponibles." - -#: client/src/projects/add/projects-add.controller.js:35 -msgid "You do not have permission to add a project." -msgstr "Usted no tiene permiso para añadir un proyecto." - -#: client/src/users/add/users-add.controller.js:45 -msgid "You do not have permission to add a user." -msgstr "Usted no tiene permiso para añadir un usuario." - -#: client/src/templates/main.js:367 -msgid "You do not have permission to add a workflow job template." -msgstr "Usted no tiene permiso para añadir una plantilla de trabajo del flujo de trabajo." - -#: client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js:190 -msgid "You do not have permission to manage this user" -msgstr "No tiene permiso para gestionar este usuario." - -#: client/features/templates/templates.strings.js:80 -msgid "You do not have permission to perform this action." -msgstr "No tiene permiso para realizar esta acción." - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "You do not have permission to view this job." -msgstr "No tiene permiso para ver este trabajo." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:41 -msgid "You do not have sufficient permissions to edit the host filter." -msgstr "No tiene permisos suficientes para editar el filtro del host." - -#: client/src/login/loginModal/loginModal.partial.html:34 -msgid "You have been logged out. Please sign in." -msgstr "Se ha cerrado la sesión. Inicie sesión." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:51 -#: client/src/configuration/forms/settings-form.controller.js:443 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:49 -msgid "You have unsaved changes. Would you like to proceed without saving?" -msgstr "Tiene modificaciones sin guardar.¿Le gustaría continuar sin guardarlas?" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook." -msgstr "Debe ejecutar una actualización exitosa para poder seleccionar un cuaderno de estrategias. No podrá guardar esta plantilla de trabajo sin un cuaderno de estrategias válido." - -#: client/features/projects/projects.strings.js:21 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "Your request to cancel the update was submitted to the task manager." -msgstr "Su solicitud de cancelación de la actualización ha sido enviada al gestor de tareas." - -#: client/src/login/loginModal/loginModal.partial.html:28 -msgid "Your session timed out due to inactivity. Please sign in." -msgstr "Su sesión ha expirado debido a la inactividad. Inicie sesión." - -#: client/index.template.ejs:32 -msgid "Your session will expire in 60 seconds, would you like to continue?" -msgstr "Su sesión caducará en 60 segundos, ¿le gustaría continuar?" - -#: client/src/shared/form-generator.js:1169 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "and" -msgstr "y" - -#: client/src/activity-stream/factories/build-description.factory.js:133 -msgid "approved" -msgstr "aprobado" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "button to view the latest status." -msgstr "botón para ver el último estado." - -#: client/features/users/tokens/tokens.strings.js:27 -msgid "by" -msgstr "por" - -#: client/features/jobs/jobs.strings.js:29 -msgid "canceled" -msgstr "cancelado" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "characters long." -msgstr "caracteres." - -#: client/src/activity-stream/factories/build-description.factory.js:138 -msgid "denied" -msgstr "denegado" - -#: client/features/output/output.strings.js:104 -#: client/src/shared/smart-search/smart-search.partial.html:50 -msgid "documentation" -msgstr "documentación" - -#: client/features/jobs/jobs.strings.js:28 -msgid "error" -msgstr "error" - -#: client/features/jobs/jobs.strings.js:27 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -msgid "failed" -msgstr "falló" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:262 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:275 -msgid "for a complete list of supported filters." -msgstr "para acceder a una lista completa de filtros compatibles." - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "from the" -msgstr "del" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -#: client/src/inventories-hosts/inventory-hosts.strings.js:8 -msgid "group" -msgid_plural "groups" -msgstr[0] "grupo" -msgstr[1] "grupos" - -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:49 -msgid "groups with sync failures. Click for details" -msgstr "grupos con fallas en la sincronización. Haga clic para obtener más información" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:9 -msgid "host" -msgid_plural "hosts" -msgstr[0] "host" -msgstr[1] "hosts" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:64 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:61 -msgid "hosts with failures. Click for details." -msgstr "hosts con fallos. Haga clic para obtener más información." - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:146 -msgid "min" -msgstr "min" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "missing" -msgstr "no encontrado" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:21 -msgid "name" -msgstr "nombre" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "never updated" -msgstr "nunca actualizado" - -#: client/features/jobs/jobs.strings.js:22 -msgid "new" -msgstr "nuevo" - -#: client/src/shared/paginate/paginate.partial.html:34 -#: client/src/shared/paginate/paginate.partial.html:45 -msgid "of" -msgstr "de" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "of the filters match." -msgstr "de la coincidencia con los filtros." - -#: client/src/scheduler/scheduler.strings.js:34 -msgid "on" -msgstr "en" - -#: client/src/scheduler/scheduler.strings.js:31 -msgid "on day" -msgstr "el día" - -#: client/src/scheduler/scheduler.strings.js:35 -msgid "on days" -msgstr "los días" - -#: client/src/scheduler/scheduler.strings.js:33 -msgid "on the" -msgstr "en la" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:24 -msgid "organization" -msgstr "organización" - -#: client/features/jobs/jobs.strings.js:23 -msgid "pending" -msgstr "pendiente" - -#: client/src/shared/form-generator.js:1044 -msgid "playbook" -msgstr "playbook" - -#: client/features/jobs/jobs.strings.js:25 -msgid "running" -msgstr "ejecutando" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:150 -msgid "sec" -msgstr "seg" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "section" -msgstr "sección" - -#: client/features/credentials/credentials.strings.js:35 -msgid "selected" -msgstr "Seleccionado" - -#: client/src/credentials/credentials.form.js:138 -#: client/src/credentials/credentials.form.js:363 -msgid "set in helpers/credentials" -msgstr "definir en helpers/credentials" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:47 -msgid "sources with sync failures. Click for details" -msgstr "fuentes con fallos en la sincronización. Haga clic para obtener más información" - -#: client/features/jobs/jobs.strings.js:26 -msgid "successful" -msgstr "correctos" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "test" -msgstr "prueba" - -#: client/src/activity-stream/factories/build-description.factory.js:136 -msgid "timed out" -msgstr "agotado" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "to" -msgstr "para" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "to include all regions. Only Hosts associated with the selected regions will be updated." -msgstr "para incluir todas las regiones. Solo se actualizarán los hosts asociados con las regiones seleccionadas." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "to start it now." -msgstr "para comenzarlo ahora." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "to update." -msgstr "para actualizar." - -#: client/src/activity-stream/factories/build-description.factory.js:141 -msgid "updated" -msgstr "actualizado" - -#: client/src/credentials/credentials.form.js:380 -msgid "v2 URLs%s - leave blank" -msgstr "v2 URLs%s - dejar en blanco" - -#: client/src/credentials/credentials.form.js:381 -msgid "v3 default%s - set to 'default'" -msgstr "v3 default%s - establecer en 'valor predeterminado'" - -#: client/src/credentials/credentials.form.js:382 -msgid "v3 multi-domain%s - your domain name" -msgstr "v3 multi-domain%s - su nombre de dominio" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:318 -msgid "view azure_rm.ini in the Ansible community.general github repo." -msgstr "ver azure_rm.ini en el repositorio github community.general de Ansible." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:219 -msgid "view ec2.ini in the community.aws repo." -msgstr "ver ec2.ini en el repositorio community.aws." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:243 -msgid "view vmware_inventory.ini in the vmware community repo." -msgstr "ver vmware_inventory.ini en el repositorio community de VMware." - -#: client/features/jobs/jobs.strings.js:24 -msgid "waiting" -msgstr "esperando" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "when" -msgstr "cuando" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:240 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:252 -msgid "will create group names similar to the following examples based on the options selected:" -msgstr "se crearán nombres de grupos similares a los de los siguientes ejemplos en función de las opciones seleccionadas:" - -#: client/index.template.ejs:158 -msgid "working..." -msgstr "en funcionamiento..." - -#: client/features/users/tokens/tokens.strings.js:42 -msgid "{{ appName }} Token" -msgstr "Token de {{ appName }}" - -#: client/lib/services/base-string.service.js:158 -msgid "{{ header }} {{ body }}" -msgstr "{{ header }} {{ body }}" - -#: client/lib/services/base-string.service.js:80 -msgid "{{ resource }} successfully created" -msgstr "{{ resource }} creado correctamente" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:31 -msgid "{{ str1 }}

{{ str2 }}

" -msgstr "{{ str1 }}

{{ str2 }}

" - -#: client/lib/components/cards/card.partial.html:2 -msgid "{{ title }}" -msgstr "{{ title }}" - -#: client/src/instance-groups/container-groups/add-container-group.view.html:24 -msgid "{{ vm.form.extraVars.toggleLabel }}" -msgstr "{{ vm.form.extraVars.toggleLabel }}" - -#: client/src/configuration/forms/settings-form.partial.html:10 -#: client/src/configuration/forms/settings-form.route.js:15 -msgid "{{ vm.getCurrentFormTitle() }}" -msgstr "{{ vm.getCurrentFormTitle() }}" - -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:5 -msgid "{{:: vm.strings.get('prompt.JOB_TYPE') }}" -msgstr "{{:: vm.strings.get('prompt.JOB_TYPE') }}" - -#: client/lib/components/input/label.partial.html:5 -msgid "{{::state._hint}}" -msgstr "{{::state._hint}}" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:6 -#: client/src/configuration/forms/system-form/configuration-system.partial.html:5 -msgid "{{opt.label}}" -msgstr "{{opt.label}}" - -#: client/src/shared/paginate/paginate.partial.html:56 -msgid "{{pageSize}}" -msgstr "{{pageSize}}" - diff --git a/awx/ui/po/fr.po b/awx/ui/po/fr.po deleted file mode 100644 index 513c1718aa..0000000000 --- a/awx/ui/po/fr.po +++ /dev/null @@ -1,8191 +0,0 @@ -msgid "" -msgstr "" -"Language: fr \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" - -#: client/src/projects/add/projects-add.controller.js:166 -#: client/src/projects/edit/projects-edit.controller.js:287 -msgid "%sNote:%s Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." -msgstr "%sRemarque%s : Mercurial ne prend pas en charge l’authentification par mot de passe pour SSH. N’entrez ni le nom d’utilisateur, ni la clé dans l’URL. Si vous utilisez Bitbucket et SSH, ne saisissez pas votre nom d’utilisateur Bitbucket." - -#: client/src/projects/add/projects-add.controller.js:145 -#: client/src/projects/edit/projects-edit.controller.js:266 -msgid "%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." -msgstr "%sRemarque%s : Si vous utilisez le protocole SSH pour GitHub ou Bitbucket, entrez uniquement une clé SSH sans nom d’utilisateur (autre que git). De plus, GitHub et Bitbucket ne prennent pas en charge l’authentification par mot de passe lorsque SSH est utilisé. Le protocole GIT en lecture seule (git://) n’utilise pas les informations de nom d’utilisateur ou de mot de passe." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:62 -msgid "(HH24:MM:SS UTC)" -msgstr "(HH24:MM:SS UTC)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:57 -msgid "(HH24:MM:SS)" -msgstr "(HH24:MM:SS)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:568 -msgid "(Limited to first 10)" -msgstr "(10 premiers seulement)" - -#: client/src/credentials/credentials.form.js:286 -msgid "(defaults to %s)" -msgstr "(défini par défaut sur %s)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -msgid "(seconds)" -msgstr "(secondes)" - -#: client/src/shared/paginate/paginate.partial.html:67 -msgid "100" -msgstr "100" - -#: client/src/shared/paginate/paginate.partial.html:61 -msgid "20" -msgstr "20" - -#: client/src/shared/paginate/paginate.partial.html:64 -msgid "50" -msgstr "50" - -#: client/src/license/license.partial.html:193 -msgid "Automation analytics: This data is used to enhance future releases of the Tower Software and to provide Automation Analytics to Tower subscribers." -msgstr "Analyse automatique : ces données sont utilisées pour améliorer les versions futures de Tower Software et pour fournir Automation Analytics aux abonnés Tower." - -#: client/src/license/license.partial.html:171 -msgid "I agree to the End User License Agreement" -msgstr "J’accepte le Contrat de licence de l’utilisateur final" - -#: client/src/license/license.partial.html:187 -msgid "User analytics: This data is used to enhance future releases of the Tower Software and help streamline customer experience and success." -msgstr "Analyse utilisateur : ces données sont utilisées pour améliorer les nouvelles versions de Tower Software et simplifier l'expérience client" - -#: client/src/login/loginModal/loginModal.partial.html:32 -msgid "" -"\n" -"
\n" -" You have been logged out. Please sign in.\n" -"
" -msgstr "\n" -"
\n" -" Vous êtes déconnecté. Veuillez ouvrir à nouveau une session.\n" -"
" - -#: client/lib/components/code-mirror/code-mirror.strings.js:19 -msgid "" -"

\n" -" Enter inventory variables using either JSON or YAML\n" -" syntax. Use the radio button to toggle between the two.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" View YAML examples at\n" -" \n" -" docs.ansible.com\n" -"

" -msgstr "

\n" -" Saisir les variables d'inventaire en utilisant la syntaxe JSON ou YAML.\n" -" Utiliser le bouton radio pour basculer d'une syntaxe à l'autre.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" Exemples YAML\n" -" \n" -" docs.ansible.com\n" -"

" - -#: client/features/templates/templates.strings.js:65 -msgid "

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" -msgstr "

Transmettez des variables de ligne de commandes supplémentaires au playbook. Voici le paramètre de ligne de commande -e or --extra-vars pour ansible-playbook. Fournir la paire clé/valeur en utilisant YAML ou JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:213 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:222 -msgid "A NEW WEBHOOK KEY WILL BE GENERATED ON SAVE" -msgstr "UNE NOUVELLE CLÉ DE WEBHOOK SERA GÉNÉRÉE LORS DE LA SAUVEGARDE" - -#: client/src/projects/projects.form.js:138 -msgid "A refspec to fetch (passed to the Ansible git module). This parameter allows access to references via the branch field not otherwise available." -msgstr "Refspec à récupérer (passé au module git Ansible). Ce paramètre permet d'accéder aux références via le champ de branche non disponible par ailleurs." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 -#: client/src/scheduler/scheduler.strings.js:22 -msgid "A schedule name is required." -msgstr "Un intitulé est requis pour la programmation" - -#: client/src/users/add/users-add.controller.js:104 -msgid "A value is required" -msgstr "Entrez une valeur" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:173 -msgid "A value is required." -msgstr "Entrez une valeur." - -#: client/src/about/about.route.js:10 -msgid "ABOUT" -msgstr "À PROPOS" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:18 -msgid "ACTION" -msgstr "ACTION" - -#: client/src/activity-stream/activity-detail.form.js:23 -msgid "ACTIVITY DETAIL" -msgstr "DÉTAILS ACTIVITÉ" - -#: client/src/activity-stream/activitystream.route.js:28 -#: client/src/activity-stream/streams.list.js:14 -#: client/src/activity-stream/streams.list.js:15 -msgid "ACTIVITY STREAM" -msgstr "FLUX D’ACTIVITÉ" - -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:7 -msgid "ADD" -msgstr "AJOUTER" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:3 -msgid "ADD A NEW TEMPLATE" -msgstr "AJOUTER UN NOUVEAU MODÈLE" - -#: client/features/templates/templates.strings.js:123 -msgid "ADD A NODE" -msgstr "AJOUTER UN NŒUD" - -#: client/features/templates/templates.strings.js:141 -msgid "ADD LINK" -msgstr "AJOUTER LIEN" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:16 -msgid "ADD SURVEY PROMPT" -msgstr "AJOUTER UNE INVITE AU QUESTIONNAIRE" - -#: client/src/shared/smart-search/smart-search.partial.html:48 -msgid "ADDITIONAL INFORMATION" -msgstr "INFORMATIONS SUPPLÉMENTAIRES" - -#: client/features/output/output.strings.js:101 -msgid "ADDITIONAL_INFORMATION" -msgstr "INFORMATIONS_SUPPLÉMENTAIRES" - -#: client/src/organizations/linkout/organizations-linkout.route.js:241 -#: client/src/organizations/list/organizations-list.controller.js:90 -msgid "ADMINS" -msgstr "ADMINS" - -#: client/src/activity-stream/get-target-title.factory.js:4 -msgid "ALL ACTIVITY" -msgstr "ACTIVITÉS" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:44 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js:47 -msgid "ALL GROUPS" -msgstr "TOUS LES GROUPES" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "ANY" -msgstr "QUELCONQUE" - -#: client/src/credentials/credentials.form.js:198 -msgid "API Key" -msgstr "Clé API" - -#: client/src/notifications/notificationTemplates.form.js:263 -msgid "API Service/Integration Key" -msgstr "Service API/Clé d’intégration" - -#: client/src/notifications/shared/type-change.service.js:66 -msgid "API Token" -msgstr "Token API" - -#: client/src/notifications/notificationTemplates.form.js:348 -msgid "API URL" -msgstr "URL API" - -#: client/features/users/tokens/tokens.strings.js:40 -msgid "APPLICATION" -msgstr "APPLICATION" - -#: client/features/applications/applications.strings.js:23 -msgid "APPLICATION INFORMATION" -msgstr "INFORMATION APPLICATION" - -#: client/features/applications/applications.strings.js:28 -#: client/features/applications/applications.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:47 -msgid "APPLICATIONS" -msgstr "APPLICATIONS" - -#: client/lib/components/components.strings.js:126 -msgid "APPROVAL" -msgstr "APPROBATION" - -#: client/features/templates/templates.strings.js:155 -msgid "APPROVAL TIMED OUT" -msgstr "APPROBATION EXPIRÉE" - -#: client/lib/components/components.strings.js:128 -msgid "APPROVE" -msgstr "APPROUVER" - -#: client/features/templates/templates.strings.js:157 -msgid "APPROVED" -msgstr "APPROUVÉ" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js:19 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js:19 -msgid "ASSOCIATED GROUPS" -msgstr "GROUPES ASSOCIÉS" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js:19 -msgid "ASSOCIATED HOSTS" -msgstr "HÔTES ASSOCIÉS" - -#: client/lib/components/components.strings.js:89 -#: client/lib/components/layout/layout.partial.html:24 -msgid "About" -msgstr "À propos de " - -#: client/lib/components/components.strings.js:93 -msgid "Access" -msgstr "Accès" - -#: client/src/credentials/credentials.form.js:91 -msgid "Access Key" -msgstr "Clé d’accès" - -#: client/src/configuration/settings.service.js:40 -msgid "Access Token Expiration" -msgstr "Expiration du jeton d'accès" - -#: client/src/notifications/notificationTemplates.form.js:241 -msgid "Account SID" -msgstr "SID de compte" - -#: client/src/notifications/notificationTemplates.form.js:200 -msgid "Account Token" -msgstr "Token de compte" - -#: client/src/activity-stream/activity-detail.form.js:36 -msgid "Action" -msgstr "Action" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:21 -#: client/src/inventories-hosts/hosts/hosts.partial.html:49 -#: client/src/shared/form-generator.js:1872 -#: client/src/shared/list-generator/list-generator.factory.js:571 -msgid "Actions" -msgstr "Actions" - -#: client/features/templates/templates.strings.js:18 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:18 -#: client/src/templates/templates.list.js:36 -msgid "Activity" -msgstr "Activité" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:84 -msgid "Activity Stream" -msgstr "Flux d’activité" - -#: client/features/credentials/legacy.credentials.js:70 -#: client/src/credentials/credentials.form.js:446 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:113 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:110 -#: client/src/organizations/organizations.form.js:108 -#: client/src/organizations/organizations.form.js:150 -#: client/src/projects/projects.form.js:285 -#: client/src/teams/teams.form.js:169 -#: client/src/teams/teams.form.js:85 -#: client/src/templates/workflows.form.js:295 -#: client/src/users/users.form.js:221 -msgid "Add" -msgstr "Ajouter" - -#: client/src/instance-groups/instance-groups.strings.js:74 -msgid "Add Container Group" -msgstr "Ajouter un groupe de conteneurs" - -#: client/src/instance-groups/instance-groups.strings.js:75 -msgid "Add Credential" -msgstr "Ajouter une information d'identification" - -#: client/src/credentials/credentials.list.js:14 -msgid "Add Credentials" -msgstr "Ajouter des informations d’identification" - -#: client/src/inventories-hosts/inventories/inventory.list.js:13 -msgid "Add Inventories" -msgstr "Ajouter des inventaires" - -#: client/src/shared/stateDefinitions.factory.js:304 -msgid "Add Permissions" -msgstr "Ajouter les permissions" - -#: client/src/projects/projects.list.js:13 -msgid "Add Project" -msgstr "Ajouter un projet" - -#: client/src/shared/form-generator.js:1664 -#: client/src/templates/job_templates/job-template.form.js:596 -#: client/src/templates/workflows.form.js:351 -msgid "Add Survey" -msgstr "Ajouter un questionnaire" - -#: client/src/teams/teams.list.js:13 -msgid "Add Team" -msgstr "Ajouter une équipe" - -#: client/src/teams/teams.form.js:86 -msgid "Add User" -msgstr "Ajouter un utilisateur" - -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/shared/stateDefinitions.factory.js:594 -#: client/src/users/users.list.js:17 -msgid "Add Users" -msgstr "Ajouter des utilisateurs" - -#: client/src/organizations/organizations.form.js:109 -msgid "Add Users to this organization." -msgstr "Ajouter des utilisateurs à cette organisation." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:58 -msgid "Add a group" -msgstr "Ajouter un groupe" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:135 -msgid "Add a host" -msgstr "Ajouter un hôte" - -#: client/src/instance-groups/instance-groups.strings.js:44 -msgid "Add a new instance" -msgstr "Ajouter une nouvelle instance" - -#: client/src/instance-groups/instance-groups.strings.js:25 -msgid "Add a new instance group" -msgstr "Ajouter un nouveau groupe d'instances" - -#: client/src/organizations/list/organizations-list.partial.html:20 -msgid "Add a new organization" -msgstr "Ajouter une nouvelle organisation" - -#: client/features/projects/projects.strings.js:14 -msgid "Add a new project" -msgstr "Ajouter un nouveau projet" - -#: client/src/scheduler/schedules.list.js:81 -msgid "Add a new schedule" -msgstr "Ajouter une nouvelle programmation" - -#: client/features/templates/templates.strings.js:24 -msgid "Add a new template" -msgstr "Ajouter un nouveau modèle" - -#: client/features/users/tokens/tokens.strings.js:43 -msgid "Add a new token" -msgstr "Ajouter un nouveau jeton" - -#: client/features/credentials/legacy.credentials.js:71 -#: client/src/credentials/credentials.form.js:447 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:115 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:112 -#: client/src/organizations/organizations.form.js:151 -#: client/src/projects/projects.form.js:286 -#: client/src/templates/job_templates/job-template.form.js:541 -#: client/src/templates/workflows.form.js:296 -msgid "Add a permission" -msgstr "Ajouter une permission" - -#: client/src/organizations/linkout/organizations-linkout.route.js:63 -msgid "Add existing user to organization" -msgstr "Veuillez ajouter l'utilisateur existant à votre organisation" - -#: client/src/organizations/linkout/organizations-linkout.route.js:256 -msgid "Add existing user to organization as administrator" -msgstr "Veuillez ajouter l'utilisateur existant à votre organisation dans le rôle d'administrateur" - -#: client/src/shared/form-generator.js:1394 -msgid "Admin" -msgstr "Admin" - -#: client/lib/components/components.strings.js:94 -msgid "Administration" -msgstr "Administration" - -#: client/src/organizations/linkout/organizations-linkout.route.js:262 -msgid "Admins" -msgstr "Admins" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -msgid "After every project update where the SCM revision changes, refresh the inventory from the selected source before executing job tasks. This is intended for static content, like the Ansible inventory .ini file format." -msgstr "Chaque fois qu’un projet est mis à jour et que la révision SCM est modifiée, réalisez une mise à jour de la source sélectionnée avant de lancer la tâche. Le but est le contenu statique, comme le format .ini de fichier d'inventaire Ansible." - -#: client/features/templates/templates.strings.js:160 -#: client/lib/components/components.strings.js:105 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:41 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:49 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:72 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:80 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "All" -msgstr "Tous" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 -msgid "All Activity" -msgstr "Activités" - -#: client/features/portalMode/index.view.html:33 -msgid "All Jobs" -msgstr "Toutes les tâches" - -#: client/src/projects/projects.form.js:208 -#: client/src/projects/projects.form.js:211 -msgid "Allow branch override" -msgstr "Autoriser le remplacement de la branche" - -#: client/src/projects/projects.form.js:210 -msgid "Allow changing the SCM branch or revision in a job template that uses this project." -msgstr "Permet de modifier la branche ou la révision SCM dans un modèle de tâche qui utilise ce projet." - -#: client/features/templates/templates.strings.js:114 -#: client/src/workflow-results/workflow-results.controller.js:97 -msgid "Always" -msgstr "Toujours" - -#: client/features/projects/projects.strings.js:25 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "An SCM update does not appear to be running for project:" -msgstr "Une mise à jour SCM ne semble pas s'exécuter pour le projet :" - -#: client/lib/services/base-string.service.js:83 -msgid "Ansible AWX Logo" -msgstr "Logo d'Ansible AWX" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:66 -#: client/src/organizations/organizations.form.js:47 -#: client/src/organizations/organizations.form.js:52 -#: client/src/projects/projects.form.js:238 -#: client/src/projects/projects.form.js:243 -#: client/src/templates/job_templates/job-template.form.js:255 -#: client/src/templates/job_templates/job-template.form.js:261 -msgid "Ansible Environment" -msgstr "Environnement Ansible" - -#: client/src/projects/projects.form.js:145 -msgid "Ansible Tower Documentation" -msgstr "Documentation Ansible Tower" - -#: client/lib/services/base-string.service.js:84 -msgid "Ansible Tower Logo" -msgstr "Logo d'Ansible Tower" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:62 -#: client/src/templates/survey-maker/shared/question-definition.form.js:68 -msgid "Answer Type" -msgstr "Type de réponse" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:44 -#: client/src/templates/survey-maker/shared/question-definition.form.js:53 -msgid "Answer Variable Name" -msgstr "Nom de variable de réponse" - -#: client/features/templates/templates.strings.js:161 -msgid "Any" -msgstr "Quelconque" - -#: client/features/users/tokens/users-tokens-add.controller.js:15 -msgid "Application" -msgstr "Application" - -#: client/lib/components/components.strings.js:87 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 -msgid "Applications" -msgstr "Applications" - -#: client/features/templates/templates.strings.js:153 -#: client/src/notifications/notifications.list.js:40 -msgid "Approval" -msgstr "Approbation" - -#: client/src/workflow-results/workflow-results.service.js:87 -msgid "Are you sure you want to cancel this workflow job?" -msgstr "Êtes-vous certain de vouloir annuler ce job de flux de travail ?" - -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:110 -msgid "Are you sure you want to delete this job?" -msgstr "Êtes-vous sûr de vouloir supprimer ce job ?" - -#: client/src/notifications/notification-templates-list/list.controller.js:233 -msgid "Are you sure you want to delete this notification template?" -msgstr "Voulez-vous vraiment supprimer ce modèle de notification ?" - -#: client/src/scheduler/factories/delete-schedule.factory.js:58 -msgid "Are you sure you want to delete this schedule?" -msgstr "Voulez-vous vraiment supprimer ce planning ?" - -#: client/src/teams/list/teams-list.controller.js:80 -msgid "Are you sure you want to delete this team?" -msgstr "Voulez-vous vraiment supprimer cette équipe ?" - -#: client/src/users/list/users-list.controller.js:93 -msgid "Are you sure you want to delete this user?" -msgstr "Voulez-vous vraiment supprimer cet utilisateur ?" - -#: client/features/templates/templates.strings.js:110 -msgid "Are you sure you want to delete this workflow node?" -msgstr "Voulez-vous vraiment supprimer ce node de workflow ?" - -#: client/src/workflow-results/workflow-results.service.js:42 -msgid "Are you sure you want to delete this workflow?" -msgstr "Voulez-vous vraiment supprimer ce flux de travail ?" - -#: client/lib/services/base-string.service.js:92 -msgid "Are you sure you want to delete this {{ resourceType }}?" -msgstr "Voulez-vous vraiment supprimer ce {{ resourceType }} ?" - -#: client/src/partials/survey-maker-modal.html:13 -msgid "Are you sure you want to delete this {{deleteMode}}?" -msgstr "Êtes-vous certain de vouloir supprimer ce {{deleteMode}}?" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:26 -msgid "Are you sure you want to disassociate the group below from" -msgstr "Voulez-vous vraiment supprimer le groupe ci-dessous de" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:24 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:27 -msgid "Are you sure you want to disassociate the host below from" -msgstr "Voulez-vous vraiment supprimer l'hôte ci-dessous de" - -#: client/features/templates/templates.strings.js:149 -msgid "Are you sure you want to exit the Workflow Creator without saving your changes?" -msgstr "Voulez-vous vraiment quitter le Workflow Creator sans enregistrer vos modifications ?" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:46 -msgid "Are you sure you want to permanently delete the group below from the inventory?" -msgstr "Voulez-vous vraiment supprimer définitivement le groupe ci-dessous de l'inventaire ?" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:104 -msgid "Are you sure you want to permanently delete the host below from the inventory?" -msgstr "Voulez-vous vraiment supprimer définitivement l'hôte ci-dessous de l'inventaire ?" - -#: client/src/projects/edit/projects-edit.controller.js:242 -msgid "Are you sure you want to remove the %s below from %s?" -msgstr "Voulez-vous vraimment supprimer le %s ci-dessous de %s ?" - -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:67 -msgid "Are you sure you want to remove the following administrator from this organization?" -msgstr "Êtes-vous sûr de vouloir supprimer l'administrateur suivant de votre organisation ?" - -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:66 -msgid "Are you sure you want to remove the following user from this organization?" -msgstr "Êtes-vous sûr de vouloir supprimer l''utilisateur suivant de votre organisation ?" - -#: client/lib/services/base-string.service.js:109 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:109 -msgid "Are you sure you want to submit the request to cancel this job?" -msgstr "Voulez-vous vraiment demander l'annulation de ce job ?" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:39 -msgid "Arguments" -msgstr "Arguments" - -#: client/features/output/output.strings.js:59 -msgid "Artifacts" -msgstr "Artefacts" - -#: client/src/credentials/credentials.form.js:232 -#: client/src/credentials/credentials.form.js:271 -#: client/src/credentials/credentials.form.js:310 -#: client/src/credentials/credentials.form.js:396 -msgid "Ask at runtime?" -msgstr "Demander durant l’éxecution ?" - -#: client/src/instance-groups/instance-groups.strings.js:36 -msgid "Associate an existing Instance" -msgstr "Associer une instance existante" - -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:74 -msgid "Associate an existing group" -msgstr "Associer un groupe existant" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:56 -msgid "Associate this host with a new group" -msgstr "Associer cet hôte à un nouveau groupe" - -#: client/src/shared/form-generator.js:1396 -msgid "Auditor" -msgstr "Auditeur" - -#: client/lib/components/components.strings.js:95 -#: client/src/configuration/settings.partial.html:2 -msgid "Authentication" -msgstr "Authentification" - -#: client/src/credentials/credentials.form.js:72 -msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." -msgstr "Authentification pour l’accès aux périphériques réseau. Il peut s’agir de clés SSH, de noms d’utilisateur, de mots de passe et d’informations d’autorisation. Les informations d’identification réseau sont utilisées au cours de l’envoi de tâches afin d’exécuter des playbooks sur des périphériques réseau." - -#: client/src/credentials/credentials.form.js:68 -msgid "Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts." -msgstr "Authentification pour l’accès aux machines distantes. Il peut s’agir de clés SSH, de noms d’utilisateur, de mots de passe et d’informations sudo. Les informations d’identification de machine sont utilisées au cours de l’envoi de tâches afin d’exécuter des playbooks sur des hôtes distants." - -#: client/src/configuration/settings.service.js:48 -msgid "Authorization Code Expiration" -msgstr "Expiration du code d'autorisation" - -#: client/src/credentials/credentials.form.js:342 -msgid "Authorize" -msgstr "Autoriser" - -#: client/src/credentials/credentials.form.js:350 -msgid "Authorize Password" -msgstr "Mot de passe d’autorisation" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:241 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:253 -msgid "Availability Zone:" -msgstr "Zone de disponibilité :" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:91 -msgid "Azure AD" -msgstr "Azure AD" - -#: client/src/shared/directives.js:91 -msgid "BROWSE" -msgstr "NAVIGUER" - -#: client/features/output/output.strings.js:124 -msgid "Back to Top" -msgstr "Retour Haut de page" - -#: client/src/projects/projects.form.js:82 -msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." -msgstr "Chemin de base utilisé pour localiser les playbooks. Les répertoires localisés dans ce chemin sont répertoriés dans la liste déroulante des répertoires de playbooks. Le chemin de base et le répertoire de playbook sélectionnés fournissent ensemble le chemin complet servant à localiser les playbooks." - -#: client/src/notifications/shared/type-change.service.js:56 -msgid "Basic Auth Password" -msgstr "Mot de passe d'authentification de base" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:129 -msgid "Become Privilege Escalation" -msgstr "Activer l’élévation des privilèges" - -#: client/features/output/output.strings.js:87 -msgid "Branch" -msgstr "Branche" - -#: client/src/projects/projects.form.js:129 -msgid "Branch to checkout. In addition to branches, you can input tags, commit hashes, and arbitrary refs. Some commit hashes and refs may not be availble unless you also provide a custom refspec." -msgstr "Branche à extraire. En plus des branches, vous pouvez saisir des balises, des hachages de validation et des références arbitraires. Certains hachages et références de validation peuvent ne pas être disponibles à moins que vous ne fournissiez également une refspec personnalisée." - -#: client/features/templates/templates.strings.js:72 -#: client/src/templates/job_templates/job-template.form.js:112 -msgid "Branch to use in job run. Project default used if blank." -msgstr "Branche à utiliser lors de l’exécution du projet. Le projet par défaut est utilisé si vide." - -#: client/src/license/license.partial.html:113 -msgid "Browse" -msgstr "Parcourir" - -#: client/src/license/license.partial.html:180 -msgid "By default, Tower collects and transmits analytics data on Tower usage to Red Hat. There are two categories of data collected by Tower. For more information, see this Tower documentation page. Uncheck the following boxes to disable this feature." -msgstr "Par défaut, Tower collecte et transmet des données analytiques sur l'utilisation de Tower dans Red Hat. Deux catégories de données sont recueillies par Tower. Pour plus d'informations, voir cette page de documentation Tower. Décochez ces cases pour désactiver cette fonctionnalité." - -#: client/features/templates/templates.strings.js:151 -#: client/lib/services/base-string.service.js:61 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:29 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:50 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:23 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:16 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:16 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:16 -#: client/src/license/license.partial.html:259 -#: client/src/partials/survey-maker-modal.html:17 -#: client/src/partials/survey-maker-modal.html:82 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:17 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:131 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:180 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:68 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:149 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:188 -msgid "CANCEL" -msgstr "ANNULER" - -#: client/index.template.ejs:116 -msgid "CAUTION: Setting both numerical variables to \"0\" will delete all facts." -msgstr "ATTENTION : en définissant les deux variables numériques à \"0\", vous allez effacer tous les faits." - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:30 -msgid "CHANGES" -msgstr "MODIFICATIONS" - -#: client/features/templates/templates.strings.js:131 -msgid "CHECK" -msgstr "VÉRIFIER" - -#: client/lib/components/components.strings.js:20 -msgid "CHOOSE A FILE" -msgstr "SÉLECTIONNER UN FICHIER" - -#: client/features/output/output.strings.js:103 -#: client/src/shared/smart-search/smart-search.partial.html:26 -msgid "CLEAR ALL" -msgstr "TOUT EFFACER" - -#: client/features/applications/applications.strings.js:21 -msgid "CLIENT ID" -msgstr "ID CLIENT" - -#: client/features/applications/applications.strings.js:22 -msgid "CLIENT SECRET" -msgstr "SECRET CLIENT" - -#: client/lib/services/base-string.service.js:62 -#: client/lib/services/base-string.service.js:77 -#: client/src/partials/survey-maker-modal.html:83 -msgid "CLOSE" -msgstr "FERMER" - -#: client/features/jobs/routes/hostCompletedJobs.route.js:27 -#: client/features/jobs/routes/templateCompletedJobs.route.js:28 -#: client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js:28 -msgid "COMPLETED JOBS" -msgstr "JOBS TERMINÉS" - -#: client/features/templates/templates.strings.js:35 -#: client/src/scheduler/scheduler.strings.js:68 -msgid "CONFIRM" -msgstr "CONFIRMER" - -#: client/lib/services/base-string.service.js:75 -msgid "COPY" -msgstr "COPIER" - -#: client/features/users/tokens/tokens.strings.js:25 -msgid "COULD NOT CREATE TOKEN" -msgstr "N'A PAS PU CRÉER DE JETON" - -#: client/src/instance-groups/instance-groups.strings.js:54 -msgid "CPU" -msgstr "CPU" - -#: client/src/shared/stateDefinitions.factory.js:161 -msgid "CREATE %s" -msgstr "CRÉER %s" - -#: client/features/applications/applications.strings.js:9 -msgid "CREATE APPLICATION" -msgstr "CRÉER UNE APPLICATION" - -#: client/src/instance-groups/instance-groups.strings.js:13 -msgid "CREATE CONTAINER GROUP" -msgstr "CRÉER UN GROUPE DE CONTENEURS" - -#: client/features/credentials/credentials.strings.js:8 -#: client/src/credentials/credentials.form.js:16 -msgid "CREATE CREDENTIAL" -msgstr "CRÉER IDENTIFIANTS" - -#: client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:16 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:16 -msgid "CREATE GROUP" -msgstr "CRÉER UN GROUPE" - -#: client/src/inventories-hosts/hosts/host.form.js:17 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:17 -#: client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:17 -msgid "CREATE HOST" -msgstr "CRÉER HOTE" - -#: client/src/instance-groups/instance-groups.strings.js:12 -msgid "CREATE INSTANCE GROUP" -msgstr "CRÉER UN GROUPE D'INSTANCES" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:8 -msgid "CREATE INVENTORY SOURCE" -msgstr "CRÉER UNE SOURCE D'INVENTAIRE" - -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js:9 -#: client/src/scheduler/scheduler.strings.js:8 -#: client/src/scheduler/schedules.route.js:161 -#: client/src/scheduler/schedules.route.js:242 -#: client/src/scheduler/schedules.route.js:73 -msgid "CREATE SCHEDULE" -msgstr "CRÉER UNE PROGRAMMATION" - -#: client/src/management-jobs/scheduler/main.js:83 -msgid "CREATE SCHEDULED JOB" -msgstr "CRÉER UNE TÂCHE PROGRAMMÉE" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:18 -msgid "CREATE SOURCE" -msgstr "CRÉER UNE SOURCE" - -#: client/features/users/tokens/tokens.strings.js:18 -#: client/features/users/tokens/tokens.strings.js:9 -#: client/features/users/tokens/users-tokens-add.route.js:49 -msgid "CREATE TOKEN" -msgstr "CRÉER JETON" - -#: client/features/output/output.strings.js:128 -msgid "CREATED" -msgstr "CRÉÉ" - -#: client/features/credentials/credentials.strings.js:31 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:150 -msgid "CREDENTIAL" -msgstr "INFORMATIONS D’IDENTIFICATION" - -#: client/src/credential-types/credential-types.form.js:21 -msgid "CREDENTIAL TYPE" -msgstr "TYPE D'INFORMATIONS D'IDENTIFICATION" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:60 -msgid "CREDENTIAL TYPE:" -msgstr "TYPE D'INFORMATIONS D'IDENTIFICATION :" - -#: client/src/activity-stream/get-target-title.factory.js:11 -#: client/src/credential-types/credential-types.list.js:12 -#: client/src/credential-types/main.js:44 -msgid "CREDENTIAL TYPES" -msgstr "TYPES D'INFORMATIONS D'IDENTIFICATION" - -#: client/features/credentials/legacy.credentials.js:11 -#: client/src/activity-stream/get-target-title.factory.js:17 -#: client/src/credentials/credentials.list.js:15 -#: client/src/credentials/credentials.list.js:16 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:5 -msgid "CREDENTIALS" -msgstr "INFORMATIONS D’IDENTIFICATION" - -#: client/features/credentials/credentials.strings.js:49 -msgid "CREDENTIALS PERMISSIONS" -msgstr "PERMISSIONS LIÉES AUX INFORMATIONS D'IDENTIFICATION" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:408 -#: client/src/projects/projects.form.js:231 -msgid "Cache Timeout" -msgstr "Expiration du délai d’attente du cache" - -#: client/src/projects/projects.form.js:220 -msgid "Cache Timeout%s (seconds)%s" -msgstr "Expiration du délai d’attente du cache%s (secondes)%s" - -#: client/src/users/list/users-list.controller.js:85 -msgid "Call to %s failed. DELETE returned status:" -msgstr "Échec de l’appel de %s. État DELETE renvoyé :" - -#: client/src/projects/edit/projects-edit.controller.js:236 -msgid "Call to %s failed. POST returned status:" -msgstr "Échec de l’appel de %s. État POST renvoyé :" - -#: client/src/management-jobs/card/card.controller.js:29 -msgid "Call to %s failed. Return status: %d" -msgstr "Échec de l’appel de %s. État du renvoi : %d" - -#: client/lib/services/base-string.service.js:116 -msgid "Call to {{ path }} failed. {{ action }} returned status: {{ status }}." -msgstr "La connexion à {{ path }} a échoué. {{ action }} statut renvoyé : {{ status }}." - -#: client/features/output/output.strings.js:18 -#: client/lib/services/base-string.service.js:108 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:187 -#: client/src/configuration/forms/settings-form.controller.js:473 -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:24 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:624 -#: client/src/scheduler/scheduler.strings.js:56 -#: client/src/shared/form-generator.js:1652 -#: client/src/shared/lookup/lookup-modal.partial.html:19 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:33 -#: client/src/workflow-results/workflow-results.controller.js:56 -msgid "Cancel" -msgstr "Annuler" - -#: client/features/output/output.strings.js:54 -#: client/lib/services/base-string.service.js:110 -msgid "Cancel Job" -msgstr "Annuler la tâche" - -#: client/features/projects/projects.strings.js:31 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Cancel Not Allowed" -msgstr "Annulation non autorisée" - -#: client/src/workflow-results/workflow-results.service.js:84 -msgid "Cancel Workflow" -msgstr "Annuler le flux de travail" - -#: client/src/workflow-results/workflow-results.partial.html:39 -msgid "Cancel job" -msgstr "Annuler la tâche" - -#: client/src/license/license.strings.js:8 -msgid "Cancel license lookup" -msgstr "Annuler la recherche de licence" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:104 -msgid "Cancel sync process" -msgstr "Annuler le processus de synchronisation" - -#: client/src/projects/projects.list.js:128 -msgid "Cancel the SCM update" -msgstr "Annuler la mise à jour SCM" - -#: client/lib/services/base-string.service.js:122 -msgid "Cancel the {{resourceType}}" -msgstr "Annuler {{resourceType}}" - -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:34 -msgid "Cancel unsaved changes" -msgstr "Annuler les modifications non enregistrées" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:32 -msgid "Canceled. Click for details" -msgstr "Annulé. Cliquez pour connaître les détails." - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Cannot find job." -msgstr "Impossible de trouver le job." - -#: client/src/shared/smart-search/smart-search.controller.js:167 -msgid "Cannot search running job" -msgstr "Impossible de rechercher les tâches en cours" - -#: client/src/instance-groups/instance-groups.list.js:22 -msgid "Capacity" -msgstr "Capacité" - -#: client/lib/services/base-string.service.js:154 -msgid "Capacity (Ascending)" -msgstr "Capacité (croissant)" - -#: client/lib/services/base-string.service.js:155 -msgid "Capacity (Descending)" -msgstr "Capacité (décroissant)" - -#: client/src/projects/projects.form.js:84 -msgid "Change %s when deploying {{BRAND_NAME}} to change this location." -msgstr "Modifiez %s lorsque vous déployez {{BRAND_NAME}} pour changer cet emplacement." - -#: client/src/activity-stream/activity-detail.form.js:41 -msgid "Changes" -msgstr "Modifications" - -#: client/src/notifications/notificationTemplates.form.js:460 -msgid "Channel" -msgstr "Canal" - -#: client/features/templates/templates.strings.js:73 -msgid "Check" -msgstr "Vérifier" - -#: client/src/shared/form-generator.js:1046 -msgid "Choose a %s" -msgstr "Choisir un %s" - -#: client/src/templates/job_templates/job-template.form.js:407 -#: client/src/templates/workflows.form.js:180 -msgid "Choose a Webhook Service" -msgstr "Choisir un service de webhook" - -#: client/features/templates/templates.strings.js:62 -msgid "Choose a job type" -msgstr "Choisir un type de job" - -#: client/src/templates/job_templates/job-template.form.js:125 -msgid "Choose a playbook" -msgstr "Choisir un playbook" - -#: client/features/templates/templates.strings.js:63 -msgid "Choose a verbosity" -msgstr "Sélectionnez une verbosité" - -#: client/src/projects/projects.form.js:60 -msgid "Choose an SCM Type" -msgstr "Choisir un type de SCM" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:64 -msgid "Choose an answer type" -msgstr "Choisissez un type de réponse" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:67 -msgid "Choose an answer type or format you want as the prompt for the user. Refer to the Ansible Tower Documentation for more additional information about each option." -msgstr "Spécifiez le type de format ou de type de réponse que vous souhaitez pour interroger l'utilisateur. Consultez la documentation d’Ansible Tower pour en savoir plus sur chaque option." - -#: client/src/notifications/notificationTemplates.form.js:560 -msgid "Choose an email option" -msgstr "Choisir une option d'email" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:111 -msgid "Choose an inventory file" -msgstr "Sélectionner un fichier d'inventaire" - -#: client/src/shared/directives.js:92 -msgid "Choose file" -msgstr "Choisir un fichier" - -#: client/src/license/license.partial.html:104 -msgid "Choose your license file, agree to the End User License Agreement, and click submit." -msgstr "Choisissez votre fichier de licence, acceptez le Contrat de licence de l’utilisateur final et validez." - -#: client/src/projects/projects.form.js:176 -msgid "Clean" -msgstr "Nettoyer" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:299 -msgid "Clear" -msgstr "Effacer" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:64 -msgid "Click for details" -msgstr "Cliquez pour obtenir plus d’informations" - -#: client/src/shared/list-generator/list-actions.partial.html:59 -#: client/src/shared/list-generator/list-actions.partial.html:66 -msgid "Click for help" -msgstr "Cliquez pour obtenir de l'aide" - -#: client/features/templates/templates.strings.js:15 -msgid "Click here to open the workflow visualizer" -msgstr "Cliquez ici pour ouvrir le visualisateur de flux de travail" - -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:477 -msgid "Click here to open the workflow visualizer." -msgstr "Cliquez ici pour ouvrir le visualisateur de workflow." - -#: client/src/inventories-hosts/inventories/inventory.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new inventory." -msgstr "Cliquez sur une ligne pour la sélectionner, puis sur Terminé lorsque vous avez fini. Cliquez sur le bouton %s pour créer un inventaire." - -#: client/src/teams/teams.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new team." -msgstr "Cliquez sur une ligne pour la sélectionner, puis sur Terminé lorsque vous avez fini. Cliquez sur le bouton %s pour créer une équipe." - -#: client/src/templates/templates.list.js:17 -msgid "Click on a row to select it, and click Finished when done. Use the %s button to create a new job template." -msgstr "Cliquez sur une ligne pour la sélectionner, puis sur Terminé lorsque vous avez fini. Cliquez sur le bouton %s pour créer un modèle de tâche." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:137 -msgid "Click on the regions field to see a list of regions for your cloud provider. You can select multiple regions, or choose" -msgstr "Cliquez sur le champ régions pour voir la liste des régions associées à votre fournisseur cloud. Vous pouvez choisir plusieurs régions ou l'option" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Click the" -msgstr "Cliquer" - -#: client/features/templates/templates.strings.js:128 -msgid "Click to edit link" -msgstr "Cliquez pour modifier le lien" - -#: client/src/scheduler/scheduler.strings.js:13 -msgid "Click to edit schedule." -msgstr "Cliquez pour modifier le planning." - -#: client/features/templates/templates.strings.js:129 -msgid "Click to view link" -msgstr "Cliquez pour afficher le lien" - -#: client/src/credentials/credentials.form.js:320 -msgid "Client ID" -msgstr "ID du client" - -#: client/src/notifications/notificationTemplates.form.js:274 -msgid "Client Identifier" -msgstr "Identifiant client" - -#: client/src/credentials/credentials.form.js:329 -msgid "Client Secret" -msgstr "Question secrète du client" - -#: client/lib/components/code-mirror/modal/code-mirror-modal.partial.html:67 -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:92 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:618 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:7 -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:11 -#: client/src/partials/survey-maker-modal.html:28 -#: client/src/partials/survey-maker-modal.html:7 -#: client/src/scheduler/scheduler.strings.js:55 -#: client/src/scheduler/schedulerForm.partial.html:7 -#: client/src/shared/form-generator.js:1656 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:8 -#: client/src/shared/lookup/lookup-modal.partial.html:9 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:10 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:11 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:61 -msgid "Close" -msgstr "Fermer" - -#: client/lib/components/components.strings.js:135 -msgid "Close Approvals" -msgstr "Fermer les approbations" - -#: client/features/output/output.strings.js:136 -msgid "Close host event modal" -msgstr "Fermer la fenêtre modale de l'événement hôte" - -#: client/lib/components/code-mirror/code-mirror.strings.js:7 -msgid "Close variables modal" -msgstr "Fermer la fenêtre modale de variables" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:26 -msgid "Cloud source not configured." -msgstr "Source cloud non configurée." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "Cloud source not configured. Click" -msgstr "Source cloud non configurée. Cliquez sur" - -#: client/src/credentials/factories/become-method-change.factory.js:80 -#: client/src/credentials/factories/kind-change.factory.js:136 -msgid "CloudForms URL" -msgstr "URL CloudForms" - -#: client/features/output/output.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:201 -msgid "Collapse Output" -msgstr "Tout réduire" - -#: client/lib/components/components.strings.js:120 -msgid "Compact" -msgstr "Compact" - -#: client/src/inventories-hosts/hosts/host.form.js:125 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:135 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:155 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:168 -#: client/src/templates/job_templates/job-template.form.js:573 -#: client/src/templates/workflows.form.js:328 -msgid "Completed Jobs" -msgstr "Tâches terminées" - -#: client/src/management-jobs/card/card.partial.html:34 -#: client/src/management-jobs/card/card.partial.html:37 -msgid "Configure Notifications" -msgstr "Configurer les notifications" - -#: client/src/users/users.form.js:82 -msgid "Confirm Password" -msgstr "Confirmer le mot de passe" - -#: client/src/configuration/forms/settings-form.controller.js:480 -msgid "Confirm Reset" -msgstr "Confirmer la réinitialisation" - -#: client/src/configuration/forms/settings-form.controller.js:489 -msgid "Confirm factory reset" -msgstr "Confirmer la réinitialisation usine" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "Confirm the removal of the" -msgstr "Confirmer la suppression du" - -#: client/src/teams/teams.form.js:24 -#: client/src/users/users.form.js:25 -msgid "Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams." -msgstr "Contactez votre administrateur de systèmes pour qu'il vous octroie les permissions dont vous aurez besoin afin d'ajouter et de modifier les Utilisateurs et les Équipes." - -#: client/features/output/output.strings.js:68 -#: client/src/instance-groups/instance-groups.strings.js:78 -msgid "Container Group" -msgstr "Groupe de conteneurs" - -#: client/src/instance-groups/instance-groups.strings.js:38 -msgid "Container Groups Help" -msgstr "Aide sur les groupes de conteneurs" - -#: client/lib/components/components.strings.js:130 -msgid "Continue workflow job?" -msgstr "Continuer la tâche de workflow ?" - -#: client/features/templates/templates.strings.js:61 -#: client/src/templates/job_templates/job-template.form.js:195 -msgid "Control the level of output ansible will produce as the playbook executes." -msgstr "Contrôlez le niveau de sortie qu’Ansible génère lors de l’exécution du playbook." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:336 -msgid "Control the level of output ansible will produce for inventory source update jobs." -msgstr "Contrôlez le niveau de sortie produit par Ansible pour les tâches d'actualisation de source d'inventaire." - -#: client/features/templates/templates.strings.js:159 -msgid "Convergence" -msgstr "Convergence" - -#: client/lib/components/components.strings.js:54 -msgid "Copied to clipboard." -msgstr "Copié dans le Presse-papiers." - -#: client/src/credentials/credentials.list.js:73 -#: client/src/inventories-hosts/inventories/inventory.list.js:109 -#: client/src/inventory-scripts/inventory-scripts.list.js:61 -#: client/src/notifications/notificationTemplates.list.js:87 -#: client/src/projects/projects.list.js:106 -#: client/src/templates/templates.list.js:93 -msgid "Copy" -msgstr "Copier" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:55 -msgid "Copy Inventory" -msgstr "Copier l'inventaire" - -#: client/src/credentials/credentials.list.js:76 -msgid "Copy credential" -msgstr "Copier les identifiants" - -#: client/lib/components/components.strings.js:53 -msgid "Copy full revision to clipboard." -msgstr "Copier la révision complète dans le Presse-papiers." - -#: client/src/inventory-scripts/inventory-scripts.list.js:64 -msgid "Copy inventory script" -msgstr "Copier le script d’inventaire" - -#: client/src/notifications/notificationTemplates.list.js:90 -msgid "Copy notification" -msgstr "Copier la notification" - -#: client/src/projects/projects.list.js:109 -msgid "Copy project" -msgstr "Copier le projet" - -#: client/src/templates/templates.list.js:96 -msgid "Copy template" -msgstr "Copier le modèle" - -#: client/lib/services/base-string.service.js:120 -msgid "Copy {{resourceType}}" -msgstr "Copier {{resourceType}}" - -#: client/src/about/about.partial.html:31 -msgid "" -"Copyright © 2019 Red Hat, Inc.
\n" -" Visit Ansible.com for more information.
" -msgstr "Copyright © 2019 Red Hat, Inc.
\n" -" Consulter Ansible.com pour plus d'informations.
" - -#: client/lib/components/components.strings.js:90 -msgid "Copyright © 2019 Red Hat, Inc." -msgstr "Copyright © 2019 Red Hat, Inc." - -#: client/src/workflow-results/workflow-results.service.js:78 -msgid "Could not cancel workflow. Returned status:" -msgstr "N'a pas pu annuler le flux de travail. Statut retour :" - -#: client/src/workflow-results/workflow-results.service.js:58 -msgid "Could not delete job. Returned status:" -msgstr "N'a pas pu effacer ce job. Statut retour :" - -#: client/src/users/users.list.js:44 -msgid "Create New" -msgstr "Créer" - -#: client/features/applications/applications.strings.js:32 -msgid "Create a new Application" -msgstr "Créer une nouvelle application" - -#: client/src/instance-groups/instance-groups.strings.js:35 -msgid "Create a new Instance Group" -msgstr "Créer un nouveau groupe d'instances" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:48 -msgid "Create a new Smart Inventory from search results.

Note: changing the organization of the Smart Inventory could change the hosts included in the Smart Inventory." -msgstr "Créer un nouvel Inventaire Smart à partir des résultats de recherche.

À noter : changer l'organisation de l'Inventaire Smart pourrait changer les hôtes inclus dans l'Inventaire Smart." - -#: client/src/credentials/credentials.list.js:52 -msgid "Create a new credential" -msgstr "Créer de nouvelles informations d’identification" - -#: client/src/credential-types/credential-types.list.js:42 -msgid "Create a new credential type" -msgstr "Créer un nouveau type d'informations d'identification." - -#: client/src/inventory-scripts/inventory-scripts.list.js:40 -msgid "Create a new custom inventory" -msgstr "Créer un inventaire personnalisé" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:75 -msgid "Create a new group" -msgstr "Créer un groupe" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:139 -msgid "Create a new host" -msgstr "Créer un hôte" - -#: client/src/inventories-hosts/inventories/inventory.list.js:80 -msgid "Create a new inventory" -msgstr "Créer un inventaire" - -#: client/src/notifications/notificationTemplates.list.js:57 -msgid "Create a new notification template" -msgstr "Créer un modèle de notification" - -#: client/src/organizations/list/organizations-list.partial.html:22 -msgid "Create a new organization" -msgstr "Créer une organisation" - -#: client/src/projects/projects.list.js:81 -msgid "Create a new project" -msgstr "Créer un projet" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:72 -msgid "Create a new source" -msgstr "Créer une source" - -#: client/src/teams/teams.list.js:43 -msgid "Create a new team" -msgstr "Créer une équipe" - -#: client/src/templates/templates.list.js:56 -msgid "Create a new template" -msgstr "Créer un modèle" - -#: client/src/users/users.list.js:48 -msgid "Create a new user" -msgstr "Créer un utilisateur" - -#: client/lib/services/base-string.service.js:128 -msgid "Created (Ascending)" -msgstr "Créé (croissant)" - -#: client/lib/services/base-string.service.js:129 -msgid "Created (Descending)" -msgstr "Créé (décroissant)" - -#: client/features/output/output.strings.js:60 -#: client/features/templates/templates.strings.js:29 -#: client/src/instance-groups/container-groups/add-container-group.controller.js:24 -#: client/src/instance-groups/container-groups/edit-container-group.controller.js:38 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:73 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:73 -#: client/src/projects/add/projects-add.controller.js:140 -#: client/src/projects/add/projects-add.controller.js:153 -#: client/src/projects/add/projects-add.controller.js:162 -#: client/src/projects/add/projects-add.controller.js:181 -#: client/src/projects/edit/projects-edit.controller.js:263 -#: client/src/projects/edit/projects-edit.controller.js:274 -#: client/src/projects/edit/projects-edit.controller.js:283 -#: client/src/projects/edit/projects-edit.controller.js:302 -msgid "Credential" -msgstr "Information d’identification" - -#: client/features/templates/templates.strings.js:40 -msgid "Credential Type" -msgstr "Type d'informations d’identification" - -#: client/lib/components/components.strings.js:76 -#: client/lib/models/models.strings.js:12 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 -msgid "Credential Types" -msgstr "Types d'informations d'identification" - -#: client/src/instance-groups/instance-groups.strings.js:80 -msgid "Credential to authenticate with Kubernetes or OpenShift.  Must be of type \"Kubernetes/OpenShift API Bearer Token”." -msgstr "Informations d’identification pour s'authentifier auprès de Kubernetes ou OpenShift. Doit être de type \"Kubernetes/OpenShift API Bearer Token\"." - -#: client/features/jobs/jobs.strings.js:16 -#: client/features/templates/templates.strings.js:21 -#: client/lib/components/components.strings.js:75 -#: client/lib/models/models.strings.js:8 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:128 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:58 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 -#: client/src/templates/job_templates/job-template.form.js:140 -#: client/src/templates/job_templates/job-template.form.js:152 -msgid "Credentials" -msgstr "Informations d’identification" - -#: client/features/templates/templates.strings.js:41 -msgid "Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:" -msgstr "Les identifiants nécessitant des mots de passe au lancement ne sont pas autorisés pour les modèles de planning et les nodes de workflow. Les identifiants suivants doivent être retirés ou remplacés pour continuer :" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:17 -msgid "Critical" -msgstr "Critique" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:12 -msgid "Critical Risk" -msgstr "Risque critique" - -#: client/src/shared/directives.js:93 -msgid "Current Image:" -msgstr "Image actuelle :" - -#: client/features/output/output.strings.js:40 -msgid "Currently following output as it arrives. Click to unfollow" -msgstr "Suit actuellement les résultats au fur et à mesure qu'ils arrivent. Cliquez pour vous désinscrire " - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:170 -msgid "Custom Inventory Script" -msgstr "Script d'inventaire personnalisé" - -#: client/lib/services/base-string.service.js:85 -msgid "Custom Logo" -msgstr "Logo personnalisé" - -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 -msgid "Custom Script" -msgstr "Script personnalisé" - -#: client/src/instance-groups/instance-groups.strings.js:79 -msgid "Customize Pod Spec" -msgstr "Personnaliser les spécifications du pod" - -#: client/src/notifications/notificationTemplates.form.js:577 -msgid "Customize messages…" -msgstr "Personnaliser les messages..." - -#: client/src/home/home.route.js:16 -msgid "DASHBOARD" -msgstr "TABLEAU DE BORD" - -#: client/features/users/tokens/tokens.strings.js:28 -#: client/lib/services/base-string.service.js:74 -#: client/src/credential-types/list/list.controller.js:110 -#: client/src/credentials/list/credentials-list.controller.js:155 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:160 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:51 -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:131 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:184 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:24 -#: client/src/inventory-scripts/list/list.controller.js:130 -#: client/src/notifications/notification-templates-list/list.controller.js:235 -#: client/src/organizations/edit/organizations-edit.controller.js:164 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:69 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:68 -#: client/src/organizations/list/organizations-list.controller.js:202 -#: client/src/partials/survey-maker-modal.html:18 -#: client/src/projects/edit/projects-edit.controller.js:244 -#: client/src/scheduler/factories/delete-schedule.factory.js:60 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -#: client/src/teams/list/teams-list.controller.js:82 -#: client/src/users/list/users-list.controller.js:95 -#: client/src/workflow-results/workflow-results.service.js:62 -msgid "DELETE" -msgstr "SUPPRIMER" - -#: client/src/partials/survey-maker-modal.html:81 -msgid "DELETE SURVEY" -msgstr "SUPPRIMER QUESTIONNAIRE" - -#: client/features/templates/templates.strings.js:133 -msgid "DELETED" -msgstr "SUPPRIMÉ" - -#: client/features/templates/templates.strings.js:158 -msgid "DENIED" -msgstr "REFUSÉ" - -#: client/lib/components/components.strings.js:129 -msgid "DENY" -msgstr "REFUSER" - -#: client/features/projects/projects.strings.js:9 -#: client/features/users/tokens/tokens.strings.js:36 -msgid "DESCRIPTION" -msgstr "DESCRIPTION" - -#: client/features/templates/templates.strings.js:135 -#: client/src/instance-groups/instance-groups.strings.js:29 -#: client/src/workflow-results/workflow-results.controller.js:83 -msgid "DETAILS" -msgstr "DÉTAILS" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:32 -msgid "DISASSOCIATE" -msgstr "DISSOCIER" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:5 -msgid "DYNAMIC HOSTS" -msgstr "HÔTES DYNAMIQUES" - -#: client/lib/components/components.strings.js:70 -msgid "Dashboard" -msgstr "Tableau de bord" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:576 -#: client/src/scheduler/scheduler.strings.js:52 -msgid "Date format" -msgstr "Format de la date" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:170 -#: client/src/scheduler/scheduler.strings.js:64 -msgid "Days of data to keep" -msgstr "Nombre de jours pendant lesquels on peut conserver les données" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:101 -msgid "Default" -msgstr "Par défaut" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:196 -#: client/src/templates/survey-maker/shared/question-definition.form.js:213 -#: client/src/templates/survey-maker/shared/question-definition.form.js:228 -#: client/src/templates/survey-maker/shared/question-definition.form.js:242 -#: client/src/templates/survey-maker/shared/question-definition.form.js:256 -#: client/src/templates/survey-maker/shared/question-definition.form.js:272 -msgid "Default Answer" -msgstr "Réponse par défaut" - -#: client/src/configuration/settings.partial.html:9 -msgid "Define system-level features and functions" -msgstr "Définir les fonctions et fonctionnalités niveau système" - -#: client/features/output/output.strings.js:20 -#: client/lib/services/base-string.service.js:89 -#: client/src/credential-types/credential-types.list.js:73 -#: client/src/credential-types/list/list.controller.js:106 -#: client/src/credentials/credentials.list.js:92 -#: client/src/credentials/list/credentials-list.controller.js:151 -#: client/src/inventories-hosts/inventories/inventory.list.js:125 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:156 -#: client/src/inventory-scripts/inventory-scripts.list.js:79 -#: client/src/inventory-scripts/list/list.controller.js:126 -#: client/src/notifications/notification-templates-list/list.controller.js:231 -#: client/src/notifications/notificationTemplates.list.js:105 -#: client/src/organizations/edit/organizations-edit.controller.js:161 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:66 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:65 -#: client/src/organizations/list/organizations-list.controller.js:198 -#: client/src/projects/edit/projects-edit.controller.js:241 -#: client/src/scheduler/schedules.list.js:108 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:37 -#: client/src/teams/list/teams-list.controller.js:78 -#: client/src/teams/teams.list.js:72 -#: client/src/templates/templates.list.js:109 -#: client/src/users/list/users-list.controller.js:91 -#: client/src/users/users.list.js:79 -#: client/src/workflow-results/workflow-results.controller.js:57 -msgid "Delete" -msgstr "Supprimer" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:6 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:6 -msgid "Delete Group" -msgstr "Supprimer le groupe" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:128 -msgid "Delete Host" -msgstr "Supprimer l'hôte" - -#: client/features/output/output.strings.js:55 -#: client/src/workflow-results/workflow-results.service.js:39 -msgid "Delete Job" -msgstr "Supprimer Tâche" - -#: client/src/organizations/list/organizations-list.partial.html:73 -msgid "Delete Organization" -msgstr "Supprimer l'organisation" - -#: client/src/templates/survey-maker/surveys/init.factory.js:23 -msgid "Delete Question" -msgstr "Supprimer la question" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:180 -msgid "Delete Source" -msgstr "Supprimer la source" - -#: client/src/credentials/credentials.list.js:94 -msgid "Delete credential" -msgstr "Supprimer les informations d’identification" - -#: client/src/credential-types/credential-types.list.js:75 -msgid "Delete credential type" -msgstr "Supprimer le type d'informations d’identification" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:107 -#: client/src/inventories-hosts/inventory-hosts.strings.js:19 -msgid "Delete group" -msgid_plural "Delete groups" -msgstr[0] "Supprimer le groupe" -msgstr[1] "Supprimer les groupes" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:116 -#: client/src/inventories-hosts/inventory-hosts.strings.js:21 -msgid "Delete host" -msgid_plural "Delete hosts" -msgstr[0] "Supprimer l'hôte" -msgstr[1] "Supprimer les hôtes" - -#: client/src/inventories-hosts/inventories/inventory.list.js:127 -msgid "Delete inventory" -msgstr "Supprimer l’inventaire" - -#: client/src/inventory-scripts/inventory-scripts.list.js:81 -msgid "Delete inventory script" -msgstr "Supprimer le script d’inventaire" - -#: client/src/workflow-results/workflow-results.partial.html:52 -msgid "Delete job" -msgstr "Supprimer la tâche" - -#: client/src/notifications/notificationTemplates.list.js:107 -msgid "Delete notification" -msgstr "Supprimer la notification" - -#: client/src/projects/projects.form.js:186 -msgid "Delete on Update" -msgstr "Supprimer lors de la mise à jour" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:26 -msgid "Delete or promote the group's children?" -msgstr "Supprimer ou promouvoir les enfants du groupe ?" - -#: client/src/partials/survey-maker-modal.html:67 -msgid "Delete question" -msgstr "Supprimer la question" - -#: client/src/scheduler/schedules.list.js:111 -msgid "Delete schedule" -msgstr "Supprimer la programmation" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:121 -msgid "Delete source" -msgstr "Supprimer la source" - -#: client/src/teams/teams.list.js:76 -msgid "Delete team" -msgstr "Supprimer l’équipe" - -#: client/src/templates/templates.list.js:112 -msgid "Delete template" -msgstr "Supprimer le modèle" - -#: client/src/projects/projects.form.js:188 -msgid "Delete the local repository in its entirety prior to performing an update." -msgstr "Supprimer le référentiel local dans son intégralité avant de lancer la mise à jour." - -#: client/src/projects/projects.list.js:122 -msgid "Delete the project" -msgstr "Supprimer le projet" - -#: client/src/scheduler/scheduled-jobs.list.js:86 -msgid "Delete the schedule" -msgstr "Supprimer la planification" - -#: client/lib/services/base-string.service.js:121 -msgid "Delete the {{resourceType}}" -msgstr "Supprimer {{resourceType}}" - -#: client/src/users/users.list.js:83 -msgid "Delete user" -msgstr "Supprimer l’utilisateur" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:14 -msgid "Delete {{ group }} and {{ host }}" -msgstr "Supprimer {{ group }} et {{ host }}" - -#: client/lib/services/base-string.service.js:91 -msgid "Deleting this {{ resourceType }} will make the following resources unavailable." -msgstr "En supprimant cette {{ resourceType }} les ressources suivantes ne seront plus disponibles." - -#: client/src/projects/projects.form.js:188 -msgid "Depending on the size of the repository this may significantly increase the amount of time required to complete an update." -msgstr "Selon la taille du référentiel, cette opération risque d’augmenter considérablement le délai d’exécution de la mise à jour." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "Describe Instances documentation" -msgstr "Décrire la documentation des instances" - -#: client/features/applications/add-applications.controller.js:36 -#: client/features/templates/templates.strings.js:17 -#: client/features/users/tokens/users-tokens-add.controller.js:26 -#: client/src/credential-types/credential-types.form.js:34 -#: client/src/credentials/credentials.form.js:39 -#: client/src/inventories-hosts/hosts/host.form.js:62 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:39 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:61 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:74 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:63 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:72 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:28 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:36 -#: client/src/inventory-scripts/inventory-scripts.form.js:35 -#: client/src/notifications/notificationTemplates.form.js:39 -#: client/src/organizations/organizations.form.js:33 -#: client/src/projects/projects.form.js:37 -#: client/src/teams/teams.form.js:35 -#: client/src/templates/job_templates/job-template.form.js:41 -#: client/src/templates/survey-maker/shared/question-definition.form.js:36 -#: client/src/templates/workflows.form.js:49 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:128 -#: client/src/users/users.form.js:147 -#: client/src/users/users.form.js:175 -msgid "Description" -msgstr "Description" - -#: client/src/notifications/notificationTemplates.form.js:156 -#: client/src/notifications/notificationTemplates.form.js:160 -#: client/src/notifications/notificationTemplates.form.js:172 -#: client/src/notifications/notificationTemplates.form.js:176 -msgid "Destination Channels" -msgstr "Canaux de destination" - -#: client/src/notifications/notificationTemplates.form.js:535 -#: client/src/notifications/notificationTemplates.form.js:539 -msgid "Destination Channels or Users" -msgstr "Canaux de destination pour les utilisateurs" - -#: client/src/notifications/notificationTemplates.form.js:225 -#: client/src/notifications/notificationTemplates.form.js:226 -msgid "Destination SMS Number" -msgstr "Numéro SMS de destination" - -#: client/features/applications/applications.strings.js:15 -#: client/features/credentials/credentials.strings.js:13 -#: client/features/output/output.strings.js:46 -#: client/features/users/tokens/tokens.strings.js:14 -#: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1431 -msgid "Details" -msgstr "Détails" - -#: client/src/notifications/notificationTemplates.form.js:341 -#: client/src/notifications/notificationTemplates.form.js:403 -#: client/src/notifications/notificationTemplates.form.js:474 -#: client/src/notifications/notificationTemplates.form.js:506 -msgid "Disable SSL Verification" -msgstr "Désactiver la vérification SSL" - -#: client/src/templates/survey-maker/surveys/init.factory.js:21 -msgid "Disable Survey" -msgstr "Désactiver Questionnaire" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Disable survey" -msgstr "Désactiver le questionnaire" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Group From Group" -msgstr "Dissocier Groupe du Groupe" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:6 -msgid "Disassociate Host" -msgstr "Dissocier l'hôte" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:6 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Host From Group" -msgstr "Dissocier Hôte du Groupe" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:70 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:103 -msgid "Disassociate group" -msgstr "Dissocier le groupe" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:104 -msgid "Disassociate host" -msgstr "Dissocier l'hôte" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:54 -#: client/src/configuration/forms/settings-form.controller.js:446 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:52 -msgid "Discard changes" -msgstr "Ignorer les modifications" - -#: client/src/teams/teams.form.js:161 -msgid "Dissassociate permission from team" -msgstr "Dissocier la permission de l’équipe" - -#: client/src/users/users.form.js:234 -msgid "Dissassociate permission from user" -msgstr "Dissocier la permission de l’utilisateur" - -#: client/src/templates/job_templates/job-template.form.js:286 -msgid "Divide the work done by this job template into the specified number of job slices, each running the same tasks against a portion of the inventory." -msgstr "Diviser le travail effectué à l'aide de ce modèle de travail en un nombre spécifié de tranches de travail (job), chacune exécutant les mêmes tâches sur une partie de l'inventaire." - -#: client/src/credentials/credentials.form.js:383 -#: client/src/credentials/factories/become-method-change.factory.js:54 -#: client/src/credentials/factories/kind-change.factory.js:110 -msgid "Domain Name" -msgstr "Nom de domaine" - -#: client/features/output/output.strings.js:21 -msgid "Download Output" -msgstr "Télécharger la sortie" - -#: client/src/inventory-scripts/inventory-scripts.form.js:59 -msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. Refer to the Ansible Tower documentation for example syntax." -msgstr "Faites glisser votre script d’inventaire personnalisé et déposez-le ici ou créez-en un dans le champ pour importer votre inventaire personnalisé. Voir la documentation Ansible Tower pour obtenir des exemples de syntaxe." - -#: client/src/templates/survey-maker/surveys/init.factory.js:24 -msgid "Drag to reorder question" -msgstr "Faites glisser pour réorganiser les questions" - -#: client/src/partials/survey-maker-modal.html:74 -msgid "Drop question here to reorder" -msgstr "Mettez la question ici pour réordonnancer" - -#: client/features/applications/applications.strings.js:10 -msgid "EDIT APPLICATION" -msgstr "MODIFIER APPLICATION" - -#: client/features/credentials/credentials.strings.js:9 -msgid "EDIT CREDENTIAL" -msgstr "MODIFIER LES INFORMATIONS D'IDENTIFICATION" - -#: client/features/templates/templates.strings.js:142 -msgid "EDIT LINK" -msgstr "MODIFIER LE LIEN" - -#: client/src/scheduler/scheduler.strings.js:9 -msgid "EDIT SCHEDULE" -msgstr "MODIFIER PLANNING" - -#: client/src/management-jobs/scheduler/main.js:97 -msgid "EDIT SCHEDULED JOB" -msgstr "MODIFIER UNE TÂCHE PROGRAMMÉE" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:17 -msgid "EDIT SURVEY PROMPT" -msgstr "MODIFIER L'INVITE DU QUESTIONNAIRE" - -#: client/features/templates/templates.strings.js:124 -msgid "EDIT TEMPLATE" -msgstr "MODIFIER MODÈLE" - -#: client/lib/components/components.strings.js:9 -msgid "ENCRYPTED" -msgstr "CHIFFRÉ" - -#: client/features/output/output.strings.js:105 -msgid "EXAMPLES" -msgstr "EXEMPLES" - -#: client/src/shared/smart-search/smart-search.partial.html:36 -msgid "EXAMPLES:" -msgstr "EXEMPLES :" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:15 -msgid "EXECUTE COMMAND" -msgstr "EXÉCUTER LA COMMANDE" - -#: client/features/templates/templates.strings.js:150 -msgid "EXIT" -msgstr "QUITTER" - -#: client/lib/components/code-mirror/code-mirror.strings.js:12 -msgid "EXPAND" -msgstr "AGRANDIR" - -#: client/features/applications/applications.strings.js:29 -#: client/features/users/tokens/tokens.strings.js:37 -msgid "EXPIRATION" -msgstr "EXPIRATION" - -#: client/features/users/tokens/tokens.strings.js:24 -msgid "EXPIRES" -msgstr "EXPIRE" - -#: client/lib/components/code-mirror/code-mirror.strings.js:10 -#: client/lib/components/code-mirror/code-mirror.strings.js:50 -msgid "EXTRA VARIABLES" -msgstr "VARIABLES SUPPLÉMENTAIRES" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:375 -msgid "Each time a job runs using this inventory, refresh the inventory from the selected source before executing job tasks." -msgstr "Chaque fois qu’une tâche s’exécute avec cet inventaire, réalisez une mise à jour de la source sélectionnée avant de lancer la tâche." - -#: client/src/projects/projects.form.js:199 -msgid "Each time a job runs using this project, update the revision of the project prior to starting the job." -msgstr "Chaque fois qu’un job s’exécute avec ce projet, réalisez une mise à jour du projet avant de démarrer le job." - -#: client/src/credential-types/credential-types.list.js:56 -#: client/src/credentials/credentials.list.js:66 -#: client/src/inventories-hosts/inventories/inventory.list.js:102 -#: client/src/inventory-scripts/inventory-scripts.list.js:54 -#: client/src/notifications/notificationTemplates.list.js:71 -#: client/src/notifications/notificationTemplates.list.js:80 -#: client/src/scheduler/schedules.list.js:93 -#: client/src/teams/teams.list.js:55 -#: client/src/templates/templates.list.js:80 -#: client/src/users/users.list.js:60 -msgid "Edit" -msgstr "Modifier" - -#: client/src/organizations/list/organizations-list.partial.html:55 -msgid "Edit Organization" -msgstr "Modifier l'organisation" - -#: client/src/templates/survey-maker/surveys/init.factory.js:22 -msgid "Edit Question" -msgstr "Modifier la question" - -#: client/src/shared/form-generator.js:1668 -#: client/src/templates/job_templates/job-template.form.js:602 -#: client/src/templates/workflows.form.js:357 -msgid "Edit Survey" -msgstr "Modifier le questionnaire" - -#: client/src/credentials/credentials.list.js:68 -msgid "Edit credential" -msgstr "Modifier les informations d’identification" - -#: client/src/credential-types/credential-types.list.js:58 -msgid "Edit credential type" -msgstr "Modifier le type d’identification" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:91 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:85 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:89 -msgid "Edit group" -msgstr "Modifier le groupe" - -#: client/src/inventories-hosts/hosts/host.list.js:89 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:95 -#: client/src/inventories-hosts/inventory-hosts.strings.js:25 -msgid "Edit host" -msgstr "Modifier l’hôte" - -#: client/src/inventories-hosts/inventories/inventory.list.js:104 -msgid "Edit inventory" -msgstr "Modifier l’inventaire" - -#: client/src/inventory-scripts/inventory-scripts.list.js:56 -msgid "Edit inventory script" -msgstr "Modifier le script d’inventaire" - -#: client/src/notifications/notificationTemplates.list.js:73 -msgid "Edit notification" -msgstr "Modifier la notification" - -#: client/src/partials/survey-maker-modal.html:64 -msgid "Edit question" -msgstr "Modifier la question" - -#: client/src/scheduler/schedules.list.js:96 -msgid "Edit schedule" -msgstr "Modifier la programmation" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:87 -msgid "Edit source" -msgstr "Modifier la source" - -#: client/src/teams/teams.list.js:59 -msgid "Edit team" -msgstr "Modifier l’équipe" - -#: client/src/templates/templates.list.js:82 -msgid "Edit template" -msgstr "Modifier le modèle" - -#: client/src/workflow-results/workflow-results.controller.js:62 -msgid "Edit the inventory" -msgstr "Modifier l’inventaire" - -#: client/src/projects/projects.list.js:93 -msgid "Edit the project" -msgstr "Modifier le projet" - -#: client/src/scheduler/scheduled-jobs.list.js:72 -#: client/src/workflow-results/workflow-results.controller.js:61 -msgid "Edit the schedule" -msgstr "Modifier la planification" - -#: client/src/workflow-results/workflow-results.controller.js:60 -msgid "Edit the slice job template" -msgstr "Modifier le modèle de découpage de job" - -#: client/src/workflow-results/workflow-results.controller.js:58 -msgid "Edit the user" -msgstr "Modifier l’utilisateur" - -#: client/src/workflow-results/workflow-results.controller.js:59 -msgid "Edit the workflow job template" -msgstr "Modifier le modèle de job de workflow" - -#: client/src/users/users.list.js:64 -msgid "Edit user" -msgstr "Modifier l’utilisateur" - -#: client/features/projects/projects.strings.js:24 -msgid "Either you do not have access or the SCM update process completed" -msgstr "Soit vous avez accès, ou le processus de mise à jour SCM est terminée" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Either you do not have access or the SCM update process completed. Click the" -msgstr "Vous n’avez pas accès, ou la mise à jour SCM est terminée. Cliquez sur " - -#: client/features/output/output.strings.js:116 -#: client/src/workflow-results/workflow-results.controller.js:92 -msgid "Elapsed" -msgstr "Temps écoulé" - -#: client/src/credentials/credentials.form.js:191 -#: client/src/users/users.form.js:52 -msgid "Email" -msgstr "Email" - -#: client/src/notifications/notificationTemplates.form.js:558 -#: client/src/notifications/notificationTemplates.form.js:559 -msgid "Email Options" -msgstr "Options d'email" - -#: client/src/templates/job_templates/job-template.form.js:353 -#: client/src/templates/job_templates/job-template.form.js:358 -#: client/src/templates/workflows.form.js:157 -#: client/src/templates/workflows.form.js:162 -msgid "Enable Concurrent Jobs" -msgstr "Activer les tâches parallèles" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:31 -msgid "Enable External Logging" -msgstr "Activer la journalisation externe" - -#: client/src/templates/job_templates/job-template.form.js:363 -#: client/src/templates/job_templates/job-template.form.js:368 -msgid "Enable Fact Cache" -msgstr "Utiliser le cache des faits" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:326 -msgid "Enable Privilege Escalation" -msgstr "Activer l’élévation des privilèges" - -#: client/src/templates/job_templates/job-template.form.js:331 -#: client/src/templates/job_templates/job-template.form.js:338 -msgid "Enable Provisioning Callbacks" -msgstr "Activer les rappels de provisioning" - -#: client/src/templates/job_templates/job-template.form.js:343 -#: client/src/templates/job_templates/job-template.form.js:348 -#: client/src/templates/workflows.form.js:167 -#: client/src/templates/workflows.form.js:172 -msgid "Enable Webhook" -msgstr "Activer le webhook" - -#: client/src/configuration/settings.partial.html:3 -msgid "Enable simplified login for your Tower applications" -msgstr "Activer la connexion simplifiée pour vos applications Tower" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Enable survey" -msgstr "Activer le questionnaire" - -#: client/src/templates/job_templates/job-template.form.js:346 -msgid "Enable webhook for this job template." -msgstr "Activez le webhook pour ce modèle de tâche." - -#: client/src/templates/workflows.form.js:170 -msgid "Enable webhook for this workflow job template." -msgstr "Activez le webhook pour ce modèle de tâche de workflow." - -#: client/src/templates/job_templates/job-template.form.js:335 -msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact {{BRAND_NAME}} and request a configuration update using this job template." -msgstr "Active la création d'une URL de rappel. Avec cette URL, un hôte peut contacter {{BRAND_NAME}} et demander une mise à jour de la configuration à l'aide de ce modèle de job." - -#: client/src/credentials/factories/credential-form-save.factory.js:73 -msgid "Encrypted credentials are not supported." -msgstr "Les informations d’identification chiffrées ne sont pas prises en charge." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:487 -#: client/src/scheduler/scheduler.strings.js:44 -msgid "End" -msgstr "Fin" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:532 -#: client/src/scheduler/scheduler.strings.js:46 -msgid "End Date" -msgstr "Date de fin" - -#: client/src/scheduler/scheduler.strings.js:48 -msgid "End Time" -msgstr "Heure de fin" - -#: client/src/license/license.partial.html:163 -msgid "End User License Agreement" -msgstr "Contrat de licence de l’utilisateur final" - -#: client/src/inventories-hosts/hosts/host.form.js:72 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:71 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:73 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:68 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "Entrez les variables d’inventaire avec la syntaxe JSON ou YAML. Utilisez le bouton radio pour basculer entre les deux." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:74 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Entrez les variables d’inventaire avec la syntaxe JSON ou YAML. Utilisez le bouton radio pour basculer entre les deux. Consultez la documentation d’Ansible Tower pour avoir un exemple de syntaxe." - -#: client/src/notifications/notificationTemplates.form.js:335 -msgid "Enter one Annotation Tag per line, without commas." -msgstr "Entrez une balise d'annotation par ligne, sans virgule." - -#: client/src/notifications/notificationTemplates.form.js:175 -msgid "Enter one HipChat channel per line. The pound symbol (#) is not required." -msgstr "Saisir un canal HipChat par ligne. Le symbole dièse (#) n’est pas nécessaire." - -#: client/src/notifications/notificationTemplates.form.js:538 -msgid "Enter one IRC channel or username per line. The pound symbol (#) for channels, and the at (@) symbol for users, are not required." -msgstr "Saisir un canal IRC ou un nom d'utilisateur par ligne. Le symbole dièse (#) pour les canaux et (@) pour le utilisateurs, ne sont pas nécessaires." - -#: client/src/notifications/notificationTemplates.form.js:159 -msgid "Enter one Slack channel per line. The pound symbol (#) is required for channels." -msgstr "Saisir un canal Slack par ligne. Le symbole dièse (#) est exigé pour les canaux." - -#: client/src/notifications/notificationTemplates.form.js:97 -msgid "Enter one email address per line to create a recipient list for this type of notification." -msgstr "Saisir une adresse email par ligne pour créer une liste des destinataires pour ce type de notification." - -#: client/src/notifications/notificationTemplates.form.js:229 -msgid "Enter one phone number per line to specify where to route SMS messages." -msgstr "Saisir un numéro de téléphone par ligne pour spécifier où envoyer les messages SMS." - -#: client/src/credentials/factories/become-method-change.factory.js:81 -#: client/src/credentials/factories/kind-change.factory.js:137 -msgid "Enter the URL for the virtual machine which %scorresponds to your CloudForms instance. %sFor example, %s" -msgstr "Veuillez saisir l'URL de la machine virtuelle qui %scorrespond à votre instance CloudForms. %s. Par exemple %s" - -#: client/src/credentials/factories/become-method-change.factory.js:71 -#: client/src/credentials/factories/kind-change.factory.js:127 -msgid "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor example, %s" -msgstr "Veuillez saisir l’URL qui correspond à votre serveur %sRed Hat Satellite 6. %sPar exemple, %s" - -#: client/src/credentials/factories/become-method-change.factory.js:49 -#: client/src/credentials/factories/kind-change.factory.js:105 -msgid "Enter the hostname or IP address which corresponds to your VMware vCenter." -msgstr "Entrez le nom d’hôte ou l’adresse IP qui correspond à votre VMware vCenter." - -#: client/src/notifications/notificationTemplates.form.js:215 -msgid "Enter the number associated with the \"Messaging Service\" in Twilio in the format +18005550199." -msgstr "Numéro associé au \"Service de messagerie\" de Twilio sous le format +18005550199." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:196 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:220 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:319 -msgid "Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "Entrez les variables avec la syntaxe JSON ou YAML. Utilisez le bouton radio pour basculer entre les deux." - -#: client/features/output/output.strings.js:61 -msgid "Environment" -msgstr "Environnement" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:186 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:193 -msgid "Environment Variables" -msgstr "Variables d'environnement" - -#: client/src/license/license.controller.js:232 -msgid "Error Applying License" -msgstr "Erreur lors de l’application de la licence" - -#: client/features/output/output.strings.js:89 -msgid "Error Details" -msgstr "Détails de l'erreur" - -#: client/src/license/license.controller.js:166 -msgid "Error Fetching Licenses" -msgstr "Erreur lors de l’extraction des licences" - -#: client/src/notifications/notificationTemplates.form.js:643 -msgid "Error Message" -msgstr "Message d'erreur" - -#: client/src/notifications/notificationTemplates.form.js:654 -msgid "Error Message Body" -msgstr "Corps du message d'erreur" - -#: client/lib/services/base-string.service.js:115 -#: client/src/app.js:228 -#: client/src/configuration/forms/settings-form.controller.js:285 -#: client/src/configuration/forms/settings-form.controller.js:429 -#: client/src/configuration/forms/settings-form.controller.js:554 -#: client/src/configuration/forms/settings-form.controller.js:614 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:234 -#: client/src/credentials/factories/credential-form-save.factory.js:77 -#: client/src/credentials/factories/credential-form-save.factory.js:93 -#: client/src/home/home.controller.js:104 -#: client/src/home/home.controller.js:223 -#: client/src/home/home.controller.js:233 -#: client/src/home/home.controller.js:242 -#: client/src/home/home.controller.js:29 -#: client/src/home/home.controller.js:43 -#: client/src/home/home.controller.js:78 -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:34 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:37 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:47 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:116 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:126 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:153 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:203 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:222 -#: client/src/login/loginModal/loginModal.controller.js:143 -#: client/src/management-jobs/card/card.controller.js:122 -#: client/src/management-jobs/card/card.controller.js:28 -#: client/src/management-jobs/card/card.controller.js:58 -#: client/src/organizations/main.js:111 -#: client/src/organizations/main.js:124 -#: client/src/organizations/main.js:139 -#: client/src/projects/add/projects-add.controller.js:120 -#: client/src/projects/edit/projects-edit.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:220 -#: client/src/projects/edit/projects-edit.controller.js:236 -#: client/src/projects/main.js:121 -#: client/src/shared/stateDefinitions.factory.js:230 -#: client/src/templates/main.js:102 -#: client/src/templates/main.js:116 -#: client/src/templates/main.js:132 -#: client/src/templates/main.js:143 -#: client/src/templates/main.js:177 -#: client/src/templates/main.js:194 -#: client/src/templates/main.js:219 -#: client/src/templates/main.js:245 -#: client/src/templates/main.js:257 -#: client/src/templates/main.js:270 -#: client/src/templates/main.js:281 -#: client/src/templates/main.js:295 -#: client/src/templates/main.js:312 -#: client/src/templates/main.js:341 -#: client/src/templates/main.js:355 -#: client/src/templates/main.js:371 -#: client/src/templates/main.js:409 -#: client/src/templates/main.js:423 -#: client/src/templates/main.js:436 -#: client/src/templates/main.js:449 -#: client/src/templates/main.js:473 -#: client/src/templates/main.js:490 -#: client/src/templates/main.js:71 -#: client/src/templates/main.js:88 -#: client/src/users/add/users-add.controller.js:101 -#: client/src/users/edit/users-edit.controller.js:171 -#: client/src/users/list/users-list.controller.js:84 -#: client/src/workflow-results/workflow-results.service.js:57 -#: client/src/workflow-results/workflow-results.service.js:77 -#: client/src/workflow-results/workflow-results.service.js:99 -msgid "Error!" -msgstr "Erreur !" - -#: client/src/activity-stream/streams.list.js:40 -msgid "Event" -msgstr "Événement" - -#: client/src/activity-stream/factories/build-description.factory.js:157 -msgid "Event summary not available" -msgstr "Récapitulatif de l’événement non disponible" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:190 -#: client/src/scheduler/scheduler.strings.js:29 -msgid "Every" -msgstr "Tous les" - -#: client/src/projects/add/projects-add.controller.js:142 -#: client/src/projects/edit/projects-edit.controller.js:264 -msgid "Example URLs for GIT SCM include:" -msgstr "Exemples d’URL pour le SCM GIT :" - -#: client/src/projects/add/projects-add.controller.js:163 -#: client/src/projects/edit/projects-edit.controller.js:284 -msgid "Example URLs for Mercurial SCM include:" -msgstr "Exemples d’URL pour le SCM Mercurial :" - -#: client/src/projects/add/projects-add.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:275 -msgid "Example URLs for Subversion SCM include:" -msgstr "Exemples d’URL pour le SCM Subversion :" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Example: ansible_facts.ansible_distribution:\"RedHat\"" -msgstr "Exemple : ansible_facts.ansible_distribution:\"RedHat\"" - -#: client/src/projects/projects.form.js:140 -msgid "Examples include:" -msgstr "Voici quelques exemples :" - -#: client/features/output/output.strings.js:62 -msgid "Execution Node" -msgstr "Nœud d'exécution" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:65 -msgid "Existing Group" -msgstr "Groupe existant" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:142 -msgid "Existing Host" -msgstr "Hôte existant" - -#: client/features/output/output.strings.js:23 -#: client/src/workflow-results/workflow-results.controller.js:203 -#: client/src/workflow-results/workflow-results.controller.js:64 -msgid "Expand Output" -msgstr "Tout agrandir" - -#: client/lib/components/components.strings.js:121 -msgid "Expanded" -msgstr "Étendu" - -#: client/src/license/license.partial.html:246 -msgid "Expires" -msgstr "Expire" - -#: client/lib/services/base-string.service.js:132 -msgid "Expires (Ascending)" -msgstr "Expire (croissant)" - -#: client/lib/services/base-string.service.js:133 -msgid "Expires (Descending)" -msgstr "Expire (décroissant)" - -#: client/src/license/license.partial.html:39 -msgid "Expires On" -msgstr "Arrive à expiration le" - -#: client/lib/components/components.strings.js:133 -msgid "Expires:" -msgstr "Expire :" - -#: client/lib/components/components.strings.js:134 -msgid "Expires: Never" -msgstr "Expire : Jamais" - -#: client/features/output/output.strings.js:71 -#: client/src/workflow-results/workflow-results.controller.js:76 -msgid "Explanation" -msgstr "Explication" - -#: client/features/output/output.strings.js:63 -#: client/features/templates/templates.strings.js:64 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:133 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:145 -#: client/src/partials/logviewer.html:8 -#: client/src/scheduler/scheduler.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:480 -#: client/src/templates/job_templates/job-template.form.js:487 -#: client/src/templates/workflows.form.js:136 -#: client/src/templates/workflows.form.js:143 -#: client/src/workflow-results/workflow-results.controller.js:180 -msgid "Extra Variables" -msgstr "Variables supplémentaires" - -#: client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js:7 -msgid "FACTS" -msgstr "FAITS" - -#: client/features/output/output.strings.js:141 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:59 -msgid "FAILED" -msgstr "ÉCHEC" - -#: client/features/output/output.strings.js:106 -msgid "FIELDS" -msgstr "CHAMPS" - -#: client/src/shared/smart-search/smart-search.partial.html:42 -msgid "FIELDS:" -msgstr "CHAMPS :" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "FINISHED" -msgstr "TERMINÉ" - -#: client/src/inventories-hosts/hosts/host.form.js:103 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:105 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:114 -msgid "Facts" -msgstr "Faits" - -#: client/lib/components/components.strings.js:106 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:86 -msgid "Failed" -msgstr "Échec" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:44 -msgid "Failed Hosts" -msgstr "Échec des hôtes" - -#: client/src/projects/factories/get-project-path.factory.js:68 -msgid "Failed to access API config. GET status:" -msgstr "Impossible d'accéder à la configuration de l'API. État GET :" - -#: client/src/users/add/users-add.controller.js:101 -msgid "Failed to add new user. POST returned status:" -msgstr "L’ajout de l’utilisateur a échoué. État POST renvoyé :" - -#: client/src/credentials/factories/credential-form-save.factory.js:78 -msgid "Failed to create new Credential. POST status:" -msgstr "La création des informations d’identification a échoué. État POST :" - -#: client/src/projects/add/projects-add.controller.js:121 -msgid "Failed to create new project. POST returned status:" -msgstr "La création du projet a échoué. État POST renvoyé :" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:35 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:48 -#: client/src/templates/main.js:144 -#: client/src/templates/main.js:282 -msgid "Failed to get config. GET returned status:" -msgstr "Impossible d'obtenir la configuration. État GET renvoyé :" - -#: client/src/home/home.controller.js:43 -msgid "Failed to get dashboard graph data:" -msgstr "Impossible d'obtenir les données graphiques du tableau de bord :" - -#: client/src/home/home.controller.js:29 -msgid "Failed to get dashboard host graph data:" -msgstr "Impossible d'obtenir les données graphiques de l'hôte du tableau de bord :" - -#: client/src/home/home.controller.js:242 -msgid "Failed to get dashboard job templates list:" -msgstr "Impossible d'obtenir la liste des modèles de tâches du tableau de bord :" - -#: client/src/home/home.controller.js:233 -msgid "Failed to get dashboard jobs list:" -msgstr "Impossible d'obtenir la liste des tâches du tableau de bord :" - -#: client/src/home/home.controller.js:223 -msgid "Failed to get dashboard:" -msgstr "Impossible d’obtenir le tableau de bord :" - -#: client/src/templates/main.js:246 -msgid "Failed to get instance groups. GET returned status:" -msgstr "Impossible d'obtenir les groupes d'instances. État GET renvoyé :" - -#: client/src/templates/main.js:342 -#: client/src/templates/main.js:410 -#: client/src/templates/main.js:72 -msgid "Failed to get inventory info. GET returned status:" -msgstr "Impossible d'obtenir les informations d'inventaire. État GET renvoyé :" - -#: client/src/templates/main.js:133 -msgid "Failed to get job template options. OPTIONS returned status:" -msgstr "Impossible d'obtenir les options de modèle de job. État OPTIONS renvoyé :" - -#: client/src/templates/main.js:178 -msgid "Failed to get job template. GET returned status:" -msgstr "Impossible d'obtenir le modèle de job. État GET renvoyé :" - -#: client/src/templates/main.js:117 -#: client/src/templates/main.js:258 -#: client/src/templates/main.js:356 -#: client/src/templates/main.js:424 -msgid "Failed to get labels. GET returned status:" -msgstr "Impossible d'obtenir les étiquettes. État GET renvoyé :" - -#: client/src/home/home.controller.js:79 -msgid "Failed to get new jobs for dashboard:" -msgstr "Impossible d'obtenir de nouvelles tâches pour le tableau de bord :" - -#: client/src/home/home.controller.js:105 -msgid "Failed to get new templates for dashboard:" -msgstr "Impossible d'obtenir de nouveaux modèles pour le tableau de bord :" - -#: client/src/organizations/main.js:140 -msgid "Failed to get organizations for which this user is a notification admin. GET returned" -msgstr "Impossible d'obtenir les organisations pour lesquelles cet utilisateur est un administrateur de notification. GET renvoyé" - -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:38 -#: client/src/projects/main.js:122 -#: client/src/templates/main.js:296 -#: client/src/templates/main.js:474 -msgid "Failed to get organizations for which this user is a notification administrator. GET returned" -msgstr "Impossible d'obtenir les organisations pour lesquelles cet utilisateur est un administrateur de notification. GET renvoyé" - -#: client/src/templates/main.js:103 -#: client/src/templates/main.js:89 -msgid "Failed to get project info. GET returned status:" -msgstr "Impossible d'obtenir les informations de projet. État GET renvoyé :" - -#: client/src/templates/main.js:195 -#: client/src/templates/main.js:220 -msgid "Failed to get project. GET returned status:" -msgstr "Impossible d'obtenir le projet. État GET renvoyé :" - -#: client/src/templates/main.js:313 -#: client/src/templates/main.js:491 -msgid "Failed to get webhook key GET returned" -msgstr "Impossible d’obtenir la clé de webhook GET" - -#: client/src/templates/main.js:271 -#: client/src/templates/main.js:437 -msgid "Failed to get workflow job template labels. GET returned status:" -msgstr "Impossible d'obtenir les étiquettes du modèle de job de flux de travail. État GET renvoyé :" - -#: client/src/templates/main.js:372 -msgid "Failed to get workflow job template options. OPTIONS returned status:" -msgstr "Impossible d'obtenir les options de modèle de job de flux de travail. État OPTIONS renvoyé :" - -#: client/src/templates/main.js:450 -msgid "Failed to get workflow job template. GET returned status:" -msgstr "Impossible d'obtenir le modèle de job de flux de travail. État GET renvoyé :" - -#: client/src/app.js:229 -#: client/src/login/loginModal/loginModal.controller.js:144 -msgid "Failed to get workflow jobs pending approval. GET returned status:" -msgstr "Impossible d'obtenir l’approbation en attente des tâches de workflow. État GET renvoyé :" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:223 -msgid "Failed to retrieve job template extra variables." -msgstr "N’a pas pu extraire les variables supplémentaires du modèle de la tâche." - -#: client/src/projects/edit/projects-edit.controller.js:155 -msgid "Failed to retrieve project: %s. GET status:" -msgstr "La récupération du projet a échoué : %s. État GET :" - -#: client/src/users/edit/users-edit.controller.js:172 -msgid "Failed to retrieve user: %s. GET status:" -msgstr "La récupération de l’utilisateur a échoué : %s. État GET :" - -#: client/src/configuration/forms/settings-form.controller.js:430 -msgid "Failed to save settings. Returned status:" -msgstr "L’enregistrement des paramètres a échoué. État renvoyé :" - -#: client/src/configuration/forms/settings-form.controller.js:555 -msgid "Failed to save toggle settings. Returned status:" -msgstr "L’enregistrement des paramètres d’activation/désactivation a échoué. État renvoyé :" - -#: client/src/credentials/factories/credential-form-save.factory.js:94 -msgid "Failed to update Credential. PUT status:" -msgstr "La mise à jour des informations d’identification a échoué. État PUT :" - -#: client/src/projects/edit/projects-edit.controller.js:220 -msgid "Failed to update project: %s. PUT status:" -msgstr "La mise à jour du projet a échoué : %s. État PUT :" - -#: client/features/output/output.strings.js:110 -msgid "Failed to update search results." -msgstr "N'a pas pu mettre à jour les résultats de recherche." - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:204 -#: client/src/management-jobs/card/card.controller.js:123 -#: client/src/management-jobs/card/card.controller.js:59 -msgid "Failed updating job %s with variables. POST returned: %d" -msgstr "N’a pas pu mettre à jour la tâche %s avec les variables. Retour POST : %d" - -#: client/src/organizations/main.js:112 -msgid "Failed while checking to see if user is a notification administrator of this organization. GET returned" -msgstr "Impossible de vérifier si l'utilisateur est un administrateur de notification de cette organisation. GET renvoyé" - -#: client/src/organizations/main.js:125 -msgid "Failed while checking to see if user is an administrator of this organization. GET returned" -msgstr "Impossible de vérifier si l'utilisateur est un administrateur de cette organisation. GET renvoyé" - -#: client/src/notifications/notifications.list.js:77 -msgid "Failure" -msgstr "Défaillance" - -#: client/src/instance-groups/instance-groups.strings.js:81 -msgid "Field for passing a custom Kubernetes or OpenShift Pod specification." -msgstr "Champ permettant de passer une spécification de pod Kubernetes ou OpenShift personnalisée." - -#: client/src/scheduler/schedules.list.js:63 -msgid "Final Run" -msgstr "Dernière exécution" - -#: client/lib/services/base-string.service.js:142 -msgid "Finish Time (Ascending)" -msgstr "Heure de fin (croissant)" - -#: client/lib/services/base-string.service.js:143 -msgid "Finish Time (Descending)" -msgstr "Heure de fin (décroissant)" - -#: client/features/jobs/jobs.strings.js:10 -#: client/features/output/output.strings.js:52 -#: client/features/output/output.strings.js:64 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:56 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:44 -#: client/src/workflow-results/workflow-results.controller.js:72 -msgid "Finished" -msgstr "Terminé" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 -#: client/src/teams/teams.form.js:101 -#: client/src/users/users.form.js:29 -#: client/src/users/users.list.js:33 -msgid "First Name" -msgstr "Prénom" - -#: client/src/scheduler/schedules.list.js:53 -msgid "First Run" -msgstr "Première exécution" - -#: client/src/organizations/organizations.form.js:124 -msgid "First name" -msgstr "Prénom" - -#: client/src/templates/survey-maker/surveys/init.factory.js:19 -msgid "Float" -msgstr "Flottement" - -#: client/features/output/output.strings.js:102 -#: client/src/shared/smart-search/smart-search.partial.html:49 -msgid "For additional information on advanced search syntax please see the Ansible Tower" -msgstr "Pour obtenir des informations supplémentaires sur la syntaxe de recherche avancée, consulter la documentation Ansible Tower." - -#: client/src/credentials/factories/become-method-change.factory.js:63 -#: client/src/credentials/factories/kind-change.factory.js:119 -msgid "For example, %s" -msgstr "Par exemple, %s" - -#: client/index.template.ejs:113 -msgid "For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept." -msgstr "Pour les faits collectés en amont de la période spécifiée, enregistrez un scan des faits (instantané) par fenêtre temporelle (fréquence). Par exemple, les faits antérieurs à 30 jours sont purgés, tandis qu'un scan de faits hebdomadaire est conservé." - -#: client/src/inventories-hosts/hosts/host.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:34 -msgid "For hosts that are part of an external inventory, this flag may be reset by the inventory sync process." -msgstr "Pour les hôtes qui font partie d’un inventaire externe, ce marqueur peut être réinitialisé par le processus de synchronisation des inventaires." - -#: client/src/inventories-hosts/hosts/host.form.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:32 -#: client/src/inventories-hosts/inventory-hosts.strings.js:33 -msgid "For hosts that are part of an external inventory, this may be reset by the inventory sync process." -msgstr "Pour les hôtes qui font partie d’un inventaire externe, ceci peut être réinitialisé par le processus de synchronisation des inventaires." - -#: client/features/templates/templates.strings.js:59 -#: client/src/templates/job_templates/job-template.form.js:54 -msgid "For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook." -msgstr "Pour les modèles de job, sélectionner «run» (exécuter) pour exécuter le playbook. Sélectionner «check» (vérifier) uniquement pour vérifier la syntaxe du playbook, tester la configuration de l’environnement et signaler les problèmes." - -#: client/src/projects/projects.form.js:145 -msgid "For more information, refer to the" -msgstr "Pour plus d'informations, reportez-vous à" - -#: client/features/output/output.strings.js:65 -#: client/src/instance-groups/instance-groups.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:110 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:97 -#: client/src/templates/job_templates/job-template.form.js:162 -#: client/src/templates/job_templates/job-template.form.js:168 -msgid "Forks" -msgstr "Forks" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:179 -#: client/src/scheduler/scheduler.strings.js:28 -msgid "Frequency Details" -msgstr "Informations sur la fréquence" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:454 -#: client/src/scheduler/scheduler.strings.js:41 -msgid "Fri" -msgstr "Ven." - -#: client/src/license/license.partial.html:150 -msgid "GET LICENSES" -msgstr "OBTENIR DES LICENCES" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "GO TO NOTIFICATIONS TO" -msgstr " SE RENDRE À NOTIFICATIONS POUR" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js:45 -msgid "GROUPS" -msgstr "GROUPES" - -#: client/src/shared/form-generator.js:801 -msgid "Generate field" -msgstr "Générer le champ" - -#: client/features/projects/projects.strings.js:18 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:28 -#: client/src/projects/edit/projects-edit.controller.js:119 -msgid "Get latest SCM revision" -msgstr "Obtenir la dernière révision SCM" - -#: client/features/output/output.strings.js:37 -msgid "Get next page" -msgstr "Obtenir la page suivante" - -#: client/features/output/output.strings.js:38 -msgid "Get previous page" -msgstr "Obtenir la page précédente" - -#: client/src/credential-types/add/add.controller.js:41 -msgid "Getting Started with Credential Types" -msgstr "Guide de démarrage avec les types d'identifiants" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:92 -msgid "GitHub" -msgstr "GitHub" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:110 -msgid "GitHub (Default)" -msgstr "GitHub (Par défaut)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:31 -msgid "GitHub Category" -msgstr "Catégorie GitHub" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:111 -msgid "GitHub Org" -msgstr "GitHub Org" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:112 -msgid "GitHub Team" -msgstr "Équipe GitHub" - -#: client/src/shared/paginate/paginate.partial.html:18 -msgid "Go to current page of list" -msgstr "Allez à la page actuelle de la liste" - -#: client/features/output/output.strings.js:36 -msgid "Go to first page" -msgstr "Allez à la première page" - -#: client/features/output/output.strings.js:39 -msgid "Go to last page of available output" -msgstr "Allez à la dernière page de résultats disponibles" - -#: client/src/shared/paginate/paginate.partial.html:28 -msgid "Go to last page of list" -msgstr "Allez à la dernière page de la liste" - -#: client/src/shared/paginate/paginate.partial.html:22 -msgid "Go to next page of list" -msgstr "Allez à la page suivante de la liste" - -#: client/src/shared/paginate/paginate.partial.html:6 -msgid "Go to page 1 of list" -msgstr "Allez à la page 1 de la liste" - -#: client/src/shared/paginate/paginate.partial.html:12 -msgid "Go to previous page of list" -msgstr "Allez à la page précédente de la liste" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:93 -msgid "Google OAuth2" -msgstr "OAuth2 pour Google" - -#: client/src/notifications/notificationTemplates.form.js:300 -msgid "Grafana API Key" -msgstr "Clé API Grafana" - -#: client/src/notifications/notificationTemplates.form.js:285 -msgid "Grafana URL" -msgstr "URL Grafana" - -#: client/src/teams/teams.form.js:170 -#: client/src/users/users.form.js:222 -msgid "Grant Permission" -msgstr "Donner Permission" - -#: client/src/notifications/add/add.controller.js:84 -#: client/src/notifications/edit/edit.controller.js:147 -msgid "Gray" -msgstr "Gris" - -#: client/src/notifications/add/add.controller.js:85 -#: client/src/notifications/edit/edit.controller.js:148 -msgid "Green" -msgstr "Vert" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:51 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:52 -msgid "Group Variables" -msgstr "Grouper des variables" - -#: client/src/inventories-hosts/hosts/host.form.js:111 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:89 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:23 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:88 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:22 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:113 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:122 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:38 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:145 -msgid "Groups" -msgstr "Groupes" - -#: client/src/scheduler/scheduler.strings.js:61 -msgid "HH24" -msgstr "HH24" - -#: client/lib/services/base-string.service.js:69 -#: client/src/templates/survey-maker/surveys/init.factory.js:499 -msgid "HIDE" -msgstr "MASQUER" - -#: client/lib/components/components.strings.js:44 -msgid "HINT: Drag and drop private file on the field below." -msgstr "INDICE : glissez-déposez le fichier privé dans le champ ci-dessous." - -#: client/src/activity-stream/get-target-title.factory.js:41 -#: client/src/inventories-hosts/hosts/hosts.partial.html:9 -#: client/src/inventories-hosts/hosts/main.js:81 -#: client/src/inventories-hosts/inventories/inventories.partial.html:15 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.route.js:18 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js:17 -msgid "HOSTS" -msgstr "HÔTES " - -#: client/src/notifications/notificationTemplates.form.js:410 -#: client/src/notifications/notificationTemplates.form.js:411 -msgid "HTTP Headers" -msgstr "En-têtes HTTP" - -#: client/src/notifications/notificationTemplates.form.js:427 -#: client/src/notifications/notificationTemplates.form.js:428 -msgid "HTTP Method" -msgstr "Méthode HTTP" - -#: client/lib/components/components.strings.js:12 -msgid "Hide" -msgstr "Masquer" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "Hide Activity Stream" -msgstr "Cacher le flux d’activité" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:23 -msgid "High" -msgstr "Élevée" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:13 -msgid "High Risk" -msgstr "Risque élevé" - -#: client/src/credentials/credentials.form.js:139 -#: client/src/notifications/notificationTemplates.form.js:83 -msgid "Host" -msgstr "Hôte" - -#: client/src/credentials/factories/become-method-change.factory.js:52 -#: client/src/credentials/factories/kind-change.factory.js:108 -msgid "Host (Authentication URL)" -msgstr "Hôte (URL d’authentification)" - -#: client/src/templates/job_templates/job-template.form.js:387 -#: client/src/templates/job_templates/job-template.form.js:396 -msgid "Host Config Key" -msgstr "Clé de configuration de l’hôte" - -#: client/src/inventories-hosts/hosts/host.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:39 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:39 -msgid "Host Enabled" -msgstr "Hôte activé" - -#: client/features/output/output.strings.js:66 -msgid "Host Limit Error" -msgstr "Erreur de limite d'hôte" - -#: client/src/inventories-hosts/hosts/host.form.js:45 -#: client/src/inventories-hosts/hosts/host.form.js:56 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:44 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:55 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:46 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:57 -msgid "Host Name" -msgstr "Nom d'hôte" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:78 -msgid "Host Variables" -msgstr "Variables d'hôte" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is available" -msgstr "Hôte disponible" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is available. Click to toggle." -msgstr "Hôte disponible. Cliquez pour activer ou désactiver." - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is not available" -msgstr "Hôte indisponible." - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is not available. Click to toggle." -msgstr "Hôte indisponible. Cliquez pour activer ou désactiver." - -#: client/features/output/output.strings.js:13 -msgid "Host status information for this job is unavailable." -msgstr "Le statut de l'hôte n'est pas disponible pour ce job." - -#: client/features/output/output.strings.js:119 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:39 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:98 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:64 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:149 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:155 -msgid "Hosts" -msgstr "Hôtes" - -#: client/src/license/license.partial.html:52 -#: client/src/license/license.partial.html:58 -msgid "Hosts Available" -msgstr "Hôtes disponibles" - -#: client/src/license/license.partial.html:68 -msgid "Hosts Remaining" -msgstr "Hôtes restants" - -#: client/src/license/license.partial.html:62 -msgid "Hosts Used" -msgstr "Hôtes utilisés" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "Hosts are imported to" -msgstr "Hôtes importés dans" - -#: client/features/output/output.strings.js:129 -msgid "ID" -msgstr "ID" - -#: client/src/notifications/notificationTemplates.form.js:313 -msgid "ID of the Dashboard (optional)" -msgstr "ID du tableau de bord (facultatif)" - -#: client/src/notifications/notificationTemplates.form.js:321 -msgid "ID of the Panel (optional)" -msgstr "ID du panneau (facultatif)" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:14 -msgid "INITIATED BY" -msgstr "INITIÉ PAR" - -#: client/src/inventories-hosts/inventories/insights/insights.route.js:7 -msgid "INSIGHTS" -msgstr "INSIGHTS" - -#: client/src/instance-groups/instance-groups.list.js:6 -#: client/src/instance-groups/instance-groups.list.js:7 -#: client/src/instance-groups/instance-groups.strings.js:10 -#: client/src/instance-groups/instance-groups.strings.js:19 -msgid "INSTANCE GROUPS" -msgstr "GROUPES D'INSTANCES" - -#: client/src/instance-groups/instance-groups.strings.js:11 -#: client/src/instance-groups/instance-groups.strings.js:30 -msgid "INSTANCES" -msgstr "INSTANCES" - -#: client/src/activity-stream/get-target-title.factory.js:14 -#: client/src/inventories-hosts/hosts/hosts.partial.html:8 -#: client/src/inventories-hosts/inventories/inventories.partial.html:14 -#: client/src/inventories-hosts/inventories/inventories.route.js:8 -#: client/src/inventories-hosts/inventories/inventory.list.js:14 -#: client/src/inventories-hosts/inventories/inventory.list.js:15 -#: client/src/organizations/linkout/organizations-linkout.route.js:138 -#: client/src/organizations/list/organizations-list.controller.js:69 -msgid "INVENTORIES" -msgstr "INVENTAIRES" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:138 -msgid "INVENTORY" -msgstr "INVENTAIRE" - -#: client/src/inventory-scripts/inventory-scripts.form.js:23 -msgid "INVENTORY SCRIPT" -msgstr "SCRIPT D’INVENTAIRE" - -#: client/src/activity-stream/get-target-title.factory.js:35 -#: client/src/inventory-scripts/inventory-scripts.list.js:12 -#: client/src/inventory-scripts/main.js:65 -msgid "INVENTORY SCRIPTS" -msgstr "SCRIPTS D’INVENTAIRE" - -#: client/src/notifications/notificationTemplates.form.js:524 -msgid "IRC Nick" -msgstr "Surnom IRC" - -#: client/src/notifications/notificationTemplates.form.js:513 -msgid "IRC Server Address" -msgstr "Adresse du serveur IRC" - -#: client/src/notifications/shared/type-change.service.js:72 -msgid "IRC Server Password" -msgstr "Mot de passe du serveur IRC" - -#: client/src/notifications/shared/type-change.service.js:71 -msgid "IRC Server Port" -msgstr "Port du serveur IRC" - -#: client/src/instance-groups/instance-groups.strings.js:21 -msgid "ISOLATED" -msgstr "ISOLÉ" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:79 -msgid "ISSUE: {{report.rule.description}}" -msgstr "PROBLÈME : {{report.rule.description}}" - -#: client/src/shared/paginate/paginate.partial.html:43 -msgid "ITEMS" -msgstr "ÉLÉMENTS" - -#: client/src/notifications/notificationTemplates.form.js:467 -#: client/src/notifications/notificationTemplates.form.js:499 -msgid "Icon URL" -msgstr "Icône URL" - -#: client/src/login/authenticationServices/timer.factory.js:157 -msgid "Idle Session" -msgstr "Session inactive" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "If blank, all groups above are created except" -msgstr "Si resté vide, cela indique que tous les groupes ci-dessus sont créés sauf" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:364 -msgid "If checked, all variables for child groups and hosts will be removed and replaced by those found on the external source." -msgstr "Si cochées, toutes les variables des groupes et hôtes dépendants seront supprimées et remplacées par celles qui se trouvent dans la source externe." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:353 -msgid "If checked, any hosts and groups that were previously present on the external source but are now removed will be removed from the Tower inventory. Hosts and groups that were not managed by the inventory source will be promoted to the next manually created group or if there is no manually created group to promote them into, they will be left in the \"all\" default group for the inventory." -msgstr "Si cochés, tous les hôtes et groupes qui étaient présent auparavant sur la source externe, mais qui sont maintenant supprimés, seront supprimés de l'inventaire de Tower. Les hôtes et les groupes qui n'étaient pas gérés par la source de l'inventaire seront promus au prochain groupe créé manuellement ou s'il n'y a pas de groupe créé manuellement dans lequel les promouvoir, ils devront rester dans le groupe \"all\" par défaut de cet inventaire." - -#: client/src/templates/job_templates/job-template.form.js:324 -msgid "If enabled, run this playbook as an administrator." -msgstr "Si activé, exécuter ce playbook en tant qu'administrateur." - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:121 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Si activé, afficher les changements faits par les tâches Ansible, si supporté. C'est équivalent au mode Ansible’s -diff ." - -#: client/features/templates/templates.strings.js:51 -#: client/src/templates/job_templates/job-template.form.js:309 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Si activé, afficher les changements faits par les tâches Ansible, si supporté. C'est équivalent au mode Ansible’s --diff." - -#: client/src/templates/job_templates/job-template.form.js:356 -msgid "If enabled, simultaneous runs of this job template will be allowed." -msgstr "Si activé, il sera possible d’avoir des exécutions de ce modèle de tâche en simultané." - -#: client/src/templates/workflows.form.js:160 -msgid "If enabled, simultaneous runs of this workflow job template will be allowed." -msgstr "Si activé, il sera possible d’avoir des exécutions de ce modèle de job de workflow en simultané." - -#: client/src/templates/job_templates/job-template.form.js:366 -msgid "If enabled, use cached facts if available and store discovered facts in the cache." -msgstr "Si cette option est activée, utilisez les faits en cache le cas échéant et les faits découverts par le magasin dans le cache." - -#: client/src/credentials/credentials.form.js:52 -msgid "If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization." -msgstr "Si aucune organisation n’est renseignée, les informations d’identification ne peuvent être utilisées que par l’utilisateur qui les crée. Les administrateurs d’organisation et les administrateurs système peuvent assigner une organisation pour que les rôles liés aux informations d’identification puissent être associés aux utilisateurs et aux équipes de cette organisation." - -#: client/src/license/license.partial.html:74 -msgid "If you are ready to upgrade, please contact us by clicking the button below" -msgstr "Si vous êtes prêt à effectuer une mise à niveau, contactez-nous en cliquant sur le bouton ci-dessous" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:242 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:254 -msgid "Image ID:" -msgstr "ID d'image :" - -#: client/src/inventories-hosts/hosts/host.form.js:34 -#: client/src/inventories-hosts/hosts/host.list.js:35 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:32 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:33 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:30 -#: client/src/inventories-hosts/inventory-hosts.strings.js:32 -msgid "Indicates if a host is available and should be included in running jobs." -msgstr "Indique si un hôte est disponible et doit être ajouté aux tâches en cours d’exécution." - -#: client/src/activity-stream/activity-detail.form.js:31 -#: client/src/activity-stream/streams.list.js:33 -msgid "Initiated by" -msgstr "Initié par" - -#: client/src/credential-types/credential-types.form.js:53 -#: client/src/credential-types/credential-types.form.js:61 -msgid "Injector Configuration" -msgstr "Configuration d'Injector" - -#: client/src/credential-types/credential-types.form.js:39 -#: client/src/credential-types/credential-types.form.js:47 -msgid "Input Configuration" -msgstr "Configuration de l'entrée" - -#: client/src/inventories-hosts/hosts/host.form.js:119 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:129 -msgid "Insights" -msgstr "Insights" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:52 -msgid "Insights Credential" -msgstr "Information d’identification à Insights" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:144 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:147 -msgid "Instance Filters" -msgstr "Filtres de l'instance" - -#: client/features/output/output.strings.js:67 -#: client/src/instance-groups/instance-groups.strings.js:43 -msgid "Instance Group" -msgstr "Groupe d'instance" - -#: client/src/instance-groups/instance-groups.strings.js:71 -msgid "Instance Group parameter is missing." -msgstr "Paramètre de groupe de l'instance manquant" - -#: client/lib/components/components.strings.js:86 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:54 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:57 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:61 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:64 -#: client/src/organizations/organizations.form.js:38 -#: client/src/organizations/organizations.form.js:41 -#: client/src/templates/job_templates/job-template.form.js:268 -#: client/src/templates/job_templates/job-template.form.js:271 -msgid "Instance Groups" -msgstr "Groupes d'instances" - -#: client/src/instance-groups/instance-groups.strings.js:37 -msgid "Instance Groups Help" -msgstr "Assistance Groupes d'instances" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "Instance ID" -msgstr "ID d'instance" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:243 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:255 -msgid "Instance ID:" -msgstr "ID d'instance :" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:244 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:256 -msgid "Instance Type:" -msgstr "Type d'instance" - -#: client/lib/components/components.strings.js:85 -#: client/src/instance-groups/instance-groups.strings.js:20 -msgid "Instances" -msgstr "Instances" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "Insufficient Permissions" -msgstr "Permissions insuffisantes" - -#: client/src/templates/survey-maker/surveys/init.factory.js:18 -msgid "Integer" -msgstr "Entier relatif" - -#: client/src/license/license.partial.html:11 -msgid "Invalid License" -msgstr "Licence non valide" - -#: client/src/license/license.controller.js:109 -#: client/src/license/license.controller.js:117 -msgid "Invalid file format. Please upload valid JSON." -msgstr "Format de fichier non valide. Chargez un fichier JSON valide." - -#: client/lib/components/components.strings.js:16 -msgid "Invalid input for this type." -msgstr "Entrée non valide pour ce type." - -#: client/features/output/output.strings.js:111 -msgid "Invalid search filter provided." -msgstr "Filtre de recherche fourni non valide." - -#: client/src/login/loginModal/loginModal.partial.html:46 -msgid "Invalid username and/or password. Please try again." -msgstr "Nom d’utilisateur et/ou mot de passe non valide. Veuillez réessayer." - -#: client/lib/components/components.strings.js:77 -#: client/lib/models/models.strings.js:16 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:121 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:52 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/organizations/linkout/organizations-linkout.route.js:147 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "Inventories" -msgstr "Inventaires" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:43 -msgid "Inventories with sources cannot be copied" -msgstr "Les inventaires et les sources ne peuvent pas être copiés" - -#: client/features/jobs/jobs.strings.js:14 -#: client/features/output/output.strings.js:69 -#: client/features/templates/templates.strings.js:19 -#: client/features/templates/templates.strings.js:28 -#: client/src/inventories-hosts/hosts/host.list.js:75 -#: client/src/inventories-hosts/inventories/inventory.list.js:85 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/templates/job_templates/job-template.form.js:66 -#: client/src/templates/job_templates/job-template.form.js:80 -#: client/src/templates/workflows.form.js:72 -#: client/src/templates/workflows.form.js:82 -#: client/src/workflow-results/workflow-results.controller.js:78 -msgid "Inventory" -msgstr "Inventaire" - -#: client/lib/services/base-string.service.js:148 -msgid "Inventory (Ascending)" -msgstr "Inventaire (croissant)" - -#: client/lib/services/base-string.service.js:149 -msgid "Inventory (Descending)" -msgstr "Inventaire (décroissant)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:109 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:123 -msgid "Inventory File" -msgstr "Fichier d'inventaire" - -#: client/src/workflow-results/workflow-results.controller.js:79 -msgid "Inventory Limit" -msgstr "Limite d'inventaire" - -#: client/lib/components/components.strings.js:82 -#: client/lib/models/models.strings.js:20 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 -msgid "Inventory Scripts" -msgstr "Scripts d’inventaire" - -#: client/lib/models/models.strings.js:25 -msgid "Inventory Sources" -msgstr "Source d'inventaire" - -#: client/features/templates/templates.strings.js:118 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:52 -#: client/src/workflow-results/workflow-results.controller.js:99 -msgid "Inventory Sync" -msgstr "Synchronisation des inventaires" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:55 -msgid "Inventory Sync Failures" -msgstr "Erreurs de synchronisation des inventaires" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:75 -msgid "Inventory Variables" -msgstr "Variables d’inventaire" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:72 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:67 -msgid "Inventory contains 0 hosts." -msgstr "L'inventaire contient 0 hôtes." - -#: client/features/output/output.strings.js:47 -msgid "Isolated" -msgstr "Isolé" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "JOB ID" -msgstr "ID JOB" - -#: client/features/output/output.strings.js:109 -msgid "JOB IS STILL RUNNING" -msgstr "JOB EN COURS" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:4 -msgid "JOB STATUS" -msgstr "ÉTAT DE LA TÂCHE" - -#: client/src/templates/job_templates/job-template.form.js:22 -msgid "JOB TEMPLATE" -msgstr "MODÈLES DE TÂCHE" - -#: client/features/portalMode/portalMode.strings.js:8 -#: client/features/templates/routes/organizationsTemplatesList.route.js:28 -#: client/features/templates/routes/projectsTemplatesList.route.js:29 -#: client/src/organizations/list/organizations-list.controller.js:83 -msgid "JOB TEMPLATES" -msgstr "MODÈLES DE TÂCHE " - -#: client/features/jobs/jobs.strings.js:8 -#: client/features/jobs/routes/instanceGroupJobs.route.js:13 -#: client/features/jobs/routes/instanceGroupJobs.route.js:75 -#: client/features/jobs/routes/instanceJobs.route.js:13 -#: client/features/jobs/routes/inventoryCompletedJobs.route.js:29 -#: client/features/jobs/routes/jobs.route.js:12 -#: client/features/portalMode/portalMode.strings.js:9 -#: client/src/activity-stream/get-target-title.factory.js:32 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:115 -#: client/src/instance-groups/instance-groups.strings.js:31 -msgid "JOBS" -msgstr "TÂCHES" - -#: client/lib/components/code-mirror/code-mirror.strings.js:14 -#: client/lib/services/base-string.service.js:73 -msgid "JSON" -msgstr "JSON" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:197 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:221 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:245 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:320 -msgid "JSON:" -msgstr "JSON :" - -#: client/features/jobs/jobs.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:118 -msgid "Job" -msgstr "Job" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Job Not Found" -msgstr "Job non trouvé" - -#: client/src/templates/job_templates/job-template.form.js:277 -msgid "Job Slicing" -msgstr "Découpage de job" - -#: client/features/output/output.strings.js:72 -#: client/features/templates/templates.strings.js:54 -#: client/src/templates/job_templates/job-template.form.js:206 -#: client/src/templates/job_templates/job-template.form.js:213 -msgid "Job Tags" -msgstr "Balises de tâche" - -#: client/features/jobs/jobs.strings.js:13 -#: client/features/output/output.strings.js:73 -#: client/features/templates/templates.strings.js:116 -#: client/features/templates/templates.strings.js:13 -#: client/src/templates/templates.list.js:61 -msgid "Job Template" -msgstr "Modèle de tâche" - -#: client/lib/models/models.strings.js:30 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:102 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:36 -#: client/src/projects/projects.form.js:334 -msgid "Job Templates" -msgstr "Modèles de tâche" - -#: client/features/output/output.strings.js:75 -#: client/features/templates/templates.strings.js:58 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:35 -#: client/src/templates/job_templates/job-template.form.js:47 -#: client/src/templates/job_templates/job-template.form.js:55 -msgid "Job Type" -msgstr "Type de tâche" - -#: client/src/workflow-results/workflow-results.service.js:100 -msgid "Job has completed. Unable to be canceled." -msgstr "Job complété. Impossible de l'annuler." - -#: client/features/output/output.strings.js:30 -msgid "Job is one of several from a JT that slices on inventory" -msgstr "Le job est un parmi tant d'autres que le Modèle de job découpe dans l'inventaire (au démarrage)." - -#: client/features/jobs/jobs.strings.js:20 -msgid "Job {{status}}. Click for details." -msgstr "Job {{status}}. Cliquez pour afficher les détails." - -#: client/features/templates/templates.strings.js:125 -#: client/lib/components/components.strings.js:71 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 -#: client/src/configuration/settings.partial.html:5 -#: client/src/instance-groups/instance-groups.strings.js:60 -msgid "Jobs" -msgstr "Tâches" - -#: client/features/output/output.strings.js:107 -#: client/features/templates/templates.strings.js:111 -#: client/src/workflow-results/workflow-results.controller.js:101 -msgid "KEY" -msgstr "CLÉ" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:61 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:153 -#: client/src/shared/smart-search/smart-search.partial.html:14 -msgid "Key" -msgstr "Clé" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:245 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:257 -msgid "Key Name:" -msgstr "Nom de la clé :" - -#: client/src/credential-types/credential-types.list.js:31 -#: client/src/credentials/credentials.list.js:33 -msgid "Kind" -msgstr "Genre" - -#: client/features/applications/applications.strings.js:31 -#: client/features/projects/projects.strings.js:12 -msgid "LAST MODIFIED" -msgstr "DERNIÈRE MODIFICATION" - -#: client/features/projects/projects.strings.js:13 -#: client/features/users/tokens/tokens.strings.js:38 -msgid "LAST USED" -msgstr "DERNIÈRE UTILISATION" - -#: client/features/templates/templates.strings.js:34 -#: client/lib/components/components.strings.js:112 -msgid "LAUNCH" -msgstr "LANCEMENT" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:94 -msgid "LDAP" -msgstr "LDAP" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:102 -msgid "LDAP 1 (Optional)" -msgstr "LDAP 1 (en option)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:103 -msgid "LDAP 2 (Optional)" -msgstr "LDAP 2 (en option)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:104 -msgid "LDAP 3 (Optional)" -msgstr "LDAP 3 (en option)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:105 -msgid "LDAP 4 (Optional)" -msgstr "LDAP 4 (en option)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:106 -msgid "LDAP 5 (Optional)" -msgstr "LDAP 5 (en option)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:18 -msgid "LDAP Server" -msgstr "Serveur LDAP" - -#: client/src/license/license.route.js:18 -msgid "LICENSE" -msgstr "LICENCE" - -#: client/features/output/output.strings.js:76 -#: client/src/templates/job_templates/job-template.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:244 -#: client/src/templates/templates.list.js:43 -#: client/src/templates/workflows.form.js:121 -#: client/src/templates/workflows.form.js:125 -#: client/src/workflow-results/workflow-results.controller.js:73 -msgid "Labels" -msgstr "Libellés" - -#: client/features/templates/templates.strings.js:22 -msgid "Last Modified" -msgstr "Dernière modification" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 -#: client/src/teams/teams.form.js:105 -#: client/src/users/users.form.js:35 -#: client/src/users/users.list.js:37 -msgid "Last Name" -msgstr "Nom" - -#: client/features/templates/templates.strings.js:23 -msgid "Last Ran" -msgstr "Dernière exécution" - -#: client/lib/services/base-string.service.js:134 -msgid "Last Run (Ascending)" -msgstr "Dernière exécution (croissant)" - -#: client/lib/services/base-string.service.js:135 -msgid "Last Run (Descending)" -msgstr "Dernière exécution (décroissant)" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:56 -msgid "Last Sync" -msgstr "Dernière synchronisation" - -#: client/src/projects/projects.list.js:62 -msgid "Last Updated" -msgstr "Dernière mise à jour" - -#: client/lib/services/base-string.service.js:136 -msgid "Last Used (Ascending)" -msgstr "Dernière utilisation (croissant)" - -#: client/lib/services/base-string.service.js:137 -msgid "Last Used (Descending)" -msgstr "Dernière utilisation (décroissant)" - -#: client/src/shared/form-generator.js:1402 -msgid "Last logged in:" -msgstr "Dernière connexion :" - -#: client/src/organizations/organizations.form.js:128 -msgid "Last name" -msgstr "Nom" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:33 -#: client/src/shared/form-generator.js:1660 -msgid "Launch" -msgstr "Lancer" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:49 -msgid "Launch Configuration" -msgstr "Lancement de la configuration" - -#: client/src/management-jobs/card/card.partial.html:21 -#: client/src/management-jobs/card/card.partial.html:24 -msgid "Launch Management Job" -msgstr "Lancer la tâche de gestion" - -#: client/features/jobs/jobs.strings.js:12 -#: client/features/output/output.strings.js:77 -#: client/src/workflow-results/workflow-results.controller.js:70 -msgid "Launched By" -msgstr "Lancé par" - -#: client/lib/services/base-string.service.js:146 -msgid "Launched By (Ascending)" -msgstr "Lancé par (croissant)" - -#: client/lib/services/base-string.service.js:147 -msgid "Launched By (Descending)" -msgstr "Lancé par (décroissant)" - -#: client/features/templates/templates.strings.js:42 -msgid "Launching this job requires the passwords listed below. Enter each password before continuing." -msgstr "Le lancement de cette tâche requiert les mots de passe figurant ci-dessous. Saisissez chaque mot de passe avant de continuer." - -#: client/features/users/tokens/tokens.strings.js:32 -msgid "Leaving this field blank will result in the creation of a Personal Access Token which is not linked to an Application." -msgstr "Si vous laissez ce champ vide, il sera créera un jeton d'accès personnalisé non lié à l'application." - -#: client/features/credentials/legacy.credentials.js:350 -msgid "Legacy state configuration for does not exist" -msgstr "Configuration inexistante de l'état hérité pour." - -#: client/lib/components/components.strings.js:98 -#: client/src/configuration/settings.partial.html:14 -#: client/src/license/license.controller.js:47 -#: client/src/license/license.partial.html:109 -#: client/src/license/license.partial.html:8 -msgid "License" -msgstr "Licence" - -#: client/features/output/output.strings.js:78 -msgid "License Error" -msgstr "Erreur de licence" - -#: client/src/license/license.partial.html:33 -msgid "License Key" -msgstr "Clé de licence" - -#: client/src/license/license.controller.js:49 -msgid "License Management" -msgstr "Gestion des licences" - -#: client/src/license/license.partial.html:21 -msgid "License Type" -msgstr "Type de licence" - -#: client/features/output/output.strings.js:79 -#: client/features/templates/templates.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:45 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:55 -#: client/src/templates/job_templates/job-template.form.js:175 -#: client/src/templates/job_templates/job-template.form.js:179 -#: client/src/templates/workflows.form.js:93 -#: client/src/templates/workflows.form.js:97 -msgid "Limit" -msgstr "Limite" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:255 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:268 -msgid "Limit to hosts having a tag:" -msgstr "Limite Hôtes qui ont une balise :" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:257 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:270 -msgid "Limit to hosts using either key pair:" -msgstr "Limite Hôtes qui ont n'importe paire de clés :" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "Limit to hosts where the Name tag begins with" -msgstr "Limite Hôtes qui ont une balise de nom commençant par" - -#: client/src/scheduler/scheduler.strings.js:51 -msgid "Limited to first 10" -msgstr "Limité aux 10 premiers" - -#: client/src/shared/socket/socket.service.js:225 -msgid "Live events: attempting to connect to the server." -msgstr "Événements en direct : tentative de connexion au serveur." - -#: client/src/shared/socket/socket.service.js:229 -msgid "Live events: connected. Pages containing job status information will automatically update in real-time." -msgstr "Événements en direct : connecté. Les pages contenant des informations sur l’état de la tâche seront automatiquement mises à jour en temps réel." - -#: client/src/shared/socket/socket.service.js:233 -msgid "Live events: error connecting to the server." -msgstr "Événements en direct : erreur de connexion au serveur." - -#: client/src/shared/form-generator.js:1935 -msgid "Loading..." -msgstr "Chargement en cours..." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:136 -#: client/src/scheduler/scheduler.strings.js:26 -msgid "Local Time Zone" -msgstr "Fuseau horaire local" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:588 -msgid "Local time" -msgstr "Heure locale" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:228 -msgid "Log aggregator test failed.
Detail:" -msgstr "Échec du test de l'agrégateur de journalisation.
Détails :" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:218 -msgid "Log aggregator test sent successfully." -msgstr "Envoi réussi du test de l'agrégateur de journalisation." - -#: client/lib/components/components.strings.js:67 -msgid "Logged in as" -msgstr "Connecté en tant que" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:85 -msgid "Logging" -msgstr "Journalisation" - -#: client/lib/components/components.strings.js:69 -#: client/lib/components/layout/layout.partial.html:39 -msgid "Logout" -msgstr "Déconnexion" - -#: client/src/shared/form-generator.js:1258 -msgid "Lookup field" -msgstr "Champ de recherche" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:35 -msgid "Low" -msgstr "Basse" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:15 -msgid "Low Risk" -msgstr "Risque faible" - -#: client/src/management-jobs/card/card.partial.html:6 -#: client/src/management-jobs/card/card.route.js:19 -msgid "MANAGEMENT JOBS" -msgstr "TÂCHES DE GESTION" - -#: client/src/instance-groups/instance-groups.strings.js:18 -msgid "MANUAL" -msgstr "MANUEL" - -#: client/features/credentials/credentials.strings.js:32 -msgid "METADATA" -msgstr "MÉTADONNÉES" - -#: client/src/scheduler/scheduler.strings.js:62 -msgid "MM" -msgstr "MM" - -#: client/features/output/output.strings.js:132 -msgid "MODULE" -msgstr "MODULE" - -#: client/features/portalMode/routes/portalModeTemplatesList.route.js:13 -msgid "MY VIEW" -msgstr "MON ÉCRAN" - -#: client/src/credentials/credentials.form.js:67 -msgid "Machine" -msgstr "Machine" - -#: client/features/output/output.strings.js:80 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:60 -msgid "Machine Credential" -msgstr "Informations d’identification de la machine" - -#: client/src/license/license.partial.html:240 -msgid "Managed Nodes" -msgstr "Nœuds gérés" - -#: client/lib/components/components.strings.js:84 -msgid "Management Jobs" -msgstr "Tâches de gestion" - -#: client/features/projects/projects.strings.js:20 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:45 -#: client/src/projects/edit/projects-edit.controller.js:126 -msgid "Manual projects do not require an SCM update" -msgstr "Les projets manuels ne nécessitent pas de mise à jour SCM" - -#: client/src/templates/job_templates/job-template.form.js:250 -#: client/src/templates/workflows.form.js:131 -msgid "Max 512 characters per label." -msgstr "512 caractères max par étiquette" - -#: client/src/organizations/organizations.form.js:59 -#: client/src/organizations/organizations.form.js:66 -msgid "Max Hosts" -msgstr "Nombre d'hôtes max." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:161 -msgid "Maximum" -msgstr "Maximum" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:119 -#: client/src/templates/survey-maker/shared/question-definition.form.js:140 -#: client/src/templates/survey-maker/shared/question-definition.form.js:98 -msgid "Maximum Length" -msgstr "Longueur maximale" - -#: client/src/login/loginModal/loginModal.partial.html:40 -msgid "Maximum per-user sessions reached. Please sign in." -msgstr "Nombre maximum de sessions par utilisateur atteintes. Veuillez vous connecter." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:181 -msgid "Maximum<" -msgstr "Maximum<" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:29 -msgid "Medium" -msgstr "Moyenne" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:14 -msgid "Medium Risk" -msgstr "Risque moyen" - -#: client/src/shared/stateDefinitions.factory.js:607 -msgid "Member" -msgstr "Membre" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:156 -#: client/src/templates/survey-maker/shared/question-definition.form.js:176 -msgid "Minimum" -msgstr "Minimum" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:113 -#: client/src/templates/survey-maker/shared/question-definition.form.js:134 -#: client/src/templates/survey-maker/shared/question-definition.form.js:92 -msgid "Minimum Length" -msgstr "Longueur minimale" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:83 -msgid "Misc. System" -msgstr "Système divers" - -#: client/src/templates/workflows.form.js:35 -msgid "Missing Job Templates found in the Workflow Editor" -msgstr "Modèles de Job manquants dans Workflow Editor" - -#: client/lib/services/base-string.service.js:130 -msgid "Modified (Ascending)" -msgstr "Modifié (croissant)" - -#: client/lib/services/base-string.service.js:131 -msgid "Modified (Descending)" -msgstr "Modifié (décroissant)" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:22 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:30 -msgid "Module" -msgstr "Module" - -#: client/features/output/output.strings.js:81 -msgid "Module Args" -msgstr "Args de module" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:414 -#: client/src/scheduler/scheduler.strings.js:37 -msgid "Mon" -msgstr "Lun." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:25 -msgid "Most recent job failed. Click to view jobs." -msgstr "Échec de la dernière tâche. Cliquez pour afficher les jobs." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:29 -msgid "Most recent job successful. Click to view jobs." -msgstr "Réussite de la dernière tâche. Cliquez pour afficher les jobs." - -#: client/src/templates/survey-maker/surveys/init.factory.js:17 -msgid "Multiple Choice (multiple select)" -msgstr "Options à choix multiples (sélection multiple)" - -#: client/src/templates/survey-maker/surveys/init.factory.js:16 -msgid "Multiple Choice (single select)" -msgstr "Options à choix multiples (une seule sélection)" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:77 -msgid "Multiple Choice Options" -msgstr "Options à choix multiples." - -#: client/features/portalMode/index.view.html:26 -msgid "My Jobs" -msgstr "Mes tâches" - -#: client/lib/components/components.strings.js:73 -msgid "My View" -msgstr "Ma vue" - -#: client/features/applications/applications.strings.js:24 -msgid "NAME" -msgstr "NOM" - -#: client/features/applications/applications.strings.js:20 -msgid "NEW APPLICATION" -msgstr "NOUVELLE APPLICATION" - -#: client/features/credentials/credentials.strings.js:40 -msgid "NEW CREDENTIAL" -msgstr "NOUVELLE INFORMATION D'IDENTIFICATION" - -#: client/src/credential-types/credential-types.form.js:16 -msgid "NEW CREDENTIAL TYPE" -msgstr "NOUVEAU TYPE D'INFORMATION D'IDENTIFICATION" - -#: client/src/inventory-scripts/inventory-scripts.form.js:16 -msgid "NEW CUSTOM INVENTORY" -msgstr "NOUVEL INVENTAIRE PERSONNALISÉ" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:17 -msgid "NEW INVENTORY" -msgstr "NOUVEL INVENTAIRE" - -#: client/src/templates/job_templates/job-template.form.js:19 -msgid "NEW JOB TEMPLATE" -msgstr "NOUVEAU MODÈLE DE TÂCHE" - -#: client/src/notifications/notificationTemplates.form.js:16 -msgid "NEW NOTIFICATION TEMPLATE" -msgstr "NOUVEAU MODÈLE DE NOTIFICATION" - -#: client/src/organizations/organizations.form.js:18 -msgid "NEW ORGANIZATION" -msgstr "NOUVELLE ORGANISATION" - -#: client/src/projects/projects.form.js:17 -msgid "NEW PROJECT" -msgstr "NOUVEAU PROJET" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:10 -msgid "NEW SMART INVENTORY" -msgstr "NOUVEL INVENTAIRE SMART" - -#: client/src/teams/teams.form.js:16 -msgid "NEW TEAM" -msgstr "NOUVELLE ÉQUIPE" - -#: client/src/users/users.form.js:16 -msgid "NEW USER" -msgstr "NOUVEL UTILISATEUR" - -#: client/src/templates/workflows.form.js:17 -msgid "NEW WORKFLOW JOB TEMPLATE" -msgstr "MODÈLE DE NOUVEAU FLUX DE TRAVAIL" - -#: client/lib/services/base-string.service.js:67 -msgid "NEXT" -msgstr "SUIVANT" - -#: client/src/inventories-hosts/hosts/hosts.partial.html:38 -msgid "NO HOSTS HAVE BEEN CREATED" -msgstr "AUCUN HÔTE CRÉÉ" - -#: client/features/output/output.strings.js:142 -msgid "NO JOBS FINISHED" -msgstr "AUCUN JOB TERMINÉ" - -#: client/lib/components/components.strings.js:40 -msgid "NO OPTIONS AVAILABLE" -msgstr "AUCUNE OPTION DISPONIBLE" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:117 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:120 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:123 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:127 -msgid "NONE SELECTED" -msgstr "AUCUN(E) SÉLECTIONNÉ(E)" - -#: client/src/projects/projects.form.js:139 -msgid "NOTE: This field assumes the remote name is \"origin\"." -msgstr "REMARQUE : ce champ suppose que le nom distant est \"origin\"." - -#: client/src/login/loginModal/loginModal.partial.html:101 -msgid "NOTICE" -msgstr "ENVOI D’INFOS" - -#: client/src/notifications/notificationTemplates.form.js:21 -msgid "NOTIFICATION TEMPLATE" -msgstr "MODÈLE DE NOTIFICATION" - -#: client/src/activity-stream/get-target-title.factory.js:26 -#: client/src/notifications/notificationTemplates.list.js:14 -msgid "NOTIFICATION TEMPLATES" -msgstr "MODÈLES DE NOTIFICATION" - -#: client/lib/components/components.strings.js:131 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js:9 -#: client/src/management-jobs/notifications/notification.route.js:46 -#: client/src/notifications/main.js:44 -#: client/src/notifications/main.js:95 -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "NOTIFICATIONS" -msgstr "NOTIFICATIONS" - -#: client/features/output/output.strings.js:82 -#: client/src/credential-types/credential-types.form.js:27 -#: client/src/credential-types/credential-types.list.js:24 -#: client/src/credentials/credentials.form.js:32 -#: client/src/credentials/credentials.list.js:26 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:15 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:15 -#: client/src/instance-groups/instance-groups.list.js:15 -#: client/src/inventories-hosts/hosts/host.list.js:68 -#: client/src/inventories-hosts/inventories/inventory.list.js:52 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:33 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:37 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:21 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:28 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:45 -#: client/src/inventory-scripts/inventory-scripts.form.js:28 -#: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 -#: client/src/notifications/notificationTemplates.form.js:32 -#: client/src/notifications/notificationTemplates.list.js:37 -#: client/src/notifications/notifications.list.js:27 -#: client/src/organizations/organizations.form.js:26 -#: client/src/projects/projects.form.js:30 -#: client/src/projects/projects.list.js:43 -#: client/src/scheduler/scheduled-jobs.list.js:36 -#: client/src/scheduler/scheduler.strings.js:21 -#: client/src/scheduler/schedules.list.js:48 -#: client/src/teams/teams.form.js:135 -#: client/src/teams/teams.form.js:28 -#: client/src/teams/teams.list.js:23 -#: client/src/templates/job_templates/job-template.form.js:34 -#: client/src/templates/templates.list.js:24 -#: client/src/templates/workflows.form.js:42 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:119 -#: client/src/users/users.form.js:143 -#: client/src/users/users.form.js:171 -#: client/src/users/users.form.js:199 -msgid "Name" -msgstr "Nom" - -#: client/lib/services/base-string.service.js:126 -msgid "Name (Ascending)" -msgstr "Nom (croissant)" - -#: client/lib/services/base-string.service.js:127 -msgid "Name (Descending)" -msgstr "Nom (décroissant)" - -#: client/lib/components/layout/layout.partial.html:4 -msgid "Navigate to dashboard" -msgstr "Naviguer vers le tableau de bord" - -#: client/features/output/details.partial.html:244 -msgid "Navigate to inventory sync job" -msgstr "Naviguer vers la tâche de synchronisation des inventaires" - -#: client/features/output/details.partial.html:212 -msgid "Navigate to project sync job" -msgstr "Naviguer vers la tâche de synchronisation des projets" - -#: client/features/output/details.partial.html:164 -msgid "Navigate to workflow job" -msgstr "Naviguer vers la tâche de flux de travail" - -#: client/src/credentials/credentials.form.js:71 -msgid "Network" -msgstr "Réseau" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:70 -msgid "New Group" -msgstr "Nouveau groupe" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:147 -msgid "New Host" -msgstr "Nouvel hôte" - -#: client/src/users/add/users-add.controller.js:93 -msgid "New user successfully created!" -msgstr "Création de l’utilisateur réussie" - -#: client/src/scheduler/scheduled-jobs.list.js:56 -#: client/src/scheduler/schedules.list.js:58 -msgid "Next Run" -msgstr "Exécution suivante" - -#: client/src/credentials/credentials.list.js:21 -msgid "No Credentials Have Been Created" -msgstr "Informations d’identification non créées" - -#: client/features/templates/templates.strings.js:74 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:15 -msgid "No Credentials Matching This Type Have Been Created" -msgstr "Aucune information d'identification correspondant à ce type n'a été créée" - -#: client/features/output/host-event/host-event-codemirror.partial.html:3 -msgid "No JSON data returned by the module" -msgstr "Aucune donnée JSON retournée par ce module" - -#: client/src/license/license.controller.js:158 -msgid "No Licenses Found" -msgstr "Aucune licence trouvée" - -#: client/src/projects/projects.list.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:64 -msgid "No Projects Have Been Created" -msgstr "Projets non créés" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:50 -msgid "No Remediation Playbook Available" -msgstr "Playbook de remédiation indisponible" - -#: client/features/projects/projects.strings.js:32 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "No SCM Configuration" -msgstr "Aucune configuration SCM" - -#: client/features/projects/projects.strings.js:38 -#: client/src/projects/factories/get-project-tool-tip.factory.js:9 -msgid "No SCM updates have run for this project" -msgstr "Aucune mise à jour SCM n’a été exécutée pour ce projet" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:17 -msgid "No Teams exist" -msgstr "Aucune équipe existante" - -#: client/features/projects/projects.strings.js:29 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "No Updates Available" -msgstr "Aucune mise à jour disponible" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:18 -msgid "No Users to add" -msgstr "Aucun utilisateur à ajouter" - -#: client/features/credentials/credentials.strings.js:36 -msgid "No credential selected" -msgstr "Aucune information d'identification sélectionnée" - -#: client/features/templates/templates.strings.js:37 -msgid "No credentials selected" -msgstr "Aucune valeur d'identification sélectionnée" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:63 -msgid "No data is available. There are no issues to report." -msgstr "Aucune donnée disponible : aucun problème à signaler." - -#: client/features/credentials/credentials.strings.js:34 -msgid "No external credentials available." -msgstr "Aucune information d'identification externe disponible." - -#: client/src/license/license.controller.js:44 -msgid "No file selected." -msgstr "Aucun fichier sélectionné." - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js:48 -msgid "No groups to add" -msgstr "Aucun groupe à ajouter" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js:45 -msgid "No hosts to add" -msgstr "Aucun hôte à ajouter" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:68 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:64 -msgid "No hosts with failures. Click for details." -msgstr "Aucun hôte avec des échecs. Cliquez pour obtenir plus d'informations." - -#: client/features/templates/templates.strings.js:38 -msgid "No inventory selected" -msgstr "Aucun inventaire sélectionné" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:51 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:52 -msgid "No inventory sync failures. Click for details." -msgstr "Aucun échec de synchronisation d'inventaire. Cliquez pour obtenir plus d'informations." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:16 -msgid "No job data" -msgstr "Aucune donnée de tâche" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:75 -msgid "No job data available." -msgstr "Aucune donnée de tâche disponible." - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:54 -msgid "No job templates were recently used." -msgstr "Aucun modèle de tâche utilisé récemment." - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:51 -msgid "No jobs were recently run." -msgstr "Aucune tâche récemment exécutée." - -#: client/src/teams/teams.form.js:132 -#: client/src/users/users.form.js:196 -msgid "No permissions have been granted" -msgstr "Aucune permission accordée" - -#: client/features/templates/templates.strings.js:147 -msgid "No promptable values were provided when this node was created." -msgstr "Aucune valeur d'invite n'a été fournie quand le nœud a été créé." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:17 -msgid "No recent job data available for this host." -msgstr "Aucune donnée de job récent n'est disponible pour cet hôte." - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:98 -msgid "No recent job data available for this inventory." -msgstr "Aucune donnée de job récente n'est disponible pour cet inventaire." - -#: client/src/notifications/notification-templates-list/list.controller.js:86 -msgid "No recent notifications." -msgstr "Aucun notification récente." - -#: client/features/credentials/credentials.strings.js:33 -#: client/src/inventories-hosts/hosts/hosts.partial.html:36 -#: client/src/shared/form-generator.js:1833 -#: client/src/shared/list-generator/list-generator.factory.js:240 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:25 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:62 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:92 -msgid "No records matched your search." -msgstr "Aucun enregistrement ne correspond à votre demande." - -#: client/features/output/output.strings.js:133 -msgid "No result found" -msgstr "Aucun résultat trouvé" - -#: client/src/scheduler/scheduled-jobs.list.js:16 -msgid "No schedules exist" -msgstr "Aucune planification existante" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:71 -msgid "No sync data" -msgstr "Aucunes données synchronisées" - -#: client/src/organizations/linkout/addUsers/addUsers.controller.js:60 -msgid "No users available to add as adminstrators" -msgstr "Aucun utilisateur disponible à ajouter en tant qu'administrateur" - -#: client/src/users/add/users-add.controller.js:10 -#: client/src/users/edit/users-edit.controller.js:10 -#: client/src/users/list/users-list.controller.js:10 -msgid "Normal User" -msgstr "Utilisateur normal" - -#: client/features/output/output.strings.js:48 -#: client/src/workflow-results/workflow-results.controller.js:84 -msgid "Not Finished" -msgstr "Non terminé" - -#: client/features/output/output.strings.js:49 -#: client/src/workflow-results/workflow-results.controller.js:85 -msgid "Not Started" -msgstr "Non démarré" - -#: client/features/projects/projects.strings.js:37 -msgid "Not configured for SCM" -msgstr "Non configuré pour le SCM" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:58 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:56 -msgid "Not configured for inventory sync." -msgstr "Non configuré pour la synchronisation de l'inventaire." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -msgid "Note that only hosts directly in this group can be disassociated. Hosts in sub-groups must be disassociated directly from the sub-group level that they belong." -msgstr "Notez que seuls les hôtes qui sont directement dans ce groupe peuvent être dissociés. Les hôtes qui se trouvent dans les sous-groupes doivent être dissociés directement au niveau du sous-groupe auquel ils appartiennent." - -#: client/src/notifications/notificationTemplates.form.js:371 -#: client/src/notifications/notificationTemplates.form.js:372 -#: client/src/notifications/notificationTemplates.form.js:568 -#: client/src/notifications/notificationTemplates.form.js:569 -msgid "Notification Color" -msgstr "Couleur des notifications" - -#: client/src/notifications/notification-templates-list/list.controller.js:140 -msgid "Notification Failed." -msgstr "Échec de notification" - -#: client/src/notifications/notificationTemplates.form.js:360 -msgid "Notification Label" -msgstr "Étiquette de notification" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 -msgid "Notification Templates" -msgstr "Modèles de notification" - -#: client/src/notifications/notification-templates-list/list.controller.js:157 -msgid "Notification timed out." -msgstr "La notification a expiré." - -#: client/lib/components/components.strings.js:83 -#: client/src/management-jobs/notifications/notification.route.js:21 -#: client/src/notifications/notifications.list.js:17 -msgid "Notifications" -msgstr "Notifications" - -#: client/src/notifications/notificationTemplates.form.js:385 -msgid "Notify Channel" -msgstr "Canal de notification" - -#: client/lib/services/base-string.service.js:71 -msgid "OFF" -msgstr "DÉSACTIVÉ" - -#: client/index.template.ejs:71 -#: client/lib/services/base-string.service.js:65 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -msgid "OK" -msgstr "OK" - -#: client/lib/services/base-string.service.js:70 -msgid "ON" -msgstr "ACTIVÉ" - -#: client/lib/components/components.strings.js:10 -msgid "OPTIONS" -msgstr "OPTIONS" - -#: client/src/license/license.partial.html:121 -msgid "OR" -msgstr "OU" - -#: client/features/applications/applications.strings.js:30 -msgid "ORG" -msgstr "ORG" - -#: client/features/projects/projects.strings.js:11 -msgid "ORGANIZATION" -msgstr "ORGANISATION" - -#: client/src/activity-stream/get-target-title.factory.js:29 -#: client/src/organizations/list/organizations-list.partial.html:6 -#: client/src/organizations/main.js:51 -msgid "ORGANIZATIONS" -msgstr "ORGANISATIONS" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:507 -msgid "Occurrence(s)" -msgstr "Occurrence(s)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:567 -#: client/src/scheduler/scheduler.strings.js:45 -msgid "Occurrences" -msgstr "Occurrences" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:396 -msgid "On Days" -msgstr "Tels jours" - -#: client/features/templates/templates.strings.js:113 -#: client/src/workflow-results/workflow-results.controller.js:96 -msgid "On Failure" -msgstr "En cas d'échec" - -#: client/features/templates/templates.strings.js:112 -#: client/src/workflow-results/workflow-results.controller.js:95 -msgid "On Success" -msgstr "En cas de succès" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:156 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:161 -msgid "Only Group By" -msgstr "Grouper seulement par" - -#: client/src/templates/job_templates/multi-credential/multi-credential.partial.html:4 -msgid "Open credential lookup" -msgstr "Ouvrir la recherche d'informations d'identification" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:42 -msgid "Open host filter" -msgstr "Ouvrir le filtre d'hôte" - -#: client/src/shared/instance-groups-multiselect/instance-groups.partial.html:3 -msgid "Open instance groups" -msgstr "Ouvrir les groupes d'instances" - -#: client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html:4 -msgid "Open webhook credential lookup" -msgstr "Ouvrir la recherche d'informations d'identification de webhook" - -#: client/src/credentials/credentials.form.js:378 -msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" -msgstr "Les domaines OpenStack définissent les limites administratives. Ils sont nécessaires seulement pour les URL d’authentification Keystone v3. Les scénarios courants incluent :" - -#: client/src/templates/job_templates/job-template.form.js:246 -#: client/src/templates/workflows.form.js:127 -msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs." -msgstr "Libellés facultatifs décrivant ce modèle de job, par exemple 'dev' ou 'test'. Les libellés peuvent être utilisés pour regrouper et filtrer les modèles de job et les jobs terminés." - -#: client/src/templates/job_templates/job-template.form.js:472 -msgid "Optionally, select the credential to use to send status updates back to the webhook service" -msgstr "En option, sélectionnez les informations d’identification à utiliser pour renvoyer les mises à jour de statut au service webhook" - -#: client/src/templates/workflows.form.js:245 -msgid "Optionally, select the credential to use to send status updates back to the webhook service." -msgstr "En option, sélectionnez les informations d'identification à utiliser pour renvoyer les mises à jour de statut au service webhook." - -#: client/src/partials/logviewer.html:7 -#: client/src/templates/job_templates/job-template.form.js:317 -#: client/src/templates/workflows.form.js:153 -msgid "Options" -msgstr "Options" - -#: client/features/applications/add-applications.controller.js:31 -#: client/features/templates/templates.strings.js:16 -#: client/src/credentials/credentials.form.js:46 -#: client/src/credentials/credentials.form.js:53 -#: client/src/inventories-hosts/inventories/inventory.list.js:65 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:33 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:40 -#: client/src/inventory-scripts/inventory-scripts.list.js:27 -#: client/src/notifications/notificationTemplates.form.js:44 -#: client/src/projects/projects.form.js:42 -#: client/src/projects/projects.form.js:48 -#: client/src/teams/teams.form.js:40 -#: client/src/teams/teams.list.js:30 -#: client/src/templates/workflows.form.js:55 -#: client/src/templates/workflows.form.js:61 -#: client/src/users/users.form.js:41 -msgid "Organization" -msgstr "Organisation" - -#: client/lib/services/base-string.service.js:152 -msgid "Organization (Ascending)" -msgstr "Organisation (croissant)" - -#: client/lib/services/base-string.service.js:153 -msgid "Organization (Descending)" -msgstr "Organisation (décroissant)" - -#: client/lib/components/components.strings.js:79 -#: client/lib/models/models.strings.js:35 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:135 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:64 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 -#: client/src/users/users.form.js:133 -msgid "Organizations" -msgstr "Organisations" - -#: client/features/templates/templates.strings.js:31 -msgid "Other Prompts" -msgstr "Autres invites" - -#: client/src/credentials/credentials.form.js:79 -msgid "Others (Cloud Providers)" -msgstr "Autres (fournisseurs cloud)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:316 -msgid "Override variables found in azure_rm.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Remplacer les variables qui se trouvent dans azure_rm.ini et qui sont utilisées par le script de mise à jour de l'inventaire. Pour obtenir une description détaillée de ces variables" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:282 -msgid "" -"Override variables found in cloudforms.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view cloudforms.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Remplacez les variables qui se trouvent dans cloudforms.ini et qui sont utilisées par le script de mise à jour de l'inventaire. Voici un exemple de configuration de variable\n" -" \n" -" voir cloudforms.ini dans Ansible Collections github repo.\n" -" Entrez les variables d’inventaire avec la syntaxe JSON ou YAML. Utilisez le bouton radio pour basculer entre les deux. Consultez la documentation d’Ansible Tower pour avoir un exemple de syntaxe." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:217 -msgid "Override variables found in ec2.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Remplacer les variables qui se trouvent dans ec2.ini et qui sont utilisées par le script de mise à jour de l'inventaire. Pour obtenir une description détaillée de ces variables" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:299 -msgid "" -"Override variables found in foreman.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view foreman.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Remplacez les variables qui se trouvent dans foreman.ini et qui sont utilisées par le script de mise à jour de l'inventaire. Voici un exemple de configuration de variable\n" -" \n" -" voir foreman.ini dans Ansible le référentiel github repo. Entrez les variables d’inventaire avec la syntaxe JSON ou YAML. Utilisez le bouton radio pour basculer entre les deux. Consultez la documentation d’Ansible Tower pour avoir un exemple de syntaxe." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:265 -msgid "" -"Override variables found in openstack.yml and used by the inventory update script. For an example variable configuration\n" -" \n" -" view openstack.yml in the Openstack github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Remplacez les variables qui se trouvent dans openstack.yml et qui sont utilisées par le script de mise à jour de l'inventaire. Voici un exemple de configuration de variable\n" -" \n" -" voir openstack.yml dans le référentiel Ansible github repo. Entrez les variables d’inventaire avec la syntaxe JSON ou YAML. Utilisez le bouton radio pour basculer entre les deux. Consultez la documentation d’Ansible Tower pour avoir un exemple de syntaxe." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:241 -msgid "Override variables found in vmware.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Remplacer les variables qui se trouvent dans vmware.ini et qui sont utilisées par le script de mise à jour de l'inventaire. Pour obtenir une description détaillée de ces variables" - -#: client/features/output/output.strings.js:83 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:350 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:355 -msgid "Overwrite" -msgstr "Remplacer" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:361 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:366 -msgid "Overwrite Variables" -msgstr "Remplacer les variables" - -#: client/features/output/output.strings.js:84 -msgid "Overwrite Vars" -msgstr "Remplacer Vars" - -#: client/src/credentials/credentials.list.js:40 -msgid "Owners" -msgstr "Propriétaires" - -#: client/src/license/license.partial.html:136 -#: client/src/login/loginModal/loginModal.partial.html:80 -msgid "PASSWORD" -msgstr "MOT DE PASSE" - -#: client/features/credentials/legacy.credentials.js:117 -msgid "PERMISSIONS" -msgstr "PERMISSIONS" - -#: client/features/output/output.strings.js:130 -msgid "PLAY" -msgstr "LECTURE" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:146 -msgid "PLAYBOOK" -msgstr "PLAYBOOK" - -#: client/src/partials/survey-maker-modal.html:42 -msgid "PLEASE ADD A SURVEY PROMPT." -msgstr "VEUILLEZ AJOUTER UNE INVITE AU QUESTIONNAIRE." - -#: client/src/organizations/list/organizations-list.partial.html:38 -#: client/src/shared/form-generator.js:1839 -#: client/src/shared/list-generator/list-generator.factory.js:248 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:27 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:94 -msgid "PLEASE ADD ITEMS TO THIS LIST" -msgstr "AJOUTEZ DES ÉLÉMENTS À CETTE LISTE" - -#: client/src/notifications/add/add.controller.js:106 -#: client/src/notifications/edit/edit.controller.js:160 -msgid "POST" -msgstr "PUBLICATION" - -#: client/src/partials/survey-maker-modal.html:40 -msgid "PREVIEW" -msgstr "PRÉVISUALISATION" - -#: client/src/workflow-results/workflow-results.service.js:105 -msgid "PROCEED" -msgstr "CONTINUER" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:142 -msgid "PROJECT" -msgstr "PROJET" - -#: client/features/projects/projects.strings.js:8 -#: client/features/projects/routes/projectsList.route.js:13 -#: client/src/activity-stream/get-target-title.factory.js:8 -#: client/src/organizations/linkout/organizations-linkout.route.js:182 -#: client/src/organizations/list/organizations-list.controller.js:76 -#: client/src/projects/projects.list.js:14 -#: client/src/projects/projects.list.js:15 -msgid "PROJECTS" -msgstr "PROJETS" - -#: client/features/templates/templates.strings.js:30 -msgid "PROMPT" -msgstr "INVITE" - -#: client/src/notifications/add/add.controller.js:107 -#: client/src/notifications/edit/edit.controller.js:161 -msgid "PUT" -msgstr "PLACER" - -#: client/src/shared/paginate/paginate.partial.html:33 -msgid "Page" -msgstr "Page" - -#: client/src/notifications/notificationTemplates.form.js:252 -msgid "Pagerduty subdomain" -msgstr "Sous-domaine Pagerduty" - -#: client/src/templates/job_templates/job-template.form.js:486 -msgid "Pass extra command line variables to the playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "Transmettez des variables de ligne de commandes supplémentaires au playbook. Fournir la paire clé/valeur en utilisant YAML ou JSON. Consulter la documentation Ansible Tower pour obtenir des exemples de syntaxe." - -#: client/src/templates/workflows.form.js:142 -msgid "Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "Transmettez des variables de ligne de commandes supplémentaires au playbook. Voici le paramètre de ligne de commande -e or --extra-vars pour ansible-playbook. Fournir la paire clé/valeur en utilisant YAML ou JSON. Consulter la documentation Ansible Tower pour obtenir des exemples de syntaxe." - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:139 -msgid "Pass extra command line variables. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." -msgstr "Transmettez des variables de ligne de commande supplémentaires. Il s'agit du paramètre de ligne de commande %s ou %s pour %s. Entrez des paires clé/valeur avec la syntaxe YAML ou JSON." - -#: client/src/credentials/credentials.form.js:226 -#: client/src/credentials/factories/become-method-change.factory.js:21 -#: client/src/credentials/factories/become-method-change.factory.js:40 -#: client/src/credentials/factories/become-method-change.factory.js:48 -#: client/src/credentials/factories/become-method-change.factory.js:68 -#: client/src/credentials/factories/become-method-change.factory.js:78 -#: client/src/credentials/factories/become-method-change.factory.js:88 -#: client/src/credentials/factories/kind-change.factory.js:104 -#: client/src/credentials/factories/kind-change.factory.js:124 -#: client/src/credentials/factories/kind-change.factory.js:134 -#: client/src/credentials/factories/kind-change.factory.js:144 -#: client/src/credentials/factories/kind-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:77 -#: client/src/credentials/factories/kind-change.factory.js:96 -#: client/src/notifications/shared/type-change.service.js:31 -#: client/src/templates/survey-maker/surveys/init.factory.js:15 -#: client/src/users/users.form.js:69 -msgid "Password" -msgstr "Mot de passe" - -#: client/src/credentials/factories/kind-change.factory.js:57 -msgid "Password (API Key)" -msgstr "Mot de passe (clé API)" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:23 -msgid "Past 24 Hours" -msgstr "Après 24 heures" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:16 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:29 -msgid "Past Month" -msgstr "Le mois dernier" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:26 -msgid "Past Week" -msgstr "La semaine dernière" - -#: client/src/credentials/factories/become-method-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:85 -msgid "Paste the contents of the PEM file associated with the service account email." -msgstr "Collez le contenu du fichier PEM associé à l’adresse électronique du compte de service." - -#: client/src/credentials/factories/kind-change.factory.js:50 -msgid "Paste the contents of the SSH private key file." -msgstr "Collez le contenu du fichier de clé privée SSH." - -#: client/src/credentials/factories/kind-change.factory.js:25 -msgid "Paste the contents of the SSH private key file.%s or click to close%s" -msgstr "Collez le contenu du fichier de clé privée SSH.%s ou cliquez pour fermer%s" - -#: client/src/inventories-hosts/inventories/inventory.list.js:133 -#: client/src/shared/list-generator/list-generator.factory.js:415 -msgid "Pending Delete" -msgstr "En attente de suppression" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js:60 -msgid "Perform a search above to define a host filter" -msgstr "Effectuez une recherche ci-dessus pour définir un filtre d'hôte" - -#: client/lib/components/components.strings.js:49 -msgid "Perform lookup" -msgstr "Effectuer une recherche" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:8 -msgid "Period" -msgstr "Période" - -#: client/src/projects/add/projects-add.controller.js:35 -#: client/src/templates/main.js:128 -#: client/src/templates/main.js:367 -#: client/src/users/add/users-add.controller.js:45 -msgid "Permission Error" -msgstr "Erreur de permission" - -#: client/features/credentials/credentials.strings.js:14 -#: client/features/credentials/legacy.credentials.js:63 -#: client/src/credentials/credentials.form.js:438 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:104 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:101 -#: client/src/organizations/organizations.form.js:143 -#: client/src/projects/projects.form.js:278 -#: client/src/teams/teams.form.js:128 -#: client/src/templates/job_templates/job-template.form.js:532 -#: client/src/templates/workflows.form.js:287 -#: client/src/users/users.form.js:192 -msgid "Permissions" -msgstr "Permissions" - -#: client/features/users/tokens/tokens.strings.js:41 -msgid "Personal Access Token" -msgstr "Jeton d'accès personnel" - -#: client/features/output/output.strings.js:85 -#: client/src/shared/form-generator.js:1044 -#: client/src/templates/job_templates/job-template.form.js:123 -#: client/src/templates/job_templates/job-template.form.js:134 -msgid "Playbook" -msgstr "Playbook" - -#: client/src/projects/projects.form.js:91 -msgid "Playbook Directory" -msgstr "Répertoire de playbooks" - -#: client/features/templates/templates.strings.js:70 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:58 -msgid "Playbook Run" -msgstr "Exécution du playbook" - -#: client/features/output/output.strings.js:117 -msgid "Plays" -msgstr "Lancements" - -#: client/lib/components/components.strings.js:116 -msgid "Please add items to this list." -msgstr "Veuillez ajouter des éléments à cette liste." - -#: client/src/users/users.form.js:127 -msgid "Please add user to an Organization." -msgstr "Veuillez ajouter un utilisateur à votre organisation." - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:99 -msgid "Please assign roles to the selected resources" -msgstr "Veuillez allouer des rôles aux ressources sélectionnées" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:60 -msgid "Please assign roles to the selected users/teams" -msgstr "Veuillez allouer des rôles aux utilisateurs / équipes sélectionnées" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "Please check the server and make sure the directory exists and file permissions are set correctly." -msgstr "Veuillez vérifier le serveur, s'assurer que le répertoire existe bien et que les permissions d'accès aux fichiers sont définies correctement." - -#: client/features/templates/templates.strings.js:144 -msgid "Please click on an available node to form a new link." -msgstr "Veuillez cliquer sur un nœud disponible pour former un nouveau lien." - -#: client/src/license/license.partial.html:91 -msgid "Please click the button below to visit Ansible's website to get a Tower license key." -msgstr "Cliquez sur le bouton ci-dessous pour visiter le site Web d'Ansible afin d'obtenir une clé de licence Tower." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:40 -msgid "Please click the icon to edit the host filter." -msgstr "Cliquez sur l'icône pour modifier le filtre de l'hôte." - -#: client/features/templates/templates.strings.js:126 -msgid "Please click the start button to build your workflow." -msgstr "Veuillez cliquer sur le bouton de démarrage pour créer votre workflow." - -#: client/lib/services/base-string.service.js:98 -msgid "Please confirm that you would like to remove {{ role }} access from the team {{ name }}. This will affect all members of the team. If you would like to only remove access for this particular user, please remove them from the team." -msgstr "Veuillez confirmer que vous souhaitez supprimer l'accès {{ role }} de l'équipe {{ name }}. Ceci affectera tous les membres de l'équipe. Si vous ne souhaitez supprimer l'accès que pour cet utilisateur particulier, veuillez le retirer de l'équipe." - -#: client/lib/services/base-string.service.js:104 -msgid "Please confirm that you would like to remove {{ role }} access from {{ name }}." -msgstr "Veuillez confirmer que vous souhaitez supprimer l'accès {{ role }} de {{ name }}." - -#: client/src/shared/form-generator.js:833 -#: client/src/shared/form-generator.js:925 -msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." -msgstr "Veuillez saisir une URL commençant par ssh, http ou https. L’URL ne doit pas contenir le caractère '@'." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:183 -msgid "Please enter a larger float." -msgstr "Veuillez saisir une valeur de flottement supérieure." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:163 -msgid "Please enter a larger integer." -msgstr "Veuillez saisir un entier relatif plus élevé." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:246 -msgid "Please enter a maximum default of {{float_max}}." -msgstr "Veuillez saisir une valeur maximum par défaut de {{float_max}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:232 -msgid "Please enter a maximum default of {{int_max}}." -msgstr "Veuillez saisir une valeur maximum par défaut de {{int_max}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:245 -msgid "Please enter a minimum default of {{float_min}}." -msgstr "Veuillez saisir une valeur maximum par défaut de {{float_min}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:231 -msgid "Please enter a minimum default of {{int_min}}." -msgstr "Veuillez saisir une valeur minimum par défaut de {{int_min}}." - -#: client/src/shared/form-generator.js:1134 -msgid "Please enter a number greater than %d and less than %d." -msgstr "Entrez un nombre supérieur à %d et inférieur à %d." - -#: client/src/shared/form-generator.js:1136 -msgid "Please enter a number greater than %d." -msgstr "Entrez un nombre supérieur à %d." - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:151 -msgid "Please enter a number greater than or equal to 0." -msgstr "Entrez un nombre égal ou supérieur à 0." - -#: client/src/shared/form-generator.js:1128 -msgid "Please enter a number." -msgstr "Entrez un nombre." - -#: client/features/templates/templates.strings.js:43 -#: client/src/login/loginModal/loginModal.partial.html:90 -msgid "Please enter a password." -msgstr "Entrez un mot de passe." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:178 -msgid "Please enter a smaller float." -msgstr "Saisir une valeur de flottement inférieure." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:158 -msgid "Please enter a smaller integer." -msgstr "Veuillez saisir un entier relatif plus petit." - -#: client/src/login/loginModal/loginModal.partial.html:70 -msgid "Please enter a username." -msgstr "Entrez un nom d’utilisateur." - -#: client/src/shared/form-generator.js:823 -#: client/src/shared/form-generator.js:915 -msgid "Please enter a valid email address." -msgstr "Entrez une adresse électronique valide." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:177 -#: client/src/templates/survey-maker/shared/question-definition.form.js:182 -#: client/src/templates/survey-maker/shared/question-definition.form.js:244 -msgid "Please enter a valid float." -msgstr "Veuillez saisir une valeur de flottement valide." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:157 -#: client/src/templates/survey-maker/shared/question-definition.form.js:162 -#: client/src/templates/survey-maker/shared/question-definition.form.js:230 -msgid "Please enter a valid integer." -msgstr "Veuillez saisir un entier relatif valide." - -#: client/lib/components/components.strings.js:15 -#: client/src/shared/form-generator.js:818 -#: client/src/shared/form-generator.js:910 -#: client/src/shared/form-generator.js:982 -msgid "Please enter a value." -msgstr "Entrez une valeur." - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:36 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "Please enter an answer between" -msgstr "Veuillez saisir une réponse entre" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:199 -msgid "Please enter an answer from the choices listed." -msgstr "Veuillez saisir une réponse parmi les choix proposés." - -#: client/features/templates/templates.strings.js:69 -msgid "Please enter an answer that is a decimal number." -msgstr "Veuillez saisir une réponse qui est un chiffre décimal." - -#: client/features/templates/templates.strings.js:68 -msgid "Please enter an answer that is a valid integer." -msgstr "Veuillez saisir une réponse qui est un entier valide." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:47 -msgid "Please enter an answer variable name." -msgstr "Veuillez saisir un nom de variable comme réponse." - -#: client/features/templates/templates.strings.js:66 -msgid "Please enter an answer." -msgstr "Veuillez saisir une réponse." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:216 -msgid "Please enter an answer/answers from the choices listed." -msgstr "Veuillez saisir une ou plusieurs réponse(s) parmi les choix proposés." - -#: client/index.template.ejs:149 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Entrez un entier non négatif et inférieur à 9999." - -#: client/index.template.ejs:132 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Entrez un entier non négatif et inférieur à 9999." - -#: client/index.template.ejs:105 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Entrez un entier non négatif et inférieur à 9999." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:47 -msgid "Please enter at least one search term to create a new Smart Inventory." -msgstr "Veuillez saisir une expression de recherche au moins pour créer un nouvel inventaire Smart." - -#: client/features/templates/templates.strings.js:127 -msgid "Please hover over a template for additional options." -msgstr "Veuillez pointer un modèle avec la souris pour obtenir des options supplémentaires." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:175 -msgid "Please input a number greater than 1." -msgstr "Veuillez saisir un nombre supérieur à 1." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:538 -#: client/src/scheduler/scheduler.strings.js:47 -msgid "Please provide a valid date." -msgstr "Merci d'indiquer une date valide." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:208 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:521 -#: client/src/scheduler/scheduler.strings.js:30 -msgid "Please provide a value between 1 and 999." -msgstr "Vous devez spécifier une valeur comprise entre 1 et 999." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:48 -msgid "Please remove the illegal character from the survey question variable name." -msgstr "Veuillez supprimer le caractère illégal de la variable dans la question d'enquête." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:169 -msgid "Please save before adding a survey to this job template." -msgstr "Veuillez enregistrer avant d'ajouter un questionnaire à ce modèle de job." - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:53 -msgid "Please save before adding a survey to this workflow." -msgstr "Veuillez enregistrer avant d'ajouter un questionnaire à ce flux de travail." - -#: client/src/notifications/notifications.list.js:15 -msgid "Please save before adding notifications." -msgstr "Veuillez enregistrer avant d'ajouter des notifications." - -#: client/src/organizations/organizations.form.js:95 -#: client/src/teams/teams.form.js:72 -msgid "Please save before adding users." -msgstr "Veuillez enregistrer avant d'ajouter des utilisateurs" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:100 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:97 -#: client/src/organizations/organizations.form.js:135 -#: client/src/projects/projects.form.js:270 -#: client/src/teams/teams.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:525 -#: client/src/templates/workflows.form.js:280 -msgid "Please save before assigning permissions." -msgstr "Veuillez enregistrer avant d'attribuer des permissions." - -#: client/src/users/users.form.js:125 -#: client/src/users/users.form.js:188 -msgid "Please save before assigning to organizations." -msgstr "Veuillez enregistrer avant l'attribution à des organisations." - -#: client/src/users/users.form.js:155 -msgid "Please save before assigning to teams." -msgstr "Veuillez enregistrer avant l'attribution à des équipes." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:142 -msgid "Please save before creating groups." -msgstr "Veuillez enregistrer avant la création de groupes." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:152 -msgid "Please save before creating hosts." -msgstr "Veuillez enregistrer avant la création d'hôtes." - -#: client/src/inventories-hosts/hosts/host.form.js:108 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:86 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:110 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:119 -msgid "Please save before defining groups." -msgstr "Veuillez enregistrer avant de définir des groupes." - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:94 -msgid "Please save before defining hosts." -msgstr "Veuillez enregistrer avant de définir des hôtes." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:161 -msgid "Please save before defining inventory sources." -msgstr "Veuillez enregistrer avant de définir des sources d'inventaire." - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:52 -msgid "Please save before defining the workflow graph." -msgstr "Veuillez enregistrer avant de définir le graphique du flux de travail." - -#: client/lib/components/components.strings.js:111 -msgid "Please save before launching this template." -msgstr "Veuillez enregistrer avant de lancer ce modèle." - -#: client/src/inventories-hosts/hosts/host.form.js:117 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:127 -msgid "Please save before viewing Insights." -msgstr "Veuillez enregistrer avant d'afficher Insights." - -#: client/src/inventories-hosts/hosts/host.form.js:101 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:103 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:112 -msgid "Please save before viewing facts." -msgstr "Veuillez enregistrer avant d'afficher des facts." - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:146 -msgid "Please save before viewing hosts." -msgstr "Veuillez enregistrer avant d'afficher le hôtes." - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 -msgid "Please select Users / Teams from the lists below." -msgstr "Veuillez sélectionner des utilisateurs / équipes dans les listes ci-dessous." - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 -msgid "Please select Users from the list below." -msgstr "Veuillez sélectionner des utilisateurs dans la liste ci-dessous." - -#: client/src/shared/form-generator.js:1169 -msgid "Please select a number between" -msgstr "Sélectionnez un nombre compris entre" - -#: client/src/shared/form-generator.js:1165 -msgid "Please select a number." -msgstr "Sélectionnez un nombre." - -#: client/features/templates/templates.strings.js:67 -msgid "Please select a value" -msgstr "Sélectionnez une valeur." - -#: client/src/shared/form-generator.js:1056 -#: client/src/shared/form-generator.js:1125 -#: client/src/shared/form-generator.js:1298 -msgid "Please select a value." -msgstr "Sélectionnez une valeur." - -#: client/src/templates/job_templates/job-template.form.js:77 -msgid "Please select an Inventory or check the Prompt on launch option." -msgstr "Sélectionnez un inventaire ou cochez l’option Me le demander au lancement." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:39 -msgid "Please select an organization before editing the host filter." -msgstr "Veuillez sélectionner une organisation avant d'éditer le filtre de l'hôte." - -#: client/src/shared/form-generator.js:1162 -msgid "Please select at least one value." -msgstr "Sélectionnez une valeur au moins." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:476 -#: client/src/scheduler/scheduler.strings.js:43 -msgid "Please select one or more days." -msgstr "Veuillez sélectionner un ou plusieurs jours." - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:30 -msgid "Please select resources from the lists below." -msgstr "Veuillez sélectionner des ressources dans les listes ci-dessous." - -#: client/src/instance-groups/instance-groups.strings.js:77 -msgid "Pod Spec Override" -msgstr "Remplacement des spécifications du pod" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Populate the hosts for this inventory by using a search filter." -msgstr "Remplir les hôtes de cet inventaire en utilisant un filtre de recherche." - -#: client/src/notifications/shared/type-change.service.js:30 -msgid "Port" -msgstr "Port" - -#: client/features/templates/templates.strings.js:33 -msgid "Preview" -msgstr "Prévisualisation" - -#: client/src/credentials/credentials.form.js:257 -#: client/src/credentials/factories/kind-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:44 -msgid "Private Key" -msgstr "Clé privée" - -#: client/features/templates/templates.strings.js:46 -#: client/src/credentials/credentials.form.js:264 -msgid "Private Key Passphrase" -msgstr "Phrase de passe pour la clé privée" - -#: client/src/credentials/credentials.form.js:279 -#: client/src/credentials/credentials.form.js:283 -msgid "Privilege Escalation" -msgstr "Élévation des privilèges" - -#: client/features/templates/templates.strings.js:47 -#: client/src/credentials/credentials.form.js:304 -msgid "Privilege Escalation Password" -msgstr "Mot de passe pour l’élévation des privilèges" - -#: client/src/credentials/credentials.form.js:294 -msgid "Privilege Escalation Username" -msgstr "Nom d’utilisateur pour l’élévation des privilèges" - -#: client/features/jobs/jobs.strings.js:15 -#: client/features/output/output.strings.js:86 -#: client/features/templates/templates.strings.js:20 -#: client/src/credentials/factories/become-method-change.factory.js:30 -#: client/src/credentials/factories/kind-change.factory.js:86 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:92 -#: client/src/templates/job_templates/job-template.form.js:100 -#: client/src/templates/job_templates/job-template.form.js:113 -#: client/src/templates/job_templates/job-template.form.js:91 -msgid "Project" -msgstr "Projet" - -#: client/lib/services/base-string.service.js:150 -msgid "Project (Ascending)" -msgstr "Projet (croissant)" - -#: client/lib/services/base-string.service.js:151 -msgid "Project (Descending)" -msgstr "Projet (décroissant)" - -#: client/src/credentials/factories/become-method-change.factory.js:53 -#: client/src/credentials/factories/kind-change.factory.js:109 -msgid "Project (Tenant Name)" -msgstr "Projet (nom du client)" - -#: client/src/projects/projects.form.js:77 -#: client/src/projects/projects.form.js:85 -msgid "Project Base Path" -msgstr "Chemin de base du projet" - -#: client/src/credentials/credentials.form.js:364 -msgid "Project Name" -msgstr "Nom du projet" - -#: client/src/projects/projects.form.js:102 -msgid "Project Path" -msgstr "Chemin du projet" - -#: client/features/templates/templates.strings.js:117 -#: client/src/workflow-results/workflow-results.controller.js:98 -msgid "Project Sync" -msgstr "Sync Projet" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:66 -msgid "Project Sync Failures" -msgstr "Erreurs de synchronisation du projet" - -#: client/lib/components/components.strings.js:74 -#: client/lib/models/models.strings.js:40 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:114 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:47 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/organizations/linkout/organizations-linkout.route.js:190 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "Projects" -msgstr "Projets" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:18 -msgid "Promote group" -msgid_plural "Promote groups" -msgstr[0] "Promouvoir Groupe" -msgstr[1] "Promouvoir des groupes" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:20 -msgid "Promote host" -msgid_plural "Promote hosts" -msgstr[0] "Promouvoir Hôte" -msgstr[1] "Promouvoir des hôtes" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:10 -msgid "Promote {{ group }} and {{ host }}" -msgstr "Promouvoir {{ group }} et {{ host }}" - -#: client/src/scheduler/scheduler.strings.js:54 -#: client/src/templates/survey-maker/shared/question-definition.form.js:27 -msgid "Prompt" -msgstr "Invite" - -#: client/lib/components/components.strings.js:35 -#: client/src/templates/job_templates/job-template.form.js:116 -#: client/src/templates/job_templates/job-template.form.js:157 -#: client/src/templates/job_templates/job-template.form.js:184 -#: client/src/templates/job_templates/job-template.form.js:201 -#: client/src/templates/job_templates/job-template.form.js:218 -#: client/src/templates/job_templates/job-template.form.js:235 -#: client/src/templates/job_templates/job-template.form.js:312 -#: client/src/templates/job_templates/job-template.form.js:493 -#: client/src/templates/job_templates/job-template.form.js:60 -#: client/src/templates/job_templates/job-template.form.js:86 -#: client/src/templates/workflows.form.js:102 -#: client/src/templates/workflows.form.js:116 -#: client/src/templates/workflows.form.js:148 -#: client/src/templates/workflows.form.js:88 -msgid "Prompt on launch" -msgstr "Me le demander au lancement" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:253 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:266 -msgid "Provide a comma-separated list of filter expressions." -msgstr "Fournir une liste d'expressions de filtre séparées par des virgules." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:269 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:284 -msgid "Provide a comma-separated list of filter expressions. Hosts are imported when all of the filters match. Refer to Ansible Tower documentation for more detail." -msgstr "Fournir une liste séparée par des virgules d'expressions de filtre. Les hôtes sont importés lorsque tous les filtres correspondent. Reportez-vous à la documentation de Ansible Tower pour plus de détails." - -#: client/src/inventories-hosts/hosts/host.form.js:49 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:48 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:50 -msgid "Provide a host name, ip address, or ip address:port. Examples include:" -msgstr "Fournir un nom d'hôte, une adresse ip ou ip address:port. Exemples :" - -#: client/features/templates/templates.strings.js:57 -#: client/src/templates/job_templates/job-template.form.js:178 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns." -msgstr "Entrez un modèle d’hôte pour limiter davantage la liste des hôtes qui seront gérés ou attribués par le playbook. Plusieurs modèles sont autorisés. Voir la documentation Ansible pour plus d'informations et pour obtenir des exemples de modèles." - -#: client/src/templates/workflows.form.js:96 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the workflow. This limit is applied to all job template nodes that prompt for a limit. Refer to Ansible documentation for more information and examples on patterns." -msgstr "Entrez un modèle d’hôte pour limiter davantage la liste des hôtes qui seront gérés ou attribués par le workflow. Cette limite est appliquée à tous les nœuds de limite de tâche nécessitant une limite. Voir la documentation Ansible pour plus d'informations et pour obtenir des exemples de modèles." - -#: client/features/credentials/credentials.strings.js:22 -msgid "Provide account information using Google Compute Engine JSON credentials file." -msgstr "Fournir des informations sur le compte à l'aide de Google Compute Engine JSON." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:195 -msgid "Provide environment variables to pass to the custom inventory script." -msgstr "Fournir des variables d'environnement à transmettre au script de l'inventaire personnalisé." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:272 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:287 -msgid "Provide the named URL encoded name or id of the remote Tower inventory to be imported." -msgstr "Fournir le nom encodé de l'URL ou d'id de l'inventaire distant de Tower à importer." - -#: client/src/license/license.partial.html:128 -msgid "Provide your Red Hat customer credentials and you can choose from a list of your available licenses. The credentials you use will be stored for future use in retrieving renewal or expanded licenses. You can update or remove them in SETTINGS > SYSTEM." -msgstr "Fournissez vos informations d’identification client Red Hat et choisissez parmi une liste de licences disponibles pour vous. Les informations d'identification que vous utilisez seront stockées pour une utilisation ultérieure lors de la récupération des licences renouvelées ou étendues. Vous pouvez les mettre à jour ou les supprimer dans PARAMÈTRES > SYSTÈME." - -#: client/src/templates/job_templates/job-template.form.js:374 -#: client/src/templates/job_templates/job-template.form.js:382 -msgid "Provisioning Callback URL" -msgstr "URL de rappel d’exécution de Tower job_template" - -#: client/src/notifications/add/add.controller.js:86 -#: client/src/notifications/edit/edit.controller.js:149 -msgid "Purple" -msgstr "Violet" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:95 -msgid "RADIUS" -msgstr "RADIUS" - -#: client/src/instance-groups/instance-groups.strings.js:55 -msgid "RAM" -msgstr "RAM" - -#: client/lib/components/code-mirror/code-mirror.strings.js:15 -msgid "READ ONLY" -msgstr "LECTURE SEULE" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:4 -msgid "RECENT JOB RUNS" -msgstr "RÉCENTES EXÉCUTIONS DE TÂCHE" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:47 -msgid "RECENTLY RUN JOBS" -msgstr "TÂCHES RÉCEMMENT EXÉCUTÉES" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:50 -msgid "RECENTLY USED JOB TEMPLATES" -msgstr "MODÈLES DE TÂCHE RÉCEMMENT UTILISÉS" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:4 -msgid "RECENTLY USED TEMPLATES" -msgstr "MODÈLES RÉCEMMENT UTILISÉS" - -#: client/src/activity-stream/streams.list.js:54 -#: client/src/inventories-hosts/hosts/host.list.js:108 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:51 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:52 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:58 -#: client/src/projects/projects.list.js:76 -#: client/src/scheduler/schedules.list.js:76 -msgid "REFRESH" -msgstr "ACTUALISER" - -#: client/features/users/tokens/tokens.strings.js:23 -msgid "REFRESH TOKEN" -msgstr "RÉACTUALISER JETON" - -#: client/src/shared/smart-search/smart-search.partial.html:45 -msgid "RELATED FIELDS:" -msgstr "CHAMPS ASSOCIÉS :" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:91 -msgid "REMEDIATE INVENTORY" -msgstr "REMÉDIER À L'INVENTAIRE" - -#: client/lib/services/base-string.service.js:79 -#: client/src/access/permissions-list.controller.js:57 -#: client/src/access/permissions-list.controller.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:84 -#: client/src/shared/directives.js:94 -#: client/src/templates/labels/labelsList.directive.js:96 -msgid "REMOVE" -msgstr "SUPPRIMER" - -#: client/lib/services/base-string.service.js:103 -msgid "REMOVE ACCESS" -msgstr "SUPPRIMER L'ACCÈS" - -#: client/lib/services/base-string.service.js:97 -msgid "REMOVE TEAM ACCESS" -msgstr "SUPPRIMER L'ACCÈS À L'ÉQUIPE" - -#: client/features/output/output.strings.js:8 -msgid "RESULTS" -msgstr "RÉSULTATS" - -#: client/features/templates/templates.strings.js:39 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:50 -msgid "REVERT" -msgstr "RÉTABLIR" - -#: client/features/projects/projects.strings.js:10 -msgid "REVISION" -msgstr "RÉVISION" - -#: client/src/inventories-hosts/inventories/main.js:301 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:49 -msgid "ROOT GROUPS" -msgstr "GROUPES RACINE" - -#: client/src/credentials/factories/become-method-change.factory.js:25 -#: client/src/credentials/factories/kind-change.factory.js:81 -msgid "RSA Private Key" -msgstr "Clé privée RSA" - -#: client/features/templates/templates.strings.js:130 -#: client/lib/services/base-string.service.js:66 -msgid "RUN" -msgstr "EXÉCUTER" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.route.js:45 -msgid "RUN COMMAND" -msgstr "EXÉCUTER COMMANDE" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:62 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:45 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:118 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:61 -msgid "RUN COMMANDS" -msgstr "EXÉCUTER DES COMMANDES" - -#: client/src/notifications/add/add.controller.js:89 -#: client/src/notifications/edit/edit.controller.js:152 -msgid "Random" -msgstr "Aléatoire" - -#: client/features/users/tokens/tokens.strings.js:30 -msgid "Read" -msgstr "Lecture" - -#: client/src/workflow-results/workflow-results.controller.js:179 -msgid "Read only view of extra variables added to the workflow." -msgstr "Affichage en lecture seule de variables supplémentaires ajoutées au flux de travail." - -#: client/features/output/output.strings.js:17 -msgid "Read-only view of artifacts added to the job template" -msgstr "Affichage en lecture seule des artefacts ajoutés au modèle de job" - -#: client/features/output/output.strings.js:24 -msgid "Read-only view of extra variables added to the job template" -msgstr "Affichage en lecture seule de variables supplémentaires ajoutées au modèle de job." - -#: client/lib/components/code-mirror/code-mirror.strings.js:51 -msgid "Read-only view of extra variables added to the job template." -msgstr "Affichage en lecture seule de variables supplémentaires ajoutées au modèle de job." - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Failed Jobs" -msgstr "Tâches ayant échoué récemment." - -#: client/src/notifications/notificationTemplates.list.js:28 -msgid "Recent Notifications" -msgstr "Notifications récentes" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Successful Jobs" -msgstr "Tâches ayant réussi récemment" - -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:98 -msgid "Recipient List" -msgstr "Liste de destinataires" - -#: client/src/notifications/add/add.controller.js:87 -#: client/src/notifications/edit/edit.controller.js:150 -msgid "Red" -msgstr "Rouge" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Refer to the Ansible Tower documentation for further syntax and examples." -msgstr "Consultez la documentation d’Ansible Tower pour obtenir des exemples de syntaxe." - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "Refer to the Ansible documentation for details about the configuration file." -msgstr "Reportez-vous à la documentation Ansible pour plus de détails sur le fichier de configuration." - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Refresh" -msgstr "Recharger" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:8 -msgid "Refresh Insights" -msgstr "Actualiser Insights" - -#: client/src/configuration/settings.service.js:44 -msgid "Refresh Token Expiration" -msgstr "Actualiser l’expiration du jeton" - -#: client/src/activity-stream/streams.list.js:51 -#: client/src/bread-crumb/bread-crumb.partial.html:6 -#: client/src/inventories-hosts/hosts/host.list.js:104 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:47 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:126 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:48 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:54 -#: client/src/projects/projects.list.js:72 -#: client/src/scheduler/schedules.list.js:72 -msgid "Refresh the page" -msgstr "Actualiser la page" - -#: client/features/output/output.strings.js:88 -msgid "Refspec" -msgstr "Refspec" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:246 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:258 -msgid "Region:" -msgstr "Région :" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:130 -msgid "Regions" -msgstr "Régions" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:81 -msgid "Related Groups" -msgstr "Groupes liés" - -#: client/lib/components/components.strings.js:104 -msgid "Relaunch On" -msgstr "Relancer sur" - -#: client/src/workflow-results/workflow-results.partial.html:26 -msgid "Relaunch job" -msgstr "Relancer la tâche" - -#: client/lib/components/components.strings.js:103 -msgid "Relaunch using host parameters" -msgstr "Relancer en utilisant les paramètres de l'hôte" - -#: client/lib/components/components.strings.js:102 -#: client/src/workflow-results/workflow-results.controller.js:55 -msgid "Relaunch using the same parameters" -msgstr "Relancer en utilisant les mêmes paramètres" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:176 -msgid "Remediate Inventory" -msgstr "Remédier à l'inventaire" - -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:106 -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:107 -#: client/src/teams/teams.form.js:157 -#: client/src/users/users.form.js:231 -msgid "Remove" -msgstr "Supprimer" - -#: client/src/templates/labels/labelsList.directive.js:93 -msgid "Remove Label from" -msgstr "Supprimer l'étiquette de" - -#: client/src/projects/projects.form.js:178 -msgid "Remove any local modifications prior to performing an update." -msgstr "Supprimez toutes les modifications locales avant d’effectuer une mise à jour." - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:81 -msgid "Remove host from" -msgstr "Supprimer l'hôte de" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:152 -#: client/src/scheduler/scheduler.strings.js:27 -msgid "Repeat frequency" -msgstr "Fréquence de répétition" - -#: client/lib/components/components.strings.js:7 -msgid "Replace" -msgstr "Remplacer" - -#: client/src/license/license.strings.js:7 -msgid "Replace password" -msgstr "Remplacer le mot de passe" - -#: client/lib/components/components.strings.js:139 -msgid "Replace secret" -msgstr "Remplacer le secret" - -#: client/src/license/license.partial.html:96 -msgid "Request License" -msgstr "Demander une licence" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:291 -msgid "Required" -msgstr "Obligatoire" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:154 -msgid "Reset" -msgstr "Réinitialisation" - -#: client/lib/components/components.strings.js:92 -msgid "Resources" -msgstr "Ressources" - -#: client/features/templates/templates.strings.js:97 -#: client/src/scheduler/schedules.list.js:25 -msgid "Resources are missing from this template." -msgstr "Ressources manquantes dans ce modèle." - -#: client/lib/services/base-string.service.js:111 -msgid "Return" -msgstr "Renvoi" - -#: client/features/users/tokens/tokens.strings.js:26 -msgid "Returned status:" -msgstr "État renvoyé :" - -#: client/lib/components/components.strings.js:8 -#: client/src/shared/form-generator.js:658 -msgid "Revert" -msgstr "Revenir" - -#: client/src/configuration/forms/auth-form/sub-forms/auth-azure.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-org.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-team.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-google-oauth2.form.js:59 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap1.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap2.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap3.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap4.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap5.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-radius.form.js:34 -#: client/src/configuration/forms/auth-form/sub-forms/auth-saml.form.js:121 -#: client/src/configuration/forms/auth-form/sub-forms/auth-tacacs.form.js:47 -#: client/src/configuration/forms/jobs-form/configuration-jobs.form.js:129 -#: client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js:26 -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:74 -#: client/src/configuration/forms/system-form/sub-forms/system-misc.form.js:95 -#: client/src/configuration/forms/ui-form/configuration-ui.form.js:36 -msgid "Revert all to default" -msgstr "Revenir aux valeurs par défaut" - -#: client/features/output/output.strings.js:90 -#: client/src/projects/projects.list.js:56 -msgid "Revision" -msgstr "Révision" - -#: client/src/projects/add/projects-add.controller.js:159 -#: client/src/projects/edit/projects-edit.controller.js:280 -msgid "Revision #" -msgstr "Révision n°" - -#: client/features/credentials/legacy.credentials.js:85 -#: client/src/credentials/credentials.form.js:461 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:130 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:127 -#: client/src/organizations/organizations.form.js:165 -#: client/src/projects/projects.form.js:301 -#: client/src/teams/teams.form.js:109 -#: client/src/teams/teams.form.js:148 -#: client/src/templates/workflows.form.js:311 -#: client/src/users/users.form.js:212 -msgid "Role" -msgstr "Rôle" - -#: client/lib/services/base-string.service.js:102 -msgid "Role access removal" -msgstr "Suppression de l'accès du rôle" - -#: client/src/templates/job_templates/job-template.form.js:440 -#: client/src/templates/job_templates/job-template.form.js:444 -#: client/src/templates/workflows.form.js:213 -#: client/src/templates/workflows.form.js:217 -msgid "Rotate Webhook Key" -msgstr "Rotation de clé de webhook" - -#: client/src/instance-groups/instance-groups.list.js:26 -#: client/src/instance-groups/instance-groups.strings.js:22 -#: client/src/instance-groups/instance-groups.strings.js:61 -msgid "Running Jobs" -msgstr "Tâches en cours d'exécution" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:96 -msgid "SAML" -msgstr "SAML" - -#: client/lib/services/base-string.service.js:63 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:17 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:17 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:17 -#: client/src/partials/survey-maker-modal.html:84 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:18 -msgid "SAVE" -msgstr "ENREGISTRER" - -#: client/features/templates/templates.strings.js:152 -msgid "SAVE & EXIT" -msgstr "ENREGISTRER ET QUITTER" - -#: client/src/scheduler/scheduled-jobs.list.js:13 -#: client/src/scheduler/scheduled-jobs.list.js:14 -msgid "SCHEDULED JOBS" -msgstr "TÂCHES PROGRAMMÉES" - -#: client/src/activity-stream/get-target-title.factory.js:38 -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js:9 -#: client/src/management-jobs/scheduler/main.js:28 -#: client/src/management-jobs/scheduler/main.js:34 -#: client/src/scheduler/schedules.route.js:102 -#: client/src/scheduler/schedules.route.js:14 -#: client/src/scheduler/schedules.route.js:189 -#: client/src/scheduler/schedules.route.js:283 -msgid "SCHEDULES" -msgstr "PROGRAMMATIONS" - -#: client/features/templates/templates.strings.js:71 -#: client/src/projects/add/projects-add.controller.js:130 -#: client/src/projects/edit/projects-edit.controller.js:252 -#: client/src/projects/projects.form.js:130 -#: client/src/templates/job_templates/job-template.form.js:107 -#: client/src/templates/workflows.form.js:107 -#: client/src/templates/workflows.form.js:111 -#: client/src/workflow-results/workflow-results.controller.js:80 -msgid "SCM Branch" -msgstr "Branche SCM" - -#: client/src/projects/add/projects-add.controller.js:150 -#: client/src/projects/edit/projects-edit.controller.js:271 -msgid "SCM Branch/Tag/Commit" -msgstr "Branche SCM/Balise/Validation" - -#: client/src/projects/add/projects-add.controller.js:171 -#: client/src/projects/edit/projects-edit.controller.js:292 -msgid "SCM Branch/Tag/Revision" -msgstr "Branche SCM/Balise/Révision" - -#: client/src/projects/projects.form.js:179 -msgid "SCM Clean" -msgstr "Nettoyage SCM" - -#: client/src/projects/projects.form.js:190 -msgid "SCM Delete" -msgstr "Suppression SCM" - -#: client/src/credentials/factories/become-method-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:76 -msgid "SCM Private Key" -msgstr "Clé privée SCM" - -#: client/src/projects/add/projects-add.controller.js:131 -#: client/src/projects/edit/projects-edit.controller.js:253 -#: client/src/projects/projects.form.js:146 -msgid "SCM Refspec" -msgstr "Refspec SCM" - -#: client/src/projects/projects.form.js:57 -msgid "SCM Type" -msgstr "Type de SCM" - -#: client/src/projects/projects.form.js:108 -#: client/src/projects/projects.form.js:119 -msgid "SCM URL" -msgstr "URL du SCM" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:55 -#: client/src/projects/projects.form.js:200 -msgid "SCM Update" -msgstr "Mise à jour SCM" - -#: client/features/projects/projects.strings.js:30 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "SCM Update Cancel" -msgstr "Annulation de la mise à jour SCM" - -#: client/src/projects/projects.form.js:170 -msgid "SCM Update Options" -msgstr "Options de mise à jour SCM" - -#: client/features/projects/projects.strings.js:19 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:126 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:36 -#: client/src/projects/edit/projects-edit.controller.js:122 -msgid "SCM update currently running" -msgstr "Mise à jour SCM en cours" - -#: client/features/users/tokens/tokens.strings.js:39 -msgid "SCOPE" -msgstr "CHAMP d'APPLICATION" - -#: client/features/output/output.strings.js:108 -msgid "SEARCH" -msgstr "RECHERCHE" - -#: client/features/templates/templates.strings.js:132 -#: client/lib/services/base-string.service.js:64 -#: client/src/license/license.partial.html:260 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:137 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:186 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:74 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:155 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:194 -msgid "SELECT" -msgstr "SÉLECTIONNER" - -#: client/src/instance-groups/instance-groups.strings.js:76 -msgid "SELECT A CREDENTIAL" -msgstr "SÉLECTIONNER UNE INFORMATION D'IDENTIFICATION" - -#: client/features/credentials/credentials.strings.js:20 -msgid "SELECT A CREDENTIAL TYPE" -msgstr "SÉLECTIONNER UN TYPE D'INFORMATION D'IDENTIFICATION" - -#: client/features/users/tokens/tokens.strings.js:19 -msgid "SELECT AN APPLICATION" -msgstr "SÉLECTIONNER UNE APPLICATION" - -#: client/features/applications/applications.strings.js:36 -#: client/features/credentials/credentials.strings.js:19 -msgid "SELECT AN ORGANIZATION" -msgstr "SÉLECTIONNER UNE ORGANISATION" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:6 -msgid "SELECT GROUPS" -msgstr "SÉLECTIONNER DES GROUPES" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:6 -msgid "SELECT HOSTS" -msgstr "SÉLECTIONNER DES HÔTES" - -#: client/src/instance-groups/instance-groups.strings.js:42 -msgid "SELECT INSTANCE" -msgstr "SÉLECTIONNER UNE INSTANCE" - -#: client/features/templates/templates.strings.js:36 -msgid "SELECTED" -msgstr "SÉLECTIONNÉ" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:18 -msgid "SELECTED:" -msgstr "SÉLECTIONNÉ :" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:22 -msgid "SETTING CATEGORY" -msgstr "CATÉGORIE DE PARAMÈTRE" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:26 -msgid "SETTING NAME" -msgstr "NOM DU PARAMÈTRE" - -#: client/src/configuration/settings.route.js:10 -msgid "SETTINGS" -msgstr "PARAMÈTRES" - -#: client/lib/services/base-string.service.js:68 -#: client/src/templates/survey-maker/surveys/init.factory.js:502 -msgid "SHOW" -msgstr "AFFICHER" - -#: client/src/login/loginModal/loginModal.partial.html:109 -msgid "SIGN IN" -msgstr "SE CONNECTER" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html:2 -msgid "SIGN IN WITH" -msgstr "SE CONNECTER AVEC" - -#: client/src/inventories-hosts/hosts/host.list.js:116 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:14 -msgid "SMART INVENTORY" -msgstr "INVENTAIRE SMART" - -#: client/lib/components/components.strings.js:122 -msgid "SORT BY" -msgstr "TRIER PAR" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js:27 -msgid "SOURCES" -msgstr "SOURCES" - -#: client/src/scheduler/scheduler.strings.js:63 -msgid "SS" -msgstr "SS" - -#: client/src/credentials/factories/become-method-change.factory.js:89 -#: client/src/credentials/factories/kind-change.factory.js:145 -msgid "SSH Key" -msgstr "Clé SSH" - -#: client/features/templates/templates.strings.js:45 -msgid "SSH Password" -msgstr "Mot de passe SSH" - -#: client/src/credentials/credentials.form.js:255 -msgid "SSH key description" -msgstr "Description de la clé SSH" - -#: client/src/notifications/notificationTemplates.form.js:551 -msgid "SSL Connection" -msgstr "Connexion SSL" - -#: client/features/templates/templates.strings.js:134 -msgid "START" -msgstr "DÉMARRER" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "STATUS" -msgstr "STATUT" - -#: client/src/credentials/credentials.form.js:119 -#: client/src/credentials/credentials.form.js:127 -msgid "STS Token" -msgstr "Token STS" - -#: client/features/output/output.strings.js:140 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:56 -msgid "SUCCESSFUL" -msgstr "RÉUSSI" - -#: client/src/partials/survey-maker-modal.html:24 -msgid "SURVEY" -msgstr "QUESTIONNAIRE" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:66 -msgid "SYNC ALL" -msgstr "SYNCHRONISER TOUT" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:464 -#: client/src/scheduler/scheduler.strings.js:42 -msgid "Sat" -msgstr "Sam." - -#: client/src/credentials/factories/become-method-change.factory.js:70 -#: client/src/credentials/factories/kind-change.factory.js:126 -msgid "Satellite 6 URL" -msgstr "URL Satellite 6" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:113 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:192 -#: client/src/credentials/credentials.form.js:416 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:158 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:630 -#: client/src/scheduler/scheduler.strings.js:57 -#: client/src/shared/form-generator.js:1644 -msgid "Save" -msgstr "Enregistrer" - -#: client/src/configuration/forms/settings-form.controller.js:416 -msgid "Save Complete" -msgstr "Sauvegarde terminée" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:199 -msgid "Save and enable log aggregation before testing the log aggregator." -msgstr "Enregistrez et activez l'agrégation de journalisation avant de tester l'agrégateur de journalisation." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:66 -#: client/src/configuration/forms/settings-form.controller.js:454 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:63 -msgid "Save changes" -msgstr "Enregistrer les modifications" - -#: client/src/license/license.partial.html:200 -msgid "Save successful!" -msgstr "Enregistrement réussi" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:558 -#: client/src/scheduler/scheduler.strings.js:50 -msgid "Schedule Description" -msgstr "Description du planning" - -#: client/src/management-jobs/card/card.partial.html:28 -#: client/src/management-jobs/card/card.partial.html:30 -msgid "Schedule Management Job" -msgstr "Planifier la tâche de gestion" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:7 -msgid "Schedule inventory syncs" -msgstr "Planifier des synchronisations d'inventaire futures" - -#: client/src/scheduler/scheduler.strings.js:14 -msgid "Schedule is active." -msgstr "Le planning est actif." - -#: client/src/scheduler/scheduler.strings.js:15 -msgid "Schedule is active. Click to stop." -msgstr "Le planning est actif. Cliquer pour le mettre à l'arrêt." - -#: client/src/scheduler/scheduler.strings.js:16 -msgid "Schedule is stopped." -msgstr "Le planning est à l'arrêt." - -#: client/src/scheduler/scheduler.strings.js:17 -msgid "Schedule is stopped. Click to activate." -msgstr "Le planning à l'arrêt. Cliquer pour l'activer." - -#: client/src/scheduler/scheduler.strings.js:60 -msgid "Schedule name" -msgstr "Intitulé" - -#: client/lib/components/components.strings.js:72 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:434 -#: client/src/projects/projects.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:578 -#: client/src/templates/workflows.form.js:333 -msgid "Schedules" -msgstr "Calendriers" - -#: client/features/users/tokens/users-tokens-add.controller.js:38 -msgid "Scope" -msgstr "Champ d'application" - -#: client/src/shared/smart-search/smart-search.controller.js:127 -#: client/src/shared/smart-search/smart-search.controller.js:169 -msgid "Search" -msgstr "Rechercher" - -#: client/src/credentials/credentials.form.js:104 -msgid "Secret Key" -msgstr "Clé secrète" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:247 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:259 -msgid "Security Group:" -msgstr "Groupe de sécurité :" - -#: client/src/credentials/credentials.form.js:124 -msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." -msgstr "Le service de jeton de sécurité (STS) est un service Web qui permet de demander des informations d’identification provisoires avec des privilèges limités pour les utilisateurs d’AWS Identity and Access Management (IAM)." - -#: client/src/shared/form-generator.js:1648 -#: client/src/shared/lookup/lookup-modal.directive.js:59 -#: client/src/shared/lookup/lookup-modal.partial.html:20 -msgid "Select" -msgstr "Sélectionner" - -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:5 -msgid "Select Instance Groups" -msgstr "Sélectionner des groupes d'instance" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:58 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:100 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:84 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:108 -msgid "Select Webhook Credential" -msgstr "Sélectionnez l’information d’identification de webhook" - -#: client/src/templates/workflows.form.js:110 -msgid "Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch." -msgstr "Sélectionnez une branche pour le workflow. Cette branche est appliquée à tous les nœuds de modèle de tâche qui demandent une branche." - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:73 -msgid "Select a credential" -msgstr "Sélectionner une information d'identification" - -#: client/index.template.ejs:139 -msgid "Select a frequency for snapshot retention" -msgstr "Sélectionnez une fréquence pour la conservation des instantanés" - -#: client/src/license/license.partial.html:214 -msgid "Select a license" -msgstr "Sélectionner une licence" - -#: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:70 -msgid "Select a role" -msgstr "Sélectionner un rôle" - -#: client/features/users/tokens/tokens.strings.js:29 -msgid "Select a scope" -msgstr "Sélectionner un champ d'application" - -#: client/index.template.ejs:122 -msgid "Select a time period after which to remove old facts" -msgstr "Sélectionnez un intervalle de temps après lequel les faits anciens pourront être supprimés" - -#: client/src/templates/job_templates/job-template.form.js:413 -#: client/src/templates/workflows.form.js:186 -msgid "Select a webhook service." -msgstr "Sélectionnez un service webhook." - -#: client/src/templates/workflows.form.js:81 -msgid "Select an inventory for the workflow. This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "Sélectionnez un inventaire pour le flux de travail. Cet inventaire est appliqué à tous les nœuds de modèle de tâche qui demandent un inventaire." - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:59 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or a selection of multiple groups." -msgstr "Sélectionner une source d'inventaire en cliquant sur la case correspondante. La source de l'inventaire peut être un seul groupe ou une sélection de plusieurs groupes." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:42 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:115 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:58 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups." -msgstr "Sélectionner une source d'inventaire en cliquant sur la case correspondante. La source de l'inventaire peut être un seul groupe ou hôte, une sélection de plusieurs hôtes ou une sélection de plusieurs groupes." - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:127 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single host or a selection of multiple hosts." -msgstr "Sélectionner une source d'inventaire en cliquant sur la case correspondante. La source de l'inventaire peut être un seul hôte ou une sélection de plusieurs hôtes." - -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:107 -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:132 -#: client/src/configuration/forms/ui-form/configuration-ui.controller.js:94 -msgid "Select commands" -msgstr "Sélectionner des commandes" - -#: client/src/templates/job_templates/job-template.form.js:151 -msgid "Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking \"Prompt on launch\" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check \"Prompt on launch\", the selected credential(s) become the defaults that can be updated at run time." -msgstr "Sélectionnez les informations d'identification permettant à Tower d'accéder aux noeuds selon qui déterminent l'exécution de cette tâche. Vous pouvez uniquement sélectionner une information d'identification de chaque type. Pour les informations d'identification machine (SSH), cocher la case \"Me demander au lancement\" requiert la sélection des informations d'identification de la machine lors de l'exécution. Si vous sélectionnez des informations d'identification ET que vous cochez la case \"Me demander au lancement\", les informations d'identification sélectionnées deviennent les informations d'identification par défaut qui peuvent être mises à jour au moment de l'exécution." - -#: client/src/scheduler/schedulerDatePicker.partial.html:2 -msgid "Select date" -msgstr "Sélectionner une date" - -#: client/lib/components/components.strings.js:21 -msgid "Select file" -msgstr "Sélectionner un fichier" - -#: client/src/projects/projects.form.js:100 -msgid "Select from the list of directories found in the Project Base Path. Together the base path and the playbook directory provide the full path used to locate playbooks." -msgstr "Faites une sélection à partir de la liste des répertoires trouvés dans le chemin de base du projet. Le chemin de base et le répertoire de playbook fournissent ensemble le chemin complet servant à localiser les playbooks." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:317 -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:336 -msgid "Select group types" -msgstr "Sélectionner des types de groupe" - -#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:24 -msgid "Select roles" -msgstr "Sélectionner des rôles" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:56 -msgid "Select the Instance Groups for this Inventory to run on." -msgstr "Sélectionnez les groupes d'instances sur lesquels exécuter cet inventaire." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:63 -msgid "Select the Instance Groups for this Inventory to run on. Refer to the Ansible Tower documentation for more detail." -msgstr "Sélectionnez les groupes d'instances sur lesquels exécuter cet inventaire. Voir la documentation Ansible Tower pour obtenir plus d'informations." - -#: client/src/templates/job_templates/job-template.form.js:270 -msgid "Select the Instance Groups for this Job Template to run on." -msgstr "Sélectionnez les groupes d'instances sur lesquels exécuter ce modèle de job." - -#: client/src/organizations/organizations.form.js:40 -msgid "Select the Instance Groups for this Organization to run on." -msgstr "Sélectionnez les groupes d'instances sur lesquels exécuter cette organisation." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:65 -msgid "Select the custom Python virtual environment for this inventory source sync to run on." -msgstr "Sélectionnez l'environnement virtuel Python personnalisé sur lequel exécuter cette source d'inventaire." - -#: client/src/templates/job_templates/job-template.form.js:260 -msgid "Select the custom Python virtual environment for this job template to run on." -msgstr "Sélectionnez l'environnement virtuel Python personnalisé sur lequel exécuter ce modèle de job." - -#: client/src/organizations/organizations.form.js:51 -msgid "Select the custom Python virtual environment for this organization to run on." -msgstr "Sélectionnez l'environnement virtuel Python personnalisé sur lequel exécuter ce modèle de job." - -#: client/src/projects/projects.form.js:242 -msgid "Select the custom Python virtual environment for this project to run on." -msgstr "Sélectionnez l'environnement virtuel Python personnalisé sur lequel exécuter ce projet." - -#: client/src/templates/job_templates/job-template.form.js:79 -msgid "Select the inventory containing the hosts you want this job to manage." -msgstr "Sélectionnez l’inventaire contenant les hôtes que vous souhaitez gérer." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:121 -msgid "Select the inventory file to be synced by this source. You can select from the dropdown or enter a file within the input." -msgstr "Sélectionnez le fichier d'inventaire à synchroniser par cette source. Vous pouvez le choisir dans le menu déroulant ou saisir un fichier dans l'entrée." - -#: client/src/templates/job_templates/job-template.form.js:132 -msgid "Select the playbook to be executed by this job.You can select from the dropdown or enter a file within the input." -msgstr "Sélectionnez le playbook que cette tâche doit exécuter. Vous pouvez le choisir dans le menu déroulant ou saisir un fichier dans l'entrée." - -#: client/src/templates/job_templates/job-template.form.js:99 -msgid "Select the project containing the playbook you want this job to execute." -msgstr "Sélectionnez le projet contenant le playbook que cette tâche devra exécuter." - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:188 -msgid "Select types" -msgstr "Sélectionner des types" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:239 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:251 -msgid "Select which groups to create automatically." -msgstr "Sélectionner quels groupes créer automatiquement." - -#: client/src/license/license.partial.html:153 -msgid "Selected" -msgstr "Sélectionné" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:202 -msgid "Send a test log message to the configured log aggregator." -msgstr "Envoyez un message de journal de test à l'agrégateur de journalisation configuré." - -#: client/src/notifications/notificationTemplates.form.js:110 -msgid "Sender Email" -msgstr "Adresse électronique de l’expéditeur" - -#: client/src/credentials/factories/become-method-change.factory.js:24 -#: client/src/credentials/factories/kind-change.factory.js:80 -msgid "Service Account Email Address" -msgstr "Adresse électronique du compte de service" - -#: client/features/credentials/credentials.strings.js:21 -msgid "Service Account JSON File" -msgstr "Fichier JSON Compte de service" - -#: client/features/credentials/credentials.strings.js:30 -msgid "Set Input Source" -msgstr "Définir la source en entrée" - -#: client/index.template.ejs:102 -msgid "Set how many days of data should be retained." -msgstr "Définissez le nombre de jours pendant lesquels les données doivent être conservées." - -#: client/src/configuration/settings.partial.html:12 -msgid "Set preferences for data collection, logos, and logins" -msgstr "Définissez des préférences pour la collection des données, les logos et logins." - -#: client/lib/components/components.strings.js:88 -msgid "Settings" -msgstr "Paramètres" - -#: client/lib/components/components.strings.js:11 -#: client/src/shared/form-generator.js:845 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:24 -msgid "Show" -msgstr "Afficher" - -#: client/features/templates/templates.strings.js:50 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:115 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:118 -#: client/src/templates/job_templates/job-template.form.js:303 -#: client/src/templates/job_templates/job-template.form.js:306 -msgid "Show Changes" -msgstr "Afficher les modifications" - -#: client/features/output/output.strings.js:50 -#: client/src/workflow-results/workflow-results.controller.js:86 -msgid "Show Less" -msgstr "Afficher moins de détails" - -#: client/features/output/output.strings.js:51 -#: client/src/workflow-results/workflow-results.controller.js:87 -msgid "Show More" -msgstr "Afficher plus de détails" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:34 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:8 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:104 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:125 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:136 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:28 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:44 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:6 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:61 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:83 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:138 -msgid "Show help text" -msgstr "Afficher le texte d'aide" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html:1 -msgid "Show host summary" -msgstr "Afficher le récapitulatif de l'hôte" - -#: client/src/shared/paginate/paginate.partial.html:51 -msgid "Show page size options" -msgstr "Afficher les options de taille de page" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html:1 -msgid "Show source summary" -msgstr "Afficher le récapitulatif de la source" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:33 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:44 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:55 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:76 -msgid "Sign in with %s" -msgstr "Se connecter avec %s" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:63 -msgid "Sign in with %s Organizations" -msgstr "Se connecter avec des organisations %s" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:61 -msgid "Sign in with %s Teams" -msgstr "Se connecter avec des équipes %s" - -#: client/features/output/output.strings.js:91 -#: client/features/templates/templates.strings.js:52 -#: client/src/templates/job_templates/job-template.form.js:223 -#: client/src/templates/job_templates/job-template.form.js:230 -msgid "Skip Tags" -msgstr "Balises de saut" - -#: client/features/templates/templates.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:229 -msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "Les balises de saut sont utiles si votre playbook est important et que vous souhaitez ignorer certaines parties d’une scène ou d’une tâche. Utiliser des virgules pour séparer plusieurs balises. Consulter la documentation Ansible Tower pour obtenir des détails sur l'utilisation des balises." - -#: client/features/jobs/jobs.strings.js:21 -#: client/features/output/output.strings.js:74 -msgid "Slice Job" -msgstr "Tranche de Job" - -#: client/src/templates/job_templates/job-template.form.js:283 -msgid "Slice Job Count" -msgstr "Nbre Tranches Job" - -#: client/src/workflow-results/workflow-results.controller.js:75 -msgid "Slice Job Template" -msgstr "Modèle de découpage de Job" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:48 -msgid "Smart Host Filter" -msgstr "Filtre d'hôte smart" - -#: client/src/inventories-hosts/inventories/inventory.list.js:90 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/shared/form-generator.js:1406 -msgid "Smart Inventory" -msgstr "Inventaire smart" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:44 -msgid "Solvable With Playbook" -msgstr "Solvable avec playbook" - -#: client/features/output/output.strings.js:92 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:50 -msgid "Source" -msgstr "Source" - -#: client/src/credentials/credentials.form.js:75 -msgid "Source Control" -msgstr "Contrôle de la source" - -#: client/features/output/output.strings.js:93 -msgid "Source Credential" -msgstr "Informations d'identification de la source" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:33 -#: client/src/projects/projects.form.js:26 -msgid "Source Details" -msgstr "Détails de la source" - -#: client/src/notifications/notificationTemplates.form.js:212 -#: client/src/notifications/notificationTemplates.form.js:213 -msgid "Source Phone Number" -msgstr "Numéro de téléphone de la source" - -#: client/features/output/output.strings.js:70 -msgid "Source Project" -msgstr "Projet source" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:135 -msgid "Source Regions" -msgstr "Régions sources" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:208 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:215 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:232 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:239 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:256 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:263 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:273 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:280 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:290 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:297 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:307 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:314 -msgid "Source Variables" -msgstr "Variables sources" - -#: client/src/partials/logviewer.html:9 -msgid "Source Vars" -msgstr "Vars Source" - -#: client/features/output/output.strings.js:94 -#: client/src/workflow-results/workflow-results.controller.js:77 -msgid "Source Workflow" -msgstr "Flux de travail source" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:39 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:163 -msgid "Sources" -msgstr "Sources" - -#: client/src/notifications/notificationTemplates.form.js:420 -msgid "Specify HTTP Headers in JSON format. Refer to the Ansible Tower documentation for example syntax." -msgstr "Spécifier les En-têtes HTTP en format JSON. Voir la documentation Ansible Tower pour obtenir des exemples de syntaxe." - -#: client/src/credentials/credentials.form.js:284 -msgid "Specify a method for %s operations. This is equivalent to specifying the %s parameter, where %s could be %s" -msgstr "Spécifiez une méthode pour les opérations %s. Cela équivaut à définir le paramètre %s, où %s peut être %s" - -#: client/src/notifications/notificationTemplates.form.js:574 -msgid "Specify a notification color. Acceptable colors are hex color code (example: #3af or #789abc) ." -msgstr "Spécifier une couleur de notification. Les couleurs acceptées sont d'un code de couleur hex (exemple : #3af or #789abc) ." - -#: client/src/notifications/notificationTemplates.form.js:375 -msgid "Specify a notification color. Acceptable colors are: yellow, green, red purple, gray or random." -msgstr "Spécifier une couleur de notification. Les couleurs acceptées sont : jaune, vert, rouge, violet, gris, ou au hasard." - -#: client/features/users/tokens/tokens.strings.js:20 -msgid "Specify a scope for the token's access" -msgstr "Spécifier le champ d'application du jeton" - -#: client/src/notifications/notificationTemplates.form.js:432 -msgid "Specify an HTTP method for the webhook. Acceptable choices are: POST or PUT" -msgstr "Spécifiez une méthode HTTP pour le webhook. Les choix acceptables sont : POST ou PUT" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:268 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:283 -msgid "Specify which groups to create automatically. Group names will be created similar to the options selected. If blank, all groups above are created. Refer to Ansible Tower documentation for more detail." -msgstr "Spécifier quels groupes créer automatiquement. Les noms de groupe seront créés de la même façon que les options sélectionnées. Si vide, tous les groupes au-dessus seront créés. Voir la documentation Ansible Tower pour obtenir plus d'informations." - -#: client/features/output/output.strings.js:135 -msgid "Standard Error" -msgstr "Erreur standard" - -#: client/features/output/output.strings.js:134 -#: client/src/partials/logviewer.html:5 -msgid "Standard Out" -msgstr "Standard Out" - -#: client/src/notifications/notifications.list.js:53 -msgid "Start" -msgstr "Démarrer" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:42 -#: client/src/scheduler/scheduler.strings.js:23 -msgid "Start Date" -msgstr "Date Début" - -#: client/src/notifications/notificationTemplates.form.js:597 -msgid "Start Message" -msgstr "Message de départ" - -#: client/src/notifications/notificationTemplates.form.js:608 -msgid "Start Message Body" -msgstr "Démarrer le corps du message" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 -#: client/src/scheduler/scheduler.strings.js:24 -msgid "Start Time" -msgstr "Heure Début" - -#: client/lib/services/base-string.service.js:140 -msgid "Start Time (Ascending)" -msgstr "Heure de début (croissant)" - -#: client/lib/services/base-string.service.js:141 -msgid "Start Time (Descending)" -msgstr "Heure de début (décroissant)" - -#: client/lib/components/components.strings.js:110 -msgid "Start a job using this template" -msgstr "Démarrer une tâche avec ce modèle" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:6 -msgid "Start sync process" -msgstr "Démarrer le processus de synchronisation" - -#: client/features/jobs/jobs.strings.js:9 -#: client/features/output/output.strings.js:95 -#: client/src/workflow-results/workflow-results.controller.js:71 -msgid "Started" -msgstr "Démarré" - -#: client/features/output/output.strings.js:96 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:55 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:55 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:43 -#: client/src/notifications/notification-templates-list/list.controller.js:71 -#: client/src/partials/logviewer.html:4 -#: client/src/workflow-results/workflow-results.controller.js:74 -msgid "Status" -msgstr "État" - -#: client/src/license/license.partial.html:203 -msgid "Submit" -msgstr "Valider" - -#: client/features/output/output.strings.js:112 -msgid "Submit search" -msgstr "Soumettre la recherche" - -#: client/src/license/license.partial.html:27 -msgid "Subscription" -msgstr "Abonnement" - -#: client/src/credentials/credentials.form.js:151 -#: client/src/credentials/credentials.form.js:162 -msgid "Subscription ID" -msgstr "ID d’abonnement" - -#: client/src/credentials/credentials.form.js:161 -msgid "Subscription ID is an Azure construct, which is mapped to a username." -msgstr "L’ID d’abonnement est une construction Azure mappée à un nom d’utilisateur." - -#: client/src/notifications/notifications.list.js:65 -msgid "Success" -msgstr "Réussite" - -#: client/src/notifications/notificationTemplates.form.js:620 -msgid "Success Message" -msgstr "Message de réussite" - -#: client/src/notifications/notificationTemplates.form.js:631 -msgid "Success Message Body" -msgstr "Corps du message de réussite" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:83 -msgid "Successful" -msgstr "Réussi" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:404 -#: client/src/scheduler/scheduler.strings.js:36 -msgid "Sun" -msgstr "Dim." - -#: client/features/templates/templates.strings.js:32 -msgid "Survey" -msgstr "Questionnaire" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:73 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:478 -msgid "Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch." -msgstr "Les questionnaires permettent aux utilisateurs d'être invités lors du lancement d'une tâche à répondre à une série de questions liées à la tâche. Cela permet de définir les variables affectant l'exécution du Playbook au moment du lancement." - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:79 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:186 -msgid "Sync Status" -msgstr "Statut de la synchronisation" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:62 -msgid "Sync all inventory sources" -msgstr "Synchroniser toutes les sources d'inventaire" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:29 -msgid "Sync canceled. Click to view log." -msgstr "Synchronisation annulée. Cliquez pour afficher le journal." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:35 -msgid "Sync completed. Click to view log." -msgstr "Synchronisation terminée. Cliquez pour afficher le journal." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:32 -msgid "Sync failed. Click to view log." -msgstr "Échec de la synchronisation. Cliquez pour afficher le journal." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "Sync not performed. Click" -msgstr "Synchronisation non effectuée. Cliquez" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:38 -msgid "Sync pending." -msgstr "Synchronisation en attente." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:45 -msgid "Sync running" -msgstr "Synchronisation en cours" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:46 -msgid "Sync running. Click to view log." -msgstr "Synchronisation en cours. Cliquez pour afficher le journal." - -#: client/lib/components/components.strings.js:96 -#: client/src/configuration/settings.partial.html:8 -msgid "System" -msgstr "Système" - -#: client/src/users/add/users-add.controller.js:12 -#: client/src/users/edit/users-edit.controller.js:12 -#: client/src/users/list/users-list.controller.js:12 -msgid "System Administrator" -msgstr "Administrateur du système" - -#: client/src/shared/form-generator.js:1846 -msgid "System Administrators have access to all s" -msgstr "Les administrateurs système ont accès à tous les s" - -#: client/src/users/add/users-add.controller.js:11 -#: client/src/users/edit/users-edit.controller.js:11 -#: client/src/users/list/users-list.controller.js:11 -msgid "System Auditor" -msgstr "Auditeur système" - -#: client/src/configuration/forms/settings-form.partial.html:3 -msgid "System auditors have read-only permissions in this section." -msgstr "Les auditeurs de système n’ont que des permissions lecture-seule sur cette section." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:97 -msgid "TACACS+" -msgstr "TACACS+" - -#: client/features/output/output.strings.js:131 -msgid "TASK" -msgstr "TÂCHE" - -#: client/src/activity-stream/get-target-title.factory.js:23 -#: client/src/organizations/linkout/organizations-linkout.route.js:95 -#: client/src/organizations/list/organizations-list.controller.js:62 -#: client/src/teams/main.js:65 -#: client/src/teams/teams.list.js:14 -#: client/src/teams/teams.list.js:15 -msgid "TEAMS" -msgstr "ÉQUIPES" - -#: client/features/templates/routes/templatesList.route.js:12 -#: client/features/templates/templates.strings.js:12 -#: client/features/templates/templates.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:44 -#: client/src/templates/templates.list.js:15 -#: client/src/templates/templates.list.js:16 -msgid "TEMPLATES" -msgstr "MODÈLES" - -#: client/lib/services/base-string.service.js:78 -msgid "TEST" -msgstr "TESTER" - -#: client/src/instance-groups/instance-groups.list.js:8 -msgid "THERE ARE CURRENTLY NO INSTANCE GROUPS DEFINED" -msgstr "IL N'Y AUCUN GROUPE D'INSTANCES ACTUELLEMENT DÉFINIS" - -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:103 -msgid "TIME" -msgstr "DURÉE" - -#: client/features/users/tokens/tokens.strings.js:22 -msgid "TOKEN" -msgstr "JETON" - -#: client/features/users/tokens/tokens.strings.js:21 -msgid "TOKEN INFORMATION" -msgstr "INFORMATION JETON" - -#: client/features/applications/applications.strings.js:11 -#: client/features/users/tokens/tokens.strings.js:10 -#: client/features/users/tokens/tokens.strings.js:8 -#: client/features/users/tokens/users-tokens-list.route.js:24 -#: client/src/activity-stream/get-target-title.factory.js:50 -msgid "TOKENS" -msgstr "JETONS" - -#: client/features/templates/templates.strings.js:122 -msgid "TOTAL NODES" -msgstr "TOTAL DES NOEUDS" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:250 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:262 -msgid "Tag None:" -msgstr "Ne rien baliser :" - -#: client/features/templates/templates.strings.js:55 -#: client/src/templates/job_templates/job-template.form.js:212 -msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "Les balises sont utiles si votre playbook est important et que vous souhaitez faire jouer certaines parties d’une scène ou exécuter une tâche. Utiliser des virgules pour séparer plusieurs balises. Consulter la documentation Ansible Tower pour obtenir des détails sur l'utilisation des balises." - -#: client/src/notifications/notificationTemplates.form.js:330 -msgid "Tags for the Annotation" -msgstr "Balises pour l'annotation" - -#: client/src/notifications/notificationTemplates.form.js:329 -msgid "Tags for the Annotation (optional)" -msgstr "Balises pour l'annotation (facultatif)" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:248 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:260 -msgid "Tags:" -msgstr "Balises :" - -#: client/src/notifications/notificationTemplates.form.js:392 -#: client/src/notifications/notificationTemplates.form.js:442 -#: client/src/notifications/notificationTemplates.form.js:481 -msgid "Target URL" -msgstr "URL cible" - -#: client/features/output/output.strings.js:118 -msgid "Tasks" -msgstr "Tâches" - -#: client/features/credentials/legacy.credentials.js:91 -#: client/src/credentials/credentials.form.js:467 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:136 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:133 -#: client/src/organizations/organizations.form.js:171 -#: client/src/projects/projects.form.js:307 -#: client/src/templates/workflows.form.js:317 -msgid "Team Roles" -msgstr "Rôles d’équipe" - -#: client/lib/services/base-string.service.js:96 -msgid "Team access removal" -msgstr "Suppression de l'accès à équipe" - -#: client/lib/components/components.strings.js:81 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:36 -#: client/src/organizations/linkout/organizations-linkout.route.js:103 -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/users/users.form.js:162 -msgid "Teams" -msgstr "Équipes" - -#: client/features/templates/templates.strings.js:120 -#: client/src/templates/templates.list.js:14 -#: client/src/workflow-results/workflow-results.controller.js:69 -msgid "Template" -msgstr "Modèle" - -#: client/features/templates/templates.strings.js:79 -msgid "Template parameter is missing." -msgstr "Paramètre du modèle manquant" - -#: client/lib/components/components.strings.js:78 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:37 -msgid "Templates" -msgstr "Modèles" - -#: client/src/credentials/credentials.form.js:336 -msgid "Tenant ID" -msgstr "ID Client" - -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:80 -msgid "Test" -msgstr "Test" - -#: client/features/credentials/credentials.strings.js:26 -msgid "Test External Credential" -msgstr "Test des informations d'identification externes" - -#: client/features/credentials/credentials.strings.js:45 -msgid "Test failed." -msgstr "Échec du test." - -#: client/src/notifications/notificationTemplates.list.js:82 -msgid "Test notification" -msgstr "Notification test" - -#: client/features/credentials/credentials.strings.js:44 -msgid "Test passed." -msgstr "Test réussi." - -#: client/src/templates/survey-maker/surveys/init.factory.js:13 -msgid "Text" -msgstr "Texte" - -#: client/src/templates/survey-maker/surveys/init.factory.js:14 -msgid "Textarea" -msgstr "Zone de texte" - -#: client/src/shared/form-generator.js:1306 -#: client/src/shared/form-generator.js:1312 -msgid "That value was not found. Please enter or select a valid value." -msgstr "Cette valeur n’a pas été trouvée. Veuillez entrer ou sélectionner une valeur valide." - -#: client/lib/components/components.strings.js:48 -msgid "That value was not found. Please enter or select a valid value." -msgstr "Cette valeur n’a pas été trouvée. Veuillez entrer ou sélectionner une valeur valide." - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:66 -msgid "The Insights Credential for {{inventory.name}} was not found." -msgstr "Informations d'identification Insights introuvables pour {{inventory.name}}." - -#: client/src/credentials/factories/become-method-change.factory.js:32 -#: client/src/credentials/factories/kind-change.factory.js:88 -msgid "The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:" -msgstr "L’ID du projet est l’identifiant attribué par GCE. Il se compose de deux mots suivis d’un nombre à trois chiffres. Exemple :" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "The Project selected has a status of" -msgstr "La projet sélectionné a un statut " - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "The SCM update process is running." -msgstr "Le processus de mise à jour SCM est en cours d’exécution." - -#: client/src/notifications/notificationTemplates.form.js:150 -msgid "The amount of time (in seconds) before the email notification stops trying to reach the host and times out. Ranges from 1 to 120 seconds." -msgstr "Délai (en secondes) avant que la notification par e-mail cesse d'essayer de joindre l'hôte et expire. Compris entre 1 et 120 secondes." - -#: client/src/templates/job_templates/job-template.form.js:299 -msgid "The amount of time (in seconds) to run before the task is canceled. Defaults to 0 for no job timeout." -msgstr "Délai (en secondes) avant l'annulation de la tâche. La valeur par défaut est 0 pour aucun délai d'expiration du job." - -#: client/features/templates/templates.strings.js:154 -msgid "The amount of time to wait before this approval step is automatically denied. Defaults to 0 for no timeout." -msgstr "Le temps d'attente avant cette étape d'approbation est automatiquement refusé. La valeur par défaut est 0 pour aucun délai d'attente." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:201 -#: client/src/templates/survey-maker/shared/question-definition.form.js:260 -#: client/src/templates/survey-maker/shared/question-definition.form.js:281 -msgid "The answer is longer than the maximum length. Please make the answer shorter." -msgstr "La réponse est plus longue que la longueur maximale requise. Veuillez réduire la taille de votre réponse." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:200 -#: client/src/templates/survey-maker/shared/question-definition.form.js:259 -#: client/src/templates/survey-maker/shared/question-definition.form.js:280 -msgid "The answer is shorter than the minimium length. Please make the answer longer." -msgstr "La réponse est plus courte que la longueur maximale requise. Veuillez augmenter la taille de votre réponse." - -#: client/src/notifications/notificationTemplates.form.js:287 -msgid "The base URL of the Grafana server - the /api/annotations endpoint will be added automatically to the base Grafana URL." -msgstr "URL de base du serveur Grafana - le point de terminaison /api/annotations sera ajouté automatiquement à l'URL Grafana de base." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:241 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:328 -#: client/src/scheduler/scheduler.strings.js:32 -msgid "The day must be between 1 and 31." -msgstr "Le jour doit être compris entre 1 et 31." - -#: client/src/configuration/settings.service.js:39 -msgid "The duration (in seconds) access tokens remain valid since their creation." -msgstr "Durée (en secondes) pendant laquelle les jetons d'accès restent valables depuis leur création." - -#: client/src/configuration/settings.service.js:47 -msgid "The duration (in seconds) authorization codes remain valid since their creation." -msgstr "Durée (en secondes) pendant laquelle les codes d'autorisation restent valables depuis leur création." - -#: client/src/configuration/settings.service.js:43 -msgid "The duration (in seconds) refresh tokens remain valid after the expiration of their associated access token." -msgstr "Durée (en secondes) pendant laquelle les jetons d’actualisation restent valables après l'expiration de leur jeton d'accès associé." - -#: client/src/credentials/credentials.form.js:190 -msgid "The email address assigned to the Google Compute Engine %sservice account." -msgstr "Adresse électronique attribuée au compte de service Google Compute Engine %s." - -#: client/src/projects/projects.form.js:143 -msgid "The first fetches all references. The second fetches the Github pull request number 62, in this example the branch needs to be `pull/62/head`." -msgstr "Le premier extrait toutes les références. Le second extrait la requête Github pull numéro 62, dans cet exemple la branche doit être `pull/62/head`." - -#: client/features/templates/templates.strings.js:146 -msgid "The following promptable values were provided when this node was created:" -msgstr "Les valeurs d'invite suivantes ont été fournies quand le nœud a été créé :" - -#: client/features/output/output.strings.js:12 -msgid "The host status bar will update when the job is complete." -msgstr "La barre de statut d'hôte s'actualisera une fois la tâche terminée." - -#: client/src/credentials/factories/become-method-change.factory.js:62 -#: client/src/credentials/factories/kind-change.factory.js:118 -msgid "The host to authenticate with." -msgstr "Hôte avec lequel s’authentifier." - -#: client/src/credentials/factories/kind-change.factory.js:59 -msgid "The host value" -msgstr "Valeur de l’hôte" - -#: client/features/templates/templates.strings.js:137 -msgid "The inventory of this node will be overridden by the parent workflow inventory." -msgstr "L'inventaire de ce nœud sera remplacé par l'inventaire du flux de travail parent." - -#: client/features/templates/templates.strings.js:139 -msgid "The inventory of this node will be overridden if a parent workflow inventory is provided at launch." -msgstr "L'inventaire de ce nœud sera remplacé si un inventaire de flux de travail parent est fourni au démarrage." - -#: client/features/templates/templates.strings.js:138 -msgid "The inventory of this node will not be overridden by the parent workflow inventory." -msgstr "L'inventaire de ce nœud ne sera pas remplacé par l'inventaire du flux de travail parent." - -#: client/features/templates/templates.strings.js:140 -msgid "The inventory of this node will not be overridden if a parent workflow inventory is provided at launch." -msgstr "L'inventaire de ce nœud ne sera pas remplacé si l'inventaire de flux de travail parent est fourni au démarrage." - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:153 -msgid "The inventory will be in a pending status until the final delete is processed." -msgstr "L'inventaire présentera le statut en attente tant que la suppression complète ne sera pas traitée." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:100 -#: client/src/templates/survey-maker/shared/question-definition.form.js:121 -#: client/src/templates/survey-maker/shared/question-definition.form.js:142 -msgid "The maximum length is too low. Please enter a number larger than the minimum length you set." -msgstr "La longueur maximum est trop courte. Veuillez saisir un nombre plus élevé en respectant la longueur minimale que vous avez définie." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:120 -#: client/src/templates/survey-maker/shared/question-definition.form.js:141 -#: client/src/templates/survey-maker/shared/question-definition.form.js:99 -msgid "The maximum length you entered is not a valid number. Please enter a whole number." -msgstr "La longueur maximum que vous avez saisie ne correspond pas à un nombre valide. Veuillez saisir un nombre entier." - -#: client/src/organizations/organizations.form.js:69 -msgid "The maximum number of hosts allowed to be managed by this organization. Value defaults to 0 which means no limit. Refer to the Ansible documentation for more details." -msgstr "Nombre maximal d'hôtes pouvant être gérés par cette organisation. La valeur par défaut est 0, ce qui signifie aucune limite. Reportez-vous à la documentation Ansible pour plus de détails." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:115 -#: client/src/templates/survey-maker/shared/question-definition.form.js:136 -#: client/src/templates/survey-maker/shared/question-definition.form.js:94 -msgid "The minimium length is too high. Please enter a lower number." -msgstr "La longueur minimum est trop élevée. Veuillez saisir un plus petit nombre." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:116 -#: client/src/templates/survey-maker/shared/question-definition.form.js:137 -#: client/src/templates/survey-maker/shared/question-definition.form.js:95 -msgid "The minimum length is too low. Please enter a positive number." -msgstr "La longueur minimum est trop basse. Veuillez saisir un nombre positif." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:114 -#: client/src/templates/survey-maker/shared/question-definition.form.js:135 -#: client/src/templates/survey-maker/shared/question-definition.form.js:93 -msgid "The minimum length you entered is not a valid number. Please enter a whole number." -msgstr "La longueur minimum que vous avez saisie ne correspond pas à un nombre valide. Veuillez saisir un nombre entier." - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. An empty value, or a value less than 1 will use the Ansible default which is usually 5. The default number of forks can be overwritten with a change to" -msgstr "Le nombre de processus parallèles ou simultanés à utiliser lors de l'exécution du playbook. Une valeur vide, ou une valeur inférieure à 1 utilisera la valeur par défaut Ansible qui est généralement 5. Le nombre de fourches par défaut peut être remplacé par un changement vers" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:105 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. Inputting no value will use the default value from the %sansible configuration file%s." -msgstr "Nombre de processus parallèles ou simultanés à utiliser lors de l'exécution du playbook. La saisie d'aucune valeur entraînera l'utilisation de la valeur par défaut du %sfichier de configuration ansible%s." - -#: client/src/credentials/factories/kind-change.factory.js:58 -msgid "The project value" -msgstr "Valeur du projet" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:552 -msgid "The scheduler options are invalid or incomplete." -msgstr "Les options de planning ne sont pas valides ou sont incomplètes." - -#: client/src/scheduler/scheduler.strings.js:49 -msgid "The scheduler options are invalid, incomplete, or a date is in the past." -msgstr "Les options de planning ne sont pas valides, incomplètes, ou correspondent à une date qui existe dans le passé." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "The selected project has a status of" -msgstr "La projet sélectionné a un statut " - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings and then run an update." -msgstr "Le projet sélectionné n’est pas configuré pour SCM. Afin de le configurer pour SCM, modifiez le projet et définissez les paramètres SCM, puis lancez une mise à jour." - -#: client/features/projects/projects.strings.js:23 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." -msgstr "Le projet sélectionné n’est pas configuré pour SCM. Afin de le configurer pour SCM, modifiez le projet et définissez les paramètres SCM, puis lancez une mise à jour." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:52 -msgid "The suggested format for variable names is lowercase and underscore-separated (for example, foo_bar, user_id, host_name, etc.). Variable names with spaces are not allowed." -msgstr "Le format suggéré pour les noms de variables est en minuscules avec des tirets de séparation (exemple, foo_bar, user_id, host_name, etc.). Les noms de variables contenant des espaces ne sont pas autorisés." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:126 -#: client/src/scheduler/scheduler.strings.js:25 -msgid "The time must be in HH24:MM:SS format." -msgstr "L’heure doit être sous le format suivant HH24:MM:SS" - -#: client/lib/services/base-string.service.js:90 -msgid "The {{ resourceType }} is currently being used by other resources." -msgstr "Le {{ resourceType }} est utilisé actuellement par d'autres ressources." - -#: client/src/activity-stream/streams.list.js:17 -msgid "There are no events to display at this time" -msgstr "Aucun événement à afficher pour le moment" - -#: client/lib/components/components.strings.js:127 -msgid "There are no jobs awaiting approval" -msgstr "Il n'y a pas de tâches en attente d'approbation" - -#: client/features/jobs/jobs.strings.js:18 -msgid "There are no running jobs." -msgstr "Aucun job en cours d'exécution." - -#: client/features/projects/projects.strings.js:22 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "Aucune information de mise à jour SCM n’est disponible pour ce projet. Une mise à jour n’est pas encore terminée. Si vous n’avez pas encore lancé une mise à jour pour ce projet, faites-le." - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "Aucune information de mise à jour SCM n’est disponible pour ce projet. Une mise à jour n’est pas encore terminée. Si vous n’avez pas encore lancé une mise à jour pour ce projet, faites-le." - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:127 -msgid "There was an error deleting inventory source groups. Returned status:" -msgstr "Une erreur s’est produite lors de la suppression des groupes de source d'inventaire. État renvoyé :" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:117 -msgid "There was an error deleting inventory source hosts. Returned status:" -msgstr "Une erreur s’est produite lors de la suppression des hôtes de source d'inventaire. État renvoyé :" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:154 -msgid "There was an error deleting inventory source. Returned status:" -msgstr "Une erreur s’est produite lors de la suppression de la source d'inventaire. État renvoyé :" - -#: client/src/configuration/forms/settings-form.controller.js:286 -msgid "There was an error resetting value. Returned status:" -msgstr "Une erreur s’est produite lors de la réinitialisation de la valeur. État renvoyé :" - -#: client/src/configuration/forms/settings-form.controller.js:615 -msgid "There was an error resetting values. Returned status:" -msgstr "Une erreur s’est produite lors de la réinitialisation des valeurs. État renvoyé :" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:235 -msgid "There was an error testing the log aggregator. Returned status:" -msgstr "Une erreur s’est produite lors du test de l'agrégateur. État renvoyé :" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:29 -msgid "These are the modules that {{BRAND_NAME}} supports running commands against." -msgstr "Il s'agit des modules pris en charge par {{BRAND_NAME}} pour l'exécution de commandes." - -#: client/features/templates/templates.strings.js:106 -msgid "This Job Template has a credential that requires a password. Credentials requiring passwords on launch are not permitted on workflow nodes." -msgstr "Ce modèle de job a un identifiant qui exige un mot de passe. Les identifiants qui exigent des mots de passe au lancement ne sont pas permis sur les nodes de workflow." - -#: client/src/scheduler/scheduler.strings.js:59 -msgid "This Job Template has a default credential that requires a password before launch. Adding or editing schedules is prohibited while this credential is selected. To add or edit a schedule, credentials that require a password must be removed from the Job Template." -msgstr "Ce modèle de travail a un identifiant par défaut qui nécessite un mot de passe avant le lancement. Il est interdit d'ajouter ou de modifier des plannings tant que cet identifiant est sélectionné. Pour ajouter ou modifier un planning, les identifiants nécessitant un mot de passe doivent être supprimées du modèle de travail." - -#: client/features/templates/templates.strings.js:105 -msgid "This Job Template is missing a default inventory or project. This must be addressed in the Job Template form before this node can be saved." -msgstr "Ce Modèle de Job ne possède pas d'inventaire ou de projet par défaut. Ceci doit être corrigé dans le formulaire de Modèle de Job avant que ce node puisse être sauvegardé." - -#: client/src/credential-types/credential-types.strings.js:8 -msgid "This credential type is currently being used by one or more credentials. Credentials that use this credential type must be deleted before the credential type can be deleted." -msgstr "Ce type de justificatif d'identifiant est actuellement utilisé par un ou plusieurs identifiants. Les identifiants qui utilisent ce type de justificatif d'identité doivent être supprimés avant que le type d'identifiant puisse être supprimé." - -#: client/src/instance-groups/instance-groups.strings.js:14 -msgid "This feature is currently in tech preview and is subject to change in a future release. Click here for documentation." -msgstr "Cette fonctionnalité est actuellement en version préliminaire et est susceptible d'être modifiée dans une prochaine version. Cliquez ici pour obtenir de la documentation." - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:25 -msgid "This group contains at least one group or host" -msgstr "Ce groupe contient au moins un groupe ou un hôte" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:50 -#: client/src/templates/workflows.form.js:74 -msgid "This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "Cet inventaire s'applique à tous les noeuds de modèles de job qui demandent un inventaire." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:174 -msgid "This is not a valid number." -msgstr "Le nombre n’est pas valide." - -#: client/src/credentials/factories/become-method-change.factory.js:59 -#: client/src/credentials/factories/kind-change.factory.js:115 -msgid "This is the tenant name. This value is usually the same as the username." -msgstr "Il s’agit du nom du client. Cette valeur est habituellement la même que celle du nom d’utilisateur." - -#: client/features/templates/templates.strings.js:75 -msgid "This job template has a default {{typeLabel}} credential which must be included or replaced before proceeding." -msgstr "Ce modèle de job possède un identifiant {{typeLabel}} par défaut qui doit être inclus ou remplacé avant de pouvoir continuer." - -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "This list is populated by inventories added from the" -msgstr "Cette liste contient des inventaires ajoutés à partir de " - -#: client/src/notifications/notifications.list.js:21 -msgid "This list is populated by notification templates added from the %sNotifications%s section" -msgstr "Cette liste contient des modèles de notification ajoutés à partir de la section %sNotifications%s" - -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "This list is populated by projects added from the" -msgstr "Cette liste contient des équipes ajoutés à partir de " - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -msgid "This list is populated by teams added from the" -msgstr "Cette liste contient des équipes ajoutées à partir de" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:4 -msgid "This machine has not checked in with Insights in {{last_check_in}} hours" -msgstr "Cette machine n'a pas été connectée à Insights depuis {{last_check_in}} heures" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:49 -msgid "This question variable is already in use. Please enter a different variable name." -msgstr "Cette variable de question est déjà utilisée. Veuillez saisir un nom de variable différent." - -#: client/src/shared/form-generator.js:707 -msgid "This setting has been set manually in a settings file and is now disabled." -msgstr "Cette valeur a été définie manuellement dans un fichier de configuration et est maintenant désactivée." - -#: client/src/users/users.form.js:167 -msgid "This user is not a member of any teams" -msgstr "Cet utilisateur n’est pas membre d’une équipe" - -#: client/src/shared/form-generator.js:828 -#: client/src/shared/form-generator.js:920 -msgid "This value does not match the password you entered previously. Please confirm that password." -msgstr "Cette valeur ne correspond pas au mot de passe que vous avez entré précédemment. Veuillez confirmer ce mot de passe." - -#: client/src/configuration/forms/settings-form.controller.js:488 -msgid "This will reset all configuration values to their factory defaults. Are you sure you want to proceed?" -msgstr "Cette opération rétablit toutes les valeurs de configuration sur leurs valeurs par défaut. Voulez-vous vraiment continuer ?" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:51 -msgid "This workflow job template has a default inventory which must be included or replaced before proceeding." -msgstr "Ce modèle de job de flux de travail possède un inventaire par défaut qui doit être inclus ou remplacé avant de pouvoir continuer." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:444 -#: client/src/scheduler/scheduler.strings.js:40 -msgid "Thu" -msgstr "Jeu." - -#: client/src/activity-stream/streams.list.js:25 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:18 -#: client/src/notifications/notification-templates-list/list.controller.js:72 -msgid "Time" -msgstr "Durée" - -#: client/src/license/license.partial.html:45 -msgid "Time Remaining" -msgstr "Durée restante" - -#: client/src/projects/projects.form.js:228 -msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." -msgstr "Délai en secondes à prévoir pour qu’un projet soit actualisé. Durant l’exécution des tâches et les rappels, le système de tâches évalue l’horodatage de la dernière mise à jour du projet. Si elle est plus ancienne que le délai d’expiration du cache, elle n’est pas considérée comme actualisée, et une nouvelle mise à jour du projet sera effectuée." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:405 -msgid "Time in seconds to consider an inventory sync to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest sync. If it is older than Cache Timeout, it is not considered current, and a new inventory sync will be performed." -msgstr "Délai en secondes à prévoir pour qu'une synchronisation d'inventaire soit actualisée. Durant l’exécution des tâches et les rappels, le système de tâches évalue l’horodatage de la dernière mise à jour du projet. Si elle est plus ancienne que le délai d’expiration du cache, elle n’est pas considérée comme actualisée, et une nouvelle synchronisation de l'inventaire sera effectuée." - -#: client/features/templates/templates.strings.js:156 -#: client/src/notifications/notificationTemplates.form.js:136 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/templates/job_templates/job-template.form.js:290 -#: client/src/templates/job_templates/job-template.form.js:296 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:137 -msgid "Timeout" -msgstr "Délai d'attente" - -#: client/src/credentials/credentials.form.js:125 -msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." -msgstr "Pour en savoir plus sur le token STS d’IAM, reportez-vous à la documentation d’%sAmazon%s." - -#: client/features/output/output.strings.js:120 -msgid "Toggle expanded output" -msgstr "Activer la sortie de commande développée" - -#: client/src/shared/form-generator.js:850 -msgid "Toggle the display of plaintext." -msgstr "Bascule l’affichage du texte en clair." - -#: client/src/notifications/shared/type-change.service.js:37 -#: client/src/notifications/shared/type-change.service.js:46 -msgid "Token" -msgstr "Token" - -#: client/features/applications/applications.strings.js:16 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 -#: client/src/users/users.form.js:242 -msgid "Tokens" -msgstr "Jetons" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:10 -msgid "Total Issues" -msgstr "Nombre de problèmes total" - -#: client/src/instance-groups/instance-groups.strings.js:23 -msgid "Total Jobs" -msgstr "Total Jobs" - -#: client/src/workflow-results/workflow-results.controller.js:91 -msgid "Total Nodes" -msgstr "Total des nœuds" - -#: client/src/partials/logviewer.html:6 -msgid "Traceback" -msgstr "Traceback" - -#: client/src/license/license.partial.html:176 -msgid "Tracking and Analytics" -msgstr "Suivi et analyse" - -#: client/src/license/license.partial.html:233 -msgid "Trial" -msgstr "Essai" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:424 -#: client/src/scheduler/scheduler.strings.js:38 -msgid "Tue" -msgstr "Mar." - -#: client/src/credentials/credentials.form.js:60 -#: client/src/credentials/credentials.form.js:84 -#: client/src/inventories-hosts/inventories/inventory.list.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:45 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:44 -#: client/src/notifications/notifications.list.js:33 -#: client/src/projects/projects.list.js:50 -#: client/src/scheduler/scheduled-jobs.list.js:47 -#: client/src/teams/teams.form.js:142 -#: client/src/templates/templates.list.js:31 -#: client/src/users/users.form.js:206 -msgid "Type" -msgstr "Type" - -#: client/features/credentials/credentials.strings.js:18 -#: client/src/credentials/credentials.form.js:23 -#: client/src/notifications/notificationTemplates.form.js:26 -msgid "Type Details" -msgstr "Détails sur le type" - -#: client/features/templates/templates.strings.js:145 -msgid "UNLINK" -msgstr "UNLINK" - -#: client/src/projects/add/projects-add.controller.js:182 -#: client/src/projects/edit/projects-edit.controller.js:303 -msgid "URL popover text" -msgstr "Texte popover de l’URL" - -#: client/src/license/license.partial.html:132 -#: client/src/login/loginModal/loginModal.partial.html:61 -msgid "USERNAME" -msgstr "NOM D’UTILISATEUR" - -#: client/src/activity-stream/get-target-title.factory.js:20 -#: client/src/organizations/linkout/organizations-linkout.route.js:43 -#: client/src/organizations/list/organizations-list.controller.js:55 -#: client/src/users/users.list.js:18 -#: client/src/users/users.list.js:19 -#: client/src/users/users.route.js:8 -msgid "USERS" -msgstr "UTILISATEURS" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:597 -msgid "UTC" -msgstr "UTC" - -#: client/lib/services/base-string.service.js:144 -msgid "UUID (Ascending)" -msgstr "UUID (croissant)" - -#: client/lib/services/base-string.service.js:145 -msgid "UUID (Descending)" -msgstr "UUID (décroissant)" - -#: client/lib/components/components.strings.js:25 -msgid "Unable to Submit" -msgstr "Validation impossible" - -#: client/features/templates/templates.strings.js:96 -msgid "Unable to copy template." -msgstr "Impossible de copier le modèle." - -#: client/src/instance-groups/instance-groups.strings.js:67 -msgid "Unable to delete instance group." -msgstr "Impossible de supprimer le groupe d'instances" - -#: client/features/templates/templates.strings.js:92 -msgid "Unable to delete template." -msgstr "Impossible de supprimer le modèle." - -#: client/features/templates/templates.strings.js:94 -msgid "Unable to determine template type." -msgstr "Impossible de déterminer le type de modèle." - -#: client/features/templates/templates.strings.js:81 -msgid "Unable to determine this template's type while copying." -msgstr "Impossible de déterminer ce type de modèle pendant la copie." - -#: client/features/templates/templates.strings.js:82 -msgid "Unable to determine this template's type while deleting." -msgstr "Impossible de déterminer ce type de modèle pendant la suppression." - -#: client/features/templates/templates.strings.js:83 -msgid "Unable to determine this template's type while editing." -msgstr "Impossible de déterminer ce type de modèle lors de la modification." - -#: client/features/templates/templates.strings.js:84 -msgid "Unable to determine this template's type while launching." -msgstr "Impossible de déterminer ce type de modèle pendant le lancement." - -#: client/features/templates/templates.strings.js:85 -msgid "Unable to determine this template's type while scheduling." -msgstr "Impossible de déterminer ce type de modèle lors de la programmation." - -#: client/features/templates/templates.strings.js:91 -msgid "Unable to edit template." -msgstr "Impossible de modifier le modèle." - -#: client/src/shared/stateDefinitions.factory.js:231 -msgid "Unable to get resource:" -msgstr "Impossible d'obtenir la ressource :" - -#: client/features/templates/templates.strings.js:93 -msgid "Unable to launch template." -msgstr "Impossible de lancer le modèle." - -#: client/features/templates/templates.strings.js:95 -msgid "Unable to schedule job." -msgstr "Impossible de programmer le job." - -#: client/src/instance-groups/instance-groups.strings.js:49 -msgid "Unavailable" -msgstr "Non disponible" - -#: client/src/instance-groups/instance-groups.strings.js:48 -msgid "Unavailable to run jobs." -msgstr "Non disponible pour exécuter les tâches." - -#: client/lib/components/components.strings.js:27 -msgid "Unexpected Error" -msgstr "Erreur inattendue" - -#: client/lib/components/components.strings.js:26 -msgid "Unexpected server error. View the console for more information" -msgstr "Erreur de serveur inattendue. Affichez la console pour plus d'informations." - -#: client/src/license/license.partial.html:59 -msgid "Unlimited" -msgstr "Illimité" - -#: client/lib/components/components.strings.js:39 -msgid "Unsupported display model type" -msgstr "Type de modèle d'affichage non pris en charge" - -#: client/lib/components/components.strings.js:31 -msgid "Unsupported input type" -msgstr "Type d'entrée non prise en charge" - -#: client/features/projects/projects.strings.js:33 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Update Not Found" -msgstr "Mise à jour introuvable" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:344 -msgid "Update Options" -msgstr "Mettre à jour les options" - -#: client/src/projects/projects.form.js:197 -msgid "Update Revision on Launch" -msgstr "Mettre à jour Révision au lancement" - -#: client/features/projects/projects.strings.js:44 -#: client/src/projects/factories/get-project-tool-tip.factory.js:30 -msgid "Update canceled. Click for details" -msgstr "Mise à jour annulée. Cliquer pour plus de détails." - -#: client/features/projects/projects.strings.js:42 -#: client/src/projects/factories/get-project-tool-tip.factory.js:24 -msgid "Update failed. Click for details" -msgstr "Échec de la mise à jour. Cliquer pour plus de détails." - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "Update in Progress" -msgstr "Mise à jour en cours" - -#: client/features/projects/projects.strings.js:43 -#: client/src/projects/factories/get-project-tool-tip.factory.js:27 -msgid "Update missing. Click for details" -msgstr "Mise à jour manquante. Cliquer pour plus de détails." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:372 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:377 -msgid "Update on Launch" -msgstr "Mettre à jour au lancement" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:383 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:389 -msgid "Update on Project Update" -msgstr "Mettre à jour lorsque le projet est actualisé" - -#: client/features/projects/projects.strings.js:39 -#: client/src/projects/factories/get-project-tool-tip.factory.js:14 -msgid "Update queued. Click for details" -msgstr "Mise à jour en file d'attente. Cliquer pour plus de détails." - -#: client/features/projects/projects.strings.js:40 -#: client/src/projects/factories/get-project-tool-tip.factory.js:18 -msgid "Update running. Click for details" -msgstr "Mise à jour en cours. Cliquer pour plus de détails." - -#: client/src/configuration/settings.partial.html:6 -msgid "Update settings pertaining to Jobs within Tower" -msgstr "Mise à jour de la configuration des paramètres liés aux Jobs dans Tower." - -#: client/features/projects/projects.strings.js:41 -#: client/src/projects/factories/get-project-tool-tip.factory.js:21 -msgid "Update succeeded. Click for details" -msgstr "Mise à jour réussie. Cliquer pour plus de détails." - -#: client/src/license/license.partial.html:75 -msgid "Upgrade" -msgstr "Mettre à niveau" - -#: client/src/license/license.partial.html:111 -msgid "Upload a license file" -msgstr "Télécharger un fichier de licence" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:62 -#: client/src/organizations/organizations.form.js:48 -#: client/src/projects/projects.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:257 -msgid "Use Default Environment" -msgstr "Utiliser l'environnement par défaut" - -#: client/src/notifications/add/add.controller.js:98 -#: client/src/notifications/edit/edit.controller.js:139 -msgid "Use SSL" -msgstr "Utiliser SSL" - -#: client/src/notifications/add/add.controller.js:97 -#: client/src/notifications/edit/edit.controller.js:138 -msgid "Use TLS" -msgstr "Utiliser TLS" - -#: client/src/notifications/notificationTemplates.form.js:586 -msgid "Use custom messages to change the content of notifications sent when a job starts, succeeds, or fails. Use curly braces to access information about the job: {{ job_friendly_name }}, {{ url }}, or attributes of the job such as {{ job.status }}. You may apply a number of possible variables in the message. Refer to the Ansible Tower documentation for more details." -msgstr "Utilisez des messages personnalisés pour modifier le contenu des notifications envoyées lorsqu'une tâche commence, réussit ou échoue. Utilisez des accolades pour accéder aux informations sur la tâche : {{ nom_convivial_tâche }}, {{ url }}, ou des attributs de la tâche tels que {{ job.status}}. Vous pouvez appliquer un certain nombre de variables possibles dans le message. Reportez-vous à la documentation Ansible Tower pour plus de détails." - -#: client/src/instance-groups/instance-groups.strings.js:24 -#: client/src/instance-groups/instance-groups.strings.js:50 -msgid "Used Capacity" -msgstr "Capacité utilisée" - -#: client/src/credentials/credentials.form.js:76 -msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." -msgstr "Utilisé pour vérifier et synchroniser les référentiels de playbooks avec un SCM à distance tel que Git, Subversion (svn) ou Mercurial (hg). Ces informations d’identification sont utilisées par les Projets." - -#: client/features/credentials/legacy.credentials.js:80 -#: client/src/credentials/credentials.form.js:456 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:125 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:122 -#: client/src/organizations/organizations.form.js:119 -#: client/src/organizations/organizations.form.js:160 -#: client/src/projects/projects.form.js:296 -#: client/src/teams/teams.form.js:96 -#: client/src/templates/workflows.form.js:306 -msgid "User" -msgstr "Utilisateur" - -#: client/lib/components/components.strings.js:97 -#: client/src/configuration/settings.partial.html:11 -msgid "User Interface" -msgstr "Interface utilisateur" - -#: client/src/users/users.form.js:96 -msgid "User Type" -msgstr "Type d’utilisateur" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 -#: client/src/credentials/factories/become-method-change.factory.js:17 -#: client/src/credentials/factories/become-method-change.factory.js:38 -#: client/src/credentials/factories/kind-change.factory.js:16 -#: client/src/credentials/factories/kind-change.factory.js:40 -#: client/src/credentials/factories/kind-change.factory.js:73 -#: client/src/credentials/factories/kind-change.factory.js:94 -#: client/src/notifications/notificationTemplates.form.js:453 -#: client/src/notifications/notificationTemplates.form.js:492 -#: client/src/notifications/notificationTemplates.form.js:64 -#: client/src/users/users.form.js:59 -#: client/src/users/users.list.js:29 -msgid "Username" -msgstr "Nom d'utilisateur" - -#: client/lib/services/base-string.service.js:138 -msgid "Username (Ascending)" -msgstr "Nom d'utilisateur (croissant)" - -#: client/lib/services/base-string.service.js:139 -msgid "Username (Descending)" -msgstr "Nom d'utilisateur (décroissant)" - -#: client/src/credentials/credentials.form.js:80 -msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for smart inventory sources and for cloud provisioning and deployment in playbook runs." -msgstr "Noms d'utilisateur, mots de passe et clés d'accès pour s'authentifier auprès du fournisseur de cloud ou d'infrastructure spécifié. Ceux-ci sont utilisés pour les sources d'inventaire smarts et pour l'allocation de services dans le cloud et leur déploiement dans les playbooks." - -#: client/lib/components/components.strings.js:80 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:38 -#: client/src/organizations/organizations.form.js:101 -#: client/src/teams/teams.form.js:78 -msgid "Users" -msgstr "Utilisateurs" - -#: client/src/scheduler/schedulerList.controller.js:46 -msgid "Using a credential that requires a password on launch is prohibited when creating a Job Template schedule" -msgstr "L'utilisation d'un identifiant exigeant un mot de passe au lancement n'est pas permis lorsqu'on créer un planning de Modèle de job." - -#: client/lib/components/code-mirror/code-mirror.strings.js:11 -msgid "VARIABLES" -msgstr "VARIABLES" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:7 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:7 -msgid "VIEW ALL" -msgstr "TOUT AFFICHER" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:90 -msgid "VIEW DATA IN INSIGHTS" -msgstr "AFFICHER LES DONNÉES DANS INSIGHTS" - -#: client/lib/components/components.strings.js:59 -msgid "VIEW LESS" -msgstr "AFFICHER MOINS DE DÉTAILS" - -#: client/features/templates/templates.strings.js:143 -msgid "VIEW LINK" -msgstr "AFFICHER LE LIEN" - -#: client/lib/components/components.strings.js:58 -msgid "VIEW MORE" -msgstr "AFFICHER DES DÉTAILS SUPPLÉMENTAIRES" - -#: client/src/shared/paginate/paginate.partial.html:48 -msgid "VIEW PER PAGE" -msgstr "AFFICHER PAR PAGE" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:249 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:261 -msgid "VPC ID:" -msgstr "ID VPC :" - -#: client/src/license/license.partial.html:10 -msgid "Valid License" -msgstr "Licence valide" - -#: client/src/inventories-hosts/hosts/host.form.js:67 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:46 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:47 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:68 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:63 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:70 -msgid "Variables" -msgstr "Variables" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:25 -#: client/src/templates/prompt/steps/credential/prompt-credential.directive.js:37 -msgid "Vault ID" -msgstr "ID Archivage de sécurité" - -#: client/features/templates/templates.strings.js:48 -#: client/src/credentials/credentials.form.js:390 -msgid "Vault Password" -msgstr "Mot de passe Vault" - -#: client/features/output/output.strings.js:97 -#: client/features/templates/templates.strings.js:60 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:82 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:91 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:330 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:337 -#: client/src/templates/job_templates/job-template.form.js:189 -#: client/src/templates/job_templates/job-template.form.js:196 -msgid "Verbosity" -msgstr "Verbosité" - -#: client/src/license/license.partial.html:15 -msgid "Version" -msgstr "Version" - -#: client/src/activity-stream/streams.list.js:63 -#: client/src/credential-types/credential-types.list.js:64 -#: client/src/credentials/credentials.list.js:82 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:64 -#: client/src/inventories-hosts/inventories/inventory.list.js:118 -#: client/src/inventory-scripts/inventory-scripts.list.js:70 -#: client/src/notifications/notificationTemplates.list.js:96 -#: client/src/scheduler/schedules.list.js:101 -#: client/src/teams/teams.list.js:64 -#: client/src/templates/templates.list.js:101 -#: client/src/users/users.list.js:70 -msgid "View" -msgstr "Afficher" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "View Activity Stream" -msgstr "Afficher le flux d’activité" - -#: client/lib/components/components.strings.js:68 -msgid "View Documentation" -msgstr "Afficher la documentation" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:52 -msgid "View Insights" -msgstr "Afficher les informations" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:102 -#: client/src/inventories-hosts/inventory-hosts.strings.js:27 -msgid "View Insights Data" -msgstr "Afficher les données des informations" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:201 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:225 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:249 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:324 -msgid "View JSON examples at" -msgstr "Afficher les exemples JSON à" - -#: client/src/inventories-hosts/hosts/host.form.js:77 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:76 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:84 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:73 -msgid "View JSON examples at %s" -msgstr "Afficher les exemples JSON à %s" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:13 -msgid "View Less" -msgstr "Afficher moins" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:11 -msgid "View More" -msgstr "Afficher plus" - -#: client/src/organizations/list/organizations-list.partial.html:64 -msgid "View Organization" -msgstr "Afficher l'organisation" - -#: client/features/output/output.strings.js:28 -#: client/features/output/output.strings.js:32 -msgid "View Project checkout results" -msgstr "Afficher les résultats d'extraction du projet" - -#: client/src/shared/form-generator.js:1672 -#: client/src/templates/job_templates/job-template.form.js:588 -#: client/src/templates/workflows.form.js:343 -msgid "View Survey" -msgstr "Afficher le questionnaire" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:202 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:226 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:250 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:325 -msgid "View YAML examples at" -msgstr "Afficher les exemples YAML à" - -#: client/src/inventories-hosts/hosts/host.form.js:78 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:77 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:88 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:74 -msgid "View YAML examples at %s" -msgstr "Afficher les exemples YAML à %s" - -#: client/src/configuration/settings.partial.html:15 -msgid "View and edit your license information" -msgstr "Affichez et modifiez vos informations de licence." - -#: client/src/credentials/credentials.list.js:84 -msgid "View credential" -msgstr "Afficher les informations d’identification" - -#: client/src/credential-types/credential-types.list.js:66 -msgid "View credential type" -msgstr "Afficher le type d'informations d’identification" - -#: client/lib/components/layout/layout.partial.html:29 -msgid "View documentation" -msgstr "Afficher la documentation" - -#: client/src/activity-stream/streams.list.js:67 -msgid "View event details" -msgstr "Afficher les détails de l’événement" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:92 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:96 -msgid "View group" -msgstr "Afficher le groupe" - -#: client/src/inventories-hosts/hosts/host.list.js:95 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:96 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:109 -#: client/src/inventories-hosts/inventory-hosts.strings.js:26 -msgid "View host" -msgstr "Afficher l'hôte" - -#: client/src/inventories-hosts/inventories/inventory.list.js:120 -msgid "View inventory" -msgstr "Afficher l’inventaire" - -#: client/src/inventory-scripts/inventory-scripts.list.js:72 -msgid "View inventory script" -msgstr "Afficher le script d’inventaire" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:83 -msgid "View job" -msgstr "Afficher la tâche" - -#: client/src/notifications/notificationTemplates.list.js:98 -msgid "View notification" -msgstr "Afficher la notification" - -#: client/src/scheduler/schedules.list.js:103 -msgid "View schedule" -msgstr "Afficher le calendrier" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:114 -msgid "View source" -msgstr "Afficher la source" - -#: client/src/teams/teams.list.js:67 -msgid "View team" -msgstr "Afficher l’équipe" - -#: client/src/templates/templates.list.js:103 -msgid "View template" -msgstr "Afficher le modèle" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "View the" -msgstr "Afficher " - -#: client/features/output/output.strings.js:22 -#: client/lib/components/components.strings.js:63 -msgid "View the Credential" -msgstr "Afficher les informations d’identification" - -#: client/features/output/output.strings.js:26 -msgid "View the Inventory" -msgstr "Afficher l’inventaire" - -#: client/features/output/output.strings.js:29 -msgid "View the Job Template" -msgstr "Afficher le Modèle de Job" - -#: client/features/output/output.strings.js:27 -#: client/features/output/output.strings.js:31 -msgid "View the Project" -msgstr "Afficher le projet" - -#: client/features/output/output.strings.js:33 -msgid "View the Schedule" -msgstr "Afficher le planning" - -#: client/features/output/output.strings.js:35 -msgid "View the User" -msgstr "Afficher cet utilisateur" - -#: client/src/projects/projects.list.js:115 -msgid "View the project" -msgstr "Afficher le projet" - -#: client/src/scheduler/scheduled-jobs.list.js:79 -msgid "View the schedule" -msgstr "Afficher le calendrier" - -#: client/features/output/output.strings.js:34 -#: client/src/workflow-results/workflow-results.controller.js:63 -msgid "View the source Workflow Job" -msgstr "Afficher source Job de workflow" - -#: client/features/output/output.strings.js:41 -msgid "View the webhook configuration on the job template." -msgstr "Affichez la configuration du webhook sur le modèle de tâche." - -#: client/features/output/output.strings.js:42 -#: client/src/workflow-results/workflow-results.controller.js:65 -msgid "View the webhook configuration on the workflow job template." -msgstr "Affichez la configuration du webhook sur le modèle de tâche de workflow." - -#: client/src/users/users.list.js:73 -msgid "View user" -msgstr "Afficher l’utilisateur" - -#: client/lib/components/components.strings.js:91 -msgid "Views" -msgstr "Affichages" - -#: client/features/templates/templates.strings.js:148 -msgid "WARNING: UNSAVED CHANGES" -msgstr "AVERTISSEMENT : MODIFICATIONS NON ENREGISTRÉES" - -#: client/src/templates/workflows.form.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js:47 -msgid "WORKFLOW" -msgstr "WORKFLOW" - -#: client/features/templates/templates.strings.js:136 -msgid "WORKFLOW VISUALIZER" -msgstr "VISUALISATEUR DE WORKFLOW" - -#: client/features/templates/templates.strings.js:115 -msgid "Wait For Approval" -msgstr "Attendre l'approbation" - -#: client/features/templates/templates.strings.js:121 -#: client/src/scheduler/scheduler.strings.js:58 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:369 -msgid "Warning" -msgstr "Avertissement" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:52 -#: client/src/configuration/forms/settings-form.controller.js:444 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:50 -msgid "Warning: Unsaved Changes" -msgstr "Avertissement : modifications non enregistrées" - -#: client/src/license/license.controller.js:159 -msgid "We were unable to locate licenses associated with this account" -msgstr "Nous n'avons pas été en mesure de trouver les licences associées à ce compte" - -#: client/features/jobs/jobs.strings.js:17 -#: client/features/output/output.strings.js:53 -#: client/src/workflow-results/workflow-results.controller.js:88 -msgid "Webhook" -msgstr "Webhook" - -#: client/src/templates/job_templates/job-template.form.js:462 -#: client/src/templates/job_templates/job-template.form.js:473 -#: client/src/templates/workflows.form.js:235 -#: client/src/templates/workflows.form.js:246 -msgid "Webhook Credential" -msgstr "Informations d'identification du webhook" - -#: client/src/templates/job_templates/job-template.form.js:430 -#: client/src/templates/job_templates/job-template.form.js:456 -#: client/src/templates/workflows.form.js:203 -#: client/src/templates/workflows.form.js:229 -msgid "Webhook Key" -msgstr "Clé du webhook" - -#: client/src/templates/job_templates/job-template.form.js:405 -#: client/src/templates/job_templates/job-template.form.js:414 -#: client/src/templates/workflows.form.js:178 -#: client/src/templates/workflows.form.js:187 -msgid "Webhook Service" -msgstr "Service webhook" - -#: client/src/templates/job_templates/job-template.form.js:419 -#: client/src/templates/job_templates/job-template.form.js:425 -#: client/src/templates/workflows.form.js:192 -#: client/src/templates/workflows.form.js:198 -msgid "Webhook URL" -msgstr "URL du webhook" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:78 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:69 -msgid "Webhook services can launch jobs with this job template by making a POST request to this URL." -msgstr "Les services webhook peuvent lancer des tâches avec ce modèle de tâche en effectuant une requête POST à cette URL." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:47 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:79 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:70 -msgid "Webhook services can use this as a shared secret." -msgstr "Les services webhook peuvent l'utiliser en tant que secret partagé." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:434 -#: client/src/scheduler/scheduler.strings.js:39 -msgid "Wed" -msgstr "Mer." - -#: client/src/license/license.partial.html:82 -msgid "Welcome to Ansible Tower! Please complete the steps below to acquire a license." -msgstr "Bienvenue à Ansible Tower ! Veuillez suivre les étapes ci-dessous pour obtenir une licence." - -#: client/src/login/loginModal/loginModal.partial.html:23 -msgid "Welcome to Ansible {{BRAND_NAME}}!  Please sign in." -msgstr "Bienvenue sur Ansible {{BRAND_NAME}} !  Connectez-vous." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:365 -msgid "When not checked, a merge will be performed, combining local variables with those found on the external source." -msgstr "Si la case n'est pas cochée, une fusion aura lieu, combinant les variables locales à celles qui se trouvent dans la source externe." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:354 -msgid "When not checked, local child hosts and groups not found on the external source will remain untouched by the inventory update process." -msgstr "Si non cochée, les hôtes et groupes locaux dépendants non trouvés dans la source externe ne seront pas touchés par le processus de mise à jour de l'inventaire." - -#: client/features/output/output.strings.js:25 -msgid "When this field is true, the job's inventory belongs to an organization that has exceeded it's limit of hosts as defined by the system administrator." -msgstr "Lorsque ce champ est vrai, l'inventaire du job appartient à une organisation qui a dépassé sa limite d'hôtes définie par l'administrateur système." - -#: client/src/projects/projects.form.js:50 -msgid "When this project is used by a Job Template, Organization cannot be changed." -msgstr "Lorsque ce projet est utilisé par un modèle de tâche, l'organisation ne peut pas être modifiée." - -#: client/features/templates/templates.strings.js:119 -#: client/src/workflow-results/workflow-results.controller.js:100 -msgid "Workflow" -msgstr "Workflow" - -#: client/src/notifications/notificationTemplates.form.js:666 -msgid "Workflow Approved Message" -msgstr "Message de workflow approuvé" - -#: client/src/notifications/notificationTemplates.form.js:677 -msgid "Workflow Approved Message Body" -msgstr "Corps de message de workflow approuvé" - -#: client/src/notifications/notificationTemplates.form.js:689 -msgid "Workflow Denied Message" -msgstr "Message de workflow refusé" - -#: client/src/notifications/notificationTemplates.form.js:700 -msgid "Workflow Denied Message Body" -msgstr "Corps de message de workflow refusé" - -#: client/features/jobs/jobs.strings.js:11 -msgid "Workflow Job" -msgstr "Tâche de workflow" - -#: client/lib/models/models.strings.js:49 -msgid "Workflow Job Template Nodes" -msgstr "Nodes de modèles de Jobs de workflows" - -#: client/lib/models/models.strings.js:45 -msgid "Workflow Job Templates" -msgstr "Modèles de Jobs de flux de travail" - -#: client/src/notifications/notificationTemplates.form.js:712 -msgid "Workflow Pending Approval Message" -msgstr "Message de flux de travail en attente d'approbation" - -#: client/src/notifications/notificationTemplates.form.js:723 -msgid "Workflow Pending Approval Message Body" -msgstr "Corps du message de flux de travail en attente d'approbation" - -#: client/features/templates/templates.strings.js:14 -#: client/lib/components/components.strings.js:132 -#: client/src/templates/templates.list.js:66 -msgid "Workflow Template" -msgstr "Modèle de workflow" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:41 -msgid "Workflow Templates" -msgstr "Modèles de workflow" - -#: client/src/notifications/notificationTemplates.form.js:735 -msgid "Workflow Timed Out Message" -msgstr "Message d'expiration de workflow" - -#: client/src/notifications/notificationTemplates.form.js:746 -msgid "Workflow Timed Out Message Body" -msgstr "Corps du message d’expiration de workflow" - -#: client/src/shared/form-generator.js:1676 -#: client/src/templates/workflows.form.js:367 -msgid "Workflow Visualizer" -msgstr "Visualisateur de workflow" - -#: client/features/users/tokens/tokens.strings.js:31 -msgid "Write" -msgstr "Écriture" - -#: client/lib/components/code-mirror/code-mirror.strings.js:13 -#: client/lib/services/base-string.service.js:72 -msgid "YAML" -msgstr "YAML" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:199 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:223 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:247 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:322 -msgid "YAML:" -msgstr "YAML :" - -#: client/lib/services/base-string.service.js:76 -msgid "YES" -msgstr "OUI" - -#: client/src/notifications/add/add.controller.js:88 -#: client/src/notifications/edit/edit.controller.js:151 -msgid "Yellow" -msgstr "Jaune" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:57 -msgid "You can create a job template here." -msgstr "Vous pouvez créer un modèle de tâche ici." - -#: client/features/templates/templates.strings.js:101 -msgid "You do not have access to all resources used by this workflow. Resources that you don't have access to will not be copied and will result in an incomplete workflow." -msgstr "Vous n'avez pas accès à toutes les ressources utilisées par ce workflow. Les ressources auxquelles vous n'avez pas accès ne seront pas copiées et donc, le workflow ne sera pas complet." - -#: client/src/projects/factories/get-project-path.factory.js:56 -msgid "You do not have access to view this property" -msgstr "Vous n’avez pas d’accès pour afficher cette propriété" - -#: client/src/templates/main.js:128 -msgid "You do not have permission to add a job template, or there are no projects available." -msgstr "Vous n'avez pas la permission d'ajouter un modèle de tâche, ou il n'y a pas de projets disponibles." - -#: client/src/projects/add/projects-add.controller.js:35 -msgid "You do not have permission to add a project." -msgstr "Vous n’êtes pas autorisé à ajouter un projet." - -#: client/src/users/add/users-add.controller.js:45 -msgid "You do not have permission to add a user." -msgstr "Vous n’êtes pas autorisé à ajouter un utilisateur." - -#: client/src/templates/main.js:367 -msgid "You do not have permission to add a workflow job template." -msgstr "Vous n'êtes pas autorisé à ajouter un modèle de job de flux de travail." - -#: client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js:190 -msgid "You do not have permission to manage this user" -msgstr "Vous n'êtes pas autorisé à gérer cet utilisateur" - -#: client/features/templates/templates.strings.js:80 -msgid "You do not have permission to perform this action." -msgstr "Vous n'êtes pas autorisé à effectuer cette action." - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "You do not have permission to view this job." -msgstr "Vous n'êtes pas autorisé à afficher ce job." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:41 -msgid "You do not have sufficient permissions to edit the host filter." -msgstr "Vous ne disposez pas de suffisamment de permissions pour modifier le filtre de l'hôte." - -#: client/src/login/loginModal/loginModal.partial.html:34 -msgid "You have been logged out. Please sign in." -msgstr "Votre session a expiré. Veuillez vous connecter." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:51 -#: client/src/configuration/forms/settings-form.controller.js:443 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:49 -msgid "You have unsaved changes. Would you like to proceed without saving?" -msgstr "Des modifications n’ont pas été enregistrées. Voulez-vous continuer sans les enregistrer ?" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook." -msgstr "Vous devez procéder à la mise à jour avant de sélectionner un playbook. Vous ne pourrez pas enregistrer ce modèle de job sans playbook valide." - -#: client/features/projects/projects.strings.js:21 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "Your request to cancel the update was submitted to the task manager." -msgstr "Votre demande d’annulation de la mise à jour a été envoyée au gestionnaire de tâches." - -#: client/src/login/loginModal/loginModal.partial.html:28 -msgid "Your session timed out due to inactivity. Please sign in." -msgstr "Votre session a expiré en raison d’un temps d’inactivité. Veuillez vous connecter." - -#: client/index.template.ejs:32 -msgid "Your session will expire in 60 seconds, would you like to continue?" -msgstr "Votre session expirera dans 60 secondes, voulez-vous continuer ?" - -#: client/src/shared/form-generator.js:1169 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "and" -msgstr "et" - -#: client/src/activity-stream/factories/build-description.factory.js:133 -msgid "approved" -msgstr "approuvé" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "button to view the latest status." -msgstr "bouton pour voir le statut le plus récent." - -#: client/features/users/tokens/tokens.strings.js:27 -msgid "by" -msgstr "par" - -#: client/features/jobs/jobs.strings.js:29 -msgid "canceled" -msgstr "annulé(e)" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "characters long." -msgstr "caractères." - -#: client/src/activity-stream/factories/build-description.factory.js:138 -msgid "denied" -msgstr "refusé" - -#: client/features/output/output.strings.js:104 -#: client/src/shared/smart-search/smart-search.partial.html:50 -msgid "documentation" -msgstr "documentation" - -#: client/features/jobs/jobs.strings.js:28 -msgid "error" -msgstr "erreur" - -#: client/features/jobs/jobs.strings.js:27 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -msgid "failed" -msgstr "Échec" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:262 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:275 -msgid "for a complete list of supported filters." -msgstr "pour obtenir une liste complète des filtres pris en charge." - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "from the" -msgstr "à partir du" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -#: client/src/inventories-hosts/inventory-hosts.strings.js:8 -msgid "group" -msgid_plural "groups" -msgstr[0] "group" -msgstr[1] "groupes" - -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:49 -msgid "groups with sync failures. Click for details" -msgstr "groupes avec échecs de synchronisation. Cliquez pour obtenir plus d'informations." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:9 -msgid "host" -msgid_plural "hosts" -msgstr[0] "hôte" -msgstr[1] "hôtes" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:64 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:61 -msgid "hosts with failures. Click for details." -msgstr "hôtes avec échecs. Cliquez pour obtenir plus d'informations." - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:146 -msgid "min" -msgstr "min" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "missing" -msgstr "manquant" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:21 -msgid "name" -msgstr "nom" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "never updated" -msgstr "jamais mis à jour" - -#: client/features/jobs/jobs.strings.js:22 -msgid "new" -msgstr "nouveau" - -#: client/src/shared/paginate/paginate.partial.html:34 -#: client/src/shared/paginate/paginate.partial.html:45 -msgid "of" -msgstr "de" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "of the filters match." -msgstr "des filtres correspondent." - -#: client/src/scheduler/scheduler.strings.js:34 -msgid "on" -msgstr "le" - -#: client/src/scheduler/scheduler.strings.js:31 -msgid "on day" -msgstr "le" - -#: client/src/scheduler/scheduler.strings.js:35 -msgid "on days" -msgstr "les" - -#: client/src/scheduler/scheduler.strings.js:33 -msgid "on the" -msgstr "le" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:24 -msgid "organization" -msgstr "organisation" - -#: client/features/jobs/jobs.strings.js:23 -msgid "pending" -msgstr "en attente" - -#: client/src/shared/form-generator.js:1044 -msgid "playbook" -msgstr "playbook" - -#: client/features/jobs/jobs.strings.js:25 -msgid "running" -msgstr "actif" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:150 -msgid "sec" -msgstr "sec" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "section" -msgstr "section" - -#: client/features/credentials/credentials.strings.js:35 -msgid "selected" -msgstr "sélectionné" - -#: client/src/credentials/credentials.form.js:138 -#: client/src/credentials/credentials.form.js:363 -msgid "set in helpers/credentials" -msgstr "définir dans helpers/credentials" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:47 -msgid "sources with sync failures. Click for details" -msgstr "sources avec échecs de synchronisation. Cliquez pour obtenir plus d'informations." - -#: client/features/jobs/jobs.strings.js:26 -msgid "successful" -msgstr "réussi" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "test" -msgstr "test" - -#: client/src/activity-stream/factories/build-description.factory.js:136 -msgid "timed out" -msgstr "expiré" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "to" -msgstr "pour" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "to include all regions. Only Hosts associated with the selected regions will be updated." -msgstr "pour inclure toutes les régions. Seuls les hôtes associés aux régions sélectionnées sont actualisés." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "to start it now." -msgstr "pour commencer maintenant." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "to update." -msgstr "pour actualiser." - -#: client/src/activity-stream/factories/build-description.factory.js:141 -msgid "updated" -msgstr "actualisé" - -#: client/src/credentials/credentials.form.js:380 -msgid "v2 URLs%s - leave blank" -msgstr "v2 URLs%s - laisser vide" - -#: client/src/credentials/credentials.form.js:381 -msgid "v3 default%s - set to 'default'" -msgstr "v3 default%s - définir sur 'default'" - -#: client/src/credentials/credentials.form.js:382 -msgid "v3 multi-domain%s - your domain name" -msgstr "v3 multi-domain%s - votre nom de domaine" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:318 -msgid "view azure_rm.ini in the Ansible community.general github repo." -msgstr "afficher azure_rm.ini dans le référentiel github général de la communauté Ansible." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:219 -msgid "view ec2.ini in the community.aws repo." -msgstr "afficher ec2.ini dans le référentiel community.aws." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:243 -msgid "view vmware_inventory.ini in the vmware community repo." -msgstr "afficher vmware_inventory.ini dans le référentiel de la communauté vmware." - -#: client/features/jobs/jobs.strings.js:24 -msgid "waiting" -msgstr "en attente" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "when" -msgstr "quand" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:240 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:252 -msgid "will create group names similar to the following examples based on the options selected:" -msgstr "créera des noms de groupe semblables aux noms de groupes des exemples suivants selon les options sélectionnées :" - -#: client/index.template.ejs:158 -msgid "working..." -msgstr "en cours..." - -#: client/features/users/tokens/tokens.strings.js:42 -msgid "{{ appName }} Token" -msgstr "{{ appName }} Jeton" - -#: client/lib/services/base-string.service.js:158 -msgid "{{ header }} {{ body }}" -msgstr "{{ header }} {{ body }}" - -#: client/lib/services/base-string.service.js:80 -msgid "{{ resource }} successfully created" -msgstr "{{ resource }} créé" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:31 -msgid "{{ str1 }}

{{ str2 }}

" -msgstr "{{ str1 }}

{{ str2 }}

" - -#: client/lib/components/cards/card.partial.html:2 -msgid "{{ title }}" -msgstr "{{ title }}" - -#: client/src/instance-groups/container-groups/add-container-group.view.html:24 -msgid "{{ vm.form.extraVars.toggleLabel }}" -msgstr "{{ vm.form.extraVars.toggleLabel }}" - -#: client/src/configuration/forms/settings-form.partial.html:10 -#: client/src/configuration/forms/settings-form.route.js:15 -msgid "{{ vm.getCurrentFormTitle() }}" -msgstr "{{ vm.getCurrentFormTitle() }}" - -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:5 -msgid "{{:: vm.strings.get('prompt.JOB_TYPE') }}" -msgstr "{{:: vm.strings.get('prompt.JOB_TYPE') }}" - -#: client/lib/components/input/label.partial.html:5 -msgid "{{::state._hint}}" -msgstr "{{::state._hint}}" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:6 -#: client/src/configuration/forms/system-form/configuration-system.partial.html:5 -msgid "{{opt.label}}" -msgstr "{{opt.label}}" - -#: client/src/shared/paginate/paginate.partial.html:56 -msgid "{{pageSize}}" -msgstr "{{pageSize}}" - diff --git a/awx/ui/po/ja.po b/awx/ui/po/ja.po deleted file mode 100644 index 9c04b6160a..0000000000 --- a/awx/ui/po/ja.po +++ /dev/null @@ -1,8064 +0,0 @@ -msgid "" -msgstr "" -"Language: ja \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" - -#: client/src/projects/add/projects-add.controller.js:166 -#: client/src/projects/edit/projects-edit.controller.js:287 -msgid "%sNote:%s Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." -msgstr "%s注:%s Mercurial は SSH のパスワード認証をサポートしません。ユーザー名およびキーを URL に入れないでください。Bitbucket および SSH を使用している場合は、Bitbucket ユーザー名を入力しないでください。" - -#: client/src/projects/add/projects-add.controller.js:145 -#: client/src/projects/edit/projects-edit.controller.js:266 -msgid "%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." -msgstr "%s注:%s GitHub または Bitbucket の SSH プロトコルを使用している場合、SSH キーのみを入力し、ユーザー名 (git 以外) を入力しないでください。また、GitHub および Bitbucket は、SSH の使用時のパスワード認証をサポートしません。GIT の読み取り専用プロトコル (git://) はユーザー名またはパスワード情報を使用しません。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:62 -msgid "(HH24:MM:SS UTC)" -msgstr "(HH24:MM:SS UTC)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:57 -msgid "(HH24:MM:SS)" -msgstr "(HH24:MM:SS)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:568 -msgid "(Limited to first 10)" -msgstr "(最初の 10 件に制限)" - -#: client/src/credentials/credentials.form.js:286 -msgid "(defaults to %s)" -msgstr "(%s にデフォルト設定)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -msgid "(seconds)" -msgstr "(秒)" - -#: client/src/shared/paginate/paginate.partial.html:67 -msgid "100" -msgstr "100" - -#: client/src/shared/paginate/paginate.partial.html:61 -msgid "20" -msgstr "20" - -#: client/src/shared/paginate/paginate.partial.html:64 -msgid "50" -msgstr "50" - -#: client/src/license/license.partial.html:193 -msgid "Automation analytics: This data is used to enhance future releases of the Tower Software and to provide Automation Analytics to Tower subscribers." -msgstr "自動化アナリティクス: このデータを使用して、Tower ソフトウェアの今後のリリースを強化し、Tower をサブスクライブする方に自動化アナリティクスを提供します。" - -#: client/src/license/license.partial.html:171 -msgid "I agree to the End User License Agreement" -msgstr "使用許諾契約書に同意します" - -#: client/src/license/license.partial.html:187 -msgid "User analytics: This data is used to enhance future releases of the Tower Software and help streamline customer experience and success." -msgstr "ユーザーの解析: このデータは、Tower ソフトウェアの今後のリリースを強化し、顧客へのサービスを効率化し、成功に導くサポートをします。" - -#: client/src/login/loginModal/loginModal.partial.html:32 -msgid "" -"\n" -"
\n" -" You have been logged out. Please sign in.\n" -"
" -msgstr "\n" -"
\n" -" ログアウトされました。サインインしてください。\n" -"
" - -#: client/lib/components/code-mirror/code-mirror.strings.js:19 -msgid "" -"

\n" -" Enter inventory variables using either JSON or YAML\n" -" syntax. Use the radio button to toggle between the two.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" View YAML examples at\n" -" \n" -" docs.ansible.com\n" -"

" -msgstr "

\n" -" JSON または YAML 構文のいずれかを使用してインベントリー変数を入力します。ラジオボタンを使用してこれらの間で切り替えを行います。\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" JSON サンプルの表示\n" -" www.json.org\n" -"

\n" -"

\n" -" YAML サンプルの表示\n" -" \n" -" docs.ansible.com\n" -"

" - -#: client/features/templates/templates.strings.js:65 -msgid "

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" -msgstr "

追加のコマンドライン変数を Playbook に渡します。これは、ansible-playbook の -e または --extra-vars コマンドラインパラメーターです。YAML または JSON のいずれかを使用してキーと値のペアを指定します。

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:213 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:222 -msgid "A NEW WEBHOOK KEY WILL BE GENERATED ON SAVE" -msgstr "新規 WEBHOOK キーは保存時に生成されます。" - -#: client/src/projects/projects.form.js:138 -msgid "A refspec to fetch (passed to the Ansible git module). This parameter allows access to references via the branch field not otherwise available." -msgstr "取得する refspec (Ansible git モジュールに渡します)。このパラメーターを使用すると、(パラメーターなしでは利用できない) ブランチのフィールド経由で参照にアクセスできるようになります。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 -#: client/src/scheduler/scheduler.strings.js:22 -msgid "A schedule name is required." -msgstr "スケジュール名が必要です。" - -#: client/src/users/add/users-add.controller.js:104 -msgid "A value is required" -msgstr "値が必要です" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:173 -msgid "A value is required." -msgstr "値が必要です。" - -#: client/src/about/about.route.js:10 -msgid "ABOUT" -msgstr "情報" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:18 -msgid "ACTION" -msgstr "アクション" - -#: client/src/activity-stream/activity-detail.form.js:23 -msgid "ACTIVITY DETAIL" -msgstr "アクティビティーの詳細" - -#: client/src/activity-stream/activitystream.route.js:28 -#: client/src/activity-stream/streams.list.js:14 -#: client/src/activity-stream/streams.list.js:15 -msgid "ACTIVITY STREAM" -msgstr "アクティビティーストリーム" - -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:7 -msgid "ADD" -msgstr "追加" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:3 -msgid "ADD A NEW TEMPLATE" -msgstr "新規テンプレートの追加" - -#: client/features/templates/templates.strings.js:123 -msgid "ADD A NODE" -msgstr "ノードの追加" - -#: client/features/templates/templates.strings.js:141 -msgid "ADD LINK" -msgstr "リンクの追加" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:16 -msgid "ADD SURVEY PROMPT" -msgstr "Survey プロンプトの追加" - -#: client/src/shared/smart-search/smart-search.partial.html:48 -msgid "ADDITIONAL INFORMATION" -msgstr "追加情報" - -#: client/features/output/output.strings.js:101 -msgid "ADDITIONAL_INFORMATION" -msgstr "ADDITIONAL_INFORMATION" - -#: client/src/organizations/linkout/organizations-linkout.route.js:241 -#: client/src/organizations/list/organizations-list.controller.js:90 -msgid "ADMINS" -msgstr "管理者" - -#: client/src/activity-stream/get-target-title.factory.js:4 -msgid "ALL ACTIVITY" -msgstr "すべてのアクティビティー" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:44 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js:47 -msgid "ALL GROUPS" -msgstr "すべてのグループ" - -#: client/src/credentials/credentials.form.js:198 -msgid "API Key" -msgstr "API キー" - -#: client/src/notifications/notificationTemplates.form.js:247 -msgid "API Service/Integration Key" -msgstr "API サービス/統合キー" - -#: client/src/notifications/shared/type-change.service.js:66 -msgid "API Token" -msgstr "API トークン" - -#: client/features/users/tokens/tokens.strings.js:40 -msgid "APPLICATION" -msgstr "アプリケーション" - -#: client/features/applications/applications.strings.js:23 -msgid "APPLICATION INFORMATION" -msgstr "アプリケーション情報" - -#: client/features/applications/applications.strings.js:28 -#: client/features/applications/applications.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:47 -msgid "APPLICATIONS" -msgstr "アプリケーション" - -#: client/lib/components/components.strings.js:126 -msgid "APPROVAL" -msgstr "承認" - -#: client/features/templates/templates.strings.js:155 -msgid "APPROVAL TIMED OUT" -msgstr "承認タイムアウト" - -#: client/lib/components/components.strings.js:128 -msgid "APPROVE" -msgstr "承認" - -#: client/features/templates/templates.strings.js:157 -msgid "APPROVED" -msgstr "承認" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js:19 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js:19 -msgid "ASSOCIATED GROUPS" -msgstr "関連付けられているグループ" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js:19 -msgid "ASSOCIATED HOSTS" -msgstr "関連付けられているホスト" - -#: client/lib/components/components.strings.js:89 -#: client/lib/components/layout/layout.partial.html:24 -msgid "About" -msgstr "情報" - -#: client/lib/components/components.strings.js:93 -msgid "Access" -msgstr "アクセス" - -#: client/src/credentials/credentials.form.js:91 -msgid "Access Key" -msgstr "アクセスキー" - -#: client/src/configuration/settings.service.js:40 -msgid "Access Token Expiration" -msgstr "アクセストークンの有効期限" - -#: client/src/notifications/notificationTemplates.form.js:225 -msgid "Account SID" -msgstr "アカウント SID" - -#: client/src/notifications/notificationTemplates.form.js:184 -msgid "Account Token" -msgstr "アカウントトークン" - -#: client/src/activity-stream/activity-detail.form.js:36 -msgid "Action" -msgstr "アクション" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:21 -#: client/src/inventories-hosts/hosts/hosts.partial.html:49 -#: client/src/shared/form-generator.js:1872 -#: client/src/shared/list-generator/list-generator.factory.js:571 -msgid "Actions" -msgstr "アクション" - -#: client/features/templates/templates.strings.js:18 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:18 -#: client/src/templates/templates.list.js:36 -msgid "Activity" -msgstr "アクティビティー" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:84 -msgid "Activity Stream" -msgstr "アクティビティーストリーム" - -#: client/features/credentials/legacy.credentials.js:70 -#: client/src/credentials/credentials.form.js:446 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:113 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:110 -#: client/src/organizations/organizations.form.js:117 -#: client/src/organizations/organizations.form.js:159 -#: client/src/projects/projects.form.js:285 -#: client/src/teams/teams.form.js:169 -#: client/src/teams/teams.form.js:85 -#: client/src/templates/workflows.form.js:295 -#: client/src/users/users.form.js:221 -msgid "Add" -msgstr "追加" - -#: client/src/instance-groups/instance-groups.strings.js:74 -msgid "Add Container Group" -msgstr "コンテナーグループの追加" - -#: client/src/instance-groups/instance-groups.strings.js:75 -msgid "Add Credential" -msgstr "認証情報の追加" - -#: client/src/credentials/credentials.list.js:14 -msgid "Add Credentials" -msgstr "認証情報の追加" - -#: client/src/inventories-hosts/inventories/inventory.list.js:13 -msgid "Add Inventories" -msgstr "インベントリーの追加" - -#: client/src/shared/stateDefinitions.factory.js:304 -msgid "Add Permissions" -msgstr "パーミッションの追加" - -#: client/src/projects/projects.list.js:13 -msgid "Add Project" -msgstr "プロジェクトの追加" - -#: client/src/shared/form-generator.js:1664 -#: client/src/templates/job_templates/job-template.form.js:596 -#: client/src/templates/workflows.form.js:351 -msgid "Add Survey" -msgstr "Survey の追加" - -#: client/src/teams/teams.list.js:13 -msgid "Add Team" -msgstr "チームの追加" - -#: client/src/teams/teams.form.js:86 -msgid "Add User" -msgstr "ユーザーの追加" - -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/shared/stateDefinitions.factory.js:594 -#: client/src/users/users.list.js:17 -msgid "Add Users" -msgstr "ユーザーの追加" - -#: client/src/organizations/organizations.form.js:118 -msgid "Add Users to this organization." -msgstr "ユーザーをこの組織に追加してください。" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:58 -msgid "Add a group" -msgstr "グループの追加" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:135 -msgid "Add a host" -msgstr "ホストの追加" - -#: client/src/instance-groups/instance-groups.strings.js:44 -msgid "Add a new instance" -msgstr "新規インスタンスの追加" - -#: client/src/instance-groups/instance-groups.strings.js:25 -msgid "Add a new instance group" -msgstr "新規インスタンスグループの追加" - -#: client/src/organizations/list/organizations-list.partial.html:20 -msgid "Add a new organization" -msgstr "新規組織の追加" - -#: client/features/projects/projects.strings.js:14 -msgid "Add a new project" -msgstr "新規プロジェクトの追加" - -#: client/src/scheduler/schedules.list.js:81 -msgid "Add a new schedule" -msgstr "新規スケジュールの追加" - -#: client/features/templates/templates.strings.js:24 -msgid "Add a new template" -msgstr "新規テンプレートの追加" - -#: client/features/users/tokens/tokens.strings.js:43 -msgid "Add a new token" -msgstr "新規トークンの追加" - -#: client/features/credentials/legacy.credentials.js:71 -#: client/src/credentials/credentials.form.js:447 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:115 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:112 -#: client/src/organizations/organizations.form.js:160 -#: client/src/projects/projects.form.js:286 -#: client/src/templates/job_templates/job-template.form.js:541 -#: client/src/templates/workflows.form.js:296 -msgid "Add a permission" -msgstr "パーミッションの追加" - -#: client/src/organizations/linkout/organizations-linkout.route.js:63 -msgid "Add existing user to organization" -msgstr "組織への既存ユーザーの追加" - -#: client/src/organizations/linkout/organizations-linkout.route.js:256 -msgid "Add existing user to organization as administrator" -msgstr "管理者として組織に既存ユーザーを追加する" - -#: client/src/shared/form-generator.js:1394 -msgid "Admin" -msgstr "管理者" - -#: client/lib/components/components.strings.js:94 -msgid "Administration" -msgstr "管理" - -#: client/src/organizations/linkout/organizations-linkout.route.js:262 -msgid "Admins" -msgstr "管理者" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:376 -msgid "After every project update where the SCM revision changes, refresh the inventory from the selected source before executing job tasks. This is intended for static content, like the Ansible inventory .ini file format." -msgstr "SCM リビジョンが変更されるプロジェクトの毎回の更新後に、選択されたソースのインベントリーを更新してからジョブのタスクを実行します。これは、Ansible インベントリーの .ini ファイル形式のような静的コンテンツが対象であることが意図されています。" - -#: client/features/templates/templates.strings.js:160 -#: client/lib/components/components.strings.js:105 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:41 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:49 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:72 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:80 -msgid "All" -msgstr "すべて" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 -msgid "All Activity" -msgstr "すべてのアクティビティー" - -#: client/features/portalMode/index.view.html:33 -msgid "All Jobs" -msgstr "すべてのジョブ" - -#: client/src/projects/projects.form.js:208 -#: client/src/projects/projects.form.js:211 -msgid "Allow branch override" -msgstr "ブランチの上書き許可" - -#: client/src/projects/projects.form.js:210 -msgid "Allow changing the SCM branch or revision in a job template that uses this project." -msgstr "このプロジェクトを使用するジョブテンプレートで SCM ブランチまたはリビジョンを変更できるようにします。" - -#: client/features/templates/templates.strings.js:114 -#: client/src/workflow-results/workflow-results.controller.js:97 -msgid "Always" -msgstr "常時" - -#: client/features/projects/projects.strings.js:25 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "An SCM update does not appear to be running for project:" -msgstr "SCM 更新がプロジェクトに対して実行されていないようです。" - -#: client/lib/services/base-string.service.js:83 -msgid "Ansible AWX Logo" -msgstr "Ansible AWX ロゴ" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:66 -#: client/src/organizations/organizations.form.js:47 -#: client/src/organizations/organizations.form.js:52 -#: client/src/projects/projects.form.js:238 -#: client/src/projects/projects.form.js:243 -#: client/src/templates/job_templates/job-template.form.js:255 -#: client/src/templates/job_templates/job-template.form.js:261 -msgid "Ansible Environment" -msgstr "Ansible 環境" - -#: client/src/projects/projects.form.js:145 -msgid "Ansible Tower Documentation" -msgstr "Ansible Tower ドキュメント" - -#: client/lib/services/base-string.service.js:84 -msgid "Ansible Tower Logo" -msgstr "Ansible Tower ロゴ" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:62 -#: client/src/templates/survey-maker/shared/question-definition.form.js:68 -msgid "Answer Type" -msgstr "回答タイプ" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:44 -#: client/src/templates/survey-maker/shared/question-definition.form.js:53 -msgid "Answer Variable Name" -msgstr "回答の変数名" - -#: client/features/templates/templates.strings.js:161 -msgid "Any" -msgstr "任意" - -#: client/features/users/tokens/users-tokens-add.controller.js:15 -msgid "Application" -msgstr "アプリケーション" - -#: client/lib/components/components.strings.js:87 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 -msgid "Applications" -msgstr "アプリケーション" - -#: client/features/templates/templates.strings.js:153 -#: client/src/notifications/notifications.list.js:40 -msgid "Approval" -msgstr "承認" - -#: client/src/workflow-results/workflow-results.service.js:87 -msgid "Are you sure you want to cancel this workflow job?" -msgstr "このワークフローのジョブをキャンセルしてよろしいですか?" - -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:110 -msgid "Are you sure you want to delete this job?" -msgstr "このジョブを削除してもよろしいですか?" - -#: client/src/notifications/notification-templates-list/list.controller.js:233 -msgid "Are you sure you want to delete this notification template?" -msgstr "この通知テンプレートを削除してもよろしいですか?" - -#: client/src/scheduler/factories/delete-schedule.factory.js:58 -msgid "Are you sure you want to delete this schedule?" -msgstr "このスケジュールを削除してもよろしいですか?" - -#: client/src/teams/list/teams-list.controller.js:80 -msgid "Are you sure you want to delete this team?" -msgstr "このチームを削除してもよろしいですか?" - -#: client/src/users/list/users-list.controller.js:93 -msgid "Are you sure you want to delete this user?" -msgstr "このユーザーを削除してもよろしいですか?" - -#: client/features/templates/templates.strings.js:110 -msgid "Are you sure you want to delete this workflow node?" -msgstr "このワークフローノードを削除してもよろしいですか?" - -#: client/src/workflow-results/workflow-results.service.js:42 -msgid "Are you sure you want to delete this workflow?" -msgstr "このワークフローを削除してもよろしいですか?" - -#: client/lib/services/base-string.service.js:92 -msgid "Are you sure you want to delete this {{ resourceType }}?" -msgstr "この {{ resourceType }} を削除してもよろしいですか?" - -#: client/src/partials/survey-maker-modal.html:13 -msgid "Are you sure you want to delete this {{deleteMode}}?" -msgstr "この {{deleteMode}} を削除してもよろしいですか?" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:26 -msgid "Are you sure you want to disassociate the group below from" -msgstr "以下のグループの関連付けを解除してもよろしいですか?" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:24 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:27 -msgid "Are you sure you want to disassociate the host below from" -msgstr "以下のホストの関連付けを解除してもよろしいですか?" - -#: client/features/templates/templates.strings.js:149 -msgid "Are you sure you want to exit the Workflow Creator without saving your changes?" -msgstr "変更を保存せずにワークフロークリエーターを終了してもよろしいですか?" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:46 -msgid "Are you sure you want to permanently delete the group below from the inventory?" -msgstr "インベントリーから以下のグループを完全に削除してもよろしいですか?" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:104 -msgid "Are you sure you want to permanently delete the host below from the inventory?" -msgstr "インベントリーからホストを完全に削除してもよろしいですか?" - -#: client/src/projects/edit/projects-edit.controller.js:242 -msgid "Are you sure you want to remove the %s below from %s?" -msgstr "%s から以下の %s を削除してもよろしいですか?" - -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:67 -msgid "Are you sure you want to remove the following administrator from this organization?" -msgstr "この組織から以下の管理者を削除してもよろしいですか?" - -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:66 -msgid "Are you sure you want to remove the following user from this organization?" -msgstr "この組織から以下のユーザーを削除してもよろしいですか?" - -#: client/lib/services/base-string.service.js:109 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:109 -msgid "Are you sure you want to submit the request to cancel this job?" -msgstr "このジョブをキャンセルする要求を送信してよろしいですか?" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:39 -msgid "Arguments" -msgstr "引数" - -#: client/features/output/output.strings.js:59 -msgid "Artifacts" -msgstr "アーティファクト" - -#: client/src/credentials/credentials.form.js:232 -#: client/src/credentials/credentials.form.js:271 -#: client/src/credentials/credentials.form.js:310 -#: client/src/credentials/credentials.form.js:396 -msgid "Ask at runtime?" -msgstr "実行時に確認しますか?" - -#: client/src/instance-groups/instance-groups.strings.js:36 -msgid "Associate an existing Instance" -msgstr "既存インスタンスの関連付け" - -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:74 -msgid "Associate an existing group" -msgstr "既存グループの関連付け" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:56 -msgid "Associate this host with a new group" -msgstr "新規グループへのこのホストの関連付け" - -#: client/src/shared/form-generator.js:1396 -msgid "Auditor" -msgstr "監査者" - -#: client/lib/components/components.strings.js:95 -#: client/src/configuration/settings.partial.html:2 -msgid "Authentication" -msgstr "認証" - -#: client/src/credentials/credentials.form.js:72 -msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." -msgstr "ネットワークデバイスアクセスの認証です。これには、SSH キー、ユーザー名、パスワード、および承認情報が含まれることがあります。ネットワーク認証情報は、ネットワークデバイスに対して Playbook を実行するためのジョブの送信時に使用されます。" - -#: client/src/credentials/credentials.form.js:68 -msgid "Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts." -msgstr "リモートマシンアクセスの認証です。これには、SSH キー、ユーザー名、パスワード、および sudo 情報が含まれることがあります。マシン認証情報は、リモートホストに対して Playbook を実行するためのジョブの送信時に使用されます。" - -#: client/src/configuration/settings.service.js:48 -msgid "Authorization Code Expiration" -msgstr "認証コードの有効期限" - -#: client/src/credentials/credentials.form.js:342 -msgid "Authorize" -msgstr "承認" - -#: client/src/credentials/credentials.form.js:350 -msgid "Authorize Password" -msgstr "パスワードの承認" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:91 -msgid "Azure AD" -msgstr "Azure AD" - -#: client/src/shared/directives.js:91 -msgid "BROWSE" -msgstr "参照" - -#: client/features/output/output.strings.js:124 -msgid "Back to Top" -msgstr "トップに戻る" - -#: client/src/projects/projects.form.js:82 -msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." -msgstr "Playbook を見つけるために使用されるベースパスです。このパス内にあるディレクトリーは Playbook ディレクトリーのドロップダウンに一覧表示されます。ベースパスと選択された Playbook ディレクトリーは、Playbook を見つけるために使用される完全なパスを提供します。" - -#: client/src/notifications/shared/type-change.service.js:56 -msgid "Basic Auth Password" -msgstr "Basic 認証パスワード" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:129 -msgid "Become Privilege Escalation" -msgstr "Become (権限昇格)" - -#: client/features/output/output.strings.js:87 -msgid "Branch" -msgstr "ブランチ" - -#: client/src/projects/projects.form.js:129 -msgid "Branch to checkout. In addition to branches, you can input tags, commit hashes, and arbitrary refs. Some commit hashes and refs may not be availble unless you also provide a custom refspec." -msgstr "チェックアウトするブランチです。ブランチ以外に、タグ、コミットハッシュ値、任意の参照 (refs) を入力できます。カスタムの refspec も指定しない限り、コミットハッシュ値や参照で利用できないものもあります。" - -#: client/features/templates/templates.strings.js:72 -#: client/src/templates/job_templates/job-template.form.js:112 -msgid "Branch to use in job run. Project default used if blank." -msgstr "ジョブ実行で使用するブランチ。空白の場合はプロジェクトのデフォルト値が使用されます。" - -#: client/src/license/license.partial.html:113 -msgid "Browse" -msgstr "参照" - -#: client/src/license/license.partial.html:180 -msgid "By default, Tower collects and transmits analytics data on Tower usage to Red Hat. There are two categories of data collected by Tower. For more information, see this Tower documentation page. Uncheck the following boxes to disable this feature." -msgstr "デフォルトでは、Tower は Tower の使用状況に関する解析データを収集して、Red Hat に送信します。Tower が収集するデータにはカテゴリーが 2 種類あります。詳細情報は、 この Tower ドキュメントページ を参照してください。この機能を無効にするには、以下のボックスのチェックを解除します。" - -#: client/features/templates/templates.strings.js:151 -#: client/lib/services/base-string.service.js:61 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:29 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:50 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:23 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:16 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:16 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:16 -#: client/src/license/license.partial.html:259 -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:17 -#: client/src/partials/survey-maker-modal.html:17 -#: client/src/partials/survey-maker-modal.html:82 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:17 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:131 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:180 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:69 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:149 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:188 -msgid "CANCEL" -msgstr "取り消し" - -#: client/index.template.ejs:116 -msgid "CAUTION: Setting both numerical variables to \"0\" will delete all facts." -msgstr "注意: どちらの数値変数も「0」に設定すると、すべてのファクトが削除されます。" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:30 -msgid "CHANGES" -msgstr "変更" - -#: client/features/templates/templates.strings.js:131 -msgid "CHECK" -msgstr "チェック" - -#: client/lib/components/components.strings.js:20 -msgid "CHOOSE A FILE" -msgstr "ファイルの選択" - -#: client/features/output/output.strings.js:103 -#: client/src/shared/smart-search/smart-search.partial.html:26 -msgid "CLEAR ALL" -msgstr "すべてをクリア" - -#: client/features/applications/applications.strings.js:21 -msgid "CLIENT ID" -msgstr "クライアント ID" - -#: client/features/applications/applications.strings.js:22 -msgid "CLIENT SECRET" -msgstr "クライアントシークレット" - -#: client/lib/services/base-string.service.js:62 -#: client/lib/services/base-string.service.js:77 -#: client/src/partials/survey-maker-modal.html:83 -msgid "CLOSE" -msgstr "閉じる" - -#: client/features/jobs/routes/hostCompletedJobs.route.js:27 -#: client/features/jobs/routes/templateCompletedJobs.route.js:28 -#: client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js:28 -msgid "COMPLETED JOBS" -msgstr "完了したジョブ" - -#: client/features/templates/templates.strings.js:35 -#: client/src/scheduler/scheduler.strings.js:68 -msgid "CONFIRM" -msgstr "確認" - -#: client/lib/services/base-string.service.js:75 -msgid "COPY" -msgstr "コピー" - -#: client/features/users/tokens/tokens.strings.js:25 -msgid "COULD NOT CREATE TOKEN" -msgstr "トークンを作成できませんでした。" - -#: client/src/instance-groups/instance-groups.strings.js:54 -msgid "CPU" -msgstr "CPU" - -#: client/src/shared/stateDefinitions.factory.js:161 -msgid "CREATE %s" -msgstr "%s の作成" - -#: client/features/applications/applications.strings.js:9 -msgid "CREATE APPLICATION" -msgstr "アプリケーションの作成" - -#: client/src/instance-groups/instance-groups.strings.js:13 -msgid "CREATE CONTAINER GROUP" -msgstr "コンテナーグループの作成" - -#: client/features/credentials/credentials.strings.js:8 -#: client/src/credentials/credentials.form.js:16 -msgid "CREATE CREDENTIAL" -msgstr "認証情報の作成" - -#: client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:16 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:16 -msgid "CREATE GROUP" -msgstr "グループの作成" - -#: client/src/inventories-hosts/hosts/host.form.js:17 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:17 -#: client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:17 -msgid "CREATE HOST" -msgstr "ホストの作成" - -#: client/src/instance-groups/instance-groups.strings.js:12 -msgid "CREATE INSTANCE GROUP" -msgstr "インスタンスグループの作成" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:8 -msgid "CREATE INVENTORY SOURCE" -msgstr "インベントリーソースの作成" - -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js:9 -#: client/src/scheduler/scheduler.strings.js:8 -#: client/src/scheduler/schedules.route.js:161 -#: client/src/scheduler/schedules.route.js:242 -#: client/src/scheduler/schedules.route.js:73 -msgid "CREATE SCHEDULE" -msgstr "スケジュールの作成" - -#: client/src/management-jobs/scheduler/main.js:83 -msgid "CREATE SCHEDULED JOB" -msgstr "スケジュール済みジョブの作成" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:18 -msgid "CREATE SOURCE" -msgstr "ソースの作成" - -#: client/features/users/tokens/tokens.strings.js:18 -#: client/features/users/tokens/tokens.strings.js:9 -#: client/features/users/tokens/users-tokens-add.route.js:49 -msgid "CREATE TOKEN" -msgstr "トークンの作成" - -#: client/features/output/output.strings.js:128 -msgid "CREATED" -msgstr "作成済み" - -#: client/features/credentials/credentials.strings.js:31 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:150 -msgid "CREDENTIAL" -msgstr "認証情報" - -#: client/src/credential-types/credential-types.form.js:21 -msgid "CREDENTIAL TYPE" -msgstr "認証情報タイプ" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:61 -msgid "CREDENTIAL TYPE:" -msgstr "認証情報タイプ:" - -#: client/src/activity-stream/get-target-title.factory.js:11 -#: client/src/credential-types/credential-types.list.js:12 -#: client/src/credential-types/main.js:44 -msgid "CREDENTIAL TYPES" -msgstr "認証情報タイプ" - -#: client/features/credentials/legacy.credentials.js:11 -#: client/src/activity-stream/get-target-title.factory.js:17 -#: client/src/credentials/credentials.list.js:15 -#: client/src/credentials/credentials.list.js:16 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:5 -msgid "CREDENTIALS" -msgstr "認証情報" - -#: client/features/credentials/credentials.strings.js:49 -msgid "CREDENTIALS PERMISSIONS" -msgstr "認証情報のパーミッション" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:398 -#: client/src/projects/projects.form.js:231 -msgid "Cache Timeout" -msgstr "キャッシュタイムアウト" - -#: client/src/projects/projects.form.js:220 -msgid "Cache Timeout%s (seconds)%s" -msgstr "キャッシュタイムアウト%s (秒)%s" - -#: client/src/users/list/users-list.controller.js:85 -msgid "Call to %s failed. DELETE returned status:" -msgstr "%s の呼び出しに失敗しました。DELETE で返されたステータス:" - -#: client/src/projects/edit/projects-edit.controller.js:236 -msgid "Call to %s failed. POST returned status:" -msgstr "%s の呼び出しに失敗しました。POST で返されたステータス:" - -#: client/src/management-jobs/card/card.controller.js:29 -msgid "Call to %s failed. Return status: %d" -msgstr "%s の呼び出しが失敗しました。返されたステータス: %d" - -#: client/lib/services/base-string.service.js:116 -msgid "Call to {{ path }} failed. {{ action }} returned status: {{ status }}." -msgstr "{{ path }} の呼び出しに失敗しました。{{ action }} で返されたステータス: {{ status }}" - -#: client/features/output/output.strings.js:18 -#: client/lib/services/base-string.service.js:108 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:187 -#: client/src/configuration/forms/settings-form.controller.js:473 -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:24 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:624 -#: client/src/scheduler/scheduler.strings.js:56 -#: client/src/shared/form-generator.js:1652 -#: client/src/shared/lookup/lookup-modal.partial.html:19 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:33 -#: client/src/workflow-results/workflow-results.controller.js:56 -msgid "Cancel" -msgstr "取り消し" - -#: client/features/output/output.strings.js:54 -#: client/lib/services/base-string.service.js:110 -msgid "Cancel Job" -msgstr "ジョブの取り消し" - -#: client/features/projects/projects.strings.js:31 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Cancel Not Allowed" -msgstr "取り消しは許可されていません" - -#: client/src/workflow-results/workflow-results.service.js:84 -msgid "Cancel Workflow" -msgstr "ワークフローの取り消し" - -#: client/src/workflow-results/workflow-results.partial.html:39 -msgid "Cancel job" -msgstr "ジョブの取り消し" - -#: client/src/license/license.strings.js:8 -msgid "Cancel license lookup" -msgstr "ライセンス検索の取り消し" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:104 -msgid "Cancel sync process" -msgstr "同期プロセスの取り消し" - -#: client/src/projects/projects.list.js:128 -msgid "Cancel the SCM update" -msgstr "SCM 更新の取り消し" - -#: client/lib/services/base-string.service.js:122 -msgid "Cancel the {{resourceType}}" -msgstr "{{resourceType}} の取り消し" - -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:34 -msgid "Cancel unsaved changes" -msgstr "変更が保存されていません" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:32 -msgid "Canceled. Click for details" -msgstr "取り消されました。クリックして詳細を確認してください。" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Cannot find job." -msgstr "ジョブが見つかりません。" - -#: client/src/shared/smart-search/smart-search.controller.js:167 -msgid "Cannot search running job" -msgstr "実行中のジョブを検索することはできません" - -#: client/src/instance-groups/instance-groups.list.js:22 -msgid "Capacity" -msgstr "容量" - -#: client/lib/services/base-string.service.js:154 -msgid "Capacity (Ascending)" -msgstr "容量 (昇順)" - -#: client/lib/services/base-string.service.js:155 -msgid "Capacity (Descending)" -msgstr "容量 (降順)" - -#: client/src/projects/projects.form.js:84 -msgid "Change %s when deploying {{BRAND_NAME}} to change this location." -msgstr "この場所を変更するには {{BRAND_NAME}} のデプロイ時に %s を変更します。" - -#: client/src/activity-stream/activity-detail.form.js:41 -msgid "Changes" -msgstr "変更" - -#: client/src/notifications/notificationTemplates.form.js:432 -msgid "Channel" -msgstr "チャネル" - -#: client/features/templates/templates.strings.js:73 -msgid "Check" -msgstr "チェック" - -#: client/src/shared/form-generator.js:1046 -msgid "Choose a %s" -msgstr "%s の選択" - -#: client/src/templates/job_templates/job-template.form.js:407 -#: client/src/templates/workflows.form.js:180 -msgid "Choose a Webhook Service" -msgstr "Webhook サービスの選択" - -#: client/features/templates/templates.strings.js:62 -msgid "Choose a job type" -msgstr "ジョブタイプを選択してください" - -#: client/src/templates/job_templates/job-template.form.js:125 -msgid "Choose a playbook" -msgstr "Playbook の選択" - -#: client/features/templates/templates.strings.js:63 -msgid "Choose a verbosity" -msgstr "詳細レベルの選択" - -#: client/src/projects/projects.form.js:60 -msgid "Choose an SCM Type" -msgstr "SCM タイプの選択" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:64 -msgid "Choose an answer type" -msgstr "回答タイプの選択" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:67 -msgid "Choose an answer type or format you want as the prompt for the user. Refer to the Ansible Tower Documentation for more additional information about each option." -msgstr "ユーザーのプロンプトが表示される際に、必要な回答タイプを選択します。それぞれのオプションの詳細については、Ansible Tower ドキュメントを参照してください。" - -#: client/src/notifications/notificationTemplates.form.js:532 -msgid "Choose an email option" -msgstr "メールオプションの選択" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:111 -msgid "Choose an inventory file" -msgstr "インベントリーファイルの選択" - -#: client/src/shared/directives.js:92 -msgid "Choose file" -msgstr "ファイルの選択" - -#: client/src/license/license.partial.html:104 -msgid "Choose your license file, agree to the End User License Agreement, and click submit." -msgstr "ライセンスファイルを選択し、使用許諾契約書に同意した後に「送信」をクリックします。" - -#: client/src/projects/projects.form.js:176 -msgid "Clean" -msgstr "クリーニング" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:299 -msgid "Clear" -msgstr "消去" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:64 -msgid "Click for details" -msgstr "クリックして詳細を確認してください。" - -#: client/src/shared/list-generator/list-actions.partial.html:59 -#: client/src/shared/list-generator/list-actions.partial.html:66 -msgid "Click for help" -msgstr "クリックしてヘルプを確認してください" - -#: client/features/templates/templates.strings.js:15 -msgid "Click here to open the workflow visualizer" -msgstr "こちらをクリックしてワークフロービジュアライザーを開きます" - -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:477 -msgid "Click here to open the workflow visualizer." -msgstr "こちらをクリックしてワークフロービジュアライザーを開きます。" - -#: client/src/inventories-hosts/inventories/inventory.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new inventory." -msgstr "行をクリックしてこれを選択し、終了したら「終了」をクリックします。%s ボタンをクリックして新規インベントリーを作成します。" - -#: client/src/teams/teams.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new team." -msgstr "行をクリックしてこれを選択し、終了したら「終了」をクリックします。%s ボタンをクリックして新規チームを作成します。" - -#: client/src/templates/templates.list.js:17 -msgid "Click on a row to select it, and click Finished when done. Use the %s button to create a new job template." -msgstr "行をクリックしてこれを選択し、終了したら「終了」をクリックします。%s ボタンをクリックして新規ジョブテンプレートを作成します。" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Click the" -msgstr "次をクリックしてください:" - -#: client/features/templates/templates.strings.js:128 -msgid "Click to edit link" -msgstr "クリックしてリンクを編集します" - -#: client/src/scheduler/scheduler.strings.js:13 -msgid "Click to edit schedule." -msgstr "クリックしてスケジュールを編集します。" - -#: client/features/templates/templates.strings.js:129 -msgid "Click to view link" -msgstr "クリックしてリンクを表示します" - -#: client/src/credentials/credentials.form.js:320 -msgid "Client ID" -msgstr "クライアント ID" - -#: client/src/notifications/notificationTemplates.form.js:258 -msgid "Client Identifier" -msgstr "クライアント識別子" - -#: client/src/credentials/credentials.form.js:329 -msgid "Client Secret" -msgstr "クライアントシークレット" - -#: client/lib/components/code-mirror/modal/code-mirror-modal.partial.html:67 -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:92 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:618 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:7 -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:8 -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:11 -#: client/src/partials/survey-maker-modal.html:28 -#: client/src/partials/survey-maker-modal.html:7 -#: client/src/scheduler/scheduler.strings.js:55 -#: client/src/scheduler/schedulerForm.partial.html:7 -#: client/src/shared/form-generator.js:1656 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:8 -#: client/src/shared/lookup/lookup-modal.partial.html:9 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:10 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:11 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:61 -msgid "Close" -msgstr "閉じる" - -#: client/lib/components/components.strings.js:135 -msgid "Close Approvals" -msgstr "承認の終了" - -#: client/features/output/output.strings.js:136 -msgid "Close host event modal" -msgstr "ホストイベントモーダルの終了" - -#: client/lib/components/code-mirror/code-mirror.strings.js:7 -msgid "Close variables modal" -msgstr "変数モーダルの終了" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:26 -msgid "Cloud source not configured." -msgstr "クラウドリソースは設定されていません。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "Cloud source not configured. Click" -msgstr "クラウドソースは設定されていません。以下をクリックします。" - -#: client/src/credentials/factories/become-method-change.factory.js:80 -#: client/src/credentials/factories/kind-change.factory.js:136 -msgid "CloudForms URL" -msgstr "CloudForms URL" - -#: client/features/output/output.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:201 -msgid "Collapse Output" -msgstr "出力の折りたたみ" - -#: client/lib/components/components.strings.js:120 -msgid "Compact" -msgstr "簡略表示" - -#: client/src/inventories-hosts/hosts/host.form.js:125 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:135 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:155 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:168 -#: client/src/templates/job_templates/job-template.form.js:573 -#: client/src/templates/workflows.form.js:328 -msgid "Completed Jobs" -msgstr "完了したジョブ" - -#: client/src/management-jobs/card/card.partial.html:34 -#: client/src/management-jobs/card/card.partial.html:37 -msgid "Configure Notifications" -msgstr "通知の設定" - -#: client/src/users/users.form.js:82 -msgid "Confirm Password" -msgstr "パスワードの確認" - -#: client/src/configuration/forms/settings-form.controller.js:480 -msgid "Confirm Reset" -msgstr "リセットの確認" - -#: client/src/configuration/forms/settings-form.controller.js:489 -msgid "Confirm factory reset" -msgstr "出荷時の設定へのリセットの確認" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "Confirm the removal of the" -msgstr "以下の削除を確認:" - -#: client/src/teams/teams.form.js:24 -#: client/src/users/users.form.js:25 -msgid "Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams." -msgstr "ユーザーおびチームを追加し、編集するためのパーミッションについては、システム管理者にお問い合わせください。" - -#: client/features/output/output.strings.js:68 -#: client/src/instance-groups/instance-groups.strings.js:78 -msgid "Container Group" -msgstr "コンテナーグループ" - -#: client/src/instance-groups/instance-groups.strings.js:38 -msgid "Container Groups Help" -msgstr "コンテナーグループのヘルプ" - -#: client/src/login/authenticationServices/timer.factory.js:136 -msgid "Continue" -msgstr "続行" - -#: client/lib/components/components.strings.js:130 -msgid "Continue workflow job?" -msgstr "ワークフロージョブを続行しますか?" - -#: client/features/templates/templates.strings.js:61 -#: client/src/templates/job_templates/job-template.form.js:195 -msgid "Control the level of output ansible will produce as the playbook executes." -msgstr "Playbook の実行時に Ansible が生成する出力のレベルを制御します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:296 -msgid "Control the level of output ansible will produce for inventory source update jobs." -msgstr "インベントリーソースの更新ジョブ用に Ansible が生成する出力のレベルを制御します。" - -#: client/features/templates/templates.strings.js:159 -msgid "Convergence" -msgstr "収束 (コンバージェンス)" - -#: client/lib/components/components.strings.js:54 -msgid "Copied to clipboard." -msgstr "クリップボードにコピーしました。" - -#: client/src/credentials/credentials.list.js:73 -#: client/src/inventories-hosts/inventories/inventory.list.js:109 -#: client/src/inventory-scripts/inventory-scripts.list.js:61 -#: client/src/notifications/notificationTemplates.list.js:87 -#: client/src/projects/projects.list.js:106 -#: client/src/templates/templates.list.js:93 -msgid "Copy" -msgstr "コピー" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:55 -msgid "Copy Inventory" -msgstr "インベントリーのコピー" - -#: client/src/credentials/credentials.list.js:76 -msgid "Copy credential" -msgstr "認証情報のコピー" - -#: client/lib/components/components.strings.js:53 -msgid "Copy full revision to clipboard." -msgstr "完全なリビジョンをクリップボードにコピーします。" - -#: client/src/inventory-scripts/inventory-scripts.list.js:64 -msgid "Copy inventory script" -msgstr "インベントリースクリプトのコピー" - -#: client/src/notifications/notificationTemplates.list.js:90 -msgid "Copy notification" -msgstr "通知のコピー" - -#: client/src/projects/projects.list.js:109 -msgid "Copy project" -msgstr "プロジェクトのコピー" - -#: client/src/templates/templates.list.js:96 -msgid "Copy template" -msgstr "テンプレートのコピー" - -#: client/lib/services/base-string.service.js:120 -msgid "Copy {{resourceType}}" -msgstr "{{resourceType}} のコピー" - -#: client/src/about/about.partial.html:31 -msgid "" -"Copyright © 2019 Red Hat, Inc.
\n" -" Visit Ansible.com for more information.
" -msgstr "Copyright © 2019 Red Hat, Inc.
詳細は、 Ansible.com をご覧ください。
" - -#: client/lib/components/components.strings.js:90 -msgid "Copyright © 2019 Red Hat, Inc." -msgstr "著作権©2019 Red Hat、Inc." - -#: client/src/workflow-results/workflow-results.service.js:78 -msgid "Could not cancel workflow. Returned status:" -msgstr "ワークフローを取り消すことができませんでした。返されたステータス:" - -#: client/src/workflow-results/workflow-results.service.js:58 -msgid "Could not delete job. Returned status:" -msgstr "ジョブを削除できませんでした。返されたステータス:" - -#: client/src/users/users.list.js:44 -msgid "Create New" -msgstr "新規作成" - -#: client/features/applications/applications.strings.js:32 -msgid "Create a new Application" -msgstr "新規アプリケーションの作成" - -#: client/src/instance-groups/instance-groups.strings.js:35 -msgid "Create a new Instance Group" -msgstr "新規インスタンスグループの作成" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:48 -msgid "Create a new Smart Inventory from search results.

Note: changing the organization of the Smart Inventory could change the hosts included in the Smart Inventory." -msgstr "検索結果から新規のスマートインベントリーを作成します。

注: スマートインベントリーの組織を変更することで、スマートインベントリーに含まれるホストが変更される可能性があります。" - -#: client/src/credentials/credentials.list.js:52 -msgid "Create a new credential" -msgstr "新規認証情報の作成" - -#: client/src/credential-types/credential-types.list.js:42 -msgid "Create a new credential type" -msgstr "新規認証情報タイプの作成" - -#: client/src/inventory-scripts/inventory-scripts.list.js:40 -msgid "Create a new custom inventory" -msgstr "新規カスタムインベントリーの作成" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:75 -msgid "Create a new group" -msgstr "新規グループの作成" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:139 -msgid "Create a new host" -msgstr "新規ホストの作成" - -#: client/src/inventories-hosts/inventories/inventory.list.js:80 -msgid "Create a new inventory" -msgstr "新規インベントリーの作成" - -#: client/src/notifications/notificationTemplates.list.js:57 -msgid "Create a new notification template" -msgstr "新規通知テンプレートの作成" - -#: client/src/organizations/list/organizations-list.partial.html:22 -msgid "Create a new organization" -msgstr "新規組織の作成" - -#: client/src/projects/projects.list.js:81 -msgid "Create a new project" -msgstr "新規プロジェクトの作成" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:72 -msgid "Create a new source" -msgstr "新規ソースの作成" - -#: client/src/teams/teams.list.js:43 -msgid "Create a new team" -msgstr "新規チームの作成" - -#: client/src/templates/templates.list.js:56 -msgid "Create a new template" -msgstr "新規テンプレートの作成" - -#: client/src/users/users.list.js:48 -msgid "Create a new user" -msgstr "新規ユーザーの作成" - -#: client/lib/services/base-string.service.js:128 -msgid "Created (Ascending)" -msgstr "作成日 (昇順)" - -#: client/lib/services/base-string.service.js:129 -msgid "Created (Descending)" -msgstr "作成日 (降順)" - -#: client/features/output/output.strings.js:60 -#: client/features/templates/templates.strings.js:29 -#: client/src/instance-groups/container-groups/add-container-group.controller.js:24 -#: client/src/instance-groups/container-groups/edit-container-group.controller.js:38 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:73 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:73 -#: client/src/projects/add/projects-add.controller.js:140 -#: client/src/projects/add/projects-add.controller.js:153 -#: client/src/projects/add/projects-add.controller.js:162 -#: client/src/projects/add/projects-add.controller.js:174 -#: client/src/projects/add/projects-add.controller.js:189 -#: client/src/projects/edit/projects-edit.controller.js:263 -#: client/src/projects/edit/projects-edit.controller.js:274 -#: client/src/projects/edit/projects-edit.controller.js:283 -#: client/src/projects/edit/projects-edit.controller.js:295 -#: client/src/projects/edit/projects-edit.controller.js:310 -msgid "Credential" -msgstr "認証情報" - -#: client/features/templates/templates.strings.js:40 -msgid "Credential Type" -msgstr "認証情報タイプ" - -#: client/lib/components/components.strings.js:76 -#: client/lib/models/models.strings.js:12 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 -msgid "Credential Types" -msgstr "認証情報タイプ" - -#: client/src/instance-groups/instance-groups.strings.js:80 -msgid "Credential to authenticate with Kubernetes or OpenShift.  Must be of type \"Kubernetes/OpenShift API Bearer Token”." -msgstr "Kubernetes または OpenShift での認証に使用する認証情報。\"Kubernetes/OpenShift API ベアラートークン” のタイプでなければなりません。" - -#: client/features/jobs/jobs.strings.js:16 -#: client/features/templates/templates.strings.js:21 -#: client/lib/components/components.strings.js:75 -#: client/lib/models/models.strings.js:8 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:128 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:58 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 -#: client/src/templates/job_templates/job-template.form.js:140 -#: client/src/templates/job_templates/job-template.form.js:152 -msgid "Credentials" -msgstr "認証情報" - -#: client/features/templates/templates.strings.js:41 -msgid "Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:" -msgstr "起動時にパスワードを必要とする認証情報はテンプレートスケジュールおよびワークフローノードでは許可されません。以下の認証情報を削除するか、または置換して次に進んでください。" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:17 -msgid "Critical" -msgstr "重大" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:12 -msgid "Critical Risk" -msgstr "重大リスク" - -#: client/src/shared/directives.js:93 -msgid "Current Image:" -msgstr "現在のイメージ:" - -#: client/features/output/output.strings.js:40 -msgid "Currently following output as it arrives. Click to unfollow" -msgstr "現在、受信時の出力をフォローしています。クリックしてフォローを解除します" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:130 -msgid "Custom Inventory Script" -msgstr "カスタムインベントリースクリプト" - -#: client/lib/services/base-string.service.js:85 -msgid "Custom Logo" -msgstr "カスタムロゴ" - -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 -msgid "Custom Script" -msgstr "カスタムスクリプト" - -#: client/src/instance-groups/instance-groups.strings.js:79 -msgid "Customize Pod Spec" -msgstr "Pod 仕様のカスタマイズ" - -#: client/src/notifications/notificationTemplates.form.js:549 -msgid "Customize messages…" -msgstr "メッセージのカスタマイズ…" - -#: client/src/home/home.route.js:16 -msgid "DASHBOARD" -msgstr "ダッシュボード" - -#: client/features/users/tokens/tokens.strings.js:28 -#: client/lib/services/base-string.service.js:74 -#: client/src/credential-types/list/list.controller.js:110 -#: client/src/credentials/list/credentials-list.controller.js:155 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:160 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:51 -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:131 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:184 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:24 -#: client/src/inventory-scripts/list/list.controller.js:130 -#: client/src/notifications/notification-templates-list/list.controller.js:235 -#: client/src/organizations/edit/organizations-edit.controller.js:180 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:69 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:68 -#: client/src/organizations/list/organizations-list.controller.js:202 -#: client/src/partials/survey-maker-modal.html:18 -#: client/src/projects/edit/projects-edit.controller.js:244 -#: client/src/scheduler/factories/delete-schedule.factory.js:60 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -#: client/src/teams/list/teams-list.controller.js:82 -#: client/src/users/list/users-list.controller.js:95 -#: client/src/workflow-results/workflow-results.service.js:62 -msgid "DELETE" -msgstr "削除" - -#: client/src/partials/survey-maker-modal.html:81 -msgid "DELETE SURVEY" -msgstr "Survey の削除" - -#: client/features/templates/templates.strings.js:133 -msgid "DELETED" -msgstr "削除済み" - -#: client/features/templates/templates.strings.js:158 -msgid "DENIED" -msgstr "拒否" - -#: client/lib/components/components.strings.js:129 -msgid "DENY" -msgstr "拒否" - -#: client/features/projects/projects.strings.js:9 -#: client/features/users/tokens/tokens.strings.js:36 -msgid "DESCRIPTION" -msgstr "説明" - -#: client/features/templates/templates.strings.js:135 -#: client/src/instance-groups/instance-groups.strings.js:29 -#: client/src/workflow-results/workflow-results.controller.js:83 -msgid "DETAILS" -msgstr "詳細" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:32 -msgid "DISASSOCIATE" -msgstr "関連付けの解除" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:5 -msgid "DYNAMIC HOSTS" -msgstr "動的ホスト" - -#: client/lib/components/components.strings.js:70 -msgid "Dashboard" -msgstr "ダッシュボード" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:576 -#: client/src/scheduler/scheduler.strings.js:52 -msgid "Date format" -msgstr "日付書式" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:170 -#: client/src/scheduler/scheduler.strings.js:64 -msgid "Days of data to keep" -msgstr "データの保持日数" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:101 -msgid "Default" -msgstr "デフォルト" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:196 -#: client/src/templates/survey-maker/shared/question-definition.form.js:213 -#: client/src/templates/survey-maker/shared/question-definition.form.js:228 -#: client/src/templates/survey-maker/shared/question-definition.form.js:242 -#: client/src/templates/survey-maker/shared/question-definition.form.js:256 -#: client/src/templates/survey-maker/shared/question-definition.form.js:272 -msgid "Default Answer" -msgstr "デフォルトの応答" - -#: client/src/configuration/settings.partial.html:9 -msgid "Define system-level features and functions" -msgstr "システムレベルの機能および関数の定義" - -#: client/features/output/output.strings.js:20 -#: client/lib/services/base-string.service.js:89 -#: client/src/credential-types/credential-types.list.js:73 -#: client/src/credential-types/list/list.controller.js:106 -#: client/src/credentials/credentials.list.js:92 -#: client/src/credentials/list/credentials-list.controller.js:151 -#: client/src/inventories-hosts/inventories/inventory.list.js:125 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:156 -#: client/src/inventory-scripts/inventory-scripts.list.js:79 -#: client/src/inventory-scripts/list/list.controller.js:126 -#: client/src/notifications/notification-templates-list/list.controller.js:231 -#: client/src/notifications/notificationTemplates.list.js:105 -#: client/src/organizations/edit/organizations-edit.controller.js:177 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:66 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:65 -#: client/src/organizations/list/organizations-list.controller.js:198 -#: client/src/projects/edit/projects-edit.controller.js:241 -#: client/src/scheduler/schedules.list.js:108 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:37 -#: client/src/teams/list/teams-list.controller.js:78 -#: client/src/teams/teams.list.js:72 -#: client/src/templates/templates.list.js:109 -#: client/src/users/list/users-list.controller.js:91 -#: client/src/users/users.list.js:79 -#: client/src/workflow-results/workflow-results.controller.js:57 -msgid "Delete" -msgstr "削除" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:6 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:6 -msgid "Delete Group" -msgstr "グループの削除" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:128 -msgid "Delete Host" -msgstr "ホストの削除" - -#: client/features/output/output.strings.js:55 -#: client/src/workflow-results/workflow-results.service.js:39 -msgid "Delete Job" -msgstr "ジョブの削除" - -#: client/src/organizations/list/organizations-list.partial.html:73 -msgid "Delete Organization" -msgstr "組織の削除" - -#: client/src/templates/survey-maker/surveys/init.factory.js:23 -msgid "Delete Question" -msgstr "質問の削除" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:180 -msgid "Delete Source" -msgstr "ソースの削除" - -#: client/src/credentials/credentials.list.js:94 -msgid "Delete credential" -msgstr "認証情報の削除" - -#: client/src/credential-types/credential-types.list.js:75 -msgid "Delete credential type" -msgstr "認証情報タイプの削除" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:107 -#: client/src/inventories-hosts/inventory-hosts.strings.js:19 -msgid "Delete group" -msgid_plural "Delete groups" -msgstr[0] "グループの削除" -msgstr[1] "グループの削除" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:116 -#: client/src/inventories-hosts/inventory-hosts.strings.js:21 -msgid "Delete host" -msgid_plural "Delete hosts" -msgstr[0] "ホストの削除" -msgstr[1] "ホストの削除" - -#: client/src/inventories-hosts/inventories/inventory.list.js:127 -msgid "Delete inventory" -msgstr "インベントリーの削除" - -#: client/src/inventory-scripts/inventory-scripts.list.js:81 -msgid "Delete inventory script" -msgstr "インベントリースクリプトの削除" - -#: client/src/workflow-results/workflow-results.partial.html:52 -msgid "Delete job" -msgstr "ジョブの削除" - -#: client/src/notifications/notificationTemplates.list.js:107 -msgid "Delete notification" -msgstr "通知の削除" - -#: client/src/projects/projects.form.js:186 -msgid "Delete on Update" -msgstr "更新時のデプロイ" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:26 -msgid "Delete or promote the group's children?" -msgstr "グループの子を削除またはプロモートしますか?" - -#: client/src/partials/survey-maker-modal.html:67 -msgid "Delete question" -msgstr "質問の削除" - -#: client/src/scheduler/schedules.list.js:111 -msgid "Delete schedule" -msgstr "スケジュールの削除" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:121 -msgid "Delete source" -msgstr "ソースの削除" - -#: client/src/teams/teams.list.js:76 -msgid "Delete team" -msgstr "チームの削除" - -#: client/src/templates/templates.list.js:112 -msgid "Delete template" -msgstr "テンプレートの削除" - -#: client/src/projects/projects.form.js:188 -msgid "Delete the local repository in its entirety prior to performing an update." -msgstr "更新の実行前にローカルリポジトリーを完全に削除します。" - -#: client/src/projects/projects.list.js:122 -msgid "Delete the project" -msgstr "プロジェクトの削除" - -#: client/src/scheduler/scheduled-jobs.list.js:86 -msgid "Delete the schedule" -msgstr "スケジュールの削除" - -#: client/lib/services/base-string.service.js:121 -msgid "Delete the {{resourceType}}" -msgstr "{{resourceType}} の削除" - -#: client/src/users/users.list.js:83 -msgid "Delete user" -msgstr "ユーザーの削除" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:14 -msgid "Delete {{ group }} and {{ host }}" -msgstr "{{ group }} および {{ host }} の削除" - -#: client/lib/services/base-string.service.js:91 -msgid "Deleting this {{ resourceType }} will make the following resources unavailable." -msgstr "この {{ resourceType }} を削除すると、以下のリソースが利用できなくなります。" - -#: client/src/projects/projects.form.js:188 -msgid "Depending on the size of the repository this may significantly increase the amount of time required to complete an update." -msgstr "リポジトリーのサイズにより、更新の完了までに必要な時間が大幅に長くなる可能性があります。" - -#: client/features/applications/add-applications.controller.js:36 -#: client/features/templates/templates.strings.js:17 -#: client/features/users/tokens/users-tokens-add.controller.js:26 -#: client/src/credential-types/credential-types.form.js:34 -#: client/src/credentials/credentials.form.js:39 -#: client/src/inventories-hosts/hosts/host.form.js:62 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:39 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:61 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:74 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:63 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:72 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:28 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:36 -#: client/src/inventory-scripts/inventory-scripts.form.js:35 -#: client/src/notifications/notificationTemplates.form.js:39 -#: client/src/organizations/organizations.form.js:33 -#: client/src/projects/projects.form.js:37 -#: client/src/teams/teams.form.js:35 -#: client/src/templates/job_templates/job-template.form.js:41 -#: client/src/templates/survey-maker/shared/question-definition.form.js:36 -#: client/src/templates/workflows.form.js:49 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:128 -#: client/src/users/users.form.js:147 -#: client/src/users/users.form.js:175 -msgid "Description" -msgstr "説明" - -#: client/src/notifications/notificationTemplates.form.js:156 -#: client/src/notifications/notificationTemplates.form.js:160 -msgid "Destination Channels" -msgstr "送信先チャネル" - -#: client/src/notifications/notificationTemplates.form.js:507 -#: client/src/notifications/notificationTemplates.form.js:511 -msgid "Destination Channels or Users" -msgstr "送信先チャネルまたはユーザー" - -#: client/src/notifications/notificationTemplates.form.js:209 -#: client/src/notifications/notificationTemplates.form.js:210 -msgid "Destination SMS Number" -msgstr "送信先 SMS 番号" - -#: client/features/applications/applications.strings.js:15 -#: client/features/credentials/credentials.strings.js:13 -#: client/features/output/output.strings.js:46 -#: client/features/users/tokens/tokens.strings.js:14 -#: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1431 -msgid "Details" -msgstr "詳細" - -#: client/src/notifications/notificationTemplates.form.js:325 -#: client/src/notifications/notificationTemplates.form.js:375 -#: client/src/notifications/notificationTemplates.form.js:446 -#: client/src/notifications/notificationTemplates.form.js:478 -msgid "Disable SSL Verification" -msgstr "SSL 検証の無効化" - -#: client/src/templates/survey-maker/surveys/init.factory.js:21 -msgid "Disable Survey" -msgstr "Survey の無効化" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Disable survey" -msgstr "Survey の無効化" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Group From Group" -msgstr "グループの他のグループとの関連付けを解除" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:6 -msgid "Disassociate Host" -msgstr "ホストの関連付けの解除" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:6 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Host From Group" -msgstr "ホストのグループとの関連付けを解除" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:70 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:103 -msgid "Disassociate group" -msgstr "グループの関連付けの解除" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:104 -msgid "Disassociate host" -msgstr "ホストの関連付けの解除" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:54 -#: client/src/configuration/forms/settings-form.controller.js:446 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:52 -msgid "Discard changes" -msgstr "変更の破棄" - -#: client/src/teams/teams.form.js:161 -msgid "Dissassociate permission from team" -msgstr "チームからパーミッションの関連付けを解除" - -#: client/src/users/users.form.js:234 -msgid "Dissassociate permission from user" -msgstr "ユーザーからパーミッションの関連付けを解除" - -#: client/src/templates/job_templates/job-template.form.js:286 -msgid "Divide the work done by this job template into the specified number of job slices, each running the same tasks against a portion of the inventory." -msgstr "このジョブテンプレートで実施される作業を指定した数のジョブスライスに分割し、それぞれインベントリーの部分に対して同じタスクを実行します。" - -#: client/src/credentials/credentials.form.js:383 -#: client/src/credentials/factories/become-method-change.factory.js:54 -#: client/src/credentials/factories/kind-change.factory.js:110 -msgid "Domain Name" -msgstr "ドメイン名" - -#: client/features/output/output.strings.js:21 -msgid "Download Output" -msgstr "出力のダウンロード" - -#: client/src/inventory-scripts/inventory-scripts.form.js:59 -msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. Refer to the Ansible Tower documentation for example syntax." -msgstr "カスタムインベントリーのスクリプトファイルをここにドラッグアンドドロップするか、またはこのフィールドにカスタムインベントリーをインポートするためのファイルを作成します。構文のサンプルについては、Ansible Tower ドキュメントを参照してください。" - -#: client/src/templates/survey-maker/surveys/init.factory.js:24 -msgid "Drag to reorder question" -msgstr "ドラッグして質問を並び替える" - -#: client/src/partials/survey-maker-modal.html:74 -msgid "Drop question here to reorder" -msgstr "並び替える質問をドロップ" - -#: client/features/applications/applications.strings.js:10 -msgid "EDIT APPLICATION" -msgstr "アプリケーションの編集" - -#: client/features/credentials/credentials.strings.js:9 -msgid "EDIT CREDENTIAL" -msgstr "認証情報の編集" - -#: client/features/templates/templates.strings.js:142 -msgid "EDIT LINK" -msgstr "リンクの編集" - -#: client/src/scheduler/scheduler.strings.js:9 -msgid "EDIT SCHEDULE" -msgstr "スケジュールの編集" - -#: client/src/management-jobs/scheduler/main.js:97 -msgid "EDIT SCHEDULED JOB" -msgstr "スケジュール済みジョブの編集" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:17 -msgid "EDIT SURVEY PROMPT" -msgstr "Survey プロンプトの編集" - -#: client/features/templates/templates.strings.js:124 -msgid "EDIT TEMPLATE" -msgstr "テンプレートの編集" - -#: client/lib/components/components.strings.js:9 -msgid "ENCRYPTED" -msgstr "暗号化" - -#: client/features/output/output.strings.js:105 -msgid "EXAMPLES" -msgstr "例" - -#: client/src/shared/smart-search/smart-search.partial.html:36 -msgid "EXAMPLES:" -msgstr "例:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:15 -msgid "EXECUTE COMMAND" -msgstr "コマンドの実行" - -#: client/features/templates/templates.strings.js:150 -msgid "EXIT" -msgstr "終了" - -#: client/lib/components/code-mirror/code-mirror.strings.js:12 -msgid "EXPAND" -msgstr "展開" - -#: client/features/applications/applications.strings.js:29 -#: client/features/users/tokens/tokens.strings.js:37 -msgid "EXPIRATION" -msgstr "有効期限" - -#: client/features/users/tokens/tokens.strings.js:24 -msgid "EXPIRES" -msgstr "期限切れ" - -#: client/lib/components/code-mirror/code-mirror.strings.js:10 -#: client/lib/components/code-mirror/code-mirror.strings.js:50 -msgid "EXTRA VARIABLES" -msgstr "追加の変数" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:365 -msgid "Each time a job runs using this inventory, refresh the inventory from the selected source before executing job tasks." -msgstr "このインベントリーでジョブを実行する際は常に、選択されたソースのインベントリーを更新してからジョブのタスクを実行します。" - -#: client/src/projects/projects.form.js:199 -msgid "Each time a job runs using this project, update the revision of the project prior to starting the job." -msgstr "このプロジェクトでジョブを実行する際は常に、ジョブの開始前にプロジェクトのリビジョンを更新します。" - -#: client/src/credential-types/credential-types.list.js:56 -#: client/src/credentials/credentials.list.js:66 -#: client/src/inventories-hosts/inventories/inventory.list.js:102 -#: client/src/inventory-scripts/inventory-scripts.list.js:54 -#: client/src/notifications/notificationTemplates.list.js:71 -#: client/src/notifications/notificationTemplates.list.js:80 -#: client/src/scheduler/schedules.list.js:93 -#: client/src/teams/teams.list.js:55 -#: client/src/templates/templates.list.js:80 -#: client/src/users/users.list.js:60 -msgid "Edit" -msgstr "編集" - -#: client/src/organizations/list/organizations-list.partial.html:55 -msgid "Edit Organization" -msgstr "新規組織" - -#: client/src/templates/survey-maker/surveys/init.factory.js:22 -msgid "Edit Question" -msgstr "質問の編集" - -#: client/src/shared/form-generator.js:1668 -#: client/src/templates/job_templates/job-template.form.js:602 -#: client/src/templates/workflows.form.js:357 -msgid "Edit Survey" -msgstr "Survey の編集" - -#: client/src/credentials/credentials.list.js:68 -msgid "Edit credential" -msgstr "認証情報の編集" - -#: client/src/credential-types/credential-types.list.js:58 -msgid "Edit credential type" -msgstr "認証情報タイプの編集" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:91 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:85 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:89 -msgid "Edit group" -msgstr "グループの編集" - -#: client/src/inventories-hosts/hosts/host.list.js:89 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:95 -#: client/src/inventories-hosts/inventory-hosts.strings.js:25 -msgid "Edit host" -msgstr "ホストの編集" - -#: client/src/inventories-hosts/inventories/inventory.list.js:104 -msgid "Edit inventory" -msgstr "インベントリーの編集" - -#: client/src/inventory-scripts/inventory-scripts.list.js:56 -msgid "Edit inventory script" -msgstr "インベントリースクリプトの編集" - -#: client/src/notifications/notificationTemplates.list.js:73 -msgid "Edit notification" -msgstr "通知の編集" - -#: client/src/partials/survey-maker-modal.html:64 -msgid "Edit question" -msgstr "質問の編集" - -#: client/src/scheduler/schedules.list.js:96 -msgid "Edit schedule" -msgstr "スケジュールの編集" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:87 -msgid "Edit source" -msgstr "ソースの編集" - -#: client/src/teams/teams.list.js:59 -msgid "Edit team" -msgstr "チームの編集" - -#: client/src/templates/templates.list.js:82 -msgid "Edit template" -msgstr "テンプレートの編集" - -#: client/src/workflow-results/workflow-results.controller.js:62 -msgid "Edit the inventory" -msgstr "インベントリーの編集" - -#: client/src/projects/projects.list.js:93 -msgid "Edit the project" -msgstr "プロジェクトの編集" - -#: client/src/scheduler/scheduled-jobs.list.js:72 -#: client/src/workflow-results/workflow-results.controller.js:61 -msgid "Edit the schedule" -msgstr "スケジュールの編集" - -#: client/src/workflow-results/workflow-results.controller.js:60 -msgid "Edit the slice job template" -msgstr "スライスジョブテンプレートの編集" - -#: client/src/workflow-results/workflow-results.controller.js:58 -msgid "Edit the user" -msgstr "ユーザーの編集" - -#: client/src/workflow-results/workflow-results.controller.js:59 -msgid "Edit the workflow job template" -msgstr "ワークフロージョブテンプレートの編集" - -#: client/src/users/users.list.js:64 -msgid "Edit user" -msgstr "ユーザーの編集" - -#: client/features/projects/projects.strings.js:24 -msgid "Either you do not have access or the SCM update process completed" -msgstr "アクセスがないか、または SCM 更新プロセスが完了しました" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Either you do not have access or the SCM update process completed. Click the" -msgstr "アクセスがないか、または SCM 更新プロセスが完了しました。次をクリックしてください: " - -#: client/features/output/output.strings.js:116 -#: client/src/workflow-results/workflow-results.controller.js:92 -msgid "Elapsed" -msgstr "経過時間" - -#: client/src/credentials/credentials.form.js:191 -#: client/src/users/users.form.js:52 -msgid "Email" -msgstr "メール" - -#: client/src/notifications/notificationTemplates.form.js:530 -#: client/src/notifications/notificationTemplates.form.js:531 -msgid "Email Options" -msgstr "メールオプション" - -#: client/src/templates/job_templates/job-template.form.js:353 -#: client/src/templates/job_templates/job-template.form.js:358 -#: client/src/templates/workflows.form.js:157 -#: client/src/templates/workflows.form.js:162 -msgid "Enable Concurrent Jobs" -msgstr "同時実行ジョブの有効化" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:31 -msgid "Enable External Logging" -msgstr "外部ログの有効化" - -#: client/src/templates/job_templates/job-template.form.js:363 -#: client/src/templates/job_templates/job-template.form.js:368 -msgid "Enable Fact Cache" -msgstr "ファクトキャッシュの有効化" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:326 -msgid "Enable Privilege Escalation" -msgstr "権限昇格の有効化" - -#: client/src/templates/job_templates/job-template.form.js:331 -#: client/src/templates/job_templates/job-template.form.js:338 -msgid "Enable Provisioning Callbacks" -msgstr "プロビジョニングコールバックの有効化" - -#: client/src/templates/job_templates/job-template.form.js:343 -#: client/src/templates/job_templates/job-template.form.js:348 -#: client/src/templates/workflows.form.js:167 -#: client/src/templates/workflows.form.js:172 -msgid "Enable Webhook" -msgstr "Webhook の有効化" - -#: client/src/configuration/settings.partial.html:3 -msgid "Enable simplified login for your Tower applications" -msgstr "Tower アプリケーションのログインの簡素化" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Enable survey" -msgstr "Survey の有効化" - -#: client/src/templates/job_templates/job-template.form.js:346 -msgid "Enable webhook for this job template." -msgstr "このジョブテンプレートの Webhook を有効にします。" - -#: client/src/templates/workflows.form.js:170 -msgid "Enable webhook for this workflow job template." -msgstr "このワークフローのジョブテンプレートの Webhook を有効にします。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:324 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:326 -msgid "Enabled Value" -msgstr "有効な値" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:314 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:316 -msgid "Enabled Variable" -msgstr "有効な変数" - -#: client/src/templates/job_templates/job-template.form.js:335 -msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact {{BRAND_NAME}} and request a configuration update using this job template." -msgstr "プロビジョニングコールバック URL の作成を有効にします。ホストは、この URL を使用して {{BRAND_NAME}} に接続でき、このジョブテンプレートを使用して設定の更新を要求できます。" - -#: client/src/credentials/factories/credential-form-save.factory.js:73 -msgid "Encrypted credentials are not supported." -msgstr "暗号化された認証情報はサポートされていません。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:487 -#: client/src/scheduler/scheduler.strings.js:44 -msgid "End" -msgstr "終了" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:532 -#: client/src/scheduler/scheduler.strings.js:46 -msgid "End Date" -msgstr "終了日" - -#: client/src/scheduler/scheduler.strings.js:48 -msgid "End Time" -msgstr "終了時間" - -#: client/src/license/license.partial.html:163 -msgid "End User License Agreement" -msgstr "使用許諾契約書" - -#: client/src/inventories-hosts/hosts/host.form.js:72 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:71 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:73 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:68 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "JSON または YAML 構文のいずれかを使用してインベントリー変数を入力します。ラジオボタンを使用して 2 つの間の切り替えを行います。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:227 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:261 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:74 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "JSON または YAML 構文のいずれかを使用してインベントリー変数を入力します。ラジオボタンを使用してこれらの間で切り替えを行います。構文のサンプルについては Ansible Tower ドキュメントを参照してください。" - -#: client/src/notifications/notificationTemplates.form.js:319 -msgid "Enter one Annotation Tag per line, without commas." -msgstr "各行に、コンマなしでアノテーションタグを 1 つ入力してください。" - -#: client/src/notifications/notificationTemplates.form.js:510 -msgid "Enter one IRC channel or username per line. The pound symbol (#) for channels, and the at (@) symbol for users, are not required." -msgstr "各行に 1 つの IRC チャンネルまたはユーザー名を入力します。チャンネルのシャープ記号 (#) およびユーザーのアットマーク (@) 記号は不要です。" - -#: client/src/notifications/notificationTemplates.form.js:159 -msgid "Enter one Slack channel per line. The pound symbol (#) is required for channels." -msgstr "各行に 1 つの Slack チャンネルを入力します。チャンネルにはシャープ記号 (#) が必要です。" - -#: client/src/notifications/notificationTemplates.form.js:97 -msgid "Enter one email address per line to create a recipient list for this type of notification." -msgstr "各行に 1 つのメールアドレスを入力し、この通知タイプの受信者リストを作成します。" - -#: client/src/notifications/notificationTemplates.form.js:213 -msgid "Enter one phone number per line to specify where to route SMS messages." -msgstr "各行に 1 つの電話番号を入力し、SMS メッセージのルート先を指定します。" - -#: client/src/credentials/factories/become-method-change.factory.js:81 -#: client/src/credentials/factories/kind-change.factory.js:137 -msgid "Enter the URL for the virtual machine which %scorresponds to your CloudForms instance. %sFor example, %s" -msgstr "CloudForms インスタンスに対応する %s仮想マシンの URL を入力します %s(例: %s)。" - -#: client/src/credentials/factories/become-method-change.factory.js:71 -#: client/src/credentials/factories/kind-change.factory.js:127 -msgid "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor example, %s" -msgstr "Red Hat Satellite 6 Server に対応する %sURL を入力します (%s例: %s)。" - -#: client/src/credentials/factories/become-method-change.factory.js:49 -#: client/src/credentials/factories/kind-change.factory.js:105 -msgid "Enter the hostname or IP address which corresponds to your VMware vCenter." -msgstr "VMware vCenter に対応するホスト名または IP アドレスを入力します。" - -#: client/src/notifications/notificationTemplates.form.js:199 -msgid "Enter the number associated with the \"Messaging Service\" in Twilio in the format +18005550199." -msgstr "Twilio の \"メッセージングサービス\" に関連付けられた番号を入力します (形式: +18005550199)。 " - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:156 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:180 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:204 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:279 -msgid "Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "JSON または YAML 構文のいずれかを使用して変数を入力します。ラジオボタンを使用してこれら 2 つの間の切り替えを行います。" - -#: client/features/output/output.strings.js:61 -msgid "Environment" -msgstr "環境" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:146 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:153 -msgid "Environment Variables" -msgstr "環境変数" - -#: client/src/license/license.controller.js:232 -msgid "Error Applying License" -msgstr "ライセンスの適用エラー" - -#: client/features/output/output.strings.js:89 -msgid "Error Details" -msgstr "エラーの詳細" - -#: client/src/license/license.controller.js:166 -msgid "Error Fetching Licenses" -msgstr "ライセンスの取得エラー" - -#: client/src/notifications/notificationTemplates.form.js:615 -msgid "Error Message" -msgstr "エラーメッセージ" - -#: client/src/notifications/notificationTemplates.form.js:626 -msgid "Error Message Body" -msgstr "エラーメッセージボディー" - -#: client/lib/services/base-string.service.js:115 -#: client/src/app.js:228 -#: client/src/configuration/forms/settings-form.controller.js:285 -#: client/src/configuration/forms/settings-form.controller.js:429 -#: client/src/configuration/forms/settings-form.controller.js:554 -#: client/src/configuration/forms/settings-form.controller.js:614 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:234 -#: client/src/credentials/factories/credential-form-save.factory.js:77 -#: client/src/credentials/factories/credential-form-save.factory.js:93 -#: client/src/home/home.controller.js:104 -#: client/src/home/home.controller.js:223 -#: client/src/home/home.controller.js:233 -#: client/src/home/home.controller.js:242 -#: client/src/home/home.controller.js:29 -#: client/src/home/home.controller.js:43 -#: client/src/home/home.controller.js:78 -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:34 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:37 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:47 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:116 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:126 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:153 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:203 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:222 -#: client/src/login/loginModal/loginModal.controller.js:144 -#: client/src/management-jobs/card/card.controller.js:122 -#: client/src/management-jobs/card/card.controller.js:28 -#: client/src/management-jobs/card/card.controller.js:58 -#: client/src/organizations/main.js:155 -#: client/src/organizations/main.js:168 -#: client/src/organizations/main.js:183 -#: client/src/projects/add/projects-add.controller.js:120 -#: client/src/projects/edit/projects-edit.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:220 -#: client/src/projects/edit/projects-edit.controller.js:236 -#: client/src/projects/main.js:121 -#: client/src/shared/stateDefinitions.factory.js:230 -#: client/src/templates/main.js:102 -#: client/src/templates/main.js:116 -#: client/src/templates/main.js:132 -#: client/src/templates/main.js:143 -#: client/src/templates/main.js:177 -#: client/src/templates/main.js:194 -#: client/src/templates/main.js:219 -#: client/src/templates/main.js:245 -#: client/src/templates/main.js:257 -#: client/src/templates/main.js:270 -#: client/src/templates/main.js:281 -#: client/src/templates/main.js:295 -#: client/src/templates/main.js:312 -#: client/src/templates/main.js:341 -#: client/src/templates/main.js:355 -#: client/src/templates/main.js:371 -#: client/src/templates/main.js:409 -#: client/src/templates/main.js:423 -#: client/src/templates/main.js:436 -#: client/src/templates/main.js:449 -#: client/src/templates/main.js:473 -#: client/src/templates/main.js:490 -#: client/src/templates/main.js:71 -#: client/src/templates/main.js:88 -#: client/src/users/add/users-add.controller.js:101 -#: client/src/users/edit/users-edit.controller.js:171 -#: client/src/users/list/users-list.controller.js:84 -#: client/src/workflow-results/workflow-results.service.js:57 -#: client/src/workflow-results/workflow-results.service.js:77 -#: client/src/workflow-results/workflow-results.service.js:99 -msgid "Error!" -msgstr "エラー!" - -#: client/src/activity-stream/streams.list.js:40 -msgid "Event" -msgstr "イベント" - -#: client/src/activity-stream/factories/build-description.factory.js:157 -msgid "Event summary not available" -msgstr "イベントの概要はありません" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:190 -#: client/src/scheduler/scheduler.strings.js:29 -msgid "Every" -msgstr "実行頻度" - -#: client/src/projects/add/projects-add.controller.js:142 -#: client/src/projects/edit/projects-edit.controller.js:264 -msgid "Example URLs for GIT SCM include:" -msgstr "GIT SCM のサンプル URL には以下が含まれます:" - -#: client/src/projects/add/projects-add.controller.js:163 -#: client/src/projects/edit/projects-edit.controller.js:284 -msgid "Example URLs for Mercurial SCM include:" -msgstr "Mercurial SCM のサンプル URL には以下が含まれます:" - -#: client/src/projects/add/projects-add.controller.js:175 -#: client/src/projects/edit/projects-edit.controller.js:296 -msgid "Example URLs for Remote Archive SCM include:" -msgstr "リモートアーカイブ SCM のサンプル URL には以下が含まれます:" - -#: client/src/projects/add/projects-add.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:275 -msgid "Example URLs for Subversion SCM include:" -msgstr "Subversion SCM のサンプル URL には以下が含まれます:" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Example: ansible_facts.ansible_distribution:\"RedHat\"" -msgstr "例: ansible_facts.ansible_distribution:\"RedHat\"" - -#: client/src/projects/projects.form.js:140 -msgid "Examples include:" -msgstr "以下に例を示します。" - -#: client/features/output/output.strings.js:62 -msgid "Execution Node" -msgstr "実行ノード" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:65 -msgid "Existing Group" -msgstr "既存グループ" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:142 -msgid "Existing Host" -msgstr "既存ホスト" - -#: client/features/output/output.strings.js:23 -#: client/src/workflow-results/workflow-results.controller.js:203 -#: client/src/workflow-results/workflow-results.controller.js:64 -msgid "Expand Output" -msgstr "出力の展開" - -#: client/lib/components/components.strings.js:121 -msgid "Expanded" -msgstr "詳細表示" - -#: client/src/license/license.partial.html:246 -msgid "Expires" -msgstr "有効期限" - -#: client/lib/services/base-string.service.js:132 -msgid "Expires (Ascending)" -msgstr "有効期限 (昇順)" - -#: client/lib/services/base-string.service.js:133 -msgid "Expires (Descending)" -msgstr "有効期限 (降順)" - -#: client/src/license/license.partial.html:39 -msgid "Expires On" -msgstr "有効期限" - -#: client/lib/components/components.strings.js:133 -msgid "Expires:" -msgstr "有効期限:" - -#: client/lib/components/components.strings.js:134 -msgid "Expires: Never" -msgstr "有効期限: なし" - -#: client/features/output/output.strings.js:71 -#: client/src/workflow-results/workflow-results.controller.js:76 -msgid "Explanation" -msgstr "説明" - -#: client/features/output/output.strings.js:63 -#: client/features/templates/templates.strings.js:64 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:133 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:145 -#: client/src/partials/logviewer.html:8 -#: client/src/scheduler/scheduler.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:480 -#: client/src/templates/job_templates/job-template.form.js:487 -#: client/src/templates/workflows.form.js:136 -#: client/src/templates/workflows.form.js:143 -#: client/src/workflow-results/workflow-results.controller.js:180 -msgid "Extra Variables" -msgstr "追加変数" - -#: client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js:7 -msgid "FACTS" -msgstr "ファクト" - -#: client/features/output/output.strings.js:141 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:59 -msgid "FAILED" -msgstr "失敗" - -#: client/features/output/output.strings.js:106 -msgid "FIELDS" -msgstr "フィールド" - -#: client/src/shared/smart-search/smart-search.partial.html:42 -msgid "FIELDS:" -msgstr "フィールド:" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "FINISHED" -msgstr "完了" - -#: client/src/inventories-hosts/hosts/host.form.js:103 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:105 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:114 -msgid "Facts" -msgstr "Fact (ファクト)" - -#: client/lib/components/components.strings.js:106 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:86 -msgid "Failed" -msgstr "失敗" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:44 -msgid "Failed Hosts" -msgstr "失敗したホスト" - -#: client/src/projects/factories/get-project-path.factory.js:68 -msgid "Failed to access API config. GET status:" -msgstr "API 設定へのアクセスに失敗しました。GET ステータス:" - -#: client/src/users/add/users-add.controller.js:101 -msgid "Failed to add new user. POST returned status:" -msgstr "新規ユーザーを追加できませんでした。POST で返されたステータス:" - -#: client/src/credentials/factories/credential-form-save.factory.js:78 -msgid "Failed to create new Credential. POST status:" -msgstr "新規の認証情報を作成できませんでした。POST ステータス:" - -#: client/src/projects/add/projects-add.controller.js:121 -msgid "Failed to create new project. POST returned status:" -msgstr "新規プロジェクトを作成できませんでした。POST で返されたステータス:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:35 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:48 -#: client/src/templates/main.js:144 -#: client/src/templates/main.js:282 -msgid "Failed to get config. GET returned status:" -msgstr "設定の取得に失敗しました。GET で返されたステータス:" - -#: client/src/home/home.controller.js:43 -msgid "Failed to get dashboard graph data:" -msgstr "ダッシュボードのグラフデータの取得に失敗しました。" - -#: client/src/home/home.controller.js:29 -msgid "Failed to get dashboard host graph data:" -msgstr "ダッシュボードのホストグラフデータの取得に失敗しました。" - -#: client/src/home/home.controller.js:242 -msgid "Failed to get dashboard job templates list:" -msgstr "ダッシュボードのジョブテンプレート一覧の取得に失敗しました。" - -#: client/src/home/home.controller.js:233 -msgid "Failed to get dashboard jobs list:" -msgstr "ダッシュボードのジョブ一覧の取得に失敗しました。" - -#: client/src/home/home.controller.js:223 -msgid "Failed to get dashboard:" -msgstr "ダッシュボードの取得に失敗しました。" - -#: client/src/templates/main.js:246 -msgid "Failed to get instance groups. GET returned status:" -msgstr "インスタンスグループの取得に失敗しました。GET で返されたステータス:" - -#: client/src/templates/main.js:342 -#: client/src/templates/main.js:410 -#: client/src/templates/main.js:72 -msgid "Failed to get inventory info. GET returned status:" -msgstr "インベントリー情報の取得に失敗しました。GET で返されたステータス:" - -#: client/src/templates/main.js:133 -msgid "Failed to get job template options. OPTIONS returned status:" -msgstr "ジョブテンプレートオプションの取得に失敗しました。OPTIONS で返されたステータス:" - -#: client/src/templates/main.js:178 -msgid "Failed to get job template. GET returned status:" -msgstr "ジョブテンプレートの取得に失敗しました。GET で返されたステータス:" - -#: client/src/templates/main.js:117 -#: client/src/templates/main.js:258 -#: client/src/templates/main.js:356 -#: client/src/templates/main.js:424 -msgid "Failed to get labels. GET returned status:" -msgstr "ラベルの取得に失敗しました。GET で返されたステータス:" - -#: client/src/home/home.controller.js:79 -msgid "Failed to get new jobs for dashboard:" -msgstr "ダッシュボードの新規ジョブを取得できませんでした:" - -#: client/src/home/home.controller.js:105 -msgid "Failed to get new templates for dashboard:" -msgstr "ダッシュボードの新規テンプレートを取得できませんでした:" - -#: client/src/organizations/main.js:184 -msgid "Failed to get organizations for which this user is a notification admin. GET returned" -msgstr "このユーザーが通知管理者の組織を取得できませんでした。GET で以下が返されました" - -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:38 -#: client/src/projects/main.js:122 -#: client/src/templates/main.js:296 -#: client/src/templates/main.js:474 -msgid "Failed to get organizations for which this user is a notification administrator. GET returned" -msgstr "このユーザーが通知管理者の組織を取得できませんでした。GET で以下が返されました" - -#: client/src/templates/main.js:103 -#: client/src/templates/main.js:89 -msgid "Failed to get project info. GET returned status:" -msgstr "プロジェクト情報の取得に失敗しました。GET で返されたステータス:" - -#: client/src/templates/main.js:195 -#: client/src/templates/main.js:220 -msgid "Failed to get project. GET returned status:" -msgstr "プロジェクトの取得に失敗しました。GET で返されたステータス:" - -#: client/src/templates/main.js:313 -#: client/src/templates/main.js:491 -msgid "Failed to get webhook key GET returned" -msgstr "Webhook キーの取得に失敗しました。GET で返されたステータス:" - -#: client/src/templates/main.js:271 -#: client/src/templates/main.js:437 -msgid "Failed to get workflow job template labels. GET returned status:" -msgstr "ワークフロージョブテンプレートのラベルの取得に失敗しました。GET で返されたステータス:" - -#: client/src/templates/main.js:372 -msgid "Failed to get workflow job template options. OPTIONS returned status:" -msgstr "ワークフロージョブテンプレートオプションの取得に失敗しました。OPTIONS で返されたステータス:" - -#: client/src/templates/main.js:450 -msgid "Failed to get workflow job template. GET returned status:" -msgstr "ワークフロージョブテンプレートの取得に失敗しました。GET で返されたステータス:" - -#: client/src/app.js:229 -#: client/src/login/loginModal/loginModal.controller.js:145 -msgid "Failed to get workflow jobs pending approval. GET returned status:" -msgstr "ワークフロージョブの保留中の承認取得に失敗しました。GET で返されたステータス:" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:223 -msgid "Failed to retrieve job template extra variables." -msgstr "ジョブテンプレートの追加変数を取得できませんでした。" - -#: client/src/projects/edit/projects-edit.controller.js:155 -msgid "Failed to retrieve project: %s. GET status:" -msgstr "プロジェクトを取得できませんでした: %s. GET ステータス:" - -#: client/src/users/edit/users-edit.controller.js:172 -msgid "Failed to retrieve user: %s. GET status:" -msgstr "ユーザーを取得できませんでした: %s. GET ステータス:" - -#: client/src/configuration/forms/settings-form.controller.js:430 -msgid "Failed to save settings. Returned status:" -msgstr "設定を保存できませんでした。返されたステータス:" - -#: client/src/configuration/forms/settings-form.controller.js:555 -msgid "Failed to save toggle settings. Returned status:" -msgstr "トグルの設定を保存できませんでした。返されたステータス:" - -#: client/src/credentials/factories/credential-form-save.factory.js:94 -msgid "Failed to update Credential. PUT status:" -msgstr "認証情報を更新できませんでした。PUT ステータス:" - -#: client/src/projects/edit/projects-edit.controller.js:220 -msgid "Failed to update project: %s. PUT status:" -msgstr "プロジェクトを更新できませんでした: %s. PUT ステータス:" - -#: client/features/output/output.strings.js:110 -msgid "Failed to update search results." -msgstr "検索結果の更新に失敗しました。" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:204 -#: client/src/management-jobs/card/card.controller.js:123 -#: client/src/management-jobs/card/card.controller.js:59 -msgid "Failed updating job %s with variables. POST returned: %d" -msgstr "変数でジョブ %s を更新できませんでした。POST で返されたステータス: %d" - -#: client/src/organizations/main.js:156 -msgid "Failed while checking to see if user is a notification administrator of this organization. GET returned" -msgstr "ユーザーがこの組織の通知管理者かどうかを確認中に失敗しました。GET で以下が返されました" - -#: client/src/organizations/main.js:169 -msgid "Failed while checking to see if user is an administrator of this organization. GET returned" -msgstr "ユーザーがこの組織の管理者かどうかを確認中に失敗しました。GET で以下が返されました" - -#: client/src/notifications/notifications.list.js:77 -msgid "Failure" -msgstr "失敗" - -#: client/src/instance-groups/instance-groups.strings.js:81 -msgid "Field for passing a custom Kubernetes or OpenShift Pod specification." -msgstr "カスタムの Kubernetes または OpenShift Pod 仕様を渡すためのフィールドです。" - -#: client/src/scheduler/schedules.list.js:63 -msgid "Final Run" -msgstr "初回実行" - -#: client/lib/services/base-string.service.js:142 -msgid "Finish Time (Ascending)" -msgstr "終了時間 (昇順)" - -#: client/lib/services/base-string.service.js:143 -msgid "Finish Time (Descending)" -msgstr "終了時間 (降順)" - -#: client/features/jobs/jobs.strings.js:10 -#: client/features/output/output.strings.js:52 -#: client/features/output/output.strings.js:64 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:56 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:44 -#: client/src/workflow-results/workflow-results.controller.js:72 -msgid "Finished" -msgstr "終了日時" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 -#: client/src/teams/teams.form.js:101 -#: client/src/users/users.form.js:29 -#: client/src/users/users.list.js:33 -msgid "First Name" -msgstr "名" - -#: client/src/scheduler/schedules.list.js:53 -msgid "First Run" -msgstr "初回実行日時" - -#: client/src/organizations/organizations.form.js:133 -msgid "First name" -msgstr "名" - -#: client/src/templates/survey-maker/surveys/init.factory.js:19 -msgid "Float" -msgstr "浮動" - -#: client/features/output/output.strings.js:102 -#: client/src/shared/smart-search/smart-search.partial.html:49 -msgid "For additional information on advanced search syntax please see the Ansible Tower" -msgstr "検索構文についての詳細は、Ansible Tower ドキュメントを参照してください。" - -#: client/src/credentials/factories/become-method-change.factory.js:63 -#: client/src/credentials/factories/kind-change.factory.js:119 -msgid "For example, %s" -msgstr "例: %s" - -#: client/index.template.ejs:113 -msgid "For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept." -msgstr "指定された期間の前に収集されたファクトについては、時間枠 (頻度) ごとに 1 つのファクトスキャン (スナップショット) を保存します。たとえば、30 日間の前のファクトは削除され、1 つの週次ファクトは保持されます。" - -#: client/src/inventories-hosts/hosts/host.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:34 -msgid "For hosts that are part of an external inventory, this flag may be reset by the inventory sync process." -msgstr "外部インベントリーの一部であるホストの場合には、このフラグはインベントリー同期プロセスでリセットされる可能性があります。" - -#: client/src/inventories-hosts/hosts/host.form.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:32 -#: client/src/inventories-hosts/inventory-hosts.strings.js:33 -msgid "For hosts that are part of an external inventory, this may be reset by the inventory sync process." -msgstr "外部インベントリーの一部であるホストの場合には、これはインベントリー同期プロセスでリセットされる可能性があります。" - -#: client/features/templates/templates.strings.js:59 -#: client/src/templates/job_templates/job-template.form.js:54 -msgid "For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook." -msgstr "ジョブテンプレートについて、Playbook を実行するために実行を選択します。Playbook を実行せずに、Playbook 構文、テスト環境セットアップおよびレポートの問題のみを検査するチェックを選択します。" - -#: client/src/projects/projects.form.js:145 -msgid "For more information, refer to the" -msgstr "詳しい情報は以下の情報を参照してください:" - -#: client/features/output/output.strings.js:65 -#: client/src/instance-groups/instance-groups.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:110 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:97 -#: client/src/templates/job_templates/job-template.form.js:162 -#: client/src/templates/job_templates/job-template.form.js:168 -msgid "Forks" -msgstr "フォーク" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:179 -#: client/src/scheduler/scheduler.strings.js:28 -msgid "Frequency Details" -msgstr "頻度の詳細" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:454 -#: client/src/scheduler/scheduler.strings.js:41 -msgid "Fri" -msgstr "金" - -#: client/src/license/license.partial.html:150 -msgid "GET LICENSES" -msgstr "ライセンスの取得" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "GO TO NOTIFICATIONS TO" -msgstr "通知へ移動:" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js:45 -msgid "GROUPS" -msgstr "グループ" - -#: client/src/organizations/organizations.form.js:59 -#: client/src/organizations/organizations.form.js:62 -msgid "Galaxy Credentials" -msgstr "Galaxy 認証情報" - -#: client/src/shared/form-generator.js:801 -msgid "Generate field" -msgstr "フィールドの生成" - -#: client/features/projects/projects.strings.js:18 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:28 -#: client/src/projects/edit/projects-edit.controller.js:119 -msgid "Get latest SCM revision" -msgstr "最新 SCM リビジョンの取得" - -#: client/features/output/output.strings.js:37 -msgid "Get next page" -msgstr "次のページを取得" - -#: client/features/output/output.strings.js:38 -msgid "Get previous page" -msgstr "前のページを取得" - -#: client/src/credential-types/add/add.controller.js:41 -msgid "Getting Started with Credential Types" -msgstr "認証情報タイプの使用開始" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:92 -msgid "GitHub" -msgstr "GitHub" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:110 -msgid "GitHub (Default)" -msgstr "GitHub (デフォルト)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:31 -msgid "GitHub Category" -msgstr "GitHub カテゴリー" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:111 -msgid "GitHub Org" -msgstr "GitHub 組織" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:112 -msgid "GitHub Team" -msgstr "GitHub チーム" - -#: client/src/shared/paginate/paginate.partial.html:18 -msgid "Go to current page of list" -msgstr "リストの現在のページに移動" - -#: client/features/output/output.strings.js:36 -msgid "Go to first page" -msgstr "最初のページに移動" - -#: client/features/output/output.strings.js:39 -msgid "Go to last page of available output" -msgstr "出力の最後のページに移動" - -#: client/src/shared/paginate/paginate.partial.html:28 -msgid "Go to last page of list" -msgstr "リストの最後のページに移動" - -#: client/src/shared/paginate/paginate.partial.html:22 -msgid "Go to next page of list" -msgstr "リストの次のページに移動" - -#: client/src/shared/paginate/paginate.partial.html:6 -msgid "Go to page 1 of list" -msgstr "リストの 1 ページ目に移動" - -#: client/src/shared/paginate/paginate.partial.html:12 -msgid "Go to previous page of list" -msgstr "リストの前のページに移動" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:93 -msgid "Google OAuth2" -msgstr "Google OAuth2" - -#: client/src/notifications/notificationTemplates.form.js:284 -msgid "Grafana API Key" -msgstr "Grafana API キー" - -#: client/src/notifications/notificationTemplates.form.js:269 -msgid "Grafana URL" -msgstr "Grafana URL" - -#: client/src/teams/teams.form.js:170 -#: client/src/users/users.form.js:222 -msgid "Grant Permission" -msgstr "パーミッションの付与" - -#: client/src/notifications/add/add.controller.js:84 -#: client/src/notifications/edit/edit.controller.js:147 -msgid "Gray" -msgstr "灰色" - -#: client/src/notifications/add/add.controller.js:85 -#: client/src/notifications/edit/edit.controller.js:148 -msgid "Green" -msgstr "緑" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:51 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:52 -msgid "Group Variables" -msgstr "グループ変数" - -#: client/src/inventories-hosts/hosts/host.form.js:111 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:89 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:23 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:88 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:22 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:113 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:122 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:38 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:145 -msgid "Groups" -msgstr "グループ" - -#: client/src/scheduler/scheduler.strings.js:61 -msgid "HH24" -msgstr "HH24" - -#: client/lib/services/base-string.service.js:69 -#: client/src/templates/survey-maker/surveys/init.factory.js:499 -msgid "HIDE" -msgstr "非表示" - -#: client/lib/components/components.strings.js:44 -msgid "HINT: Drag and drop private file on the field below." -msgstr "ヒント: 以下のフィールドに非公開ファイルをドラッグアンドドロップします。" - -#: client/src/activity-stream/get-target-title.factory.js:41 -#: client/src/inventories-hosts/hosts/hosts.partial.html:9 -#: client/src/inventories-hosts/hosts/main.js:81 -#: client/src/inventories-hosts/inventories/inventories.partial.html:15 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.route.js:18 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js:17 -msgid "HOSTS" -msgstr "ホスト" - -#: client/src/notifications/notificationTemplates.form.js:382 -#: client/src/notifications/notificationTemplates.form.js:383 -msgid "HTTP Headers" -msgstr "HTTP ヘッダー" - -#: client/src/notifications/notificationTemplates.form.js:399 -#: client/src/notifications/notificationTemplates.form.js:400 -msgid "HTTP Method" -msgstr "HTTP メソッド" - -#: client/lib/components/components.strings.js:12 -msgid "Hide" -msgstr "非表示" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "Hide Activity Stream" -msgstr "アクティビティーストリームの非表示" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:23 -msgid "High" -msgstr "高" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:13 -msgid "High Risk" -msgstr "高リスク" - -#: client/src/credentials/credentials.form.js:139 -#: client/src/notifications/notificationTemplates.form.js:83 -msgid "Host" -msgstr "ホスト" - -#: client/src/credentials/factories/become-method-change.factory.js:52 -#: client/src/credentials/factories/kind-change.factory.js:108 -msgid "Host (Authentication URL)" -msgstr "ホスト (認証 URL)" - -#: client/src/templates/job_templates/job-template.form.js:387 -#: client/src/templates/job_templates/job-template.form.js:396 -msgid "Host Config Key" -msgstr "ホスト設定キー" - -#: client/src/inventories-hosts/hosts/host.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:39 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:39 -msgid "Host Enabled" -msgstr "有効なホスト" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:304 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:306 -msgid "Host Filter" -msgstr "ホストフィルター" - -#: client/features/output/output.strings.js:66 -msgid "Host Limit Error" -msgstr "ホスト制限エラー" - -#: client/src/inventories-hosts/hosts/host.form.js:45 -#: client/src/inventories-hosts/hosts/host.form.js:56 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:44 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:55 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:46 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:57 -msgid "Host Name" -msgstr "ホスト名" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:78 -msgid "Host Variables" -msgstr "ホスト変数" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is available" -msgstr "ホストが利用可能です。" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is available. Click to toggle." -msgstr "ホストが利用可能です。クリックして切り替えます。" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is not available" -msgstr "ホストを利用できません。" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is not available. Click to toggle." -msgstr "ホストを利用できません。クリックして切り替えます。" - -#: client/features/output/output.strings.js:13 -msgid "Host status information for this job is unavailable." -msgstr "このジョブのホストのステータス情報は利用できません。" - -#: client/features/output/output.strings.js:119 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:39 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:98 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:64 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:149 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:155 -msgid "Hosts" -msgstr "ホスト" - -#: client/src/license/license.partial.html:52 -#: client/src/license/license.partial.html:58 -msgid "Hosts Available" -msgstr "利用可能なホスト" - -#: client/src/license/license.partial.html:68 -msgid "Hosts Remaining" -msgstr "残りのホスト" - -#: client/src/license/license.partial.html:62 -msgid "Hosts Used" -msgstr "使用されたホスト" - -#: client/features/output/output.strings.js:129 -msgid "ID" -msgstr "ID" - -#: client/src/notifications/notificationTemplates.form.js:297 -msgid "ID of the Dashboard (optional)" -msgstr "ダッシュボード ID (オプション)" - -#: client/src/notifications/notificationTemplates.form.js:305 -msgid "ID of the Panel (optional)" -msgstr "パネル ID (オプション)" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:14 -msgid "INITIATED BY" -msgstr "開始:" - -#: client/src/inventories-hosts/inventories/insights/insights.route.js:7 -msgid "INSIGHTS" -msgstr "INSIGHTS" - -#: client/src/instance-groups/instance-groups.list.js:6 -#: client/src/instance-groups/instance-groups.list.js:7 -#: client/src/instance-groups/instance-groups.strings.js:10 -#: client/src/instance-groups/instance-groups.strings.js:19 -msgid "INSTANCE GROUPS" -msgstr "インスタンスグループ" - -#: client/src/instance-groups/instance-groups.strings.js:11 -#: client/src/instance-groups/instance-groups.strings.js:30 -msgid "INSTANCES" -msgstr "インスタンス" - -#: client/src/activity-stream/get-target-title.factory.js:14 -#: client/src/inventories-hosts/hosts/hosts.partial.html:8 -#: client/src/inventories-hosts/inventories/inventories.partial.html:14 -#: client/src/inventories-hosts/inventories/inventories.route.js:8 -#: client/src/inventories-hosts/inventories/inventory.list.js:14 -#: client/src/inventories-hosts/inventories/inventory.list.js:15 -#: client/src/organizations/linkout/organizations-linkout.route.js:138 -#: client/src/organizations/list/organizations-list.controller.js:69 -msgid "INVENTORIES" -msgstr "インベントリー" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:138 -msgid "INVENTORY" -msgstr "インベントリー" - -#: client/src/inventory-scripts/inventory-scripts.form.js:23 -msgid "INVENTORY SCRIPT" -msgstr "インベントリースクリプト" - -#: client/src/activity-stream/get-target-title.factory.js:35 -#: client/src/inventory-scripts/inventory-scripts.list.js:12 -#: client/src/inventory-scripts/main.js:65 -msgid "INVENTORY SCRIPTS" -msgstr "インベントリースクリプト" - -#: client/src/notifications/notificationTemplates.form.js:496 -msgid "IRC Nick" -msgstr "IRC ニック" - -#: client/src/notifications/notificationTemplates.form.js:485 -msgid "IRC Server Address" -msgstr "IRC サーバーアドレス" - -#: client/src/notifications/shared/type-change.service.js:72 -msgid "IRC Server Password" -msgstr "IRC サーバーパスワード" - -#: client/src/notifications/shared/type-change.service.js:71 -msgid "IRC Server Port" -msgstr "IRC サーバーポート" - -#: client/src/instance-groups/instance-groups.strings.js:21 -msgid "ISOLATED" -msgstr "分離" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:79 -msgid "ISSUE: {{report.rule.description}}" -msgstr "問題: {{report.rule.description}}" - -#: client/src/shared/paginate/paginate.partial.html:43 -msgid "ITEMS" -msgstr "項目" - -#: client/src/notifications/notificationTemplates.form.js:439 -#: client/src/notifications/notificationTemplates.form.js:471 -msgid "Icon URL" -msgstr "アイコン URL" - -#: client/src/login/authenticationServices/timer.factory.js:157 -msgid "Idle Session" -msgstr "アイドル状態のセッション" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:354 -msgid "If checked, all variables for child groups and hosts will be removed and replaced by those found on the external source." -msgstr "チェックが付けられている場合、子グループおよびホストのすべての変数が削除され、外部ソースにあるものによって置き換えられます。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:343 -msgid "If checked, any hosts and groups that were previously present on the external source but are now removed will be removed from the Tower inventory. Hosts and groups that were not managed by the inventory source will be promoted to the next manually created group or if there is no manually created group to promote them into, they will be left in the \"all\" default group for the inventory." -msgstr "チェックが付けられている場合、以前は外部ソースにあり、現在は削除されているホストおよびグループが Tower インベントリーから削除されます。インベントリーソースで管理されていなかったホストおよびグループは次に手動で作成されるグループにプロモートされるか、またはプロモート先となる手動で作成されたグループがない場合は、それらはインベントリーの「すべて」のデフォルトグループに残ります。" - -#: client/src/templates/job_templates/job-template.form.js:324 -msgid "If enabled, run this playbook as an administrator." -msgstr "有効にされている場合、この Playbook を管理者として実行します。" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:121 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Ansible タスクで加えられた変更を表示します (有効にされ、サポートされている場合)。これは Ansible の --diff モードに相当します。" - -#: client/features/templates/templates.strings.js:51 -#: client/src/templates/job_templates/job-template.form.js:309 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Ansible タスクで加えられた変更を表示します (有効にされ、サポートされている場合)。これは Ansible の --diff モードに相当します。" - -#: client/src/templates/job_templates/job-template.form.js:356 -msgid "If enabled, simultaneous runs of this job template will be allowed." -msgstr "有効にされている場合、このジョブテンプレートの同時実行が許可されます。" - -#: client/src/templates/workflows.form.js:160 -msgid "If enabled, simultaneous runs of this workflow job template will be allowed." -msgstr "このワークフロージョブテンプレートの同時実行が許可されます (有効にされている場合)。" - -#: client/src/templates/job_templates/job-template.form.js:366 -msgid "If enabled, use cached facts if available and store discovered facts in the cache." -msgstr "キャッシュされたファクトを使用し (有効にされ、ファクトが利用可能な場合)、検出されたファクトをキャッシュに保存します。" - -#: client/src/credentials/credentials.form.js:52 -msgid "If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization." -msgstr "組織が指定されない場合、認証情報はそれを作成するユーザーのみに使用されます。組織管理者およびシステム管理者は組織を割り当て、認証情報のロールを組織内のユーザーおよびチームに割り当てられるようにします。" - -#: client/src/license/license.partial.html:74 -msgid "If you are ready to upgrade, please contact us by clicking the button below" -msgstr "アップグレードの準備ができましたら、以下のボタンをクリックしてお問い合わせください。" - -#: client/src/inventories-hosts/hosts/host.form.js:34 -#: client/src/inventories-hosts/hosts/host.list.js:35 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:32 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:33 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:30 -#: client/src/inventories-hosts/inventory-hosts.strings.js:32 -msgid "Indicates if a host is available and should be included in running jobs." -msgstr "ホストが利用可能かどうか、また実行中のジョブに組み込む必要があるかどうかを示します。" - -#: client/src/activity-stream/activity-detail.form.js:31 -#: client/src/activity-stream/streams.list.js:33 -msgid "Initiated by" -msgstr "開始:" - -#: client/src/credential-types/credential-types.form.js:53 -#: client/src/credential-types/credential-types.form.js:61 -msgid "Injector Configuration" -msgstr "インジェクターの設定" - -#: client/src/credential-types/credential-types.form.js:39 -#: client/src/credential-types/credential-types.form.js:47 -msgid "Input Configuration" -msgstr "入力の設定" - -#: client/src/inventories-hosts/hosts/host.form.js:119 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:129 -msgid "Insights" -msgstr "Insights" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:52 -msgid "Insights Credential" -msgstr "Insights 認証情報" - -#: client/features/output/output.strings.js:67 -#: client/src/instance-groups/instance-groups.strings.js:43 -msgid "Instance Group" -msgstr "Instance group (インスタンスグループ)" - -#: client/src/instance-groups/instance-groups.strings.js:71 -msgid "Instance Group parameter is missing." -msgstr "インスタンスグループのパラメーターがありません。" - -#: client/lib/components/components.strings.js:86 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:54 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:57 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:61 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:64 -#: client/src/organizations/organizations.form.js:38 -#: client/src/organizations/organizations.form.js:41 -#: client/src/templates/job_templates/job-template.form.js:268 -#: client/src/templates/job_templates/job-template.form.js:271 -msgid "Instance Groups" -msgstr "インスタンスグループ" - -#: client/src/instance-groups/instance-groups.strings.js:37 -msgid "Instance Groups Help" -msgstr "インスタンスグループのヘルプ" - -#: client/lib/components/components.strings.js:85 -#: client/src/instance-groups/instance-groups.strings.js:20 -msgid "Instances" -msgstr "インスタンス" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "Insufficient Permissions" -msgstr "十分な権限がありません" - -#: client/src/templates/survey-maker/surveys/init.factory.js:18 -msgid "Integer" -msgstr "整数" - -#: client/src/license/license.partial.html:11 -msgid "Invalid License" -msgstr "無効なライセンス" - -#: client/src/license/license.controller.js:109 -#: client/src/license/license.controller.js:117 -msgid "Invalid file format. Please upload valid JSON." -msgstr "無効なファイル形式です。有効な JSON をアップロードしてください。" - -#: client/lib/components/components.strings.js:16 -msgid "Invalid input for this type." -msgstr "このタイプの無効な入力です。" - -#: client/features/output/output.strings.js:111 -msgid "Invalid search filter provided." -msgstr "無効な検索フィルターが指定されました。" - -#: client/src/login/loginModal/loginModal.partial.html:46 -msgid "Invalid username and/or password. Please try again." -msgstr "無効なユーザー名および/またはパスワードです。やり直してください。" - -#: client/lib/components/components.strings.js:77 -#: client/lib/models/models.strings.js:16 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:121 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:52 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/organizations/linkout/organizations-linkout.route.js:147 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "Inventories" -msgstr "インベントリー" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:43 -msgid "Inventories with sources cannot be copied" -msgstr "ソースを含むインベントリーはコピーできません。" - -#: client/features/jobs/jobs.strings.js:14 -#: client/features/output/output.strings.js:69 -#: client/features/templates/templates.strings.js:19 -#: client/features/templates/templates.strings.js:28 -#: client/src/inventories-hosts/hosts/host.list.js:75 -#: client/src/inventories-hosts/inventories/inventory.list.js:85 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/templates/job_templates/job-template.form.js:66 -#: client/src/templates/job_templates/job-template.form.js:80 -#: client/src/templates/workflows.form.js:72 -#: client/src/templates/workflows.form.js:82 -#: client/src/workflow-results/workflow-results.controller.js:78 -msgid "Inventory" -msgstr "インベントリー" - -#: client/lib/services/base-string.service.js:148 -msgid "Inventory (Ascending)" -msgstr "インベントリー (昇順)" - -#: client/lib/services/base-string.service.js:149 -msgid "Inventory (Descending)" -msgstr "インベントリー (降順)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:109 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:123 -msgid "Inventory File" -msgstr "インベントリーファイル" - -#: client/src/workflow-results/workflow-results.controller.js:79 -msgid "Inventory Limit" -msgstr "インベントリーの制限" - -#: client/lib/components/components.strings.js:82 -#: client/lib/models/models.strings.js:20 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 -msgid "Inventory Scripts" -msgstr "インベントリースクリプト" - -#: client/lib/models/models.strings.js:25 -msgid "Inventory Sources" -msgstr "インベントリーソース" - -#: client/features/templates/templates.strings.js:118 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:52 -#: client/src/workflow-results/workflow-results.controller.js:99 -msgid "Inventory Sync" -msgstr "インベントリー同期" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:55 -msgid "Inventory Sync Failures" -msgstr "インベントリーの同期の失敗" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:75 -msgid "Inventory Variables" -msgstr "インベントリー変数" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:72 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:67 -msgid "Inventory contains 0 hosts." -msgstr "インベントリーには 0 ホストが含まれています。" - -#: client/features/output/output.strings.js:47 -msgid "Isolated" -msgstr "分離" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "JOB ID" -msgstr "ジョブ ID" - -#: client/features/output/output.strings.js:109 -msgid "JOB IS STILL RUNNING" -msgstr "ジョブが実行中です" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:4 -msgid "JOB STATUS" -msgstr "ジョブステータス" - -#: client/src/templates/job_templates/job-template.form.js:22 -msgid "JOB TEMPLATE" -msgstr "ジョブテンプレート" - -#: client/features/portalMode/portalMode.strings.js:8 -#: client/features/templates/routes/organizationsTemplatesList.route.js:28 -#: client/features/templates/routes/projectsTemplatesList.route.js:29 -#: client/src/organizations/list/organizations-list.controller.js:83 -msgid "JOB TEMPLATES" -msgstr "ジョブテンプレート" - -#: client/features/jobs/jobs.strings.js:8 -#: client/features/jobs/routes/instanceGroupJobs.route.js:13 -#: client/features/jobs/routes/instanceGroupJobs.route.js:75 -#: client/features/jobs/routes/instanceJobs.route.js:13 -#: client/features/jobs/routes/inventoryCompletedJobs.route.js:29 -#: client/features/jobs/routes/jobs.route.js:12 -#: client/features/portalMode/portalMode.strings.js:9 -#: client/src/activity-stream/get-target-title.factory.js:32 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:115 -#: client/src/instance-groups/instance-groups.strings.js:31 -msgid "JOBS" -msgstr "ジョブ" - -#: client/lib/components/code-mirror/code-mirror.strings.js:14 -#: client/lib/services/base-string.service.js:73 -msgid "JSON" -msgstr "JSON" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:157 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:181 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:205 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:280 -msgid "JSON:" -msgstr "JSON:" - -#: client/features/jobs/jobs.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:118 -msgid "Job" -msgstr "Job (ジョブ)" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Job Not Found" -msgstr "ジョブが見つかりません" - -#: client/src/templates/job_templates/job-template.form.js:277 -msgid "Job Slicing" -msgstr "ジョブスライス" - -#: client/features/output/output.strings.js:72 -#: client/features/templates/templates.strings.js:54 -#: client/src/templates/job_templates/job-template.form.js:206 -#: client/src/templates/job_templates/job-template.form.js:213 -msgid "Job Tags" -msgstr "ジョブタグ" - -#: client/features/jobs/jobs.strings.js:13 -#: client/features/output/output.strings.js:73 -#: client/features/templates/templates.strings.js:116 -#: client/features/templates/templates.strings.js:13 -#: client/src/templates/templates.list.js:61 -msgid "Job Template" -msgstr "ジョブテンプレート" - -#: client/lib/models/models.strings.js:30 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:102 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:36 -#: client/src/projects/projects.form.js:334 -msgid "Job Templates" -msgstr "ジョブテンプレート" - -#: client/features/output/output.strings.js:75 -#: client/features/templates/templates.strings.js:58 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:35 -#: client/src/templates/job_templates/job-template.form.js:47 -#: client/src/templates/job_templates/job-template.form.js:55 -msgid "Job Type" -msgstr "ジョブタイプ" - -#: client/src/workflow-results/workflow-results.service.js:100 -msgid "Job has completed. Unable to be canceled." -msgstr "ジョブが完了しました。取り消すことができません。" - -#: client/features/output/output.strings.js:30 -msgid "Job is one of several from a JT that slices on inventory" -msgstr "ジョブは、インベントリーをスライスするジョブテンプレートにより生成される複数ジョブの 1 つです。" - -#: client/features/jobs/jobs.strings.js:20 -msgid "Job {{status}}. Click for details." -msgstr "ジョブ {{status}}。クリックして詳細を確認してください。" - -#: client/features/templates/templates.strings.js:125 -#: client/lib/components/components.strings.js:71 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 -#: client/src/configuration/settings.partial.html:5 -#: client/src/instance-groups/instance-groups.strings.js:60 -msgid "Jobs" -msgstr "ジョブ" - -#: client/features/output/output.strings.js:107 -#: client/features/templates/templates.strings.js:111 -#: client/src/workflow-results/workflow-results.controller.js:101 -msgid "KEY" -msgstr "キー" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:61 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:153 -#: client/src/shared/smart-search/smart-search.partial.html:14 -msgid "Key" -msgstr "キー" - -#: client/src/credential-types/credential-types.list.js:31 -#: client/src/credentials/credentials.list.js:33 -msgid "Kind" -msgstr "種類" - -#: client/features/applications/applications.strings.js:31 -#: client/features/projects/projects.strings.js:12 -msgid "LAST MODIFIED" -msgstr "最終更新日" - -#: client/features/projects/projects.strings.js:13 -#: client/features/users/tokens/tokens.strings.js:38 -msgid "LAST USED" -msgstr "最終使用時間" - -#: client/features/templates/templates.strings.js:34 -#: client/lib/components/components.strings.js:112 -msgid "LAUNCH" -msgstr "起動" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:94 -msgid "LDAP" -msgstr "LDAP" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:102 -msgid "LDAP 1 (Optional)" -msgstr "LDAP 1 (オプション)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:103 -msgid "LDAP 2 (Optional)" -msgstr "LDAP 2 (オプション)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:104 -msgid "LDAP 3 (Optional)" -msgstr "LDAP 3 (オプション)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:105 -msgid "LDAP 4 (Optional)" -msgstr "LDAP 4 (オプション)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:106 -msgid "LDAP 5 (Optional)" -msgstr "LDAP 5 (オプション)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:18 -msgid "LDAP Server" -msgstr "LDAP サーバー" - -#: client/src/license/license.route.js:18 -msgid "LICENSE" -msgstr "ライセンス" - -#: client/features/output/output.strings.js:76 -#: client/src/templates/job_templates/job-template.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:244 -#: client/src/templates/templates.list.js:43 -#: client/src/templates/workflows.form.js:121 -#: client/src/templates/workflows.form.js:125 -#: client/src/workflow-results/workflow-results.controller.js:73 -msgid "Labels" -msgstr "ラベル" - -#: client/features/templates/templates.strings.js:22 -msgid "Last Modified" -msgstr "最終更新日" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 -#: client/src/teams/teams.form.js:105 -#: client/src/users/users.form.js:35 -#: client/src/users/users.list.js:37 -msgid "Last Name" -msgstr "姓" - -#: client/features/templates/templates.strings.js:23 -msgid "Last Ran" -msgstr "最終実行日時" - -#: client/lib/services/base-string.service.js:134 -msgid "Last Run (Ascending)" -msgstr "最終実行日時 (昇順)" - -#: client/lib/services/base-string.service.js:135 -msgid "Last Run (Descending)" -msgstr "最終実行日時 (降順)" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:56 -msgid "Last Sync" -msgstr "最終同期" - -#: client/src/projects/projects.list.js:62 -msgid "Last Updated" -msgstr "最終更新日時" - -#: client/lib/services/base-string.service.js:136 -msgid "Last Used (Ascending)" -msgstr "最終使用日時 (昇順)" - -#: client/lib/services/base-string.service.js:137 -msgid "Last Used (Descending)" -msgstr "最終使用日時 (降順)" - -#: client/src/shared/form-generator.js:1402 -msgid "Last logged in:" -msgstr "最終ログイン:" - -#: client/src/organizations/organizations.form.js:137 -msgid "Last name" -msgstr "姓" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:33 -#: client/src/shared/form-generator.js:1660 -msgid "Launch" -msgstr "起動" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:49 -msgid "Launch Configuration" -msgstr "設定の起動" - -#: client/src/management-jobs/card/card.partial.html:21 -#: client/src/management-jobs/card/card.partial.html:24 -msgid "Launch Management Job" -msgstr "管理ジョブの起動" - -#: client/features/jobs/jobs.strings.js:12 -#: client/features/output/output.strings.js:77 -#: client/src/workflow-results/workflow-results.controller.js:70 -msgid "Launched By" -msgstr "起動:" - -#: client/lib/services/base-string.service.js:146 -msgid "Launched By (Ascending)" -msgstr "起動 (昇順)" - -#: client/lib/services/base-string.service.js:147 -msgid "Launched By (Descending)" -msgstr "起動 (降順)" - -#: client/features/templates/templates.strings.js:42 -msgid "Launching this job requires the passwords listed below. Enter each password before continuing." -msgstr "このジョブの起動には以下に記載されているパスワードが必要です。それぞれのパスワードを入力してから続行します。" - -#: client/features/users/tokens/tokens.strings.js:32 -msgid "Leaving this field blank will result in the creation of a Personal Access Token which is not linked to an Application." -msgstr "このフィールドを空白のままにすると、アプリケーションにリンクされていないパーソナルアクセストークンが作成されます。" - -#: client/features/credentials/legacy.credentials.js:350 -msgid "Legacy state configuration for does not exist" -msgstr "レガシー状態の設定は存在しません。" - -#: client/lib/components/components.strings.js:98 -#: client/src/configuration/settings.partial.html:14 -#: client/src/license/license.controller.js:47 -#: client/src/license/license.partial.html:109 -#: client/src/license/license.partial.html:8 -msgid "License" -msgstr "ライセンス" - -#: client/features/output/output.strings.js:78 -msgid "License Error" -msgstr "ライセンスエラー" - -#: client/src/license/license.partial.html:33 -msgid "License Key" -msgstr "ライセンスキー" - -#: client/src/license/license.controller.js:49 -msgid "License Management" -msgstr "ライセンス管理" - -#: client/src/license/license.partial.html:21 -msgid "License Type" -msgstr "ライセンスタイプ" - -#: client/features/output/output.strings.js:79 -#: client/features/templates/templates.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:45 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:55 -#: client/src/templates/job_templates/job-template.form.js:175 -#: client/src/templates/job_templates/job-template.form.js:179 -#: client/src/templates/workflows.form.js:93 -#: client/src/templates/workflows.form.js:97 -msgid "Limit" -msgstr "制限" - -#: client/src/scheduler/scheduler.strings.js:51 -msgid "Limited to first 10" -msgstr "最初の 10 件に制限" - -#: client/src/shared/socket/socket.service.js:225 -msgid "Live events: attempting to connect to the server." -msgstr "ライブイベント: サーバーへの接続を試行しています。" - -#: client/src/shared/socket/socket.service.js:229 -msgid "Live events: connected. Pages containing job status information will automatically update in real-time." -msgstr "ライブイベント: 接続されています。ジョブステータス情報を含むページは自動的にリアルタイムで更新されます。" - -#: client/src/shared/socket/socket.service.js:233 -msgid "Live events: error connecting to the server." -msgstr "ライブイベント: サーバーへの接続時にエラーが発生しました。" - -#: client/src/shared/form-generator.js:1935 -msgid "Loading..." -msgstr "ロード中..." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:136 -#: client/src/scheduler/scheduler.strings.js:26 -msgid "Local Time Zone" -msgstr "ローカルタイムゾーン" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:588 -msgid "Local time" -msgstr "現地の時間" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:228 -msgid "Log aggregator test failed.
Detail:" -msgstr "ログアグリゲーターのテストに失敗しました。
詳細:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:218 -msgid "Log aggregator test sent successfully." -msgstr "ログアグリゲーターのテストの送信に成功しました。" - -#: client/lib/components/components.strings.js:67 -msgid "Logged in as" -msgstr "次の名前でログイン" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:85 -msgid "Logging" -msgstr "ロギング" - -#: client/lib/components/components.strings.js:69 -#: client/lib/components/layout/layout.partial.html:39 -msgid "Logout" -msgstr "ログアウト" - -#: client/src/shared/form-generator.js:1258 -msgid "Lookup field" -msgstr "ルックアップフィールド" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:35 -msgid "Low" -msgstr "低" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:15 -msgid "Low Risk" -msgstr "低リスク" - -#: client/src/management-jobs/card/card.partial.html:6 -#: client/src/management-jobs/card/card.route.js:19 -msgid "MANAGEMENT JOBS" -msgstr "管理ジョブ" - -#: client/src/instance-groups/instance-groups.strings.js:18 -msgid "MANUAL" -msgstr "手動" - -#: client/features/credentials/credentials.strings.js:32 -msgid "METADATA" -msgstr "メタデータ" - -#: client/src/scheduler/scheduler.strings.js:62 -msgid "MM" -msgstr "MM" - -#: client/features/output/output.strings.js:132 -msgid "MODULE" -msgstr "モジュール" - -#: client/features/portalMode/routes/portalModeTemplatesList.route.js:13 -msgid "MY VIEW" -msgstr "マイビュー" - -#: client/src/credentials/credentials.form.js:67 -msgid "Machine" -msgstr "マシン" - -#: client/features/output/output.strings.js:80 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:60 -msgid "Machine Credential" -msgstr "マシンの認証情報" - -#: client/src/license/license.partial.html:240 -msgid "Managed Nodes" -msgstr "管理ノード" - -#: client/lib/components/components.strings.js:84 -msgid "Management Jobs" -msgstr "管理ジョブ" - -#: client/features/projects/projects.strings.js:20 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:45 -#: client/src/projects/edit/projects-edit.controller.js:126 -msgid "Manual projects do not require an SCM update" -msgstr "手動プロジェクトに SCM 更新は不要です" - -#: client/src/templates/job_templates/job-template.form.js:250 -#: client/src/templates/workflows.form.js:131 -msgid "Max 512 characters per label." -msgstr "最大 512 文字 (ラベルあたり)" - -#: client/src/organizations/organizations.form.js:68 -#: client/src/organizations/organizations.form.js:75 -msgid "Max Hosts" -msgstr "最大ホスト数" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:161 -msgid "Maximum" -msgstr "最大" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:119 -#: client/src/templates/survey-maker/shared/question-definition.form.js:140 -#: client/src/templates/survey-maker/shared/question-definition.form.js:98 -msgid "Maximum Length" -msgstr "最大長" - -#: client/src/login/loginModal/loginModal.partial.html:40 -msgid "Maximum per-user sessions reached. Please sign in." -msgstr "ユーザーあたりの最大セッション数に達しました。サインインしてください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:181 -msgid "Maximum<" -msgstr "最大<" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:29 -msgid "Medium" -msgstr "中" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:14 -msgid "Medium Risk" -msgstr "中リスク" - -#: client/src/shared/stateDefinitions.factory.js:607 -msgid "Member" -msgstr "メンバー" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:156 -#: client/src/templates/survey-maker/shared/question-definition.form.js:176 -msgid "Minimum" -msgstr "最小" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:113 -#: client/src/templates/survey-maker/shared/question-definition.form.js:134 -#: client/src/templates/survey-maker/shared/question-definition.form.js:92 -msgid "Minimum Length" -msgstr "最小長" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:83 -msgid "Misc. System" -msgstr "その他のシステム" - -#: client/src/templates/workflows.form.js:35 -msgid "Missing Job Templates found in the Workflow Editor" -msgstr "欠落していたジョブテンプレートはワークフロービジュアライザーにあります。" - -#: client/lib/services/base-string.service.js:130 -msgid "Modified (Ascending)" -msgstr "変更日時 (昇順)" - -#: client/lib/services/base-string.service.js:131 -msgid "Modified (Descending)" -msgstr "変更日時 (降順)" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:22 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:30 -msgid "Module" -msgstr "モジュール" - -#: client/features/output/output.strings.js:81 -msgid "Module Args" -msgstr "モジュールの引数" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:414 -#: client/src/scheduler/scheduler.strings.js:37 -msgid "Mon" -msgstr "月" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:25 -msgid "Most recent job failed. Click to view jobs." -msgstr "最新のジョブが失敗しました。クリックしてジョブを表示します。" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:29 -msgid "Most recent job successful. Click to view jobs." -msgstr "最新のジョブが成功しました。クリックしてジョブを表示します。" - -#: client/src/templates/survey-maker/surveys/init.factory.js:17 -msgid "Multiple Choice (multiple select)" -msgstr "複数の選択 (複数の選択)" - -#: client/src/templates/survey-maker/surveys/init.factory.js:16 -msgid "Multiple Choice (single select)" -msgstr "複数の選択 (単一の選択)" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:77 -msgid "Multiple Choice Options" -msgstr "複数の選択オプション" - -#: client/features/portalMode/index.view.html:26 -msgid "My Jobs" -msgstr "マイジョブ" - -#: client/lib/components/components.strings.js:73 -msgid "My View" -msgstr "マイビュー" - -#: client/features/applications/applications.strings.js:24 -msgid "NAME" -msgstr "名前" - -#: client/features/applications/applications.strings.js:20 -msgid "NEW APPLICATION" -msgstr "新規アプリケーション" - -#: client/features/credentials/credentials.strings.js:40 -msgid "NEW CREDENTIAL" -msgstr "新規の認証情報" - -#: client/src/credential-types/credential-types.form.js:16 -msgid "NEW CREDENTIAL TYPE" -msgstr "新規の認証情報タイプ" - -#: client/src/inventory-scripts/inventory-scripts.form.js:16 -msgid "NEW CUSTOM INVENTORY" -msgstr "新規カスタムインベントリー" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:17 -msgid "NEW INVENTORY" -msgstr "新規インベントリー" - -#: client/src/templates/job_templates/job-template.form.js:19 -msgid "NEW JOB TEMPLATE" -msgstr "新規ジョブテンプレート" - -#: client/src/notifications/notificationTemplates.form.js:16 -msgid "NEW NOTIFICATION TEMPLATE" -msgstr "新規通知テンプレート" - -#: client/src/organizations/organizations.form.js:18 -msgid "NEW ORGANIZATION" -msgstr "新規組織" - -#: client/src/projects/projects.form.js:17 -msgid "NEW PROJECT" -msgstr "新規プロジェクト" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:10 -msgid "NEW SMART INVENTORY" -msgstr "新規スマートインベントリー" - -#: client/src/teams/teams.form.js:16 -msgid "NEW TEAM" -msgstr "新規チーム" - -#: client/src/users/users.form.js:16 -msgid "NEW USER" -msgstr "新規ユーザー" - -#: client/src/templates/workflows.form.js:17 -msgid "NEW WORKFLOW JOB TEMPLATE" -msgstr "新規ワークフロージョブテンプレート" - -#: client/lib/services/base-string.service.js:67 -msgid "NEXT" -msgstr "次へ" - -#: client/src/inventories-hosts/hosts/hosts.partial.html:38 -msgid "NO HOSTS HAVE BEEN CREATED" -msgstr "ホストが作成されていません" - -#: client/features/output/output.strings.js:142 -msgid "NO JOBS FINISHED" -msgstr "未完了のジョブはありません" - -#: client/lib/components/components.strings.js:40 -msgid "NO OPTIONS AVAILABLE" -msgstr "利用可能なオプションがありません" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:117 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:120 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:123 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:127 -msgid "NONE SELECTED" -msgstr "何も選択されていません" - -#: client/src/projects/projects.form.js:139 -msgid "NOTE: This field assumes the remote name is \"origin\"." -msgstr "注: このフィールドは、リモート名が \"origin\" であることが前提です。" - -#: client/src/login/loginModal/loginModal.partial.html:102 -msgid "NOTICE" -msgstr "通知" - -#: client/src/notifications/notificationTemplates.form.js:21 -msgid "NOTIFICATION TEMPLATE" -msgstr "通知テンプレート" - -#: client/src/activity-stream/get-target-title.factory.js:26 -#: client/src/notifications/notificationTemplates.list.js:14 -msgid "NOTIFICATION TEMPLATES" -msgstr "通知テンプレート" - -#: client/lib/components/components.strings.js:131 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js:9 -#: client/src/management-jobs/notifications/notification.route.js:59 -#: client/src/notifications/main.js:44 -#: client/src/notifications/main.js:95 -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "NOTIFICATIONS" -msgstr "通知" - -#: client/features/output/output.strings.js:82 -#: client/src/credential-types/credential-types.form.js:27 -#: client/src/credential-types/credential-types.list.js:24 -#: client/src/credentials/credentials.form.js:32 -#: client/src/credentials/credentials.list.js:26 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:15 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:15 -#: client/src/instance-groups/instance-groups.list.js:15 -#: client/src/inventories-hosts/hosts/host.list.js:68 -#: client/src/inventories-hosts/inventories/inventory.list.js:52 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:33 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:37 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:21 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:28 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:45 -#: client/src/inventory-scripts/inventory-scripts.form.js:28 -#: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 -#: client/src/notifications/notificationTemplates.form.js:32 -#: client/src/notifications/notificationTemplates.list.js:37 -#: client/src/notifications/notifications.list.js:27 -#: client/src/organizations/organizations.form.js:26 -#: client/src/projects/projects.form.js:30 -#: client/src/projects/projects.list.js:43 -#: client/src/scheduler/scheduled-jobs.list.js:36 -#: client/src/scheduler/scheduler.strings.js:21 -#: client/src/scheduler/schedules.list.js:48 -#: client/src/teams/teams.form.js:135 -#: client/src/teams/teams.form.js:28 -#: client/src/teams/teams.list.js:23 -#: client/src/templates/job_templates/job-template.form.js:34 -#: client/src/templates/templates.list.js:24 -#: client/src/templates/workflows.form.js:42 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:119 -#: client/src/users/users.form.js:143 -#: client/src/users/users.form.js:171 -#: client/src/users/users.form.js:199 -msgid "Name" -msgstr "名前" - -#: client/lib/services/base-string.service.js:126 -msgid "Name (Ascending)" -msgstr "名前 (昇順)" - -#: client/lib/services/base-string.service.js:127 -msgid "Name (Descending)" -msgstr "名前 (降順)" - -#: client/lib/components/layout/layout.partial.html:4 -msgid "Navigate to dashboard" -msgstr "ダッシュボードに移動する" - -#: client/features/output/details.partial.html:244 -msgid "Navigate to inventory sync job" -msgstr "インベントリー同期ジョブに移動する" - -#: client/features/output/details.partial.html:212 -msgid "Navigate to project sync job" -msgstr "プロジェクト同期ジョブに移動する" - -#: client/features/output/details.partial.html:164 -msgid "Navigate to workflow job" -msgstr "ワークフロージョブに移動する" - -#: client/src/credentials/credentials.form.js:71 -msgid "Network" -msgstr "ネットワーク" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:70 -msgid "New Group" -msgstr "新規グループ" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:147 -msgid "New Host" -msgstr "新規ホスト" - -#: client/src/users/add/users-add.controller.js:93 -msgid "New user successfully created!" -msgstr "新規ユーザーが正常に作成されました!" - -#: client/src/scheduler/scheduled-jobs.list.js:56 -#: client/src/scheduler/schedules.list.js:58 -msgid "Next Run" -msgstr "次回実行日時" - -#: client/src/credentials/credentials.list.js:21 -msgid "No Credentials Have Been Created" -msgstr "認証情報が作成されていません" - -#: client/features/templates/templates.strings.js:74 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:15 -msgid "No Credentials Matching This Type Have Been Created" -msgstr "このタイプに一致する認証情報が作成されていません" - -#: client/features/output/host-event/host-event-codemirror.partial.html:3 -msgid "No JSON data returned by the module" -msgstr "JSON データがモジュールによって返されていません" - -#: client/src/license/license.controller.js:158 -msgid "No Licenses Found" -msgstr "ライセンスが見つかりません" - -#: client/src/projects/projects.list.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:64 -msgid "No Projects Have Been Created" -msgstr "プロジェクトが作成されていません" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:50 -msgid "No Remediation Playbook Available" -msgstr "修復 Playbook を使用できません" - -#: client/features/projects/projects.strings.js:32 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "No SCM Configuration" -msgstr "SCM 設定がありません" - -#: client/features/projects/projects.strings.js:38 -#: client/src/projects/factories/get-project-tool-tip.factory.js:9 -msgid "No SCM updates have run for this project" -msgstr "このプロジェクトで実行された SCM 更新はありません" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:17 -msgid "No Teams exist" -msgstr "チームが存在しません" - -#: client/features/projects/projects.strings.js:29 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "No Updates Available" -msgstr "利用可能な更新がありません" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:18 -msgid "No Users to add" -msgstr "追加するユーザーがありません" - -#: client/features/credentials/credentials.strings.js:36 -msgid "No credential selected" -msgstr "認証情報が選択されていません" - -#: client/features/templates/templates.strings.js:37 -msgid "No credentials selected" -msgstr "認証情報が選択されていません" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:63 -msgid "No data is available. There are no issues to report." -msgstr "使用できるデータがありません。報告する問題がありません。" - -#: client/features/credentials/credentials.strings.js:34 -msgid "No external credentials available." -msgstr "利用可能な外部認証情報がありません。" - -#: client/src/license/license.controller.js:44 -msgid "No file selected." -msgstr "ファイルが選択されていません。" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js:48 -msgid "No groups to add" -msgstr "追加するグループがありません" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js:45 -msgid "No hosts to add" -msgstr "追加するホストがありません" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:68 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:64 -msgid "No hosts with failures. Click for details." -msgstr "障害のあるホストがありません。クリックして詳細を確認してください。" - -#: client/features/templates/templates.strings.js:38 -msgid "No inventory selected" -msgstr "インベントリーが選択されていません" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:51 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:52 -msgid "No inventory sync failures. Click for details." -msgstr "インベントリーの同期に障害が発生していません。クリックして詳細を確認してください。" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:16 -msgid "No job data" -msgstr "ジョブデータがありません" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:75 -msgid "No job data available." -msgstr "利用可能なジョブデータがありません。" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:54 -msgid "No job templates were recently used." -msgstr "最近使用されたジョブテンプレートはありません。" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:51 -msgid "No jobs were recently run." -msgstr "最近実行されたジョブがありません。" - -#: client/src/teams/teams.form.js:132 -#: client/src/users/users.form.js:196 -msgid "No permissions have been granted" -msgstr "パーミッションが付与されていません" - -#: client/features/templates/templates.strings.js:147 -msgid "No promptable values were provided when this node was created." -msgstr "このノードの作成時に提示可能な値が指定されませんでした。" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:17 -msgid "No recent job data available for this host." -msgstr "このホストに利用できる最新のジョブデータがありません。" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:98 -msgid "No recent job data available for this inventory." -msgstr "このインベントリーに利用できる最新のジョブデータがありません。" - -#: client/src/notifications/notification-templates-list/list.controller.js:86 -msgid "No recent notifications." -msgstr "最新の通知はありません。" - -#: client/features/credentials/credentials.strings.js:33 -#: client/src/inventories-hosts/hosts/hosts.partial.html:36 -#: client/src/shared/form-generator.js:1833 -#: client/src/shared/list-generator/list-generator.factory.js:240 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:25 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:62 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:92 -msgid "No records matched your search." -msgstr "検索に一致するレコードはありません" - -#: client/features/output/output.strings.js:133 -msgid "No result found" -msgstr "結果が見つかりません" - -#: client/src/scheduler/scheduled-jobs.list.js:16 -msgid "No schedules exist" -msgstr "スケジュールがありません" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:71 -msgid "No sync data" -msgstr "同期データはありません" - -#: client/src/organizations/linkout/addUsers/addUsers.controller.js:60 -msgid "No users available to add as adminstrators" -msgstr "管理者として追加できるユーザーがありません" - -#: client/src/users/add/users-add.controller.js:10 -#: client/src/users/edit/users-edit.controller.js:10 -#: client/src/users/list/users-list.controller.js:10 -msgid "Normal User" -msgstr "標準ユーザー" - -#: client/features/output/output.strings.js:48 -#: client/src/workflow-results/workflow-results.controller.js:84 -msgid "Not Finished" -msgstr "終了していません" - -#: client/features/output/output.strings.js:49 -#: client/src/workflow-results/workflow-results.controller.js:85 -msgid "Not Started" -msgstr "開始されていません" - -#: client/features/projects/projects.strings.js:37 -msgid "Not configured for SCM" -msgstr "SCM 用に設定されていません" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:58 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:56 -msgid "Not configured for inventory sync." -msgstr "インベントリーの同期に設定されていません。" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -msgid "Note that only hosts directly in this group can be disassociated. Hosts in sub-groups must be disassociated directly from the sub-group level that they belong." -msgstr "このグループに直接含まれるホストのみの関連付けを解除できることに注意してください。サブグループのホストの関連付けの解除については、それらのホストが属するサブグループのレベルで直接実行する必要があります。" - -#: client/src/notifications/notificationTemplates.form.js:343 -#: client/src/notifications/notificationTemplates.form.js:344 -#: client/src/notifications/notificationTemplates.form.js:540 -#: client/src/notifications/notificationTemplates.form.js:541 -msgid "Notification Color" -msgstr "通知の色" - -#: client/src/notifications/notification-templates-list/list.controller.js:140 -msgid "Notification Failed." -msgstr "通知に失敗しました。" - -#: client/src/notifications/notificationTemplates.form.js:332 -msgid "Notification Label" -msgstr "通知レベル" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 -msgid "Notification Templates" -msgstr "通知テンプレート" - -#: client/src/notifications/notification-templates-list/list.controller.js:157 -msgid "Notification timed out." -msgstr "通知がタイムアウトしました。" - -#: client/lib/components/components.strings.js:83 -#: client/src/management-jobs/notifications/notification.route.js:21 -#: client/src/notifications/notifications.list.js:17 -msgid "Notifications" -msgstr "通知" - -#: client/src/notifications/notificationTemplates.form.js:357 -msgid "Notify Channel" -msgstr "通知チャネル" - -#: client/lib/services/base-string.service.js:71 -msgid "OFF" -msgstr "オフ" - -#: client/index.template.ejs:71 -#: client/lib/services/base-string.service.js:65 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -msgid "OK" -msgstr "OK" - -#: client/lib/services/base-string.service.js:70 -msgid "ON" -msgstr "オン" - -#: client/lib/components/components.strings.js:10 -msgid "OPTIONS" -msgstr "オプション" - -#: client/src/license/license.partial.html:121 -msgid "OR" -msgstr "または" - -#: client/features/applications/applications.strings.js:30 -msgid "ORG" -msgstr "組織" - -#: client/features/projects/projects.strings.js:11 -msgid "ORGANIZATION" -msgstr "組織" - -#: client/src/activity-stream/get-target-title.factory.js:29 -#: client/src/organizations/list/organizations-list.partial.html:6 -#: client/src/organizations/main.js:55 -msgid "ORGANIZATIONS" -msgstr "組織" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:507 -msgid "Occurrence(s)" -msgstr "発生" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:567 -#: client/src/scheduler/scheduler.strings.js:45 -msgid "Occurrences" -msgstr "発生" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:396 -msgid "On Days" -msgstr "日数" - -#: client/features/templates/templates.strings.js:113 -#: client/src/workflow-results/workflow-results.controller.js:96 -msgid "On Failure" -msgstr "障害発生時" - -#: client/features/templates/templates.strings.js:112 -#: client/src/workflow-results/workflow-results.controller.js:95 -msgid "On Success" -msgstr "成功時" - -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials.partial.html:3 -msgid "Open Galaxy credentials" -msgstr "Galaxy 認証情報を開く" - -#: client/src/templates/job_templates/multi-credential/multi-credential.partial.html:4 -msgid "Open credential lookup" -msgstr "資格情報検索の表示" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:42 -msgid "Open host filter" -msgstr "スマートホストフィルター" - -#: client/src/shared/instance-groups-multiselect/instance-groups.partial.html:3 -msgid "Open instance groups" -msgstr "インスタンスグループの表示" - -#: client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html:4 -msgid "Open webhook credential lookup" -msgstr "Webhook の認証情報検索の表示" - -#: client/src/credentials/credentials.form.js:378 -msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" -msgstr "OpenStack ドメインは管理上の境界を定義します。これは Keystone v3 認証 URL にのみ必要です。共通するシナリオには以下が含まれます:" - -#: client/src/templates/job_templates/job-template.form.js:246 -#: client/src/templates/workflows.form.js:127 -msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs." -msgstr "「dev」または「test」などのこのジョブテンプレートを説明するオプションラベルです。ラベルを使用し、ジョブテンプレートおよび完了したジョブの分類およびフィルターを実行できます。" - -#: client/src/templates/job_templates/job-template.form.js:472 -msgid "Optionally, select the credential to use to send status updates back to the webhook service" -msgstr "オプションで、ステータスの更新を Webhook サービスに送信しなおすのに使用する認証情報を選択します。" - -#: client/src/templates/workflows.form.js:245 -msgid "Optionally, select the credential to use to send status updates back to the webhook service." -msgstr "オプションで、ステータスの更新を Webhook サービスに送信しなおすのに使用する認証情報を選択します。" - -#: client/src/partials/logviewer.html:7 -#: client/src/templates/job_templates/job-template.form.js:317 -#: client/src/templates/workflows.form.js:153 -msgid "Options" -msgstr "オプション" - -#: client/features/applications/add-applications.controller.js:31 -#: client/features/templates/templates.strings.js:16 -#: client/src/credentials/credentials.form.js:46 -#: client/src/credentials/credentials.form.js:53 -#: client/src/inventories-hosts/inventories/inventory.list.js:65 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:33 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:40 -#: client/src/inventory-scripts/inventory-scripts.list.js:27 -#: client/src/notifications/notificationTemplates.form.js:44 -#: client/src/projects/projects.form.js:42 -#: client/src/projects/projects.form.js:48 -#: client/src/teams/teams.form.js:40 -#: client/src/teams/teams.list.js:30 -#: client/src/templates/workflows.form.js:55 -#: client/src/templates/workflows.form.js:61 -#: client/src/users/users.form.js:41 -msgid "Organization" -msgstr "組織" - -#: client/lib/services/base-string.service.js:152 -msgid "Organization (Ascending)" -msgstr "組織 (昇順)" - -#: client/lib/services/base-string.service.js:153 -msgid "Organization (Descending)" -msgstr "組織 (降順)" - -#: client/lib/components/components.strings.js:79 -#: client/lib/models/models.strings.js:35 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:135 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:64 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 -#: client/src/users/users.form.js:133 -msgid "Organizations" -msgstr "組織" - -#: client/features/templates/templates.strings.js:31 -msgid "Other Prompts" -msgstr "他のプロンプト" - -#: client/src/credentials/credentials.form.js:79 -msgid "Others (Cloud Providers)" -msgstr "その他 (クラウドプロバイダー)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:276 -msgid "Override variables found in azure_rm.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "azure_rm.ini にあり、インベントリー更新スクリプトで使用される変数を上書きします。これらの変数の詳細な説明については、次を参照してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:242 -msgid "Override variables found in cloudforms.ini and used by the inventory update script. For an example variable configuration" -msgstr "cloudforms.ini にあり、インベントリー更新スクリプトが使用する変数を上書きします。変数の設定例については次を参照してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:177 -msgid "Override variables found in ec2.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "ec2.ini にあり、インベントリー更新スクリプトで使用される変数を上書きします。これらの変数の詳細な説明については、次を参照してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:259 -msgid "Override variables found in foreman.ini and used by the inventory update script. For an example variable configuration" -msgstr "foreman.ini にあり、インベントリー更新スクリプトが使用する変数を上書きします。変数の設定例については次を参照してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:225 -msgid "Override variables found in openstack.yml and used by the inventory update script. For an example variable configuration" -msgstr "openstack.yml にあり、インベントリー更新スクリプトが使用する変数を上書きします。変数の設定例については次を参照してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:201 -msgid "Override variables found in vmware.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "vmware.ini にあり、インベントリー更新スクリプトで使用される変数を上書きします。これらの変数の詳細な説明については、次を参照してください。" - -#: client/features/output/output.strings.js:83 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:340 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:345 -msgid "Overwrite" -msgstr "上書き" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:351 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:356 -msgid "Overwrite Variables" -msgstr "変数の上書き" - -#: client/features/output/output.strings.js:84 -msgid "Overwrite Vars" -msgstr "変数の上書き" - -#: client/src/credentials/credentials.list.js:40 -msgid "Owners" -msgstr "所有者" - -#: client/src/license/license.partial.html:136 -#: client/src/login/loginModal/loginModal.partial.html:80 -msgid "PASSWORD" -msgstr "パスワード" - -#: client/features/credentials/legacy.credentials.js:117 -msgid "PERMISSIONS" -msgstr "パーミッション" - -#: client/features/output/output.strings.js:130 -msgid "PLAY" -msgstr "プレイ" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:146 -msgid "PLAYBOOK" -msgstr "PLAYBOOK" - -#: client/src/partials/survey-maker-modal.html:42 -msgid "PLEASE ADD A SURVEY PROMPT." -msgstr "Survey プロンプトを追加してください。" - -#: client/src/organizations/list/organizations-list.partial.html:38 -#: client/src/shared/form-generator.js:1839 -#: client/src/shared/list-generator/list-generator.factory.js:248 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:27 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:94 -msgid "PLEASE ADD ITEMS TO THIS LIST" -msgstr "項目をこの一覧に追加してください" - -#: client/src/notifications/add/add.controller.js:106 -#: client/src/notifications/edit/edit.controller.js:160 -msgid "POST" -msgstr "POST" - -#: client/src/partials/survey-maker-modal.html:40 -msgid "PREVIEW" -msgstr "プレビュー" - -#: client/src/workflow-results/workflow-results.service.js:105 -msgid "PROCEED" -msgstr "続行" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:142 -msgid "PROJECT" -msgstr "プロジェクト" - -#: client/features/projects/projects.strings.js:8 -#: client/features/projects/routes/projectsList.route.js:13 -#: client/src/activity-stream/get-target-title.factory.js:8 -#: client/src/organizations/linkout/organizations-linkout.route.js:182 -#: client/src/organizations/list/organizations-list.controller.js:76 -#: client/src/projects/projects.list.js:14 -#: client/src/projects/projects.list.js:15 -msgid "PROJECTS" -msgstr "プロジェクト" - -#: client/features/templates/templates.strings.js:30 -msgid "PROMPT" -msgstr "プロンプト" - -#: client/src/notifications/add/add.controller.js:107 -#: client/src/notifications/edit/edit.controller.js:161 -msgid "PUT" -msgstr "PUT" - -#: client/src/shared/paginate/paginate.partial.html:33 -msgid "Page" -msgstr "ページ" - -#: client/src/notifications/notificationTemplates.form.js:236 -msgid "Pagerduty subdomain" -msgstr "Pagerduty サブドメイン" - -#: client/src/templates/job_templates/job-template.form.js:486 -msgid "Pass extra command line variables to the playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "追加のコマンドライン変数を Playbook に渡します。YAML または JSON のいずれかを使用してキーと値のペアを指定します。構文のサンプルについては Ansible Tower ドキュメントを参照してください。" - -#: client/src/templates/workflows.form.js:142 -msgid "Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "追加のコマンドライン変数を Playbook に渡します。これは、ansible-playbook の -e または --extra-vars コマンドラインパラメーターです。YAML または JSON のいずれかを使用してキーと値のペアを指定します。構文のサンプルについては Ansible Tower ドキュメントを参照してください。" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:139 -msgid "Pass extra command line variables. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." -msgstr "追加のコマンドライン変数を渡します。これは、%s の %s または %s コマンドラインパラメーターです。YAML または JSON のいずれかを使用してキーと値のペアを指定します。" - -#: client/src/credentials/credentials.form.js:226 -#: client/src/credentials/factories/become-method-change.factory.js:21 -#: client/src/credentials/factories/become-method-change.factory.js:40 -#: client/src/credentials/factories/become-method-change.factory.js:48 -#: client/src/credentials/factories/become-method-change.factory.js:68 -#: client/src/credentials/factories/become-method-change.factory.js:78 -#: client/src/credentials/factories/become-method-change.factory.js:88 -#: client/src/credentials/factories/kind-change.factory.js:104 -#: client/src/credentials/factories/kind-change.factory.js:124 -#: client/src/credentials/factories/kind-change.factory.js:134 -#: client/src/credentials/factories/kind-change.factory.js:144 -#: client/src/credentials/factories/kind-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:77 -#: client/src/credentials/factories/kind-change.factory.js:96 -#: client/src/notifications/shared/type-change.service.js:31 -#: client/src/templates/survey-maker/surveys/init.factory.js:15 -#: client/src/users/users.form.js:69 -msgid "Password" -msgstr "パスワード" - -#: client/src/credentials/factories/kind-change.factory.js:57 -msgid "Password (API Key)" -msgstr "パスワード (API キー)" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:23 -msgid "Past 24 Hours" -msgstr "過去 24 時間" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:16 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:29 -msgid "Past Month" -msgstr "過去 1 ヵ月" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:26 -msgid "Past Week" -msgstr "過去 1 週間" - -#: client/src/credentials/factories/become-method-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:85 -msgid "Paste the contents of the PEM file associated with the service account email." -msgstr "サービスアカウントメールに関連付けられた PEM ファイルの内容を貼り付けます。" - -#: client/src/credentials/factories/kind-change.factory.js:50 -msgid "Paste the contents of the SSH private key file." -msgstr "SSH 秘密鍵ファイルの内容を貼り付けます。" - -#: client/src/credentials/factories/kind-change.factory.js:25 -msgid "Paste the contents of the SSH private key file.%s or click to close%s" -msgstr "SSH 秘密鍵ファイルの内容を貼り付けます。%s またはクリックして %s を閉じます。" - -#: client/src/inventories-hosts/inventories/inventory.list.js:133 -#: client/src/shared/list-generator/list-generator.factory.js:415 -msgid "Pending Delete" -msgstr "保留中の削除" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js:60 -msgid "Perform a search above to define a host filter" -msgstr "上記の検索を実行して、ホストフィルターを定義します。" - -#: client/lib/components/components.strings.js:49 -msgid "Perform lookup" -msgstr "ルックアップの実行" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:8 -msgid "Period" -msgstr "期間" - -#: client/src/projects/add/projects-add.controller.js:35 -#: client/src/templates/main.js:128 -#: client/src/templates/main.js:367 -#: client/src/users/add/users-add.controller.js:45 -msgid "Permission Error" -msgstr "パーミッションのエラー" - -#: client/features/credentials/credentials.strings.js:14 -#: client/features/credentials/legacy.credentials.js:63 -#: client/src/credentials/credentials.form.js:438 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:104 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:101 -#: client/src/organizations/organizations.form.js:152 -#: client/src/projects/projects.form.js:278 -#: client/src/teams/teams.form.js:128 -#: client/src/templates/job_templates/job-template.form.js:532 -#: client/src/templates/workflows.form.js:287 -#: client/src/users/users.form.js:192 -msgid "Permissions" -msgstr "パーミッション" - -#: client/features/users/tokens/tokens.strings.js:41 -msgid "Personal Access Token" -msgstr "パーソナルアクセストークン" - -#: client/features/output/output.strings.js:85 -#: client/src/shared/form-generator.js:1044 -#: client/src/templates/job_templates/job-template.form.js:123 -#: client/src/templates/job_templates/job-template.form.js:134 -msgid "Playbook" -msgstr "Playbook" - -#: client/src/projects/projects.form.js:91 -msgid "Playbook Directory" -msgstr "Playbook ディレクトリー" - -#: client/features/templates/templates.strings.js:70 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:58 -msgid "Playbook Run" -msgstr "Playbook 実行" - -#: client/features/output/output.strings.js:117 -msgid "Plays" -msgstr "プレイ" - -#: client/lib/components/components.strings.js:116 -msgid "Please add items to this list." -msgstr "項目をこの一覧に追加してください。" - -#: client/src/users/users.form.js:127 -msgid "Please add user to an Organization." -msgstr "ユーザーを組織に追加してください。" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:99 -msgid "Please assign roles to the selected resources" -msgstr "ロールを選択したリソースに割り当ててください。" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:60 -msgid "Please assign roles to the selected users/teams" -msgstr "ロールを選択したユーザー/チームに割り当ててください。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "Please check the server and make sure the directory exists and file permissions are set correctly." -msgstr "サーバーを確認し、ディレクトリーが存在し、ファイルのパーミッションが正常に設定されていることを確認してください。" - -#: client/features/templates/templates.strings.js:144 -msgid "Please click on an available node to form a new link." -msgstr "使用できるノードをクリックして新しいリンクを作成してください。" - -#: client/src/license/license.partial.html:91 -msgid "Please click the button below to visit Ansible's website to get a Tower license key." -msgstr "以下のボタンをクリックし、Ansible の web サイトに移動して Tower ライセンスキーを取得します。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:40 -msgid "Please click the icon to edit the host filter." -msgstr "アイコンをクリックしてホストフィルターを編集します。" - -#: client/features/templates/templates.strings.js:126 -msgid "Please click the start button to build your workflow." -msgstr "開始ボタンをクリックしてワークフローを構築してください。" - -#: client/lib/services/base-string.service.js:98 -msgid "Please confirm that you would like to remove {{ role }} access from the team {{ name }}. This will affect all members of the team. If you would like to only remove access for this particular user, please remove them from the team." -msgstr "チーム {{name}} から {{role}} のアクセス権が削除されたことを確認してください。これは、チームの全メンバーに影響します。この特定のユーザーのアクセス権のみを削除する場合は、チームからこのユーザーを削除してください。" - -#: client/lib/services/base-string.service.js:104 -msgid "Please confirm that you would like to remove {{ role }} access from {{ name }}." -msgstr "チーム {{name}} から {{role}} のアクセス権が削除されたことを確認してください。" - -#: client/src/shared/form-generator.js:833 -#: client/src/shared/form-generator.js:925 -msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." -msgstr "ssh、http または https で始まる URL を入力します。URL には「@」文字を含めることはできません。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:183 -msgid "Please enter a larger float." -msgstr "もう少し大きい浮動小数点数を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:163 -msgid "Please enter a larger integer." -msgstr "もう少し大きい整数を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:246 -msgid "Please enter a maximum default of {{float_max}}." -msgstr "{{float_max}} の最大デフォルト値を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:232 -msgid "Please enter a maximum default of {{int_max}}." -msgstr "{{int_max}} の最大デフォルト値を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:245 -msgid "Please enter a minimum default of {{float_min}}." -msgstr "{{float_min}} の最小デフォルト値を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:231 -msgid "Please enter a minimum default of {{int_min}}." -msgstr "{{int_min}} の最小デフォルト値を入力してください。" - -#: client/src/shared/form-generator.js:1134 -msgid "Please enter a number greater than %d and less than %d." -msgstr "%d より大きく、%d より小さい数値を入力してください。" - -#: client/src/shared/form-generator.js:1136 -msgid "Please enter a number greater than %d." -msgstr "%d より大きい数値を入力してください。" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:151 -msgid "Please enter a number greater than or equal to 0." -msgstr "0 以上の数値を入力してください。" - -#: client/src/shared/form-generator.js:1128 -msgid "Please enter a number." -msgstr "数値を入力してください。" - -#: client/features/templates/templates.strings.js:43 -#: client/src/login/loginModal/loginModal.partial.html:90 -msgid "Please enter a password." -msgstr "パスワードを入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:178 -msgid "Please enter a smaller float." -msgstr "もう少し小さい浮動小数点数を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:158 -msgid "Please enter a smaller integer." -msgstr "もう少し小さい整数を入力してください。" - -#: client/src/login/loginModal/loginModal.partial.html:70 -msgid "Please enter a username." -msgstr "ユーザー名を入力してください。" - -#: client/src/shared/form-generator.js:823 -#: client/src/shared/form-generator.js:915 -msgid "Please enter a valid email address." -msgstr "有効なメールアドレスを入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:177 -#: client/src/templates/survey-maker/shared/question-definition.form.js:182 -#: client/src/templates/survey-maker/shared/question-definition.form.js:244 -msgid "Please enter a valid float." -msgstr "有効な浮動小数点数を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:157 -#: client/src/templates/survey-maker/shared/question-definition.form.js:162 -#: client/src/templates/survey-maker/shared/question-definition.form.js:230 -msgid "Please enter a valid integer." -msgstr "有効な整数を入力してください。" - -#: client/lib/components/components.strings.js:15 -#: client/src/shared/form-generator.js:818 -#: client/src/shared/form-generator.js:910 -#: client/src/shared/form-generator.js:982 -msgid "Please enter a value." -msgstr "値を入力してください。" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:36 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "Please enter an answer between" -msgstr "次の範囲で回答を入力してください:" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:199 -msgid "Please enter an answer from the choices listed." -msgstr "表示されている選択肢から回答を選択してください。" - -#: client/features/templates/templates.strings.js:69 -msgid "Please enter an answer that is a decimal number." -msgstr "10 進数の回答を入力してください。" - -#: client/features/templates/templates.strings.js:68 -msgid "Please enter an answer that is a valid integer." -msgstr "有効な整数の回答を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:47 -msgid "Please enter an answer variable name." -msgstr "回答の変数名を入力してください。" - -#: client/features/templates/templates.strings.js:66 -msgid "Please enter an answer." -msgstr "回答を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:216 -msgid "Please enter an answer/answers from the choices listed." -msgstr "表示されている選択肢から回答を選択してください。" - -#: client/index.template.ejs:149 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "負でない 9999 よりも値の小さい整数を入力してください。" - -#: client/index.template.ejs:132 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "負でない 9999 より値の小さい整数を入力してください。" - -#: client/index.template.ejs:105 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "負でない 9999 より値の小さい整数を入力してください。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:47 -msgid "Please enter at least one search term to create a new Smart Inventory." -msgstr "新規スマートインベントリーを作成するために 1 つ以上の検索語句を入力してください。" - -#: client/features/templates/templates.strings.js:127 -msgid "Please hover over a template for additional options." -msgstr "テンプレートにマウスオーバーして追加のオプションを確認してください。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:175 -msgid "Please input a number greater than 1." -msgstr "1 より大きい数値を入力してください。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:538 -#: client/src/scheduler/scheduler.strings.js:47 -msgid "Please provide a valid date." -msgstr "有効な日付を指定してください。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:208 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:521 -#: client/src/scheduler/scheduler.strings.js:30 -msgid "Please provide a value between 1 and 999." -msgstr "1 から 999 の間の値を指定してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:48 -msgid "Please remove the illegal character from the survey question variable name." -msgstr "Survey の質問の変数から不正な文字を削除してください。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:169 -msgid "Please save before adding a survey to this job template." -msgstr "Survey をこのジョブテンプレートに追加する前に保存してください。" - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:53 -msgid "Please save before adding a survey to this workflow." -msgstr "Survey をこのワークフローに追加する前に保存してください。" - -#: client/src/notifications/notifications.list.js:15 -msgid "Please save before adding notifications." -msgstr "通知を追加する前に保存してください。" - -#: client/src/organizations/organizations.form.js:104 -#: client/src/teams/teams.form.js:72 -msgid "Please save before adding users." -msgstr "ユーザーを追加する前に保存してください。" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:100 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:97 -#: client/src/organizations/organizations.form.js:144 -#: client/src/projects/projects.form.js:270 -#: client/src/teams/teams.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:525 -#: client/src/templates/workflows.form.js:280 -msgid "Please save before assigning permissions." -msgstr "パーミッションを割り当てる前に保存してください。" - -#: client/src/users/users.form.js:125 -#: client/src/users/users.form.js:188 -msgid "Please save before assigning to organizations." -msgstr "組織に割り当てる前に保存してください。" - -#: client/src/users/users.form.js:155 -msgid "Please save before assigning to teams." -msgstr "チームに割り当てる前に保存してください。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:142 -msgid "Please save before creating groups." -msgstr "グループを作成する前に保存してください。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:152 -msgid "Please save before creating hosts." -msgstr "ホストを作成する前に保存してください。" - -#: client/src/inventories-hosts/hosts/host.form.js:108 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:86 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:110 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:119 -msgid "Please save before defining groups." -msgstr "グループを定義する前に保存してください。" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:94 -msgid "Please save before defining hosts." -msgstr "ホストを定義する前に保存してください。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:161 -msgid "Please save before defining inventory sources." -msgstr "インベントリーソースを定義する前に保存してください。" - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:52 -msgid "Please save before defining the workflow graph." -msgstr "ワークフローグラフを定義する前に保存してください。" - -#: client/lib/components/components.strings.js:111 -msgid "Please save before launching this template." -msgstr "このテンプレートを起動する前に保存してください。" - -#: client/src/inventories-hosts/hosts/host.form.js:117 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:127 -msgid "Please save before viewing Insights." -msgstr "Insights を表示する前に保存してください。" - -#: client/src/inventories-hosts/hosts/host.form.js:101 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:103 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:112 -msgid "Please save before viewing facts." -msgstr "ファクトを表示する前に保存してください。" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:146 -msgid "Please save before viewing hosts." -msgstr "ホストを表示する前に保存してください。" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 -msgid "Please select Users / Teams from the lists below." -msgstr "以下の一覧からユーザー/チームを選択してください。" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 -msgid "Please select Users from the list below." -msgstr "以下の一覧からユーザーを選択してください。" - -#: client/src/shared/form-generator.js:1169 -msgid "Please select a number between" -msgstr "Please select a number between" - -#: client/src/shared/form-generator.js:1165 -msgid "Please select a number." -msgstr "数値を選択してください。" - -#: client/features/templates/templates.strings.js:67 -msgid "Please select a value" -msgstr "値を選択してください。" - -#: client/src/shared/form-generator.js:1056 -#: client/src/shared/form-generator.js:1125 -#: client/src/shared/form-generator.js:1298 -msgid "Please select a value." -msgstr "値を選択してください。" - -#: client/src/templates/job_templates/job-template.form.js:77 -msgid "Please select an Inventory or check the Prompt on launch option." -msgstr "インベントリーを選択するか、または「起動プロンプト」オプションにチェックを付けてください。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:39 -msgid "Please select an organization before editing the host filter." -msgstr "組織を選択してからホストフィルターを編集します。" - -#: client/src/shared/form-generator.js:1162 -msgid "Please select at least one value." -msgstr "1 つ以上の値を選択してください。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:476 -#: client/src/scheduler/scheduler.strings.js:43 -msgid "Please select one or more days." -msgstr "1 つまたは複数の曜日を選択してください。" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:30 -msgid "Please select resources from the lists below." -msgstr "以下の一覧からリソースを選択してください。" - -#: client/src/instance-groups/instance-groups.strings.js:77 -msgid "Pod Spec Override" -msgstr "Pod 仕様の上書き" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Populate the hosts for this inventory by using a search filter." -msgstr "検索フィルターを使用してこのインベントリーのホストを設定します。" - -#: client/src/notifications/shared/type-change.service.js:30 -msgid "Port" -msgstr "ポート" - -#: client/features/templates/templates.strings.js:33 -msgid "Preview" -msgstr "プレビュー" - -#: client/src/credentials/credentials.form.js:257 -#: client/src/credentials/factories/kind-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:44 -msgid "Private Key" -msgstr "秘密鍵" - -#: client/features/templates/templates.strings.js:46 -#: client/src/credentials/credentials.form.js:264 -msgid "Private Key Passphrase" -msgstr "秘密鍵のパスフレーズ" - -#: client/src/credentials/credentials.form.js:279 -#: client/src/credentials/credentials.form.js:283 -msgid "Privilege Escalation" -msgstr "権限昇格" - -#: client/features/templates/templates.strings.js:47 -#: client/src/credentials/credentials.form.js:304 -msgid "Privilege Escalation Password" -msgstr "権限昇格のパスワード" - -#: client/src/credentials/credentials.form.js:294 -msgid "Privilege Escalation Username" -msgstr "権限昇格のユーザー名" - -#: client/features/jobs/jobs.strings.js:15 -#: client/features/output/output.strings.js:86 -#: client/features/templates/templates.strings.js:20 -#: client/src/credentials/factories/become-method-change.factory.js:30 -#: client/src/credentials/factories/kind-change.factory.js:86 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:92 -#: client/src/templates/job_templates/job-template.form.js:100 -#: client/src/templates/job_templates/job-template.form.js:113 -#: client/src/templates/job_templates/job-template.form.js:91 -msgid "Project" -msgstr "プロジェクト" - -#: client/lib/services/base-string.service.js:150 -msgid "Project (Ascending)" -msgstr "プロジェクト (昇順)" - -#: client/lib/services/base-string.service.js:151 -msgid "Project (Descending)" -msgstr "プロジェクト (降順)" - -#: client/src/credentials/factories/become-method-change.factory.js:53 -#: client/src/credentials/factories/kind-change.factory.js:109 -msgid "Project (Tenant Name)" -msgstr "プロジェクト (テナント名)" - -#: client/src/projects/projects.form.js:77 -#: client/src/projects/projects.form.js:85 -msgid "Project Base Path" -msgstr "プロジェクトのベースパス" - -#: client/src/credentials/credentials.form.js:364 -msgid "Project Name" -msgstr "プロジェクト名" - -#: client/src/projects/projects.form.js:102 -msgid "Project Path" -msgstr "プロジェクトパス" - -#: client/features/templates/templates.strings.js:117 -#: client/src/workflow-results/workflow-results.controller.js:98 -msgid "Project Sync" -msgstr "プロジェクトの同期" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:66 -msgid "Project Sync Failures" -msgstr "プロジェクトの同期の失敗" - -#: client/lib/components/components.strings.js:74 -#: client/lib/models/models.strings.js:40 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:114 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:47 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/organizations/linkout/organizations-linkout.route.js:190 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "Projects" -msgstr "プロジェクト" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:18 -msgid "Promote group" -msgid_plural "Promote groups" -msgstr[0] "グループのプロモート" -msgstr[1] "グループのプロモート" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:20 -msgid "Promote host" -msgid_plural "Promote hosts" -msgstr[0] "ホストのプロモート" -msgstr[1] "ホストのプロモート" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:10 -msgid "Promote {{ group }} and {{ host }}" -msgstr "{{ group }} および {{ host }} のプロモート" - -#: client/src/scheduler/scheduler.strings.js:54 -#: client/src/templates/survey-maker/shared/question-definition.form.js:27 -msgid "Prompt" -msgstr "プロンプト" - -#: client/lib/components/components.strings.js:35 -#: client/src/templates/job_templates/job-template.form.js:116 -#: client/src/templates/job_templates/job-template.form.js:157 -#: client/src/templates/job_templates/job-template.form.js:184 -#: client/src/templates/job_templates/job-template.form.js:201 -#: client/src/templates/job_templates/job-template.form.js:218 -#: client/src/templates/job_templates/job-template.form.js:235 -#: client/src/templates/job_templates/job-template.form.js:312 -#: client/src/templates/job_templates/job-template.form.js:493 -#: client/src/templates/job_templates/job-template.form.js:60 -#: client/src/templates/job_templates/job-template.form.js:86 -#: client/src/templates/workflows.form.js:102 -#: client/src/templates/workflows.form.js:116 -#: client/src/templates/workflows.form.js:148 -#: client/src/templates/workflows.form.js:88 -msgid "Prompt on launch" -msgstr "起動プロンプト" - -#: client/src/inventories-hosts/hosts/host.form.js:49 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:48 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:50 -msgid "Provide a host name, ip address, or ip address:port. Examples include:" -msgstr "host name、ip address、または ip address:port を指定してください。例:" - -#: client/features/templates/templates.strings.js:57 -#: client/src/templates/job_templates/job-template.form.js:178 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns." -msgstr "Playbook によって管理されるか、またはその影響を受けるホストの一覧をさらに制限するためのホストのパターンを指定します。複数のパターンが許可されます。パターンについての詳細およびサンプルについては、Ansible ドキュメントを参照してください。" - -#: client/src/templates/workflows.form.js:96 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the workflow. This limit is applied to all job template nodes that prompt for a limit. Refer to Ansible documentation for more information and examples on patterns." -msgstr "ワークフローからの影響を受けるホストまたはワークフローが管理するホストの一覧をさらに制限するためにホストのパターンを指定します。この制限は、制限を求めるジョブテンプレートノードすべてに適用されます。パターンの詳細や、例については、Ansible ドキュメントを参照してください。" - -#: client/features/credentials/credentials.strings.js:22 -msgid "Provide account information using Google Compute Engine JSON credentials file." -msgstr "Google Compute Engine JSON 認証情報ファイルを使用してアカウント情報を指定します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:155 -msgid "Provide environment variables to pass to the custom inventory script." -msgstr "カスタムインベントリースクリプトに渡す環境変数を指定します。" - -#: client/src/license/license.partial.html:128 -msgid "Provide your Red Hat customer credentials and you can choose from a list of your available licenses. The credentials you use will be stored for future use in retrieving renewal or expanded licenses. You can update or remove them in SETTINGS > SYSTEM." -msgstr "Red Hat の顧客認証情報を指定して、利用可能なライセンス一覧から選択してください。使用した認証情報は、今後、ライセンスの更新や延長情報を取得する時に利用できるように保存されます。設定 > システムでこの情報は更新または削除できます。" - -#: client/src/templates/job_templates/job-template.form.js:374 -#: client/src/templates/job_templates/job-template.form.js:382 -msgid "Provisioning Callback URL" -msgstr "プロビジョニングコールバック URL" - -#: client/src/notifications/add/add.controller.js:86 -#: client/src/notifications/edit/edit.controller.js:149 -msgid "Purple" -msgstr "紫" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:95 -msgid "RADIUS" -msgstr "RADIUS" - -#: client/src/instance-groups/instance-groups.strings.js:55 -msgid "RAM" -msgstr "RAM" - -#: client/lib/components/code-mirror/code-mirror.strings.js:15 -msgid "READ ONLY" -msgstr "読み取り専用" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:4 -msgid "RECENT JOB RUNS" -msgstr "最近のジョブ実行" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:47 -msgid "RECENTLY RUN JOBS" -msgstr "最近実行されたジョブ" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:50 -msgid "RECENTLY USED JOB TEMPLATES" -msgstr "最近使用されたジョブテンプレート" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:4 -msgid "RECENTLY USED TEMPLATES" -msgstr "最近使用されたテンプレート" - -#: client/src/activity-stream/streams.list.js:54 -#: client/src/inventories-hosts/hosts/host.list.js:108 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:51 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:52 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:58 -#: client/src/projects/projects.list.js:76 -#: client/src/scheduler/schedules.list.js:76 -msgid "REFRESH" -msgstr "更新" - -#: client/features/users/tokens/tokens.strings.js:23 -msgid "REFRESH TOKEN" -msgstr "トークンの更新" - -#: client/src/shared/smart-search/smart-search.partial.html:45 -msgid "RELATED FIELDS:" -msgstr "関連フィールド:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:91 -msgid "REMEDIATE INVENTORY" -msgstr "インベントリーの修復" - -#: client/lib/services/base-string.service.js:79 -#: client/src/access/permissions-list.controller.js:57 -#: client/src/access/permissions-list.controller.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:84 -#: client/src/shared/directives.js:94 -#: client/src/templates/labels/labelsList.directive.js:96 -msgid "REMOVE" -msgstr "削除" - -#: client/lib/services/base-string.service.js:103 -msgid "REMOVE ACCESS" -msgstr "アクセス権の削除" - -#: client/lib/services/base-string.service.js:97 -msgid "REMOVE TEAM ACCESS" -msgstr "チームのアクセス権の削除" - -#: client/features/output/output.strings.js:8 -msgid "RESULTS" -msgstr "結果" - -#: client/features/templates/templates.strings.js:39 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:51 -msgid "REVERT" -msgstr "元に戻す" - -#: client/features/projects/projects.strings.js:10 -msgid "REVISION" -msgstr "リビジョン" - -#: client/src/inventories-hosts/inventories/main.js:301 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:49 -msgid "ROOT GROUPS" -msgstr "Root グループ" - -#: client/src/credentials/factories/become-method-change.factory.js:25 -#: client/src/credentials/factories/kind-change.factory.js:81 -msgid "RSA Private Key" -msgstr "RSA 秘密鍵" - -#: client/features/templates/templates.strings.js:130 -#: client/lib/services/base-string.service.js:66 -msgid "RUN" -msgstr "実行" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.route.js:45 -msgid "RUN COMMAND" -msgstr "コマンドの実行" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:62 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:45 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:118 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:61 -msgid "RUN COMMANDS" -msgstr "コマンドの実行" - -#: client/src/notifications/add/add.controller.js:89 -#: client/src/notifications/edit/edit.controller.js:152 -msgid "Random" -msgstr "ランダム" - -#: client/features/users/tokens/tokens.strings.js:30 -msgid "Read" -msgstr "読み込み" - -#: client/src/workflow-results/workflow-results.controller.js:179 -msgid "Read only view of extra variables added to the workflow." -msgstr "追加変数の読み取り専用ビューがワークフローに追加されました。" - -#: client/features/output/output.strings.js:17 -msgid "Read-only view of artifacts added to the job template" -msgstr "アーティファクトの読み取り専用ビューがジョブテンプレートに追加されました" - -#: client/features/output/output.strings.js:24 -msgid "Read-only view of extra variables added to the job template" -msgstr "追加変数の読み取り専用ビューがジョブテンプレートに追加されました" - -#: client/lib/components/code-mirror/code-mirror.strings.js:51 -msgid "Read-only view of extra variables added to the job template." -msgstr "追加変数の読み取り専用ビューがジョブテンプレートに追加されました。" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Failed Jobs" -msgstr "最近の失敗ジョブ" - -#: client/src/notifications/notificationTemplates.list.js:28 -msgid "Recent Notifications" -msgstr "最近の通知" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Successful Jobs" -msgstr "最近成功ジョブ" - -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:98 -msgid "Recipient List" -msgstr "受信者リスト" - -#: client/src/notifications/add/add.controller.js:87 -#: client/src/notifications/edit/edit.controller.js:150 -msgid "Red" -msgstr "赤" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Refer to the Ansible Tower documentation for further syntax and examples." -msgstr "追加の構文およびサンプルについては、Ansible Tower ドキュメントを参照してください。" - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "Refer to the Ansible documentation for details about the configuration file." -msgstr "設定ファイルの詳細は、Ansible ドキュメントを参照してください。" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Refresh" -msgstr "更新" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:8 -msgid "Refresh Insights" -msgstr "Insights の更新" - -#: client/src/configuration/settings.service.js:44 -msgid "Refresh Token Expiration" -msgstr "トークンの有効期限を更新する" - -#: client/src/activity-stream/streams.list.js:51 -#: client/src/bread-crumb/bread-crumb.partial.html:6 -#: client/src/inventories-hosts/hosts/host.list.js:104 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:47 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:126 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:48 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:54 -#: client/src/projects/projects.list.js:72 -#: client/src/scheduler/schedules.list.js:72 -msgid "Refresh the page" -msgstr "ページの更新" - -#: client/features/output/output.strings.js:88 -msgid "Refspec" -msgstr "Refspec" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:308 -msgid "Regular expression where only matching host names will be imported. The filter is applied as a post-processing step after any inventory plugin filters are applied." -msgstr "一致するホスト名のみがインポートされる正規表現。このフィルターは、インベントリープラグインフィルターが適用された後、後処理ステップとして適用されます。" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:81 -msgid "Related Groups" -msgstr "関連するグループ" - -#: client/lib/components/components.strings.js:104 -msgid "Relaunch On" -msgstr "再起動時" - -#: client/src/workflow-results/workflow-results.partial.html:26 -msgid "Relaunch job" -msgstr "ジョブの再起動" - -#: client/lib/components/components.strings.js:103 -msgid "Relaunch using host parameters" -msgstr "ホストパラメーターを使用した再起動" - -#: client/lib/components/components.strings.js:102 -#: client/src/workflow-results/workflow-results.controller.js:55 -msgid "Relaunch using the same parameters" -msgstr "同一パラメーターによる起動" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:176 -msgid "Remediate Inventory" -msgstr "インベントリーの修復" - -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:106 -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:107 -#: client/src/teams/teams.form.js:157 -#: client/src/users/users.form.js:231 -msgid "Remove" -msgstr "削除" - -#: client/src/templates/labels/labelsList.directive.js:93 -msgid "Remove Label from" -msgstr "以下からラベルを削除する" - -#: client/src/projects/projects.form.js:178 -msgid "Remove any local modifications prior to performing an update." -msgstr "更新の実行前にローカルの変更を削除します。" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:81 -msgid "Remove host from" -msgstr "以下からホストを削除する" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:152 -#: client/src/scheduler/scheduler.strings.js:27 -msgid "Repeat frequency" -msgstr "繰り返しの頻度" - -#: client/lib/components/components.strings.js:7 -msgid "Replace" -msgstr "置換" - -#: client/src/license/license.strings.js:7 -msgid "Replace password" -msgstr "パスワードの置き換え" - -#: client/lib/components/components.strings.js:139 -msgid "Replace secret" -msgstr "シークレットの置き換え" - -#: client/src/license/license.partial.html:96 -msgid "Request License" -msgstr "ライセンスの要求" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:291 -msgid "Required" -msgstr "必須" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:154 -msgid "Reset" -msgstr "リセット" - -#: client/lib/components/components.strings.js:92 -msgid "Resources" -msgstr "リソース" - -#: client/features/templates/templates.strings.js:97 -#: client/src/scheduler/schedules.list.js:25 -msgid "Resources are missing from this template." -msgstr "リソースがこのテンプレートにありません。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:318 -msgid "Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified using dot notation, e.g: 'foo.bar'" -msgstr "ホスト変数の指定された辞書から有効な状態を取得します。有効な変数は、ドット表記を使用して指定できます (例: 「foo.bar」)。" - -#: client/lib/services/base-string.service.js:111 -msgid "Return" -msgstr "戻る" - -#: client/features/users/tokens/tokens.strings.js:26 -msgid "Returned status:" -msgstr "返されたステータス:" - -#: client/lib/components/components.strings.js:8 -#: client/src/shared/form-generator.js:658 -msgid "Revert" -msgstr "戻す" - -#: client/src/configuration/forms/auth-form/sub-forms/auth-azure.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-org.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-team.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-google-oauth2.form.js:59 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap1.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap2.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap3.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap4.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap5.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-radius.form.js:34 -#: client/src/configuration/forms/auth-form/sub-forms/auth-saml.form.js:121 -#: client/src/configuration/forms/auth-form/sub-forms/auth-tacacs.form.js:47 -#: client/src/configuration/forms/jobs-form/configuration-jobs.form.js:110 -#: client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js:26 -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:74 -#: client/src/configuration/forms/system-form/sub-forms/system-misc.form.js:95 -#: client/src/configuration/forms/ui-form/configuration-ui.form.js:36 -msgid "Revert all to default" -msgstr "すべてをデフォルトに戻す" - -#: client/features/output/output.strings.js:90 -#: client/src/projects/projects.list.js:56 -msgid "Revision" -msgstr "リビジョン" - -#: client/src/projects/add/projects-add.controller.js:159 -#: client/src/projects/edit/projects-edit.controller.js:280 -msgid "Revision #" -msgstr "リビジョン #" - -#: client/features/credentials/legacy.credentials.js:85 -#: client/src/credentials/credentials.form.js:461 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:130 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:127 -#: client/src/organizations/organizations.form.js:174 -#: client/src/projects/projects.form.js:301 -#: client/src/teams/teams.form.js:109 -#: client/src/teams/teams.form.js:148 -#: client/src/templates/workflows.form.js:311 -#: client/src/users/users.form.js:212 -msgid "Role" -msgstr "ロール" - -#: client/lib/services/base-string.service.js:102 -msgid "Role access removal" -msgstr "ロールのアクセス権の削除" - -#: client/src/templates/job_templates/job-template.form.js:440 -#: client/src/templates/job_templates/job-template.form.js:444 -#: client/src/templates/workflows.form.js:213 -#: client/src/templates/workflows.form.js:217 -msgid "Rotate Webhook Key" -msgstr "Webhook キーの回転" - -#: client/src/instance-groups/instance-groups.list.js:26 -#: client/src/instance-groups/instance-groups.strings.js:22 -#: client/src/instance-groups/instance-groups.strings.js:61 -msgid "Running Jobs" -msgstr "実行中のジョブ" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:96 -msgid "SAML" -msgstr "SAML" - -#: client/lib/services/base-string.service.js:63 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:17 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:17 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:17 -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:18 -#: client/src/partials/survey-maker-modal.html:84 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:18 -msgid "SAVE" -msgstr "保存" - -#: client/features/templates/templates.strings.js:152 -msgid "SAVE & EXIT" -msgstr "保存して終了" - -#: client/src/scheduler/scheduled-jobs.list.js:13 -#: client/src/scheduler/scheduled-jobs.list.js:14 -msgid "SCHEDULED JOBS" -msgstr "スケジュール済みジョブ" - -#: client/src/activity-stream/get-target-title.factory.js:38 -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js:9 -#: client/src/management-jobs/scheduler/main.js:28 -#: client/src/management-jobs/scheduler/main.js:34 -#: client/src/scheduler/schedules.route.js:102 -#: client/src/scheduler/schedules.route.js:14 -#: client/src/scheduler/schedules.route.js:189 -#: client/src/scheduler/schedules.route.js:283 -msgid "SCHEDULES" -msgstr "スケジュール" - -#: client/features/templates/templates.strings.js:71 -#: client/src/projects/add/projects-add.controller.js:130 -#: client/src/projects/edit/projects-edit.controller.js:252 -#: client/src/projects/projects.form.js:130 -#: client/src/templates/job_templates/job-template.form.js:107 -#: client/src/templates/workflows.form.js:107 -#: client/src/templates/workflows.form.js:111 -#: client/src/workflow-results/workflow-results.controller.js:80 -msgid "SCM Branch" -msgstr "SCM ブランチ" - -#: client/src/projects/add/projects-add.controller.js:150 -#: client/src/projects/edit/projects-edit.controller.js:271 -msgid "SCM Branch/Tag/Commit" -msgstr "SCM ブランチ/タグ/コミット" - -#: client/src/projects/add/projects-add.controller.js:171 -#: client/src/projects/edit/projects-edit.controller.js:292 -msgid "SCM Branch/Tag/Revision" -msgstr "SCM ブランチ/タグ/リビジョン" - -#: client/src/projects/projects.form.js:179 -msgid "SCM Clean" -msgstr "SCM クリーニング" - -#: client/src/projects/projects.form.js:190 -msgid "SCM Delete" -msgstr "SCM 削除" - -#: client/src/credentials/factories/become-method-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:76 -msgid "SCM Private Key" -msgstr "SCM 秘密鍵" - -#: client/src/projects/add/projects-add.controller.js:131 -#: client/src/projects/edit/projects-edit.controller.js:253 -#: client/src/projects/projects.form.js:146 -msgid "SCM Refspec" -msgstr "SCM Refspec" - -#: client/src/projects/projects.form.js:57 -msgid "SCM Type" -msgstr "SCM タイプ" - -#: client/src/projects/projects.form.js:108 -#: client/src/projects/projects.form.js:119 -msgid "SCM URL" -msgstr "SCM URL" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:55 -#: client/src/projects/projects.form.js:200 -msgid "SCM Update" -msgstr "SCM 更新" - -#: client/features/projects/projects.strings.js:30 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "SCM Update Cancel" -msgstr "SCM 更新の取り消し" - -#: client/src/projects/projects.form.js:170 -msgid "SCM Update Options" -msgstr "SCM 更新オプション" - -#: client/features/projects/projects.strings.js:19 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:126 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:36 -#: client/src/projects/edit/projects-edit.controller.js:122 -msgid "SCM update currently running" -msgstr "現在実行中の SCM 更新" - -#: client/features/users/tokens/tokens.strings.js:39 -msgid "SCOPE" -msgstr "スコープ" - -#: client/features/output/output.strings.js:108 -msgid "SEARCH" -msgstr "検索" - -#: client/features/templates/templates.strings.js:132 -#: client/lib/services/base-string.service.js:64 -#: client/src/license/license.partial.html:260 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:137 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:186 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:75 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:155 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:194 -msgid "SELECT" -msgstr "選択" - -#: client/src/instance-groups/instance-groups.strings.js:76 -msgid "SELECT A CREDENTIAL" -msgstr "認証情報の選択" - -#: client/features/credentials/credentials.strings.js:20 -msgid "SELECT A CREDENTIAL TYPE" -msgstr "認証情報タイプの選択" - -#: client/features/users/tokens/tokens.strings.js:19 -msgid "SELECT AN APPLICATION" -msgstr "アプリケーションの選択" - -#: client/features/applications/applications.strings.js:36 -#: client/features/credentials/credentials.strings.js:19 -msgid "SELECT AN ORGANIZATION" -msgstr "組織の選択" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:6 -msgid "SELECT GROUPS" -msgstr "グループの選択" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:6 -msgid "SELECT HOSTS" -msgstr "ホストの選択" - -#: client/src/instance-groups/instance-groups.strings.js:42 -msgid "SELECT INSTANCE" -msgstr "インスタンスの選択" - -#: client/features/templates/templates.strings.js:36 -msgid "SELECTED" -msgstr "選択済み" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:18 -msgid "SELECTED:" -msgstr "選択済み:" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:22 -msgid "SETTING CATEGORY" -msgstr "カテゴリーの設定" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:26 -msgid "SETTING NAME" -msgstr "名前の設定" - -#: client/src/configuration/settings.route.js:10 -msgid "SETTINGS" -msgstr "設定" - -#: client/lib/services/base-string.service.js:68 -#: client/src/templates/survey-maker/surveys/init.factory.js:502 -msgid "SHOW" -msgstr "表示" - -#: client/src/login/loginModal/loginModal.partial.html:114 -msgid "SIGN IN" -msgstr "サインイン" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html:2 -msgid "SIGN IN WITH" -msgstr "サインイン:" - -#: client/src/inventories-hosts/hosts/host.list.js:116 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:14 -msgid "SMART INVENTORY" -msgstr "スマートインベントリー" - -#: client/lib/components/components.strings.js:122 -msgid "SORT BY" -msgstr "並び替え" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js:27 -msgid "SOURCES" -msgstr "ソース" - -#: client/src/scheduler/scheduler.strings.js:63 -msgid "SS" -msgstr "SS" - -#: client/src/credentials/factories/become-method-change.factory.js:89 -#: client/src/credentials/factories/kind-change.factory.js:145 -msgid "SSH Key" -msgstr "SSH キー" - -#: client/features/templates/templates.strings.js:45 -msgid "SSH Password" -msgstr "SSH パスワード" - -#: client/src/credentials/credentials.form.js:255 -msgid "SSH key description" -msgstr "SSH キーの説明" - -#: client/src/notifications/notificationTemplates.form.js:523 -msgid "SSL Connection" -msgstr "SSL 接続" - -#: client/features/templates/templates.strings.js:134 -msgid "START" -msgstr "開始" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "STATUS" -msgstr "ステータス" - -#: client/src/credentials/credentials.form.js:119 -#: client/src/credentials/credentials.form.js:127 -msgid "STS Token" -msgstr "STS トークン" - -#: client/features/output/output.strings.js:140 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:56 -msgid "SUCCESSFUL" -msgstr "成功" - -#: client/src/partials/survey-maker-modal.html:24 -msgid "SURVEY" -msgstr "Survey " - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:66 -msgid "SYNC ALL" -msgstr "すべてを同期する" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:464 -#: client/src/scheduler/scheduler.strings.js:42 -msgid "Sat" -msgstr "土" - -#: client/src/credentials/factories/become-method-change.factory.js:70 -#: client/src/credentials/factories/kind-change.factory.js:126 -msgid "Satellite 6 URL" -msgstr "Satellite 6 URL" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:113 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:192 -#: client/src/credentials/credentials.form.js:416 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:158 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:630 -#: client/src/scheduler/scheduler.strings.js:57 -#: client/src/shared/form-generator.js:1644 -msgid "Save" -msgstr "保存" - -#: client/src/configuration/forms/settings-form.controller.js:416 -msgid "Save Complete" -msgstr "保存が完了しました" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:199 -msgid "Save and enable log aggregation before testing the log aggregator." -msgstr "ログ集計機能をテストする前に、ログ集計を保存して有効にします。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:66 -#: client/src/configuration/forms/settings-form.controller.js:454 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:63 -msgid "Save changes" -msgstr "変更の保存" - -#: client/src/license/license.partial.html:200 -msgid "Save successful!" -msgstr "正常に保存が実行されました!" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:558 -#: client/src/scheduler/scheduler.strings.js:50 -msgid "Schedule Description" -msgstr "説明のスケジュール" - -#: client/src/management-jobs/card/card.partial.html:28 -#: client/src/management-jobs/card/card.partial.html:30 -msgid "Schedule Management Job" -msgstr "管理ジョブのスケジュール" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:7 -msgid "Schedule inventory syncs" -msgstr "インベントリー同期のスケジュール" - -#: client/src/scheduler/scheduler.strings.js:14 -msgid "Schedule is active." -msgstr "スケジュールはアクティブです。" - -#: client/src/scheduler/scheduler.strings.js:15 -msgid "Schedule is active. Click to stop." -msgstr "スケジュールはアクティブです。クリックして停止してください。" - -#: client/src/scheduler/scheduler.strings.js:16 -msgid "Schedule is stopped." -msgstr "スケジュールは停止しています。" - -#: client/src/scheduler/scheduler.strings.js:17 -msgid "Schedule is stopped. Click to activate." -msgstr "スケジュールは停止しています。クリックしてアクティブにしてください。" - -#: client/src/scheduler/scheduler.strings.js:60 -msgid "Schedule name" -msgstr "スケジュール名" - -#: client/lib/components/components.strings.js:72 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:424 -#: client/src/projects/projects.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:578 -#: client/src/templates/workflows.form.js:333 -msgid "Schedules" -msgstr "スケジュール" - -#: client/features/users/tokens/users-tokens-add.controller.js:38 -msgid "Scope" -msgstr "範囲" - -#: client/src/shared/smart-search/smart-search.controller.js:127 -#: client/src/shared/smart-search/smart-search.controller.js:169 -msgid "Search" -msgstr "検索" - -#: client/src/credentials/credentials.form.js:104 -msgid "Secret Key" -msgstr "シークレットキー" - -#: client/src/credentials/credentials.form.js:124 -msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." -msgstr "セキュリティートークンサービス (STS) は、AWS Identity and Access Management (IAM) ユーザーの一時的な、権限の制限された認証情報を要求できる web サービスです。" - -#: client/src/shared/form-generator.js:1648 -#: client/src/shared/lookup/lookup-modal.directive.js:59 -#: client/src/shared/lookup/lookup-modal.partial.html:20 -msgid "Select" -msgstr "選択" - -#: client/src/organizations/galaxy-credentials-multiselect/galaxy-credentials-modal/galaxy-credentials-modal.partial.html:5 -msgid "Select Galaxy Credentials" -msgstr "Galaxy 認証情報を選択します" - -#: client/src/organizations/organizations.form.js:61 -msgid "Select Galaxy credentials. The selection order sets the order in which Tower will download roles/collections using `ansible-galaxy`." -msgstr "Galaxy 認証情報を選択します。選択したこの順序は、Tower が「ansible-galaxy」を使用してロール/コレクションをダウンロードする順序を設定します。" - -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:5 -msgid "Select Instance Groups" -msgstr "インスタンスグループの選択" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:58 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:100 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:84 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:108 -msgid "Select Webhook Credential" -msgstr "Webhook の認証情報の選択" - -#: client/src/templates/workflows.form.js:110 -msgid "Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch." -msgstr "ワークフローにブランチを選択してください。このブランチは、ブランチを求めるジョブテンプレートノードすべてに適用されます。" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:73 -msgid "Select a credential" -msgstr "認証情報の選択" - -#: client/index.template.ejs:139 -msgid "Select a frequency for snapshot retention" -msgstr "スナップショットの保持頻度を選択" - -#: client/src/license/license.partial.html:214 -msgid "Select a license" -msgstr "ライセンスの選択" - -#: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:70 -msgid "Select a role" -msgstr "ロールの選択" - -#: client/features/users/tokens/tokens.strings.js:29 -msgid "Select a scope" -msgstr "スコープの選択" - -#: client/index.template.ejs:122 -msgid "Select a time period after which to remove old facts" -msgstr "古いファクトを削除するまでの期間を選択" - -#: client/src/templates/job_templates/job-template.form.js:413 -#: client/src/templates/workflows.form.js:186 -msgid "Select a webhook service." -msgstr "Webhook サービスを選択します。" - -#: client/src/templates/workflows.form.js:81 -msgid "Select an inventory for the workflow. This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "ワークフローのインベントリーを選択してください。このインベントリーが、インベントリーをプロンプトするすべてのジョブテンプレートノードに適用されます。" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:59 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or a selection of multiple groups." -msgstr "チェックボックスをクリックしてインベントリーソースを選択します。インベントリーソースは単一グループにすることも、複数グループのセレクションにすることもできます。" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:42 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:115 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:58 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups." -msgstr "チェックボックスをクリックしてインベントリーソースを選択します。インベントリーソースは単一グループや複数ホストのセレクション、または複数グループのセレクションにすることができます。" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:127 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single host or a selection of multiple hosts." -msgstr "チェックボックスをクリックしてインベントリーソースを選択します。インベントリーソースは単一ホストにすることも、複数ホストのセレクションにすることもできます。" - -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:107 -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:132 -#: client/src/configuration/forms/ui-form/configuration-ui.controller.js:94 -msgid "Select commands" -msgstr "コマンドの選択" - -#: client/src/templates/job_templates/job-template.form.js:151 -msgid "Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking \"Prompt on launch\" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check \"Prompt on launch\", the selected credential(s) become the defaults that can be updated at run time." -msgstr "Tower のこのジョブが実行されるノードへのアクセスを許可する認証情報を選択します。各タイプにつき 1 つの認証情報のみを選択できます。マシン認証情報 (SSH) については、認証情報を選択せずに「起動プロンプト」を選択すると、実行時にマシン認証情報を選択する必要があります。認証情報を選択し、「起動プロンプト」にチェックを付けている場合、選択した認証情報が実行時に更新できるデフォルトになります。" - -#: client/src/scheduler/schedulerDatePicker.partial.html:2 -msgid "Select date" -msgstr "日付の選択" - -#: client/lib/components/components.strings.js:21 -msgid "Select file" -msgstr "ファイルの選択" - -#: client/src/projects/projects.form.js:100 -msgid "Select from the list of directories found in the Project Base Path. Together the base path and the playbook directory provide the full path used to locate playbooks." -msgstr "プロジェクトのベースパスにあるデイレクトリーの一覧から選択します。ベースパスと Playbook ディレクトリーは、Playbook を見つけるために使用される完全なパスを提供します。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:317 -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:336 -msgid "Select group types" -msgstr "グループタイプの選択" - -#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:24 -msgid "Select roles" -msgstr "ロールの選択" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:56 -msgid "Select the Instance Groups for this Inventory to run on." -msgstr "このインベントリーが実行されるインスタンスグループを選択します。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:63 -msgid "Select the Instance Groups for this Inventory to run on. Refer to the Ansible Tower documentation for more detail." -msgstr "このインベントリーが実行されるインスタンスグループを選択します。詳細については、Ansible Tower ドキュメントを参照してください。" - -#: client/src/templates/job_templates/job-template.form.js:270 -msgid "Select the Instance Groups for this Job Template to run on." -msgstr "このジョブテンプレートが実行されるインスタンスグループを選択します。" - -#: client/src/organizations/organizations.form.js:40 -msgid "Select the Instance Groups for this Organization to run on." -msgstr "この組織が実行されるインスタンスグループを選択します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:65 -msgid "Select the custom Python virtual environment for this inventory source sync to run on." -msgstr "このインベントリーソースの実行に使用するカスタム Python 仮想環境を選択します。" - -#: client/src/templates/job_templates/job-template.form.js:260 -msgid "Select the custom Python virtual environment for this job template to run on." -msgstr "このジョブテンプレートの実行に使用するカスタム Python 仮想環境を選択します。" - -#: client/src/organizations/organizations.form.js:51 -msgid "Select the custom Python virtual environment for this organization to run on." -msgstr "この組織の実行に使用するカスタム Python 仮想環境を選択します。" - -#: client/src/projects/projects.form.js:242 -msgid "Select the custom Python virtual environment for this project to run on." -msgstr "このプロジェクトの実行に使用する Python 仮想環境を選択します。" - -#: client/src/templates/job_templates/job-template.form.js:79 -msgid "Select the inventory containing the hosts you want this job to manage." -msgstr "このジョブで管理するホストが含まれるインベントリーを選択してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:121 -msgid "Select the inventory file to be synced by this source. You can select from the dropdown or enter a file within the input." -msgstr "このソースで同期されるインベントリーファイルを選択します。ドロップダウンから選択するか、入力にファイルを指定できます。" - -#: client/src/templates/job_templates/job-template.form.js:132 -msgid "Select the playbook to be executed by this job.You can select from the dropdown or enter a file within the input." -msgstr "このジョブで実行する Playbook を選択します。ドロップダウンから選択することも、入力項目からファイルを入力することも可能です。" - -#: client/src/templates/job_templates/job-template.form.js:99 -msgid "Select the project containing the playbook you want this job to execute." -msgstr "このジョブで実行する Playbook が含まれるプロジェクトを選択してください。" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:188 -msgid "Select types" -msgstr "タイプの選択" - -#: client/src/license/license.partial.html:153 -msgid "Selected" -msgstr "選択済み" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:202 -msgid "Send a test log message to the configured log aggregator." -msgstr "設定済みのログアグリゲーターにテストログメッセージを送信します。" - -#: client/src/notifications/notificationTemplates.form.js:110 -msgid "Sender Email" -msgstr "送信者のメール" - -#: client/src/credentials/factories/become-method-change.factory.js:24 -#: client/src/credentials/factories/kind-change.factory.js:80 -msgid "Service Account Email Address" -msgstr "サービスアカウントのメールアドレス" - -#: client/features/credentials/credentials.strings.js:21 -msgid "Service Account JSON File" -msgstr "サービスアカウント JSON ファイル" - -#: client/features/credentials/credentials.strings.js:30 -msgid "Set Input Source" -msgstr "入力ソースの設定" - -#: client/index.template.ejs:102 -msgid "Set how many days of data should be retained." -msgstr "データの保持日数を設定します。" - -#: client/src/configuration/settings.partial.html:12 -msgid "Set preferences for data collection, logos, and logins" -msgstr "データ収集、ロゴ、ログイン情報の設定" - -#: client/lib/components/components.strings.js:88 -msgid "Settings" -msgstr "設定" - -#: client/lib/components/components.strings.js:11 -#: client/src/shared/form-generator.js:845 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:24 -msgid "Show" -msgstr "表示" - -#: client/features/templates/templates.strings.js:50 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:115 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:118 -#: client/src/templates/job_templates/job-template.form.js:303 -#: client/src/templates/job_templates/job-template.form.js:306 -msgid "Show Changes" -msgstr "変更の表示" - -#: client/features/output/output.strings.js:50 -#: client/src/workflow-results/workflow-results.controller.js:86 -msgid "Show Less" -msgstr "簡易表示" - -#: client/features/output/output.strings.js:51 -#: client/src/workflow-results/workflow-results.controller.js:87 -msgid "Show More" -msgstr "詳細を表示" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:34 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:8 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:104 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:125 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:136 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:28 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:44 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:6 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:61 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:83 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:138 -msgid "Show help text" -msgstr "ヘルプテキストの表示" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html:1 -msgid "Show host summary" -msgstr "ホストの概要の表示" - -#: client/src/shared/paginate/paginate.partial.html:51 -msgid "Show page size options" -msgstr "ページサイズオプションの表示" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html:1 -msgid "Show source summary" -msgstr "ソースの概要の表示" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:33 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:44 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:55 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:76 -msgid "Sign in with %s" -msgstr "%s でサインイン" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:63 -msgid "Sign in with %s Organizations" -msgstr "%s 組織でサインイン" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:61 -msgid "Sign in with %s Teams" -msgstr "%s チームでサインイン" - -#: client/features/output/output.strings.js:91 -#: client/features/templates/templates.strings.js:52 -#: client/src/templates/job_templates/job-template.form.js:223 -#: client/src/templates/job_templates/job-template.form.js:230 -msgid "Skip Tags" -msgstr "スキップタグ" - -#: client/features/templates/templates.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:229 -msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "スキップタグは、Playbook のサイズが大きい場合にプレイまたはタスクの特定の部分をスキップする必要がある場合に役立ちます。カンマを使って複数のタグを区切ります。タグの使用方法の詳細については、Ansible Tower ドキュメントを参照してください。" - -#: client/features/jobs/jobs.strings.js:21 -#: client/features/output/output.strings.js:74 -msgid "Slice Job" -msgstr "スライスジョブ" - -#: client/src/templates/job_templates/job-template.form.js:283 -msgid "Slice Job Count" -msgstr "ジョブのスライス数" - -#: client/src/workflow-results/workflow-results.controller.js:75 -msgid "Slice Job Template" -msgstr "スライスジョブテンプレート" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:48 -msgid "Smart Host Filter" -msgstr "スマートホストフィルター" - -#: client/src/inventories-hosts/inventories/inventory.list.js:90 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/shared/form-generator.js:1406 -msgid "Smart Inventory" -msgstr "スマートインベントリー" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:44 -msgid "Solvable With Playbook" -msgstr "Playbook で解決可能" - -#: client/features/output/output.strings.js:92 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:50 -msgid "Source" -msgstr "ソース" - -#: client/src/credentials/credentials.form.js:75 -msgid "Source Control" -msgstr "ソースコントロール" - -#: client/features/output/output.strings.js:93 -msgid "Source Credential" -msgstr "ソース認証情報" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:33 -#: client/src/projects/projects.form.js:26 -msgid "Source Details" -msgstr "ソース詳細" - -#: client/src/notifications/notificationTemplates.form.js:196 -#: client/src/notifications/notificationTemplates.form.js:197 -msgid "Source Phone Number" -msgstr "発信元の電話番号" - -#: client/features/output/output.strings.js:70 -msgid "Source Project" -msgstr "ソースプロジェクト" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:168 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:175 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:192 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:199 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:216 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:223 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:233 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:240 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:250 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:257 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:267 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:274 -msgid "Source Variables" -msgstr "ソース変数" - -#: client/src/partials/logviewer.html:9 -msgid "Source Vars" -msgstr "ソース変数" - -#: client/features/output/output.strings.js:94 -#: client/src/workflow-results/workflow-results.controller.js:77 -msgid "Source Workflow" -msgstr "ソースワークフロー" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:39 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:163 -msgid "Sources" -msgstr "ソース" - -#: client/src/notifications/notificationTemplates.form.js:392 -msgid "Specify HTTP Headers in JSON format. Refer to the Ansible Tower documentation for example syntax." -msgstr "JSON 形式で HTTP ヘッダーを指定します。構文のサンプルについては Ansible Tower ドキュメントを参照してください。" - -#: client/src/credentials/credentials.form.js:284 -msgid "Specify a method for %s operations. This is equivalent to specifying the %s parameter, where %s could be %s" -msgstr "%s 操作のメソッドを指定します。これは %s を指定することに相当します。%s は %s にすることができます。" - -#: client/src/notifications/notificationTemplates.form.js:546 -msgid "Specify a notification color. Acceptable colors are hex color code (example: #3af or #789abc) ." -msgstr "通知の色を指定します。使用できる色: 16 進数の色コード (例: #3af または #789abc) " - -#: client/src/notifications/notificationTemplates.form.js:347 -msgid "Specify a notification color. Acceptable colors are: yellow, green, red purple, gray or random." -msgstr "通知の色を指定します。使用できる色: 黄、緑、赤紫、灰色、またはランダム" - -#: client/features/users/tokens/tokens.strings.js:20 -msgid "Specify a scope for the token's access" -msgstr "トークンのアクセスのスコープを指定します" - -#: client/src/notifications/notificationTemplates.form.js:404 -msgid "Specify an HTTP method for the webhook. Acceptable choices are: POST or PUT" -msgstr "Webhook の HTTP メソッドを指定します。許容できる選択肢は、POST か PUT です。" - -#: client/features/output/output.strings.js:135 -msgid "Standard Error" -msgstr "標準エラー" - -#: client/features/output/output.strings.js:134 -#: client/src/partials/logviewer.html:5 -msgid "Standard Out" -msgstr "標準出力" - -#: client/src/notifications/notifications.list.js:53 -msgid "Start" -msgstr "開始" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:42 -#: client/src/scheduler/scheduler.strings.js:23 -msgid "Start Date" -msgstr "開始日" - -#: client/src/notifications/notificationTemplates.form.js:569 -msgid "Start Message" -msgstr "開始メッセージ" - -#: client/src/notifications/notificationTemplates.form.js:580 -msgid "Start Message Body" -msgstr "開始メッセージのボディー" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 -#: client/src/scheduler/scheduler.strings.js:24 -msgid "Start Time" -msgstr "開始時間" - -#: client/lib/services/base-string.service.js:140 -msgid "Start Time (Ascending)" -msgstr "開始時間 (昇順)" - -#: client/lib/services/base-string.service.js:141 -msgid "Start Time (Descending)" -msgstr "開始時間 (降順)" - -#: client/lib/components/components.strings.js:110 -msgid "Start a job using this template" -msgstr "このテンプレートによるジョブの開始" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:6 -msgid "Start sync process" -msgstr "同期プロセスの開始" - -#: client/features/jobs/jobs.strings.js:9 -#: client/features/output/output.strings.js:95 -#: client/src/workflow-results/workflow-results.controller.js:71 -msgid "Started" -msgstr "開始 " - -#: client/features/output/output.strings.js:96 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:55 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:55 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:43 -#: client/src/notifications/notification-templates-list/list.controller.js:71 -#: client/src/partials/logviewer.html:4 -#: client/src/workflow-results/workflow-results.controller.js:74 -msgid "Status" -msgstr "ステータス" - -#: client/src/license/license.partial.html:203 -msgid "Submit" -msgstr "送信" - -#: client/features/output/output.strings.js:112 -msgid "Submit search" -msgstr "検索内容の送信" - -#: client/src/license/license.partial.html:27 -msgid "Subscription" -msgstr "サブスクリプション" - -#: client/src/credentials/credentials.form.js:151 -#: client/src/credentials/credentials.form.js:162 -msgid "Subscription ID" -msgstr "サブスクリプション ID" - -#: client/src/credentials/credentials.form.js:161 -msgid "Subscription ID is an Azure construct, which is mapped to a username." -msgstr "サブスクリプション ID は、ユーザー名にマップされる Azure コンストラクトです。" - -#: client/src/notifications/notifications.list.js:65 -msgid "Success" -msgstr "成功" - -#: client/src/notifications/notificationTemplates.form.js:592 -msgid "Success Message" -msgstr "成功メッセージ" - -#: client/src/notifications/notificationTemplates.form.js:603 -msgid "Success Message Body" -msgstr "成功メッセージボディー" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:83 -msgid "Successful" -msgstr "成功" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:404 -#: client/src/scheduler/scheduler.strings.js:36 -msgid "Sun" -msgstr "日" - -#: client/features/templates/templates.strings.js:32 -msgid "Survey" -msgstr "Survey" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:73 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:478 -msgid "Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch." -msgstr "Survey により、ジョブに関連する一連の質問によるジョブ起動時のユーザーのプロモートが可能になります。これにより、起動時の Playbook 実行に影響を与える変数を定義できます。" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:79 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:186 -msgid "Sync Status" -msgstr "同期の状態" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:62 -msgid "Sync all inventory sources" -msgstr "すべてのインベントリーソースの同期" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:29 -msgid "Sync canceled. Click to view log." -msgstr "同期が取り消されました。クリックしてログを表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:35 -msgid "Sync completed. Click to view log." -msgstr "同期が完了しました。クリックしてログを表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:32 -msgid "Sync failed. Click to view log." -msgstr "同期が失敗しました。クリックしてログを表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "Sync not performed. Click" -msgstr "同期が実行されていません。次をクリックします。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:38 -msgid "Sync pending." -msgstr "同期が保留中です。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:45 -msgid "Sync running" -msgstr "同期が実行中です。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:46 -msgid "Sync running. Click to view log." -msgstr "同期が実行中です。クリックしてログを表示します。" - -#: client/lib/components/components.strings.js:96 -#: client/src/configuration/settings.partial.html:8 -msgid "System" -msgstr "システム" - -#: client/src/users/add/users-add.controller.js:12 -#: client/src/users/edit/users-edit.controller.js:12 -#: client/src/users/list/users-list.controller.js:12 -msgid "System Administrator" -msgstr "システム管理者" - -#: client/src/shared/form-generator.js:1846 -msgid "System Administrators have access to all s" -msgstr "システム管理者は全システムにアクセスできます" - -#: client/src/users/add/users-add.controller.js:11 -#: client/src/users/edit/users-edit.controller.js:11 -#: client/src/users/list/users-list.controller.js:11 -msgid "System Auditor" -msgstr "システム監査者" - -#: client/src/configuration/forms/settings-form.partial.html:3 -msgid "System auditors have read-only permissions in this section." -msgstr "システム監査者はこのセクションで読み取り専用パーミッションを持ちます。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:97 -msgid "TACACS+" -msgstr "TACACS+" - -#: client/features/output/output.strings.js:131 -msgid "TASK" -msgstr "タスク" - -#: client/src/activity-stream/get-target-title.factory.js:23 -#: client/src/organizations/linkout/organizations-linkout.route.js:95 -#: client/src/organizations/list/organizations-list.controller.js:62 -#: client/src/teams/main.js:65 -#: client/src/teams/teams.list.js:14 -#: client/src/teams/teams.list.js:15 -msgid "TEAMS" -msgstr "チーム" - -#: client/features/templates/routes/templatesList.route.js:12 -#: client/features/templates/templates.strings.js:12 -#: client/features/templates/templates.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:44 -#: client/src/templates/templates.list.js:15 -#: client/src/templates/templates.list.js:16 -msgid "TEMPLATES" -msgstr "テンプレート" - -#: client/lib/services/base-string.service.js:78 -msgid "TEST" -msgstr "テスト" - -#: client/src/instance-groups/instance-groups.list.js:8 -msgid "THERE ARE CURRENTLY NO INSTANCE GROUPS DEFINED" -msgstr "現時点で定義されたインスタンスグループはありません" - -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:103 -msgid "TIME" -msgstr "時間" - -#: client/features/users/tokens/tokens.strings.js:22 -msgid "TOKEN" -msgstr "トークン" - -#: client/features/users/tokens/tokens.strings.js:21 -msgid "TOKEN INFORMATION" -msgstr "トークン情報" - -#: client/features/applications/applications.strings.js:11 -#: client/features/users/tokens/tokens.strings.js:10 -#: client/features/users/tokens/tokens.strings.js:8 -#: client/features/users/tokens/users-tokens-list.route.js:24 -#: client/src/activity-stream/get-target-title.factory.js:50 -msgid "TOKENS" -msgstr "トークン" - -#: client/features/templates/templates.strings.js:122 -msgid "TOTAL NODES" -msgstr "ノードの合計" - -#: client/features/templates/templates.strings.js:55 -#: client/src/templates/job_templates/job-template.form.js:212 -msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "タグは、Playbook のサイズが大きい場合にプレイまたはタスクの特定の部分を実行する必要がある場合に役立ちます。カンマを使って複数のタグを区切ります。タグの使用方法の詳細については、Ansible Tower ドキュメントを参照してください。" - -#: client/src/notifications/notificationTemplates.form.js:314 -msgid "Tags for the Annotation" -msgstr "アノテーションのタグ" - -#: client/src/notifications/notificationTemplates.form.js:313 -msgid "Tags for the Annotation (optional)" -msgstr "アノテーションのタグ (オプション)" - -#: client/src/notifications/notificationTemplates.form.js:364 -#: client/src/notifications/notificationTemplates.form.js:414 -#: client/src/notifications/notificationTemplates.form.js:453 -msgid "Target URL" -msgstr "ターゲット URL" - -#: client/features/output/output.strings.js:118 -msgid "Tasks" -msgstr "タスク" - -#: client/features/credentials/legacy.credentials.js:91 -#: client/src/credentials/credentials.form.js:467 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:136 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:133 -#: client/src/organizations/organizations.form.js:180 -#: client/src/projects/projects.form.js:307 -#: client/src/templates/workflows.form.js:317 -msgid "Team Roles" -msgstr "チームロール" - -#: client/lib/services/base-string.service.js:96 -msgid "Team access removal" -msgstr "チームアクセス権の削除" - -#: client/lib/components/components.strings.js:81 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:36 -#: client/src/organizations/linkout/organizations-linkout.route.js:103 -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/users/users.form.js:162 -msgid "Teams" -msgstr "チーム" - -#: client/features/templates/templates.strings.js:120 -#: client/src/templates/templates.list.js:14 -#: client/src/workflow-results/workflow-results.controller.js:69 -msgid "Template" -msgstr "テンプレート" - -#: client/features/templates/templates.strings.js:79 -msgid "Template parameter is missing." -msgstr "テンプレートパラメーターがありません。" - -#: client/lib/components/components.strings.js:78 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:37 -msgid "Templates" -msgstr "テンプレート" - -#: client/src/credentials/credentials.form.js:336 -msgid "Tenant ID" -msgstr "テナント ID" - -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:80 -msgid "Test" -msgstr "テスト" - -#: client/features/credentials/credentials.strings.js:26 -msgid "Test External Credential" -msgstr "外部認証情報のテスト" - -#: client/features/credentials/credentials.strings.js:45 -msgid "Test failed." -msgstr "テストに失敗しました。" - -#: client/src/notifications/notificationTemplates.list.js:82 -msgid "Test notification" -msgstr "テスト通知" - -#: client/features/credentials/credentials.strings.js:44 -msgid "Test passed." -msgstr "テストに成功しました。" - -#: client/src/templates/survey-maker/surveys/init.factory.js:13 -msgid "Text" -msgstr "テキスト" - -#: client/src/templates/survey-maker/surveys/init.factory.js:14 -msgid "Textarea" -msgstr "Textarea" - -#: client/src/shared/form-generator.js:1306 -#: client/src/shared/form-generator.js:1312 -msgid "That value was not found. Please enter or select a valid value." -msgstr "値が見つかりませんでした。有効な値を入力または選択してください。" - -#: client/lib/components/components.strings.js:48 -msgid "That value was not found. Please enter or select a valid value." -msgstr "値が見つかりませんでした。有効な値を入力または選択してください。" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:66 -msgid "The Insights Credential for {{inventory.name}} was not found." -msgstr "{{inventory.name}} の Insights 認証情報が見つかりませんでした。" - -#: client/src/credentials/factories/become-method-change.factory.js:32 -#: client/src/credentials/factories/kind-change.factory.js:88 -msgid "The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:" -msgstr "プロジェクト ID は GCE によって割り当てられる識別情報です。これは、以下のように 2 語とそれに続く 3 桁の数字で構成されます。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "The Project selected has a status of" -msgstr "選択されたプロジェクトのステータス" - -#: client/src/projects/edit/projects-edit.controller.js:339 -msgid "The SCM update process is running." -msgstr "SCM 更新プロセスが実行中です。" - -#: client/src/notifications/notificationTemplates.form.js:150 -msgid "The amount of time (in seconds) before the email notification stops trying to reach the host and times out. Ranges from 1 to 120 seconds." -msgstr "メール通知が、ホストへの到達を試行するのをやめてタイムアウトするまでの時間 (秒単位)。範囲は 1 から 120 秒です。" - -#: client/src/templates/job_templates/job-template.form.js:299 -msgid "The amount of time (in seconds) to run before the task is canceled. Defaults to 0 for no job timeout." -msgstr "タスクが取り消される前の実行時間 (秒数)。デフォルト値は 0 で、ジョブのタイムアウトがありません。" - -#: client/features/templates/templates.strings.js:154 -msgid "The amount of time to wait before this approval step is automatically denied. Defaults to 0 for no timeout." -msgstr "この承認ステップが自動的に拒否されるまでの待機時間。タイムアウトなしの場合は、デフォルト値 の 0 に設定します。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:201 -#: client/src/templates/survey-maker/shared/question-definition.form.js:260 -#: client/src/templates/survey-maker/shared/question-definition.form.js:281 -msgid "The answer is longer than the maximum length. Please make the answer shorter." -msgstr "回答が最大文字数を超えています。回答を短くしてください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:200 -#: client/src/templates/survey-maker/shared/question-definition.form.js:259 -#: client/src/templates/survey-maker/shared/question-definition.form.js:280 -msgid "The answer is shorter than the minimium length. Please make the answer longer." -msgstr "回答が最小文字数より短くなっています。回答を長くしてください。" - -#: client/src/notifications/notificationTemplates.form.js:271 -msgid "The base URL of the Grafana server - the /api/annotations endpoint will be added automatically to the base Grafana URL." -msgstr "Grafana サーバーのベース URL。/api/annotations エンドポイントは、ベース Grafana URL に自動的に追加されます。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:241 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:328 -#: client/src/scheduler/scheduler.strings.js:32 -msgid "The day must be between 1 and 31." -msgstr "日付の値は 1 から 31 の間の値である必要があります。" - -#: client/src/configuration/settings.service.js:39 -msgid "The duration (in seconds) access tokens remain valid since their creation." -msgstr "期間のアクセストークンは、作成してから有効な状態が保たれます (秒単位)。" - -#: client/src/configuration/settings.service.js:47 -msgid "The duration (in seconds) authorization codes remain valid since their creation." -msgstr "期間の認証コードは、作成してから有効な状態が保たれます (秒単位)。" - -#: client/src/configuration/settings.service.js:43 -msgid "The duration (in seconds) refresh tokens remain valid after the expiration of their associated access token." -msgstr "関連付けられたアクセストークンの有効期限が過ぎた後も、期間の更新トークン (秒単位) は有効な状態が保たれます。 " - -#: client/src/credentials/credentials.form.js:190 -msgid "The email address assigned to the Google Compute Engine %sservice account." -msgstr "Google Compute Engine %sサービスアカウントに割り当てられたメールアドレス。" - -#: client/src/projects/projects.form.js:143 -msgid "The first fetches all references. The second fetches the Github pull request number 62, in this example the branch needs to be `pull/62/head`." -msgstr "最初は全参照を取得します。2 番目は Github の Pull 要求の 62 番を取得します。この例では、ブランチは `pull/62/head` である必要があります。" - -#: client/features/templates/templates.strings.js:146 -msgid "The following promptable values were provided when this node was created:" -msgstr "このノードの作成時に以下の提示可能な値が指定されました。" - -#: client/features/output/output.strings.js:12 -msgid "The host status bar will update when the job is complete." -msgstr "ジョブの完了時にホストのステータスバーが更新されます。" - -#: client/src/credentials/factories/become-method-change.factory.js:62 -#: client/src/credentials/factories/kind-change.factory.js:118 -msgid "The host to authenticate with." -msgstr "認証するホスト。" - -#: client/src/credentials/factories/kind-change.factory.js:59 -msgid "The host value" -msgstr "ホスト値" - -#: client/features/templates/templates.strings.js:137 -msgid "The inventory of this node will be overridden by the parent workflow inventory." -msgstr "このノードのインベントリーが、親ワークフローのインベントリーで上書きされます。" - -#: client/features/templates/templates.strings.js:139 -msgid "The inventory of this node will be overridden if a parent workflow inventory is provided at launch." -msgstr "起動時に親ワークフローのインベントリーが指定されている場合には、このノードのインベントリーが上書きされます。" - -#: client/features/templates/templates.strings.js:138 -msgid "The inventory of this node will not be overridden by the parent workflow inventory." -msgstr "このノードのインベントリーは、親ワークフローのインベントリーで上書きされません。" - -#: client/features/templates/templates.strings.js:140 -msgid "The inventory of this node will not be overridden if a parent workflow inventory is provided at launch." -msgstr "起動時に親ワークフローのインベントリーが指定されている場合には、このノードのインベントリーは上書きされません。" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:153 -msgid "The inventory will be in a pending status until the final delete is processed." -msgstr "最終の削除が処理されるまでインベントリーは保留状態になります。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:100 -#: client/src/templates/survey-maker/shared/question-definition.form.js:121 -#: client/src/templates/survey-maker/shared/question-definition.form.js:142 -msgid "The maximum length is too low. Please enter a number larger than the minimum length you set." -msgstr "最大長の値が小さすぎます。設定した最大長よりも大きい数を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:120 -#: client/src/templates/survey-maker/shared/question-definition.form.js:141 -#: client/src/templates/survey-maker/shared/question-definition.form.js:99 -msgid "The maximum length you entered is not a valid number. Please enter a whole number." -msgstr "入力した最大長の数字が無効です。整数を入力してください" - -#: client/src/organizations/organizations.form.js:78 -msgid "The maximum number of hosts allowed to be managed by this organization. Value defaults to 0 which means no limit. Refer to the Ansible documentation for more details." -msgstr "この組織で管理可能な最大ホスト数。デフォルト値は 0 で、管理可能な数に制限がありません。詳細は、Ansible ドキュメントを参照してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:115 -#: client/src/templates/survey-maker/shared/question-definition.form.js:136 -#: client/src/templates/survey-maker/shared/question-definition.form.js:94 -msgid "The minimium length is too high. Please enter a lower number." -msgstr "最小長の値が大きすぎます。もう少し低い値を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:116 -#: client/src/templates/survey-maker/shared/question-definition.form.js:137 -#: client/src/templates/survey-maker/shared/question-definition.form.js:95 -msgid "The minimum length is too low. Please enter a positive number." -msgstr "最小長の値が大きすぎます。正の値を入力してください。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:114 -#: client/src/templates/survey-maker/shared/question-definition.form.js:135 -#: client/src/templates/survey-maker/shared/question-definition.form.js:93 -msgid "The minimum length you entered is not a valid number. Please enter a whole number." -msgstr "入力した最小長の数字が無効です。整数を入力してください" - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. An empty value, or a value less than 1 will use the Ansible default which is usually 5. The default number of forks can be overwritten with a change to" -msgstr "Playbook の実行中に使用する並列または同時プロセスの数。値が空白または 1 未満の場合は、Ansible のデフォルト値 (通常は 5) を使用します。フォークのデフォルトの数は、以下を変更して上書きできます。" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:105 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. Inputting no value will use the default value from the %sansible configuration file%s." -msgstr "Playbook の実行中に使用する並列または同時プロセスの数です。いずれの値も入力しないと、 %sansible 設定ファイル%s のデフォルト値が使用されます。" - -#: client/src/credentials/factories/kind-change.factory.js:58 -msgid "The project value" -msgstr "プロジェクト値" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:552 -msgid "The scheduler options are invalid or incomplete." -msgstr "スケジューラーのオプションが無効であるか、不完全です。" - -#: client/src/scheduler/scheduler.strings.js:49 -msgid "The scheduler options are invalid, incomplete, or a date is in the past." -msgstr "スケジューラーのオプションは無効であるか、完了していないか、また過去の日付になっています。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "The selected project has a status of" -msgstr "選択されたプロジェクトのステータス" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings and then run an update." -msgstr "選択されたプロジェクトは SCM に対して設定されていません。SCM の設定を行うには、プロジェクトを編集して SCM 設定を指定してから更新を実行します。" - -#: client/features/projects/projects.strings.js:23 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." -msgstr "選択されたプロジェクトは SCM に対して設定されていません。SCM の設定を行うには、プロジェクトを編集して SCM 設定を指定してから更新を実行します。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:52 -msgid "The suggested format for variable names is lowercase and underscore-separated (for example, foo_bar, user_id, host_name, etc.). Variable names with spaces are not allowed." -msgstr "推奨される変数名の形式は小文字のみを使用し、それらをアンダースコアで区切る形です (foo_bar、user_id、host_name など)。スペースを含む変数名は許可されません。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:126 -#: client/src/scheduler/scheduler.strings.js:25 -msgid "The time must be in HH24:MM:SS format." -msgstr "時間は HH24:MM:SS 形式で表示される必要があります。" - -#: client/lib/services/base-string.service.js:90 -msgid "The {{ resourceType }} is currently being used by other resources." -msgstr "{{ resourceType }} は現在他のリソースで使用されています。" - -#: client/src/activity-stream/streams.list.js:17 -msgid "There are no events to display at this time" -msgstr "現時点で表示できるイベントはありません" - -#: client/lib/components/components.strings.js:127 -msgid "There are no jobs awaiting approval" -msgstr "承認待ちのジョブはありません。" - -#: client/features/jobs/jobs.strings.js:18 -msgid "There are no running jobs." -msgstr "実行中のジョブがありません。" - -#: client/features/projects/projects.strings.js:22 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "このプロジェクトに利用できる SCM 更新情報はありません。更新はまだ完了していません。まだ更新を実行していない場合は、このプロジェクトの更新を開始してください。" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "このプロジェクトに利用できる SCM 更新情報はありません。更新はまだ完了していません。まだ更新を実行していない場合は、このプロジェクトの更新を開始してください。" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:127 -msgid "There was an error deleting inventory source groups. Returned status:" -msgstr "インベントリーソースグループの削除中にエラーが発生しました。返されたステータス:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:117 -msgid "There was an error deleting inventory source hosts. Returned status:" -msgstr "インベントリーソースホストの削除中にエラーが発生しました。返されたステータス:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:154 -msgid "There was an error deleting inventory source. Returned status:" -msgstr "インベントリーソースの削除中にエラーが発生しました。返されたステータス:" - -#: client/src/configuration/forms/settings-form.controller.js:286 -msgid "There was an error resetting value. Returned status:" -msgstr "値のリセット中にエラーが発生しました。返されたステータス:" - -#: client/src/configuration/forms/settings-form.controller.js:615 -msgid "There was an error resetting values. Returned status:" -msgstr "値のリセット中にエラーが発生しました。返されたステータス:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:235 -msgid "There was an error testing the log aggregator. Returned status:" -msgstr "ログアグリゲーターのテスト中にエラーが発生しました。返されたステータス:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:29 -msgid "These are the modules that {{BRAND_NAME}} supports running commands against." -msgstr "これらは {{BRAND_NAME}} がコマンドの実行をサポートするモジュールです。" - -#: client/features/templates/templates.strings.js:106 -msgid "This Job Template has a credential that requires a password. Credentials requiring passwords on launch are not permitted on workflow nodes." -msgstr "このジョブテンプレートにはパスワードが必要な認証情報があります。起動時にパスワードを必要とする認証情報はワークフローノードでは許可されません。" - -#: client/src/scheduler/scheduler.strings.js:59 -msgid "This Job Template has a default credential that requires a password before launch. Adding or editing schedules is prohibited while this credential is selected. To add or edit a schedule, credentials that require a password must be removed from the Job Template." -msgstr "このジョブテンプレートには、起動前にパスワードを必要とするデフォルト認証情報があります。この認証情報が選択されている場合、スケジュールの追加または編集は許可されません。スケジュールを追加または編集するには、パスワードを必要とする認証情報をジョブテンプレートから削除する必要があります。" - -#: client/features/templates/templates.strings.js:105 -msgid "This Job Template is missing a default inventory or project. This must be addressed in the Job Template form before this node can be saved." -msgstr "このジョブテンプレートにはデフォルトのインベントリーまたはプロジェクトがありません。これについては、このノードを保存する前にジョブテンプレートフォームで対応する必要があります。" - -#: client/src/credential-types/credential-types.strings.js:8 -msgid "This credential type is currently being used by one or more credentials. Credentials that use this credential type must be deleted before the credential type can be deleted." -msgstr "この認証情報タイプは現在 1 つ以上の認証情報で使用されています。この認証情報タイプを使用する認証情報を削除してから認証情報タイプを削除することができます。" - -#: client/src/instance-groups/instance-groups.strings.js:14 -msgid "This feature is currently in tech preview and is subject to change in a future release. Click here for documentation." -msgstr "この機能は現在テクノロジープレビュー機能となっており、今後のリリースで変更される可能性があります。こちらをクリックしてドキュメントを確認してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:328 -msgid "This field is ignored unless an Enabled Variable is set. If the enabled variable matches this value, the host will be enabled on import." -msgstr "有効な変数が設定されていない限り、このフィールドは無視されます。有効な変数がこの値と一致すると、インポート時にこのホストが有効になります。" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:25 -msgid "This group contains at least one group or host" -msgstr "このグループには、少なくとも 1 つのグループまたはホストが含まれています。" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:50 -#: client/src/templates/workflows.form.js:74 -msgid "This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "このインベントリーが、インベントリーをプロンプトするすべてのジョブテンプレートノードに適用されます。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:174 -msgid "This is not a valid number." -msgstr "これは無効な数値です。" - -#: client/src/credentials/factories/become-method-change.factory.js:59 -#: client/src/credentials/factories/kind-change.factory.js:115 -msgid "This is the tenant name. This value is usually the same as the username." -msgstr "これはテナント名です。通常、この値はユーザー名と同じです。" - -#: client/features/templates/templates.strings.js:75 -msgid "This job template has a default {{typeLabel}} credential which must be included or replaced before proceeding." -msgstr "このジョブテンプレートにはデフォルトの {{typeLabel}} 認証情報があります。これを組み込むか、または置き換えてから次に進んでください。" - -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "This list is populated by inventories added from the" -msgstr "この一覧は、以下から追加されるインベントリーで事前に設定されます:" - -#: client/src/notifications/notifications.list.js:21 -msgid "This list is populated by notification templates added from the %sNotifications%s section" -msgstr "この一覧は、%s通知%s セクションで追加される通知テンプレートで事前に設定されます。" - -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "This list is populated by projects added from the" -msgstr "この一覧は、以下から追加されるプロジェクトで事前に設定されます:" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -msgid "This list is populated by teams added from the" -msgstr "この一覧は、以下から追加されるチームで事前に設定されます:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:4 -msgid "This machine has not checked in with Insights in {{last_check_in}} hours" -msgstr "このマシンは {{last_check_in}} 時間 Insights にチェックインしていません" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:49 -msgid "This question variable is already in use. Please enter a different variable name." -msgstr "この質問の変数はすでに使用されています。別の変数名を入力してください。" - -#: client/src/shared/form-generator.js:707 -msgid "This setting has been set manually in a settings file and is now disabled." -msgstr "この値は設定ファイルに手動で設定され、現在は無効にされています。" - -#: client/src/users/users.form.js:167 -msgid "This user is not a member of any teams" -msgstr "このユーザーはいずれのチームのメンバーでもありません。" - -#: client/src/shared/form-generator.js:828 -#: client/src/shared/form-generator.js:920 -msgid "This value does not match the password you entered previously. Please confirm that password." -msgstr "この値は、以前に入力されたパスワードと一致しません。パスワードを確認してください。" - -#: client/src/configuration/forms/settings-form.controller.js:488 -msgid "This will reset all configuration values to their factory defaults. Are you sure you want to proceed?" -msgstr "これにより、すべての設定値が出荷時の設定にリセットされます。本当に続行してもよいですか?" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:51 -msgid "This workflow job template has a default inventory which must be included or replaced before proceeding." -msgstr "このワークフロージョブテンプレートにはデフォルトのインベントリーがあります。これを組み込むか、または置き換えてから次に進んでください。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:444 -#: client/src/scheduler/scheduler.strings.js:40 -msgid "Thu" -msgstr "木" - -#: client/src/activity-stream/streams.list.js:25 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:18 -#: client/src/notifications/notification-templates-list/list.controller.js:72 -msgid "Time" -msgstr "時間" - -#: client/src/license/license.partial.html:45 -msgid "Time Remaining" -msgstr "残りの時間" - -#: client/src/projects/projects.form.js:228 -msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." -msgstr "プロジェクトが最新であることを判別するための時間 (秒単位) です。ジョブ実行およびコールバック時に、タスクシステムは最新のプロジェクト更新のタイムスタンプを評価します。これがキャッシュタイムアウトよりも古い場合には、最新とは見なされず、新規のプロジェクト更新が実行されます。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:395 -msgid "Time in seconds to consider an inventory sync to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest sync. If it is older than Cache Timeout, it is not considered current, and a new inventory sync will be performed." -msgstr "インベントリーの同期が最新の状態であることを判別するために使用される時間 (秒単位) です。ジョブの実行およびコールバック時に、タスクシステムは最新の同期のタイムスタンプを評価します。これがキャッシュタイムアウトよりも古い場合は最新とは見なされず、インベントリーの同期が新たに実行されます。" - -#: client/features/templates/templates.strings.js:156 -#: client/src/notifications/notificationTemplates.form.js:136 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/templates/job_templates/job-template.form.js:290 -#: client/src/templates/job_templates/job-template.form.js:296 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:137 -msgid "Timeout" -msgstr "タイムアウト" - -#: client/src/credentials/credentials.form.js:125 -msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." -msgstr "IAM STS トークンについての詳細は、%sAmazon ドキュメント%s を参照してください。" - -#: client/features/output/output.strings.js:120 -msgid "Toggle expanded output" -msgstr "詳細出力の切り替え" - -#: client/src/shared/form-generator.js:850 -msgid "Toggle the display of plaintext." -msgstr "プレーンテキストの表示を切り替えます。" - -#: client/src/notifications/shared/type-change.service.js:37 -#: client/src/notifications/shared/type-change.service.js:46 -msgid "Token" -msgstr "トークン" - -#: client/features/applications/applications.strings.js:16 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 -#: client/src/users/users.form.js:242 -msgid "Tokens" -msgstr "トークン" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:10 -msgid "Total Issues" -msgstr "問題の合計" - -#: client/src/instance-groups/instance-groups.strings.js:23 -msgid "Total Jobs" -msgstr "ジョブの合計" - -#: client/src/workflow-results/workflow-results.controller.js:91 -msgid "Total Nodes" -msgstr "ノードの合計" - -#: client/src/partials/logviewer.html:6 -msgid "Traceback" -msgstr "トレースバック" - -#: client/src/license/license.partial.html:176 -msgid "Tracking and Analytics" -msgstr "追跡およびアナリティクス" - -#: client/src/license/license.partial.html:233 -msgid "Trial" -msgstr "トライアル" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:424 -#: client/src/scheduler/scheduler.strings.js:38 -msgid "Tue" -msgstr "火" - -#: client/src/credentials/credentials.form.js:60 -#: client/src/credentials/credentials.form.js:84 -#: client/src/inventories-hosts/inventories/inventory.list.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:45 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:44 -#: client/src/notifications/notifications.list.js:33 -#: client/src/projects/projects.list.js:50 -#: client/src/scheduler/scheduled-jobs.list.js:47 -#: client/src/teams/teams.form.js:142 -#: client/src/templates/templates.list.js:31 -#: client/src/users/users.form.js:206 -msgid "Type" -msgstr "タイプ" - -#: client/features/credentials/credentials.strings.js:18 -#: client/src/credentials/credentials.form.js:23 -#: client/src/notifications/notificationTemplates.form.js:26 -msgid "Type Details" -msgstr "タイプの詳細" - -#: client/features/templates/templates.strings.js:145 -msgid "UNLINK" -msgstr "リンクの削除" - -#: client/src/projects/add/projects-add.controller.js:190 -#: client/src/projects/edit/projects-edit.controller.js:311 -msgid "URL popover text" -msgstr "URL ポップオーバーテキスト" - -#: client/src/license/license.partial.html:132 -#: client/src/login/loginModal/loginModal.partial.html:61 -msgid "USERNAME" -msgstr "ユーザー名" - -#: client/src/activity-stream/get-target-title.factory.js:20 -#: client/src/organizations/linkout/organizations-linkout.route.js:43 -#: client/src/organizations/list/organizations-list.controller.js:55 -#: client/src/users/users.list.js:18 -#: client/src/users/users.list.js:19 -#: client/src/users/users.route.js:8 -msgid "USERS" -msgstr "ユーザー" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:597 -msgid "UTC" -msgstr "UTC" - -#: client/lib/services/base-string.service.js:144 -msgid "UUID (Ascending)" -msgstr "UUID (昇順)" - -#: client/lib/services/base-string.service.js:145 -msgid "UUID (Descending)" -msgstr "UUID (降順)" - -#: client/lib/components/components.strings.js:25 -msgid "Unable to Submit" -msgstr "送信できません" - -#: client/features/templates/templates.strings.js:96 -msgid "Unable to copy template." -msgstr "テンプレートをコピーできませんでした。" - -#: client/src/instance-groups/instance-groups.strings.js:67 -msgid "Unable to delete instance group." -msgstr "インスタンスグループを削除できませんでした。" - -#: client/features/templates/templates.strings.js:92 -msgid "Unable to delete template." -msgstr "テンプレートを削除できませんでした。" - -#: client/features/templates/templates.strings.js:94 -msgid "Unable to determine template type." -msgstr "テンプレートタイプを判別できませんでした。" - -#: client/features/templates/templates.strings.js:81 -msgid "Unable to determine this template's type while copying." -msgstr "コピー中にこのテンプレートのタイプを判別できませんでした。" - -#: client/features/templates/templates.strings.js:82 -msgid "Unable to determine this template's type while deleting." -msgstr "削除中にこのテンプレートのタイプを判別できませんでした。" - -#: client/features/templates/templates.strings.js:83 -msgid "Unable to determine this template's type while editing." -msgstr "編集中にこのテンプレートのタイプを判別できませんでした。" - -#: client/features/templates/templates.strings.js:84 -msgid "Unable to determine this template's type while launching." -msgstr "起動中にこのテンプレートのタイプを判別できませんでした。" - -#: client/features/templates/templates.strings.js:85 -msgid "Unable to determine this template's type while scheduling." -msgstr "スケジュール中にこのテンプレートのタイプを判別できませんでした。" - -#: client/features/templates/templates.strings.js:91 -msgid "Unable to edit template." -msgstr "テンプレートを編集できませんでした。" - -#: client/src/shared/stateDefinitions.factory.js:231 -msgid "Unable to get resource:" -msgstr "リソースを取得できませんでした:" - -#: client/features/templates/templates.strings.js:93 -msgid "Unable to launch template." -msgstr "テンプレートを起動できませんでした。" - -#: client/features/templates/templates.strings.js:95 -msgid "Unable to schedule job." -msgstr "ジョブをスケジュールできませんでした。" - -#: client/src/instance-groups/instance-groups.strings.js:49 -msgid "Unavailable" -msgstr "利用できません" - -#: client/src/instance-groups/instance-groups.strings.js:48 -msgid "Unavailable to run jobs." -msgstr "ジョブの実行に使用できません。" - -#: client/lib/components/components.strings.js:27 -msgid "Unexpected Error" -msgstr "予期しないエラー" - -#: client/lib/components/components.strings.js:26 -msgid "Unexpected server error. View the console for more information" -msgstr "予期しないサーバーエラーが発生しました。コンソールで詳細情報を表示してください。" - -#: client/src/license/license.partial.html:59 -msgid "Unlimited" -msgstr "制限なし" - -#: client/lib/components/components.strings.js:39 -msgid "Unsupported display model type" -msgstr "サポートされない表示モデルタイプ" - -#: client/lib/components/components.strings.js:31 -msgid "Unsupported input type" -msgstr "サポートされない入力タイプ" - -#: client/features/projects/projects.strings.js:33 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Update Not Found" -msgstr "更新が見つかりません" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:334 -msgid "Update Options" -msgstr "オプションの更新" - -#: client/src/projects/projects.form.js:197 -msgid "Update Revision on Launch" -msgstr "起動時のリビジョン更新" - -#: client/features/projects/projects.strings.js:44 -#: client/src/projects/factories/get-project-tool-tip.factory.js:30 -msgid "Update canceled. Click for details" -msgstr "更新が取り消されました。クリックして詳細を確認してください。" - -#: client/features/projects/projects.strings.js:42 -#: client/src/projects/factories/get-project-tool-tip.factory.js:24 -msgid "Update failed. Click for details" -msgstr "更新に失敗しました。クリックして詳細を確認してください。" - -#: client/src/projects/edit/projects-edit.controller.js:339 -msgid "Update in Progress" -msgstr "更新が進行中です" - -#: client/features/projects/projects.strings.js:43 -#: client/src/projects/factories/get-project-tool-tip.factory.js:27 -msgid "Update missing. Click for details" -msgstr "更新がありません。クリックして詳細を確認してください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:362 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:367 -msgid "Update on Launch" -msgstr "起動時の更新" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:373 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:379 -msgid "Update on Project Update" -msgstr "プロジェクト更新時の更新" - -#: client/features/projects/projects.strings.js:39 -#: client/src/projects/factories/get-project-tool-tip.factory.js:14 -msgid "Update queued. Click for details" -msgstr "更新がキューに入れられました。クリックして詳細を確認してください。" - -#: client/features/projects/projects.strings.js:40 -#: client/src/projects/factories/get-project-tool-tip.factory.js:18 -msgid "Update running. Click for details" -msgstr "更新が実行中です。クリックして詳細を確認してください。" - -#: client/src/configuration/settings.partial.html:6 -msgid "Update settings pertaining to Jobs within Tower" -msgstr "Tower 内のジョブを含む設定の更新" - -#: client/features/projects/projects.strings.js:41 -#: client/src/projects/factories/get-project-tool-tip.factory.js:21 -msgid "Update succeeded. Click for details" -msgstr "更新が正常に実行されました。クリックして詳細を確認してください。" - -#: client/src/license/license.partial.html:75 -msgid "Upgrade" -msgstr "アップグレード" - -#: client/src/license/license.partial.html:111 -msgid "Upload a license file" -msgstr "ライセンスファイルのアップロード" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:62 -#: client/src/organizations/organizations.form.js:48 -#: client/src/projects/projects.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:257 -msgid "Use Default Environment" -msgstr "デフォルト環境の使用" - -#: client/src/notifications/add/add.controller.js:98 -#: client/src/notifications/edit/edit.controller.js:139 -msgid "Use SSL" -msgstr "SSL の使用" - -#: client/src/notifications/add/add.controller.js:97 -#: client/src/notifications/edit/edit.controller.js:138 -msgid "Use TLS" -msgstr "TLS の使用" - -#: client/src/notifications/notificationTemplates.form.js:558 -msgid "Use custom messages to change the content of notifications sent when a job starts, succeeds, or fails. Use curly braces to access information about the job: {{ job_friendly_name }}, {{ url }}, or attributes of the job such as {{ job.status }}. You may apply a number of possible variables in the message. Refer to the Ansible Tower documentation for more details." -msgstr "カスタムメッセージを使用して、ジョブの開始時、成功時、または失敗時に送信する通知内容を変更します。中括弧を使用して、ジョブの情報 ({{ job_friendly_name }}, {{ url }}) またはジョブの属性 ({{ job.status }}) にアクセスします。メッセージには、使用可能な変数を複数適用できます。詳細は、Ansible Tower ドキュメント を参照してください。" - -#: client/src/instance-groups/instance-groups.strings.js:24 -#: client/src/instance-groups/instance-groups.strings.js:50 -msgid "Used Capacity" -msgstr "使用済み容量" - -#: client/src/credentials/credentials.form.js:76 -msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." -msgstr "Git、Subversion (svn)、または Mercurial (hg) などのリモートソースコントロール管理システムで Playbook リポジトリーをチェックアウトし、同期するために使用されます。これらの認証情報はプロジェクトで使用されます。" - -#: client/features/credentials/legacy.credentials.js:80 -#: client/src/credentials/credentials.form.js:456 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:125 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:122 -#: client/src/organizations/organizations.form.js:128 -#: client/src/organizations/organizations.form.js:169 -#: client/src/projects/projects.form.js:296 -#: client/src/teams/teams.form.js:96 -#: client/src/templates/workflows.form.js:306 -msgid "User" -msgstr "ユーザー" - -#: client/lib/components/components.strings.js:97 -#: client/src/configuration/settings.partial.html:11 -msgid "User Interface" -msgstr "ユーザーインターフェース" - -#: client/src/users/users.form.js:96 -msgid "User Type" -msgstr "ユーザータイプ" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 -#: client/src/credentials/factories/become-method-change.factory.js:17 -#: client/src/credentials/factories/become-method-change.factory.js:38 -#: client/src/credentials/factories/kind-change.factory.js:16 -#: client/src/credentials/factories/kind-change.factory.js:40 -#: client/src/credentials/factories/kind-change.factory.js:73 -#: client/src/credentials/factories/kind-change.factory.js:94 -#: client/src/notifications/notificationTemplates.form.js:425 -#: client/src/notifications/notificationTemplates.form.js:464 -#: client/src/notifications/notificationTemplates.form.js:64 -#: client/src/users/users.form.js:59 -#: client/src/users/users.list.js:29 -msgid "Username" -msgstr "ユーザー名" - -#: client/lib/services/base-string.service.js:138 -msgid "Username (Ascending)" -msgstr "ユーザー名 (昇順)" - -#: client/lib/services/base-string.service.js:139 -msgid "Username (Descending)" -msgstr "ユーザー名 (降順)" - -#: client/src/credentials/credentials.form.js:80 -msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for smart inventory sources and for cloud provisioning and deployment in playbook runs." -msgstr "指定されたクラウドまたはインフラストラクチャープロバイダーに対する認証を行うためのユーザー名、パスワード、およびアクセスキーです。これらはスマートインベントリーソース、および Playbook 実行におけるクラウドプロビジョニングおよびデプロイメントに使用されます。" - -#: client/lib/components/components.strings.js:80 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:38 -#: client/src/organizations/organizations.form.js:110 -#: client/src/teams/teams.form.js:78 -msgid "Users" -msgstr "ユーザー" - -#: client/src/scheduler/schedulerList.controller.js:46 -msgid "Using a credential that requires a password on launch is prohibited when creating a Job Template schedule" -msgstr "ジョブテンプレートスケジュールの作成時に、起動時にパスワードを必要とする認証情報は禁止されています。" - -#: client/lib/components/code-mirror/code-mirror.strings.js:11 -msgid "VARIABLES" -msgstr "変数" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:7 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:7 -msgid "VIEW ALL" -msgstr "すべてを表示" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:90 -msgid "VIEW DATA IN INSIGHTS" -msgstr "Insights でのデータの表示" - -#: client/lib/components/components.strings.js:59 -msgid "VIEW LESS" -msgstr "簡易表示" - -#: client/features/templates/templates.strings.js:143 -msgid "VIEW LINK" -msgstr "リンクの表示" - -#: client/lib/components/components.strings.js:58 -msgid "VIEW MORE" -msgstr "詳細を表示" - -#: client/src/shared/paginate/paginate.partial.html:48 -msgid "VIEW PER PAGE" -msgstr "ページ別のビュー" - -#: client/src/license/license.partial.html:10 -msgid "Valid License" -msgstr "有効なライセンス" - -#: client/src/inventories-hosts/hosts/host.form.js:67 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:46 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:47 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:68 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:63 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:70 -msgid "Variables" -msgstr "変数" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:25 -#: client/src/templates/prompt/steps/credential/prompt-credential.directive.js:37 -msgid "Vault ID" -msgstr "Vault ID" - -#: client/features/templates/templates.strings.js:48 -#: client/src/credentials/credentials.form.js:390 -msgid "Vault Password" -msgstr "Vault パスワード" - -#: client/features/output/output.strings.js:97 -#: client/features/templates/templates.strings.js:60 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:82 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:91 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:290 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:297 -#: client/src/templates/job_templates/job-template.form.js:189 -#: client/src/templates/job_templates/job-template.form.js:196 -msgid "Verbosity" -msgstr "詳細" - -#: client/src/license/license.partial.html:15 -msgid "Version" -msgstr "バージョン" - -#: client/src/activity-stream/streams.list.js:63 -#: client/src/credential-types/credential-types.list.js:64 -#: client/src/credentials/credentials.list.js:82 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:64 -#: client/src/inventories-hosts/inventories/inventory.list.js:118 -#: client/src/inventory-scripts/inventory-scripts.list.js:70 -#: client/src/notifications/notificationTemplates.list.js:96 -#: client/src/scheduler/schedules.list.js:101 -#: client/src/teams/teams.list.js:64 -#: client/src/templates/templates.list.js:101 -#: client/src/users/users.list.js:70 -msgid "View" -msgstr "表示" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "View Activity Stream" -msgstr "アクティビティーストリームの表示" - -#: client/lib/components/components.strings.js:68 -msgid "View Documentation" -msgstr "ドキュメントの表示" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:52 -msgid "View Insights" -msgstr "Insights の表示" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:102 -#: client/src/inventories-hosts/inventory-hosts.strings.js:27 -msgid "View Insights Data" -msgstr "Insights データの表示" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:161 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:185 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:209 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:284 -msgid "View JSON examples at" -msgstr "JSON サンプルの表示: " - -#: client/src/inventories-hosts/hosts/host.form.js:77 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:76 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:84 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:73 -msgid "View JSON examples at %s" -msgstr "JSON サンプルを %s に表示" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:13 -msgid "View Less" -msgstr "簡易表示" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:11 -msgid "View More" -msgstr "詳細表示" - -#: client/src/organizations/list/organizations-list.partial.html:64 -msgid "View Organization" -msgstr "組織の表示" - -#: client/features/output/output.strings.js:28 -#: client/features/output/output.strings.js:32 -msgid "View Project checkout results" -msgstr "プロジェクトのチェックアウト結果を表示" - -#: client/src/shared/form-generator.js:1672 -#: client/src/templates/job_templates/job-template.form.js:588 -#: client/src/templates/workflows.form.js:343 -msgid "View Survey" -msgstr "Survey の表示" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:162 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:186 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:210 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:285 -msgid "View YAML examples at" -msgstr "YAML サンプルの表示: " - -#: client/src/inventories-hosts/hosts/host.form.js:78 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:77 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:88 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:74 -msgid "View YAML examples at %s" -msgstr "YAML サンプルを %s に表示" - -#: client/src/configuration/settings.partial.html:15 -msgid "View and edit your license information" -msgstr "ライセンス情報の表示、編集" - -#: client/src/credentials/credentials.list.js:84 -msgid "View credential" -msgstr "認証情報の表示" - -#: client/src/credential-types/credential-types.list.js:66 -msgid "View credential type" -msgstr "認証情報タイプの表示" - -#: client/lib/components/layout/layout.partial.html:29 -msgid "View documentation" -msgstr "ドキュメントの表示" - -#: client/src/activity-stream/streams.list.js:67 -msgid "View event details" -msgstr "イベント詳細の表示" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:92 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:96 -msgid "View group" -msgstr "グループの表示" - -#: client/src/inventories-hosts/hosts/host.list.js:95 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:96 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:109 -#: client/src/inventories-hosts/inventory-hosts.strings.js:26 -msgid "View host" -msgstr "ホストの表示" - -#: client/src/inventories-hosts/inventories/inventory.list.js:120 -msgid "View inventory" -msgstr "インベントリーの表示" - -#: client/src/inventory-scripts/inventory-scripts.list.js:72 -msgid "View inventory script" -msgstr "インベントリースクリプトの表示" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:83 -msgid "View job" -msgstr "ジョブの表示" - -#: client/src/notifications/notificationTemplates.list.js:98 -msgid "View notification" -msgstr "通知の表示" - -#: client/src/scheduler/schedules.list.js:103 -msgid "View schedule" -msgstr "スケジュールの表示" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:114 -msgid "View source" -msgstr "ソースの表示" - -#: client/src/teams/teams.list.js:67 -msgid "View team" -msgstr "チームの表示" - -#: client/src/templates/templates.list.js:103 -msgid "View template" -msgstr "テンプレートの表示" - -#: client/features/output/output.strings.js:22 -#: client/lib/components/components.strings.js:63 -msgid "View the Credential" -msgstr "認証情報の表示" - -#: client/features/output/output.strings.js:26 -msgid "View the Inventory" -msgstr "インベントリーの表示" - -#: client/features/output/output.strings.js:29 -msgid "View the Job Template" -msgstr "ジョブテンプレートの表示" - -#: client/features/output/output.strings.js:27 -#: client/features/output/output.strings.js:31 -msgid "View the Project" -msgstr "プロジェクトの表示" - -#: client/features/output/output.strings.js:33 -msgid "View the Schedule" -msgstr "スケジュールの表示" - -#: client/features/output/output.strings.js:35 -msgid "View the User" -msgstr "ユーザーの表示" - -#: client/src/projects/projects.list.js:115 -msgid "View the project" -msgstr "プロジェクトの表示" - -#: client/src/scheduler/scheduled-jobs.list.js:79 -msgid "View the schedule" -msgstr "スケジュールの表示" - -#: client/features/output/output.strings.js:34 -#: client/src/workflow-results/workflow-results.controller.js:63 -msgid "View the source Workflow Job" -msgstr "ソースのワークフロージョブの表示" - -#: client/features/output/output.strings.js:41 -msgid "View the webhook configuration on the job template." -msgstr "ジョブテンプレートで Webhook 設定を表示します。" - -#: client/features/output/output.strings.js:42 -#: client/src/workflow-results/workflow-results.controller.js:65 -msgid "View the webhook configuration on the workflow job template." -msgstr "ワークフローのジョブテンプレートで Webhook 設定を表示します。" - -#: client/src/users/users.list.js:73 -msgid "View user" -msgstr "ユーザーの表示" - -#: client/lib/components/components.strings.js:91 -msgid "Views" -msgstr "ビュー" - -#: client/features/templates/templates.strings.js:148 -msgid "WARNING: UNSAVED CHANGES" -msgstr "警告: 変更が保存されていません" - -#: client/src/templates/workflows.form.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js:47 -msgid "WORKFLOW" -msgstr "ワークフロー" - -#: client/features/templates/templates.strings.js:136 -msgid "WORKFLOW VISUALIZER" -msgstr "ワークフロービジュアライザー" - -#: client/features/templates/templates.strings.js:115 -msgid "Wait For Approval" -msgstr "承認待ち" - -#: client/features/templates/templates.strings.js:121 -#: client/src/scheduler/scheduler.strings.js:58 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:369 -msgid "Warning" -msgstr "警告" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:52 -#: client/src/configuration/forms/settings-form.controller.js:444 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:50 -msgid "Warning: Unsaved Changes" -msgstr "警告: 変更が保存されていません" - -#: client/src/license/license.controller.js:159 -msgid "We were unable to locate licenses associated with this account" -msgstr "このアカウントに関連するライセンスを見つけることができませんでした" - -#: client/features/jobs/jobs.strings.js:17 -#: client/features/output/output.strings.js:53 -#: client/src/workflow-results/workflow-results.controller.js:88 -msgid "Webhook" -msgstr "Webhook" - -#: client/src/templates/job_templates/job-template.form.js:462 -#: client/src/templates/job_templates/job-template.form.js:473 -#: client/src/templates/workflows.form.js:235 -#: client/src/templates/workflows.form.js:246 -msgid "Webhook Credential" -msgstr "Webhook の認証情報" - -#: client/src/templates/job_templates/job-template.form.js:430 -#: client/src/templates/job_templates/job-template.form.js:456 -#: client/src/templates/workflows.form.js:203 -#: client/src/templates/workflows.form.js:229 -msgid "Webhook Key" -msgstr "Webhook キー" - -#: client/src/templates/job_templates/job-template.form.js:405 -#: client/src/templates/job_templates/job-template.form.js:414 -#: client/src/templates/workflows.form.js:178 -#: client/src/templates/workflows.form.js:187 -msgid "Webhook Service" -msgstr "Webhook サービス" - -#: client/src/templates/job_templates/job-template.form.js:419 -#: client/src/templates/job_templates/job-template.form.js:425 -#: client/src/templates/workflows.form.js:192 -#: client/src/templates/workflows.form.js:198 -msgid "Webhook URL" -msgstr "Webhook URL" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:78 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:69 -msgid "Webhook services can launch jobs with this job template by making a POST request to this URL." -msgstr "Webhook サービスは、この URL への POST 要求を作成してこのジョブテンプレートでジョブを起動できます。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:47 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:79 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:70 -msgid "Webhook services can use this as a shared secret." -msgstr "Webhook サービスは、これを共有のシークレットとして使用できます。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:434 -#: client/src/scheduler/scheduler.strings.js:39 -msgid "Wed" -msgstr "水" - -#: client/src/license/license.partial.html:82 -msgid "Welcome to Ansible Tower! Please complete the steps below to acquire a license." -msgstr "Ansible Tower へようこそ! ライセンスを取得するために以下のステップを完了してください。" - -#: client/src/login/loginModal/loginModal.partial.html:23 -msgid "Welcome to Ansible {{BRAND_NAME}}!  Please sign in." -msgstr "Ansible {{BRAND_NAME}} へようこそ!  サインインしてください。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:355 -msgid "When not checked, a merge will be performed, combining local variables with those found on the external source." -msgstr "チェックが付けられていない場合、ローカル変数と外部ソースにあるものを組み合わせるマージが実行されます。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:344 -msgid "When not checked, local child hosts and groups not found on the external source will remain untouched by the inventory update process." -msgstr "チェックが付けられていない場合、外部ソースにないローカルの子ホストおよびグループは、インベントリーの更新プロセスによって処理されないままになります。" - -#: client/features/output/output.strings.js:25 -msgid "When this field is true, the job's inventory belongs to an organization that has exceeded it's limit of hosts as defined by the system administrator." -msgstr "このフィールドが True の場合には、ジョブのインベントリーが所属する組織では、システム管理者が定義したホストの上限を超えてしまいます。" - -#: client/src/projects/projects.form.js:50 -msgid "When this project is used by a Job Template, Organization cannot be changed." -msgstr "このプロジェクトがジョブテンプレートで使用されている場合には、組織は変更できません。" - -#: client/features/templates/templates.strings.js:119 -#: client/src/workflow-results/workflow-results.controller.js:100 -msgid "Workflow" -msgstr "ワークフロー" - -#: client/src/notifications/notificationTemplates.form.js:638 -msgid "Workflow Approved Message" -msgstr "ワークフロー承認メッセージ" - -#: client/src/notifications/notificationTemplates.form.js:649 -msgid "Workflow Approved Message Body" -msgstr "ワークフロー承認メッセージのボディー" - -#: client/src/notifications/notificationTemplates.form.js:661 -msgid "Workflow Denied Message" -msgstr "ワークフロー拒否メッセージ" - -#: client/src/notifications/notificationTemplates.form.js:672 -msgid "Workflow Denied Message Body" -msgstr "ワークフロー拒否メッセージのボディー" - -#: client/features/jobs/jobs.strings.js:11 -msgid "Workflow Job" -msgstr "ワークフロージョブ" - -#: client/lib/models/models.strings.js:49 -msgid "Workflow Job Template Nodes" -msgstr "ワークフロージョブテンプレートのノード" - -#: client/lib/models/models.strings.js:45 -msgid "Workflow Job Templates" -msgstr "ワークフロージョブテンプレート" - -#: client/src/notifications/notificationTemplates.form.js:684 -msgid "Workflow Pending Approval Message" -msgstr "ワークフロー承認待ちメッセージ" - -#: client/src/notifications/notificationTemplates.form.js:695 -msgid "Workflow Pending Approval Message Body" -msgstr "ワークフロー承認待ちメッセージのボディー" - -#: client/features/templates/templates.strings.js:14 -#: client/lib/components/components.strings.js:132 -#: client/src/templates/templates.list.js:66 -msgid "Workflow Template" -msgstr "ワークフローテンプレート" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:41 -msgid "Workflow Templates" -msgstr "ワークフローテンプレート" - -#: client/src/notifications/notificationTemplates.form.js:707 -msgid "Workflow Timed Out Message" -msgstr "ワークフローのタイムアウトメッセージ" - -#: client/src/notifications/notificationTemplates.form.js:718 -msgid "Workflow Timed Out Message Body" -msgstr "ワークフローのタイムアウトメッセージのボディー" - -#: client/src/shared/form-generator.js:1676 -#: client/src/templates/workflows.form.js:367 -msgid "Workflow Visualizer" -msgstr "ワークフロービジュアライザー" - -#: client/features/users/tokens/tokens.strings.js:31 -msgid "Write" -msgstr "書き込み" - -#: client/lib/components/code-mirror/code-mirror.strings.js:13 -#: client/lib/services/base-string.service.js:72 -msgid "YAML" -msgstr "YAML" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:159 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:183 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:207 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:282 -msgid "YAML:" -msgstr "YAML:" - -#: client/lib/services/base-string.service.js:76 -msgid "YES" -msgstr "YES" - -#: client/src/notifications/add/add.controller.js:88 -#: client/src/notifications/edit/edit.controller.js:151 -msgid "Yellow" -msgstr "黄" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:57 -msgid "You can create a job template here." -msgstr "ジョブテンプレートをここに作成できます。" - -#: client/features/templates/templates.strings.js:101 -msgid "You do not have access to all resources used by this workflow. Resources that you don't have access to will not be copied and will result in an incomplete workflow." -msgstr "このワークフローで使用されるすべてのリソースへのアクセスがありません。アクセスのないリソースはコピーされず、結果としてワークフローが不完全になります。" - -#: client/src/projects/factories/get-project-path.factory.js:56 -msgid "You do not have access to view this property" -msgstr "これを適切に表示するためのアクセス権がありません。" - -#: client/src/templates/main.js:128 -msgid "You do not have permission to add a job template, or there are no projects available." -msgstr "ジョブテンプレート追加のパーミッションがないか、利用可能なプロジェクトはありません。" - -#: client/src/projects/add/projects-add.controller.js:35 -msgid "You do not have permission to add a project." -msgstr "プロジェクトを追加するパーミッションがありません。" - -#: client/src/users/add/users-add.controller.js:45 -msgid "You do not have permission to add a user." -msgstr "ユーザーを追加するパーミッションがありません。" - -#: client/src/templates/main.js:367 -msgid "You do not have permission to add a workflow job template." -msgstr "ワークフロージョブテンプレートを追加するパーミッションがありません。" - -#: client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js:190 -msgid "You do not have permission to manage this user" -msgstr "このユーザーを管理するパーミッションがありません。" - -#: client/features/templates/templates.strings.js:80 -msgid "You do not have permission to perform this action." -msgstr "このアクションを実行するパーミッションがありません。" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "You do not have permission to view this job." -msgstr "このジョブを表示するパーミッションがありません。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:41 -msgid "You do not have sufficient permissions to edit the host filter." -msgstr "ホストフィルターの編集に必要なパーミッションがありません。" - -#: client/src/login/loginModal/loginModal.partial.html:34 -msgid "You have been logged out. Please sign in." -msgstr "ログアウトされました。サインインしてください。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:51 -#: client/src/configuration/forms/settings-form.controller.js:443 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:49 -msgid "You have unsaved changes. Would you like to proceed without saving?" -msgstr "保存されていない変更があります。変更せずに次に進みますか?" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook." -msgstr "Playbook を選択する前に正常な更新を実行する必要があります。有効な Playbook がないとこのジョブテンプレートを保存することはできません。" - -#: client/features/projects/projects.strings.js:21 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "Your request to cancel the update was submitted to the task manager." -msgstr "更新を取り消す要求がタスクマネージャーに送信されました。" - -#: client/src/login/loginModal/loginModal.partial.html:28 -msgid "Your session timed out due to inactivity. Please sign in." -msgstr "アイドル時間によりセッションがタイムアウトしました。サインインしてください。" - -#: client/index.template.ejs:32 -msgid "Your session will expire in 60 seconds, would you like to continue?" -msgstr "セッションは 60 秒後に期限切れになります。続行しますか?" - -#: client/src/shared/form-generator.js:1169 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "and" -msgstr "and" - -#: client/src/activity-stream/factories/build-description.factory.js:133 -msgid "approved" -msgstr "承認" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "button to view the latest status." -msgstr "最新ステータスを表示するボタン" - -#: client/features/users/tokens/tokens.strings.js:27 -msgid "by" -msgstr " 作成者: " - -#: client/features/jobs/jobs.strings.js:29 -msgid "canceled" -msgstr "取り消し済み" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "characters long." -msgstr "文字の長さ。" - -#: client/src/activity-stream/factories/build-description.factory.js:138 -msgid "denied" -msgstr "拒否" - -#: client/features/output/output.strings.js:104 -#: client/src/shared/smart-search/smart-search.partial.html:50 -msgid "documentation" -msgstr "ドキュメント" - -#: client/features/jobs/jobs.strings.js:28 -msgid "error" -msgstr "エラー" - -#: client/features/jobs/jobs.strings.js:27 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -msgid "failed" -msgstr "失敗" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "from the" -msgstr " 削除元:" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -#: client/src/inventories-hosts/inventory-hosts.strings.js:8 -msgid "group" -msgid_plural "groups" -msgstr[0] "group" -msgstr[1] "グループ" - -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:49 -msgid "groups with sync failures. Click for details" -msgstr "同期が失敗しているグループです。クリックして詳細を確認してください。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:9 -msgid "host" -msgid_plural "hosts" -msgstr[0] "ホスト" -msgstr[1] "ホスト" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:64 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:61 -msgid "hosts with failures. Click for details." -msgstr "障害のあるホストです。クリックして詳細を確認してください。" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:146 -msgid "min" -msgstr "分" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "missing" -msgstr "不明" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:21 -msgid "name" -msgstr "名前" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "never updated" -msgstr "未更新" - -#: client/features/jobs/jobs.strings.js:22 -msgid "new" -msgstr "新規" - -#: client/src/shared/paginate/paginate.partial.html:34 -#: client/src/shared/paginate/paginate.partial.html:45 -msgid "of" -msgstr " /" - -#: client/src/scheduler/scheduler.strings.js:34 -msgid "on" -msgstr "オン" - -#: client/src/scheduler/scheduler.strings.js:31 -msgid "on day" -msgstr "日数" - -#: client/src/scheduler/scheduler.strings.js:35 -msgid "on days" -msgstr "日数" - -#: client/src/scheduler/scheduler.strings.js:33 -msgid "on the" -msgstr "実行日" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:24 -msgid "organization" -msgstr "組織" - -#: client/features/jobs/jobs.strings.js:23 -msgid "pending" -msgstr "保留" - -#: client/src/shared/form-generator.js:1044 -msgid "playbook" -msgstr "Playbook" - -#: client/features/jobs/jobs.strings.js:25 -msgid "running" -msgstr "実行中" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:150 -msgid "sec" -msgstr "秒" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "section" -msgstr "セクション" - -#: client/features/credentials/credentials.strings.js:35 -msgid "selected" -msgstr "選択済み" - -#: client/src/credentials/credentials.form.js:138 -#: client/src/credentials/credentials.form.js:363 -msgid "set in helpers/credentials" -msgstr "ヘルパー/認証情報で設定" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:47 -msgid "sources with sync failures. Click for details" -msgstr "同期が失敗しているソースです。クリックして詳細を確認してください。" - -#: client/features/jobs/jobs.strings.js:26 -msgid "successful" -msgstr "成功" - -#: client/src/activity-stream/factories/build-description.factory.js:136 -msgid "timed out" -msgstr "タイムアウト" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "to" -msgstr " 〜 " - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "to start it now." -msgstr "すぐに開始します。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "to update." -msgstr "更新します。" - -#: client/src/activity-stream/factories/build-description.factory.js:141 -msgid "updated" -msgstr "更新" - -#: client/src/credentials/credentials.form.js:380 -msgid "v2 URLs%s - leave blank" -msgstr "v2 URL%s - 空白にする" - -#: client/src/credentials/credentials.form.js:381 -msgid "v3 default%s - set to 'default'" -msgstr "v3 デフォルト%s - 「デフォルト」に設定" - -#: client/src/credentials/credentials.form.js:382 -msgid "v3 multi-domain%s - your domain name" -msgstr "v3 マルチドメイン%s - ドメイン名" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:278 -msgid "view azure_rm.ini in the Ansible community.general github repo." -msgstr "Ansible community.general github リポジトリーの azure_rm.ini を表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -msgid "view cloudforms.ini in the Ansible Collections github repo." -msgstr "Ansible Collections github リポジトリーのcloudforms.ini を表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:179 -msgid "view ec2.ini in the community.aws repo." -msgstr "community.aws リポジトリーの ec2.ini を表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:261 -msgid "view foreman.ini in the Ansible Collections github repo." -msgstr "Ansible Collections github リポジトリーの foreman.ini を表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:227 -msgid "view openstack.yml in the Openstack github repo." -msgstr "Openstack github リポジトリーの openstack.yml を表示します。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:203 -msgid "view vmware_inventory.ini in the vmware community repo." -msgstr "vmware コミュニティーリポジトリーの vmware_inventory.ini を表示します。" - -#: client/features/jobs/jobs.strings.js:24 -msgid "waiting" -msgstr "待機中" - -#: client/index.template.ejs:158 -msgid "working..." -msgstr "実行中..." - -#: client/features/users/tokens/tokens.strings.js:42 -msgid "{{ appName }} Token" -msgstr "{{ appName }} トークン" - -#: client/lib/services/base-string.service.js:158 -msgid "{{ header }} {{ body }}" -msgstr "{{ header }} {{ body }}" - -#: client/lib/services/base-string.service.js:80 -msgid "{{ resource }} successfully created" -msgstr "{{ resource }} が正常に作成されました" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:31 -msgid "{{ str1 }}

{{ str2 }}

" -msgstr "{{ str1 }}

{{ str2 }}

" - -#: client/lib/components/cards/card.partial.html:2 -msgid "{{ title }}" -msgstr "{{ title }}" - -#: client/src/instance-groups/container-groups/add-container-group.view.html:24 -msgid "{{ vm.form.extraVars.toggleLabel }}" -msgstr "{{ vm.form.extraVars.toggleLabel }}" - -#: client/src/configuration/forms/settings-form.partial.html:10 -#: client/src/configuration/forms/settings-form.route.js:15 -msgid "{{ vm.getCurrentFormTitle() }}" -msgstr "{{ vm.getCurrentFormTitle() }}" - -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:5 -msgid "{{:: vm.strings.get('prompt.JOB_TYPE') }}" -msgstr "{{:: vm.strings.get('prompt.JOB_TYPE') }}" - -#: client/lib/components/input/label.partial.html:5 -msgid "{{::state._hint}}" -msgstr "{{::state._hint}}" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:6 -#: client/src/configuration/forms/system-form/configuration-system.partial.html:5 -msgid "{{opt.label}}" -msgstr "{{opt.label}}" - -#: client/src/shared/paginate/paginate.partial.html:56 -msgid "{{pageSize}}" -msgstr "{{pageSize}}" - diff --git a/awx/ui/po/nl.po b/awx/ui/po/nl.po deleted file mode 100644 index c311590856..0000000000 --- a/awx/ui/po/nl.po +++ /dev/null @@ -1,8189 +0,0 @@ -msgid "" -msgstr "" -"Language: nl \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" - -#: client/src/projects/add/projects-add.controller.js:166 -#: client/src/projects/edit/projects-edit.controller.js:287 -msgid "%sNote:%s Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." -msgstr "%sLet op:%s wachtwoordauthenticatie voor SSH wordt niet ondersteund door Mercurial. Zet de gebruikersnaam en sleutel niet in de URL. Indien u Bitbucket en SSH gebruikt, noem uw Bitbucket-gebruikersnaam dan niet." - -#: client/src/projects/add/projects-add.controller.js:145 -#: client/src/projects/edit/projects-edit.controller.js:266 -msgid "%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." -msgstr "%sLet op:%s als u een SSH-protocol gebruikt voor GitHub of Bitbucket, voer dan alleen een SSH-sleutel in. Voer geen gebruikersnaam in (behalve git). Daarnaast ondersteunen GitHub en Bitbucket geen wachtwoordauthenticatie bij gebruik van SSH. Het GIT-alleen-lezen-protocol (git://) gebruikt geen gebruikersnaam- of wachtwoordinformatie." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:62 -msgid "(HH24:MM:SS UTC)" -msgstr "(UU24:MM:SS UTC)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:57 -msgid "(HH24:MM:SS)" -msgstr "(UU24:MM:SS)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:568 -msgid "(Limited to first 10)" -msgstr "(Beperkt tot de eerste 10)" - -#: client/src/credentials/credentials.form.js:286 -msgid "(defaults to %s)" -msgstr "(wordt standaard %s)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -msgid "(seconds)" -msgstr "(seconden)" - -#: client/src/shared/paginate/paginate.partial.html:67 -msgid "100" -msgstr "100" - -#: client/src/shared/paginate/paginate.partial.html:61 -msgid "20" -msgstr "20" - -#: client/src/shared/paginate/paginate.partial.html:64 -msgid "50" -msgstr "50" - -#: client/src/license/license.partial.html:193 -msgid "Automation analytics: This data is used to enhance future releases of the Tower Software and to provide Automation Analytics to Tower subscribers." -msgstr "Automatiseringsanalyse: deze gegevens worden gebruikt om toekomstige versies van de Tower-software te verbeteren en automatiseringsanalyses te bieden aan Tower-abonnees." - -#: client/src/license/license.partial.html:171 -msgid "I agree to the End User License Agreement" -msgstr "Ik ga akkoord met de licentie-overeenkomst voor eindgebruikers" - -#: client/src/license/license.partial.html:187 -msgid "User analytics: This data is used to enhance future releases of the Tower Software and help streamline customer experience and success." -msgstr "Gebruikersanalyse: deze gegevens worden gebruikt om toekomstige versies van de Tower-software en de ervaring en uitkomst voor klanten te verbeteren." - -#: client/src/login/loginModal/loginModal.partial.html:32 -msgid "" -"\n" -"
\n" -" You have been logged out. Please sign in.\n" -"
" -msgstr "\n" -"
\n" -" U bent uitgelogd. Log opnieuw in.\n" -"
" - -#: client/lib/components/code-mirror/code-mirror.strings.js:19 -msgid "" -"

\n" -" Enter inventory variables using either JSON or YAML\n" -" syntax. Use the radio button to toggle between the two.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" View YAML examples at\n" -" \n" -" docs.ansible.com\n" -"

" -msgstr "

\n" -" Voeg de variabelen van het inventaris in met JSON- of YAML-syntaxis. Gebruik de radio-knop om tussen de twee te wisselen.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",,\n" -"
\"wachtwoord\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
wachtwoord: magic\n" -"
\n" -"
\n" -"

\n" -" Raadpleeg\n" -" www.json.org voor voorbeelden van JSON\n" -"

\n" -"

\n" -" Raadpleeg \n" -" \n" -" docs.ansible.com voor voorbeelden van YAML\n" -"

" - -#: client/features/templates/templates.strings.js:65 -msgid "

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" -msgstr "

Geef extra commandoregelvariabelen op in het draaiboek. Dit is de commandoregelparameter -e of --extra-vars voor het ansible-draaiboek. Geef sleutel/waarde-paren op met YAML of JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:213 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:222 -msgid "A NEW WEBHOOK KEY WILL BE GENERATED ON SAVE" -msgstr "ER WORDT EEN NIEUWE WEBHOOKSLEUTEL GEGENEREERD OP SAVE" - -#: client/src/projects/projects.form.js:138 -msgid "A refspec to fetch (passed to the Ansible git module). This parameter allows access to references via the branch field not otherwise available." -msgstr "Een refspec om op te halen (doorgegeven aan de Ansible git module). Deze parameter maakt toegang tot referenties mogelijk via het vertakkingsveld dat anders niet beschikbaar is." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 -#: client/src/scheduler/scheduler.strings.js:22 -msgid "A schedule name is required." -msgstr "Een naam voor het schema is vereist." - -#: client/src/users/add/users-add.controller.js:104 -msgid "A value is required" -msgstr "Een waarde is vereist" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:173 -msgid "A value is required." -msgstr "Een waarde is vereist." - -#: client/src/about/about.route.js:10 -msgid "ABOUT" -msgstr "OVER" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:18 -msgid "ACTION" -msgstr "ACTIE" - -#: client/src/activity-stream/activity-detail.form.js:23 -msgid "ACTIVITY DETAIL" -msgstr "ACTIVITEITSGEGEVENS" - -#: client/src/activity-stream/activitystream.route.js:28 -#: client/src/activity-stream/streams.list.js:14 -#: client/src/activity-stream/streams.list.js:15 -msgid "ACTIVITY STREAM" -msgstr "ACTIVITEITENLOGBOEK" - -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:7 -msgid "ADD" -msgstr "TOEVOEGEN" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:3 -msgid "ADD A NEW TEMPLATE" -msgstr "EEN NIEUW SJABLOON TOEVOEGEN" - -#: client/features/templates/templates.strings.js:123 -msgid "ADD A NODE" -msgstr "EEN KNOOPPUNT TOEVOEGEN" - -#: client/features/templates/templates.strings.js:141 -msgid "ADD LINK" -msgstr "LINK TOEVOEGEN" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:16 -msgid "ADD SURVEY PROMPT" -msgstr "MELDING VRAGENLIJST TOEVOEGEN" - -#: client/src/shared/smart-search/smart-search.partial.html:48 -msgid "ADDITIONAL INFORMATION" -msgstr "AANVULLENDE INFORMATIE" - -#: client/features/output/output.strings.js:101 -msgid "ADDITIONAL_INFORMATION" -msgstr "AANVULLENDE_INFORMATIE" - -#: client/src/organizations/linkout/organizations-linkout.route.js:241 -#: client/src/organizations/list/organizations-list.controller.js:90 -msgid "ADMINS" -msgstr "BEHEERDERS" - -#: client/src/activity-stream/get-target-title.factory.js:4 -msgid "ALL ACTIVITY" -msgstr "ALLE ACTIVITEIT" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:44 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js:47 -msgid "ALL GROUPS" -msgstr "ALLE GROEPEN" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "ANY" -msgstr "IEDERE" - -#: client/src/credentials/credentials.form.js:198 -msgid "API Key" -msgstr "API-sleutel" - -#: client/src/notifications/notificationTemplates.form.js:263 -msgid "API Service/Integration Key" -msgstr "Service-/integratiesleutel API" - -#: client/src/notifications/shared/type-change.service.js:66 -msgid "API Token" -msgstr "API-token" - -#: client/src/notifications/notificationTemplates.form.js:348 -msgid "API URL" -msgstr "API URL" - -#: client/features/users/tokens/tokens.strings.js:40 -msgid "APPLICATION" -msgstr "TOEPASSING" - -#: client/features/applications/applications.strings.js:23 -msgid "APPLICATION INFORMATION" -msgstr "TOEPASSINGSINFORMATIE" - -#: client/features/applications/applications.strings.js:28 -#: client/features/applications/applications.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:47 -msgid "APPLICATIONS" -msgstr "TOEPASSINGEN" - -#: client/lib/components/components.strings.js:126 -msgid "APPROVAL" -msgstr "GOEDKEURING" - -#: client/features/templates/templates.strings.js:155 -msgid "APPROVAL TIMED OUT" -msgstr "GOEDKEURING VERLOPEN" - -#: client/lib/components/components.strings.js:128 -msgid "APPROVE" -msgstr "GOEDKEUREN" - -#: client/features/templates/templates.strings.js:157 -msgid "APPROVED" -msgstr "GOEDGEKEURD" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js:19 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js:19 -msgid "ASSOCIATED GROUPS" -msgstr "VERBONDEN GROEPEN" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js:19 -msgid "ASSOCIATED HOSTS" -msgstr "VERBONDEN HOSTS" - -#: client/lib/components/components.strings.js:89 -#: client/lib/components/layout/layout.partial.html:24 -msgid "About" -msgstr "Over" - -#: client/lib/components/components.strings.js:93 -msgid "Access" -msgstr "Toegang" - -#: client/src/credentials/credentials.form.js:91 -msgid "Access Key" -msgstr "Toegangssleutel" - -#: client/src/configuration/settings.service.js:40 -msgid "Access Token Expiration" -msgstr "Toegangstoken vervallen" - -#: client/src/notifications/notificationTemplates.form.js:241 -msgid "Account SID" -msgstr "SID account" - -#: client/src/notifications/notificationTemplates.form.js:200 -msgid "Account Token" -msgstr "Accounttoken" - -#: client/src/activity-stream/activity-detail.form.js:36 -msgid "Action" -msgstr "Actie" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:21 -#: client/src/inventories-hosts/hosts/hosts.partial.html:49 -#: client/src/shared/form-generator.js:1872 -#: client/src/shared/list-generator/list-generator.factory.js:571 -msgid "Actions" -msgstr "Acties" - -#: client/features/templates/templates.strings.js:18 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:18 -#: client/src/templates/templates.list.js:36 -msgid "Activity" -msgstr "Activiteit" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:84 -msgid "Activity Stream" -msgstr "Activiteitenlogboek" - -#: client/features/credentials/legacy.credentials.js:70 -#: client/src/credentials/credentials.form.js:446 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:113 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:110 -#: client/src/organizations/organizations.form.js:108 -#: client/src/organizations/organizations.form.js:150 -#: client/src/projects/projects.form.js:285 -#: client/src/teams/teams.form.js:169 -#: client/src/teams/teams.form.js:85 -#: client/src/templates/workflows.form.js:295 -#: client/src/users/users.form.js:221 -msgid "Add" -msgstr "Toevoegen" - -#: client/src/instance-groups/instance-groups.strings.js:74 -msgid "Add Container Group" -msgstr "Containergroep toevoegen" - -#: client/src/instance-groups/instance-groups.strings.js:75 -msgid "Add Credential" -msgstr "Toegangsgegevens toevoegen" - -#: client/src/credentials/credentials.list.js:14 -msgid "Add Credentials" -msgstr "Toegangsgegevens toevoegen" - -#: client/src/inventories-hosts/inventories/inventory.list.js:13 -msgid "Add Inventories" -msgstr "Inventarissen toevoegen" - -#: client/src/shared/stateDefinitions.factory.js:304 -msgid "Add Permissions" -msgstr "Machtigingen toevoegen" - -#: client/src/projects/projects.list.js:13 -msgid "Add Project" -msgstr "Project toevoegen" - -#: client/src/shared/form-generator.js:1664 -#: client/src/templates/job_templates/job-template.form.js:596 -#: client/src/templates/workflows.form.js:351 -msgid "Add Survey" -msgstr "Vragenlijst toevoegen" - -#: client/src/teams/teams.list.js:13 -msgid "Add Team" -msgstr "Team toevoegen" - -#: client/src/teams/teams.form.js:86 -msgid "Add User" -msgstr "Gebruiker toevoegen" - -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/shared/stateDefinitions.factory.js:594 -#: client/src/users/users.list.js:17 -msgid "Add Users" -msgstr "Gebruikers toevoegen" - -#: client/src/organizations/organizations.form.js:109 -msgid "Add Users to this organization." -msgstr "Gebruikers toevoegen aan deze organisatie." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:58 -msgid "Add a group" -msgstr "Een groep toevoegen" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:135 -msgid "Add a host" -msgstr "Een host toevoegen" - -#: client/src/instance-groups/instance-groups.strings.js:44 -msgid "Add a new instance" -msgstr "Een nieuwe instantie toevoegen" - -#: client/src/instance-groups/instance-groups.strings.js:25 -msgid "Add a new instance group" -msgstr "Een nieuwe instantiegroep toevoegen" - -#: client/src/organizations/list/organizations-list.partial.html:20 -msgid "Add a new organization" -msgstr "Een nieuwe organisatie toevoegen" - -#: client/features/projects/projects.strings.js:14 -msgid "Add a new project" -msgstr "Een nieuw project toevoegen" - -#: client/src/scheduler/schedules.list.js:81 -msgid "Add a new schedule" -msgstr "Een nieuw schema toevoegen" - -#: client/features/templates/templates.strings.js:24 -msgid "Add a new template" -msgstr "Een nieuw sjabloon toevoegen" - -#: client/features/users/tokens/tokens.strings.js:43 -msgid "Add a new token" -msgstr "Een nieuwe token toevoegen" - -#: client/features/credentials/legacy.credentials.js:71 -#: client/src/credentials/credentials.form.js:447 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:115 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:112 -#: client/src/organizations/organizations.form.js:151 -#: client/src/projects/projects.form.js:286 -#: client/src/templates/job_templates/job-template.form.js:541 -#: client/src/templates/workflows.form.js:296 -msgid "Add a permission" -msgstr "Een machtiging toevoegen" - -#: client/src/organizations/linkout/organizations-linkout.route.js:63 -msgid "Add existing user to organization" -msgstr "Voeg een bestaande gebruiker toe aan de organisatie" - -#: client/src/organizations/linkout/organizations-linkout.route.js:256 -msgid "Add existing user to organization as administrator" -msgstr "Voeg een bestaande gebruiker toe aan de organisatie als beheerder" - -#: client/src/shared/form-generator.js:1394 -msgid "Admin" -msgstr "Beheerder" - -#: client/lib/components/components.strings.js:94 -msgid "Administration" -msgstr "Beheer" - -#: client/src/organizations/linkout/organizations-linkout.route.js:262 -msgid "Admins" -msgstr "Beheerders" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -msgid "After every project update where the SCM revision changes, refresh the inventory from the selected source before executing job tasks. This is intended for static content, like the Ansible inventory .ini file format." -msgstr "Na iedere projectupdate waarbij de SCM-revisie verandert, dient het inventaris vernieuwd te worden vanuit de geselecteerde bron voordat de opdrachten die bij de taak horen uitgevoerd worden. Dit is bedoeld voor statische content, zoals .ini, het inventarisbestandsformaat van Ansible." - -#: client/features/templates/templates.strings.js:160 -#: client/lib/components/components.strings.js:105 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:41 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:49 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:72 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:80 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "All" -msgstr "Alle" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 -msgid "All Activity" -msgstr "Alle activiteit" - -#: client/features/portalMode/index.view.html:33 -msgid "All Jobs" -msgstr "Alle taken" - -#: client/src/projects/projects.form.js:208 -#: client/src/projects/projects.form.js:211 -msgid "Allow branch override" -msgstr "Overschrijven van vertakking toelaten" - -#: client/src/projects/projects.form.js:210 -msgid "Allow changing the SCM branch or revision in a job template that uses this project." -msgstr "Wijzigen van de SCM-vertakking of de revisie toelaten in een taaksjabloon die gebruik maakt van dit project." - -#: client/features/templates/templates.strings.js:114 -#: client/src/workflow-results/workflow-results.controller.js:97 -msgid "Always" -msgstr "Altijd" - -#: client/features/projects/projects.strings.js:25 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "An SCM update does not appear to be running for project:" -msgstr "Het lijkt er op dat er geen SCM-update bezig is voor project:" - -#: client/lib/services/base-string.service.js:83 -msgid "Ansible AWX Logo" -msgstr "Ansible AWX-logo" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:66 -#: client/src/organizations/organizations.form.js:47 -#: client/src/organizations/organizations.form.js:52 -#: client/src/projects/projects.form.js:238 -#: client/src/projects/projects.form.js:243 -#: client/src/templates/job_templates/job-template.form.js:255 -#: client/src/templates/job_templates/job-template.form.js:261 -msgid "Ansible Environment" -msgstr "Ansible-omgeving" - -#: client/src/projects/projects.form.js:145 -msgid "Ansible Tower Documentation" -msgstr "Documentatie Ansible Tower" - -#: client/lib/services/base-string.service.js:84 -msgid "Ansible Tower Logo" -msgstr "Ansible Tower-logo" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:62 -#: client/src/templates/survey-maker/shared/question-definition.form.js:68 -msgid "Answer Type" -msgstr "Antwoordtype" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:44 -#: client/src/templates/survey-maker/shared/question-definition.form.js:53 -msgid "Answer Variable Name" -msgstr "Antwoord naam variabele" - -#: client/features/templates/templates.strings.js:161 -msgid "Any" -msgstr "Iedere" - -#: client/features/users/tokens/users-tokens-add.controller.js:15 -msgid "Application" -msgstr "Toepassing" - -#: client/lib/components/components.strings.js:87 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 -msgid "Applications" -msgstr "Toepassingen" - -#: client/features/templates/templates.strings.js:153 -#: client/src/notifications/notifications.list.js:40 -msgid "Approval" -msgstr "Goedkeuring" - -#: client/src/workflow-results/workflow-results.service.js:87 -msgid "Are you sure you want to cancel this workflow job?" -msgstr "Weet u zeker dat u deze workflowtaak wilt annuleren?" - -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:110 -msgid "Are you sure you want to delete this job?" -msgstr "Weet u zeker dat u deze taak wilt verwijderen?" - -#: client/src/notifications/notification-templates-list/list.controller.js:233 -msgid "Are you sure you want to delete this notification template?" -msgstr "Weet u zeker dat u dit berichtsjabloon wilt verwijderen?" - -#: client/src/scheduler/factories/delete-schedule.factory.js:58 -msgid "Are you sure you want to delete this schedule?" -msgstr "Weet u zeker dat u dit schema wilt verwijderen?" - -#: client/src/teams/list/teams-list.controller.js:80 -msgid "Are you sure you want to delete this team?" -msgstr "Weet u zeker dat u dit team wilt verwijderen?" - -#: client/src/users/list/users-list.controller.js:93 -msgid "Are you sure you want to delete this user?" -msgstr "Weet u zeker dat u deze gebruiker wilt verwijderen?" - -#: client/features/templates/templates.strings.js:110 -msgid "Are you sure you want to delete this workflow node?" -msgstr "Weet u zeker dat u dit workflowknooppunt wilt verwijderen?" - -#: client/src/workflow-results/workflow-results.service.js:42 -msgid "Are you sure you want to delete this workflow?" -msgstr "Weet u zeker dat u deze workflow wilt verwijderen?" - -#: client/lib/services/base-string.service.js:92 -msgid "Are you sure you want to delete this {{ resourceType }}?" -msgstr "Weet u zeker dat u dit {{ resourceType }} wilt verwijderen?" - -#: client/src/partials/survey-maker-modal.html:13 -msgid "Are you sure you want to delete this {{deleteMode}}?" -msgstr "Weet u zeker dat u deze {{deleteMode}} wilt verwijderen?" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:26 -msgid "Are you sure you want to disassociate the group below from" -msgstr "Weet u zeker dat u onderstaande groep los wilt koppelen van" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:24 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:27 -msgid "Are you sure you want to disassociate the host below from" -msgstr "Weet u zeker dat u onderstaande host los wilt koppelen van" - -#: client/features/templates/templates.strings.js:149 -msgid "Are you sure you want to exit the Workflow Creator without saving your changes?" -msgstr "Weet u zeker dat u de workflowcreator wil verlaten zonder uw wijzigingen op te slaan?" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:46 -msgid "Are you sure you want to permanently delete the group below from the inventory?" -msgstr "Weet u zeker dat u onderstaande groep permanent wilt verwijderen uit de inventaris?" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:104 -msgid "Are you sure you want to permanently delete the host below from the inventory?" -msgstr "Weet u zeker dat u onderstaande host permanent wilt verwijderen?" - -#: client/src/projects/edit/projects-edit.controller.js:242 -msgid "Are you sure you want to remove the %s below from %s?" -msgstr "Weet u zeker dat u onderstaande %s wilt verwijderen uit de %s?" - -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:67 -msgid "Are you sure you want to remove the following administrator from this organization?" -msgstr "Weet u zeker dat u de volgende beheerder wilt verwijderen uit deze organisatie?" - -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:66 -msgid "Are you sure you want to remove the following user from this organization?" -msgstr "Weet u zeker dat u de volgende gebruiker wilt verwijderen uit deze organisatie?" - -#: client/lib/services/base-string.service.js:109 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:109 -msgid "Are you sure you want to submit the request to cancel this job?" -msgstr "Weet u zeker dat u het verzoek om deze taak te annuleren in wilt dienen?" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:39 -msgid "Arguments" -msgstr "Argumenten" - -#: client/features/output/output.strings.js:59 -msgid "Artifacts" -msgstr "Artefacten" - -#: client/src/credentials/credentials.form.js:232 -#: client/src/credentials/credentials.form.js:271 -#: client/src/credentials/credentials.form.js:310 -#: client/src/credentials/credentials.form.js:396 -msgid "Ask at runtime?" -msgstr "Vragen bij runtime?" - -#: client/src/instance-groups/instance-groups.strings.js:36 -msgid "Associate an existing Instance" -msgstr "Een bestaande instantie verbinden" - -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:74 -msgid "Associate an existing group" -msgstr "Een bestaande groep verbinden" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:56 -msgid "Associate this host with a new group" -msgstr "Deze host verbinden met een nieuwe groep" - -#: client/src/shared/form-generator.js:1396 -msgid "Auditor" -msgstr "Controleur" - -#: client/lib/components/components.strings.js:95 -#: client/src/configuration/settings.partial.html:2 -msgid "Authentication" -msgstr "Authenticatie" - -#: client/src/credentials/credentials.form.js:72 -msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." -msgstr "Authenticatie voor toegang tot het netwerkapparaat. Hieronder kunnen vallen: SSH-sleutels, gebruikersnamen, wachtwoorden en autorisatie-informatie. Netwerktoegangsgegevens worden gebruikt voor het indienen van taken die draaiboeken afspelen tegen netwerkapparaten." - -#: client/src/credentials/credentials.form.js:68 -msgid "Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts." -msgstr "Authenticatie voor machinetoegang op afstand. Hieronder kunnen vallen: SSH-sleutels, gebruikersnamen, wachtwoorden en sudo-informatie. Machinetoegangsgegevens worden gebruikt voor het indienen van taken die draaiboeken afspelen tegen hosts op afstand." - -#: client/src/configuration/settings.service.js:48 -msgid "Authorization Code Expiration" -msgstr "Machtigingscode vervallen" - -#: client/src/credentials/credentials.form.js:342 -msgid "Authorize" -msgstr "Autoriseren" - -#: client/src/credentials/credentials.form.js:350 -msgid "Authorize Password" -msgstr "Wachtwoord autoriseren" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:241 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:253 -msgid "Availability Zone:" -msgstr "Beschikbaarheidsgebied:" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:91 -msgid "Azure AD" -msgstr "Azure AD" - -#: client/src/shared/directives.js:91 -msgid "BROWSE" -msgstr "BLADEREN" - -#: client/features/output/output.strings.js:124 -msgid "Back to Top" -msgstr "Omhoog" - -#: client/src/projects/projects.form.js:82 -msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." -msgstr "Basispad dat gebruikt wordt voor het vinden van draaiboeken. Mappen die binnen dit pad gevonden worden, zullen in het uitklapbare menu van de draaiboekmap genoemd worden. Het basispad en de gekozen draaiboekmap bieden samen het volledige pad dat gebruikt wordt om draaiboeken te vinden." - -#: client/src/notifications/shared/type-change.service.js:56 -msgid "Basic Auth Password" -msgstr "Wachtwoord basisauthenticatie" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:129 -msgid "Become Privilege Escalation" -msgstr "Verhoging van rechten worden" - -#: client/features/output/output.strings.js:87 -msgid "Branch" -msgstr "Vertakking" - -#: client/src/projects/projects.form.js:129 -msgid "Branch to checkout. In addition to branches, you can input tags, commit hashes, and arbitrary refs. Some commit hashes and refs may not be availble unless you also provide a custom refspec." -msgstr "Vertakking naar de kassa. Naast vertakkingen kunt u ook tags, commit hashes en willekeurige refs invoeren. Sommige commit hashes en refs zijn mogelijk niet beschikbaar, tenzij u ook een aangepaste refspec aanlevert." - -#: client/features/templates/templates.strings.js:72 -#: client/src/templates/job_templates/job-template.form.js:112 -msgid "Branch to use in job run. Project default used if blank." -msgstr "Vertakking om te gebruiken bij het uitvoeren van een taak. Standaardproject wordt gebruikt indien leeg." - -#: client/src/license/license.partial.html:113 -msgid "Browse" -msgstr "Bladeren" - -#: client/src/license/license.partial.html:180 -msgid "By default, Tower collects and transmits analytics data on Tower usage to Red Hat. There are two categories of data collected by Tower. For more information, see this Tower documentation page. Uncheck the following boxes to disable this feature." -msgstr "Tower verzamelt en verzendt gegevens over Tower-gebruik automatisch naar Red Hat. We zijn twee categorieën gegevens die verzameld worden door Tower. Ga voor meer informatie naar deze pagina over Tower. Vink de volgende vakjes uit om de deze functie uit te schakelen." - -#: client/features/templates/templates.strings.js:151 -#: client/lib/services/base-string.service.js:61 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:29 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:50 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:23 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:16 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:16 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:16 -#: client/src/license/license.partial.html:259 -#: client/src/partials/survey-maker-modal.html:17 -#: client/src/partials/survey-maker-modal.html:82 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:17 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:131 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:180 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:68 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:149 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:188 -msgid "CANCEL" -msgstr "ANNULEREN" - -#: client/index.template.ejs:116 -msgid "CAUTION: Setting both numerical variables to \"0\" will delete all facts." -msgstr "LET OP: door beide numerieke waarden in te stellen op '0' worden alle feiten verwijderd." - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:30 -msgid "CHANGES" -msgstr "WIJZIGINGEN" - -#: client/features/templates/templates.strings.js:131 -msgid "CHECK" -msgstr "CONTROLE" - -#: client/lib/components/components.strings.js:20 -msgid "CHOOSE A FILE" -msgstr "KIES EEN BESTAND" - -#: client/features/output/output.strings.js:103 -#: client/src/shared/smart-search/smart-search.partial.html:26 -msgid "CLEAR ALL" -msgstr "ALLES WISSEN" - -#: client/features/applications/applications.strings.js:21 -msgid "CLIENT ID" -msgstr "KLANT-ID" - -#: client/features/applications/applications.strings.js:22 -msgid "CLIENT SECRET" -msgstr "KLANT-GEHEIM" - -#: client/lib/services/base-string.service.js:62 -#: client/lib/services/base-string.service.js:77 -#: client/src/partials/survey-maker-modal.html:83 -msgid "CLOSE" -msgstr "SLUITEN" - -#: client/features/jobs/routes/hostCompletedJobs.route.js:27 -#: client/features/jobs/routes/templateCompletedJobs.route.js:28 -#: client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js:28 -msgid "COMPLETED JOBS" -msgstr "VOLTOOIDE TAKEN" - -#: client/features/templates/templates.strings.js:35 -#: client/src/scheduler/scheduler.strings.js:68 -msgid "CONFIRM" -msgstr "BEVESTIGEN" - -#: client/lib/services/base-string.service.js:75 -msgid "COPY" -msgstr "KOPIËREN" - -#: client/features/users/tokens/tokens.strings.js:25 -msgid "COULD NOT CREATE TOKEN" -msgstr "KON GEEN TOKEN AANMAKEN" - -#: client/src/instance-groups/instance-groups.strings.js:54 -msgid "CPU" -msgstr "CPU" - -#: client/src/shared/stateDefinitions.factory.js:161 -msgid "CREATE %s" -msgstr "%s AANMAKEN" - -#: client/features/applications/applications.strings.js:9 -msgid "CREATE APPLICATION" -msgstr "TOEPASSING AANMAKEN" - -#: client/src/instance-groups/instance-groups.strings.js:13 -msgid "CREATE CONTAINER GROUP" -msgstr "CONTAINERGROEP AANMAKEN" - -#: client/features/credentials/credentials.strings.js:8 -#: client/src/credentials/credentials.form.js:16 -msgid "CREATE CREDENTIAL" -msgstr "TOEGANGSGEGEVENS AANMAKEN" - -#: client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:16 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:16 -msgid "CREATE GROUP" -msgstr "GROEP AANMAKEN" - -#: client/src/inventories-hosts/hosts/host.form.js:17 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:17 -#: client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:17 -msgid "CREATE HOST" -msgstr "HOST AANMAKEN" - -#: client/src/instance-groups/instance-groups.strings.js:12 -msgid "CREATE INSTANCE GROUP" -msgstr "INSTANTIEGROEP AANMAKEN" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:8 -msgid "CREATE INVENTORY SOURCE" -msgstr "INVENTARISBRON AANMAKEN" - -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js:9 -#: client/src/scheduler/scheduler.strings.js:8 -#: client/src/scheduler/schedules.route.js:161 -#: client/src/scheduler/schedules.route.js:242 -#: client/src/scheduler/schedules.route.js:73 -msgid "CREATE SCHEDULE" -msgstr "SCHEMA AANMAKEN" - -#: client/src/management-jobs/scheduler/main.js:83 -msgid "CREATE SCHEDULED JOB" -msgstr "GEPLANDE TAAK AANMAKEN" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:18 -msgid "CREATE SOURCE" -msgstr "BRON AANMAKEN" - -#: client/features/users/tokens/tokens.strings.js:18 -#: client/features/users/tokens/tokens.strings.js:9 -#: client/features/users/tokens/users-tokens-add.route.js:49 -msgid "CREATE TOKEN" -msgstr "TOKEN AANMAKEN" - -#: client/features/output/output.strings.js:128 -msgid "CREATED" -msgstr "AANGEMAAKT" - -#: client/features/credentials/credentials.strings.js:31 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:150 -msgid "CREDENTIAL" -msgstr "TOEGANGSGEGEVEN" - -#: client/src/credential-types/credential-types.form.js:21 -msgid "CREDENTIAL TYPE" -msgstr "SOORT TOEGANGSGEGEVENS" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:60 -msgid "CREDENTIAL TYPE:" -msgstr "SOORT TOEGANGSGEGEVENS:" - -#: client/src/activity-stream/get-target-title.factory.js:11 -#: client/src/credential-types/credential-types.list.js:12 -#: client/src/credential-types/main.js:44 -msgid "CREDENTIAL TYPES" -msgstr "SOORTEN TOEGANGSGEGEVENS" - -#: client/features/credentials/legacy.credentials.js:11 -#: client/src/activity-stream/get-target-title.factory.js:17 -#: client/src/credentials/credentials.list.js:15 -#: client/src/credentials/credentials.list.js:16 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:5 -msgid "CREDENTIALS" -msgstr "TOEGANGSGEGEVENS" - -#: client/features/credentials/credentials.strings.js:49 -msgid "CREDENTIALS PERMISSIONS" -msgstr "MACHTIGINGEN TOEGANGSGEGEVENS" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:408 -#: client/src/projects/projects.form.js:231 -msgid "Cache Timeout" -msgstr "Cache time-out" - -#: client/src/projects/projects.form.js:220 -msgid "Cache Timeout%s (seconds)%s" -msgstr "Cache time-out %s (seconden)%s" - -#: client/src/users/list/users-list.controller.js:85 -msgid "Call to %s failed. DELETE returned status:" -msgstr "Oproepen %s mislukt. Geretourneerde status VERWIJDEREN:" - -#: client/src/projects/edit/projects-edit.controller.js:236 -msgid "Call to %s failed. POST returned status:" -msgstr "Oproepen %s mislukt. Geretourneerde status POSTEN:" - -#: client/src/management-jobs/card/card.controller.js:29 -msgid "Call to %s failed. Return status: %d" -msgstr "Oproepen %s mislukt. Status retourneren: %d" - -#: client/lib/services/base-string.service.js:116 -msgid "Call to {{ path }} failed. {{ action }} returned status: {{ status }}." -msgstr "Oproepen {{ path }} mislukt. {{ action }} heeft de volgende status teruggegeven: {{ status }}." - -#: client/features/output/output.strings.js:18 -#: client/lib/services/base-string.service.js:108 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:187 -#: client/src/configuration/forms/settings-form.controller.js:473 -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:24 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:624 -#: client/src/scheduler/scheduler.strings.js:56 -#: client/src/shared/form-generator.js:1652 -#: client/src/shared/lookup/lookup-modal.partial.html:19 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:33 -#: client/src/workflow-results/workflow-results.controller.js:56 -msgid "Cancel" -msgstr "Annuleren" - -#: client/features/output/output.strings.js:54 -#: client/lib/services/base-string.service.js:110 -msgid "Cancel Job" -msgstr "Taak annuleren" - -#: client/features/projects/projects.strings.js:31 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Cancel Not Allowed" -msgstr "Annuleren niet toegestaan" - -#: client/src/workflow-results/workflow-results.service.js:84 -msgid "Cancel Workflow" -msgstr "Workflow annuleren" - -#: client/src/workflow-results/workflow-results.partial.html:39 -msgid "Cancel job" -msgstr "Taak annuleren" - -#: client/src/license/license.strings.js:8 -msgid "Cancel license lookup" -msgstr "Licentie opzoeken annuleren" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:104 -msgid "Cancel sync process" -msgstr "Synchronisatieproces annuleren" - -#: client/src/projects/projects.list.js:128 -msgid "Cancel the SCM update" -msgstr "SCM-update annuleren" - -#: client/lib/services/base-string.service.js:122 -msgid "Cancel the {{resourceType}}" -msgstr "{{resourceType}} annuleren" - -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:34 -msgid "Cancel unsaved changes" -msgstr "Niet-opgeslagen wijzigingen annuleren" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:32 -msgid "Canceled. Click for details" -msgstr "Geannuleerd. Klik voor meer informatie" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Cannot find job." -msgstr "Taak kan niet gevonden worden." - -#: client/src/shared/smart-search/smart-search.controller.js:167 -msgid "Cannot search running job" -msgstr "Kan taak in uitvoering niet zoeken" - -#: client/src/instance-groups/instance-groups.list.js:22 -msgid "Capacity" -msgstr "Capaciteit" - -#: client/lib/services/base-string.service.js:154 -msgid "Capacity (Ascending)" -msgstr "Capaciteit (oplopend)" - -#: client/lib/services/base-string.service.js:155 -msgid "Capacity (Descending)" -msgstr "Capaciteit (aflopend)" - -#: client/src/projects/projects.form.js:84 -msgid "Change %s when deploying {{BRAND_NAME}} to change this location." -msgstr "Wijzig %s bij het uitrollen van {{BRAND_NAME}} om deze locatie te wijzigen." - -#: client/src/activity-stream/activity-detail.form.js:41 -msgid "Changes" -msgstr "Wijzigingen" - -#: client/src/notifications/notificationTemplates.form.js:460 -msgid "Channel" -msgstr "Kanaal" - -#: client/features/templates/templates.strings.js:73 -msgid "Check" -msgstr "Controleren" - -#: client/src/shared/form-generator.js:1046 -msgid "Choose a %s" -msgstr "Kies een %s" - -#: client/src/templates/job_templates/job-template.form.js:407 -#: client/src/templates/workflows.form.js:180 -msgid "Choose a Webhook Service" -msgstr "Kies een Webhookservice" - -#: client/features/templates/templates.strings.js:62 -msgid "Choose a job type" -msgstr "Kies een soort taak" - -#: client/src/templates/job_templates/job-template.form.js:125 -msgid "Choose a playbook" -msgstr "Kies een draaiboek" - -#: client/features/templates/templates.strings.js:63 -msgid "Choose a verbosity" -msgstr "Kies een verbositeit" - -#: client/src/projects/projects.form.js:60 -msgid "Choose an SCM Type" -msgstr "Kies een SCM-type" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:64 -msgid "Choose an answer type" -msgstr "Kies een antwoordtype" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:67 -msgid "Choose an answer type or format you want as the prompt for the user. Refer to the Ansible Tower Documentation for more additional information about each option." -msgstr "Kies een antwoordtype of -formaat dat u als melding voor de gebruiker wilt. Raadpleeg de documentatie van Ansible Tower voor meer informatie over iedere optie." - -#: client/src/notifications/notificationTemplates.form.js:560 -msgid "Choose an email option" -msgstr "Kies een e-mailoptie" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:111 -msgid "Choose an inventory file" -msgstr "Kies een inventarisbestand" - -#: client/src/shared/directives.js:92 -msgid "Choose file" -msgstr "Bestand kiezen" - -#: client/src/license/license.partial.html:104 -msgid "Choose your license file, agree to the End User License Agreement, and click submit." -msgstr "Kies uw licentiebestand, ga akkoord met de Licentie-overeenkomst voor eindgebruikers en klik op indienen." - -#: client/src/projects/projects.form.js:176 -msgid "Clean" -msgstr "Opschonen" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:299 -msgid "Clear" -msgstr "Wissen" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:64 -msgid "Click for details" -msgstr "Klik voor meer informatie" - -#: client/src/shared/list-generator/list-actions.partial.html:59 -#: client/src/shared/list-generator/list-actions.partial.html:66 -msgid "Click for help" -msgstr "Klik voor hulp" - -#: client/features/templates/templates.strings.js:15 -msgid "Click here to open the workflow visualizer" -msgstr "Klik hier om de workflowweergave te openen" - -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:477 -msgid "Click here to open the workflow visualizer." -msgstr "Klik hier om de workflowweergave te openen." - -#: client/src/inventories-hosts/inventories/inventory.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new inventory." -msgstr "Klik op een rij om deze te selecteren en klik op Klaar wanneer u klaar bent. Klik op de knop %s om een nieuwe inventaris aan te maken." - -#: client/src/teams/teams.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new team." -msgstr "Klik op een rij om deze te selecteren en klik op Klaar wanneer u klaar bent. Klik op de knop %s om een nieuw team aan te maken." - -#: client/src/templates/templates.list.js:17 -msgid "Click on a row to select it, and click Finished when done. Use the %s button to create a new job template." -msgstr "Klik op een rij om deze te selecteren en klik op Klaar wanneer u klaar bent. Klik op de knop %s om een nieuw taaksjabloon aan te maken." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:137 -msgid "Click on the regions field to see a list of regions for your cloud provider. You can select multiple regions, or choose" -msgstr "Klik op de regiovelden om een lijst van regio's voor uw cloudprovider in te zien. U kunt meerdere regio's selecteren, of kiezen" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Click the" -msgstr "Klik op" - -#: client/features/templates/templates.strings.js:128 -msgid "Click to edit link" -msgstr "Klik om de link te wijzigen" - -#: client/src/scheduler/scheduler.strings.js:13 -msgid "Click to edit schedule." -msgstr "Klik om het schema te wijzigen." - -#: client/features/templates/templates.strings.js:129 -msgid "Click to view link" -msgstr "Klik om de link te bekijken" - -#: client/src/credentials/credentials.form.js:320 -msgid "Client ID" -msgstr "Klant-ID" - -#: client/src/notifications/notificationTemplates.form.js:274 -msgid "Client Identifier" -msgstr "Klant-identificeerder" - -#: client/src/credentials/credentials.form.js:329 -msgid "Client Secret" -msgstr "Klant-geheim" - -#: client/lib/components/code-mirror/modal/code-mirror-modal.partial.html:67 -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:92 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:618 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:7 -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:11 -#: client/src/partials/survey-maker-modal.html:28 -#: client/src/partials/survey-maker-modal.html:7 -#: client/src/scheduler/scheduler.strings.js:55 -#: client/src/scheduler/schedulerForm.partial.html:7 -#: client/src/shared/form-generator.js:1656 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:8 -#: client/src/shared/lookup/lookup-modal.partial.html:9 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:10 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:11 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:61 -msgid "Close" -msgstr "Sluiten" - -#: client/lib/components/components.strings.js:135 -msgid "Close Approvals" -msgstr "Goedkeuringen sluiten" - -#: client/features/output/output.strings.js:136 -msgid "Close host event modal" -msgstr "Hostgebeurtenis modaal sluiten" - -#: client/lib/components/code-mirror/code-mirror.strings.js:7 -msgid "Close variables modal" -msgstr "Variabelen modaal sluiten" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:26 -msgid "Cloud source not configured." -msgstr "Cloudbron niet geconfigureerd." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "Cloud source not configured. Click" -msgstr "Cloudbron niet geconfigureerd. Klik op" - -#: client/src/credentials/factories/become-method-change.factory.js:80 -#: client/src/credentials/factories/kind-change.factory.js:136 -msgid "CloudForms URL" -msgstr "CloudForms-URL" - -#: client/features/output/output.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:201 -msgid "Collapse Output" -msgstr "Output samenvouwen" - -#: client/lib/components/components.strings.js:120 -msgid "Compact" -msgstr "Compact" - -#: client/src/inventories-hosts/hosts/host.form.js:125 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:135 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:155 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:168 -#: client/src/templates/job_templates/job-template.form.js:573 -#: client/src/templates/workflows.form.js:328 -msgid "Completed Jobs" -msgstr "Voltooide taken" - -#: client/src/management-jobs/card/card.partial.html:34 -#: client/src/management-jobs/card/card.partial.html:37 -msgid "Configure Notifications" -msgstr "Notificaties configureren" - -#: client/src/users/users.form.js:82 -msgid "Confirm Password" -msgstr "Wachtwoord bevestigen" - -#: client/src/configuration/forms/settings-form.controller.js:480 -msgid "Confirm Reset" -msgstr "Reset bevestigen" - -#: client/src/configuration/forms/settings-form.controller.js:489 -msgid "Confirm factory reset" -msgstr "Reset naar fabrieksinstellingen bevestigen" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "Confirm the removal of the" -msgstr "Bevestig het verwijderen van de" - -#: client/src/teams/teams.form.js:24 -#: client/src/users/users.form.js:25 -msgid "Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams." -msgstr "Neem contact op met uw systeembeheerder om de nodige toestemmingen te krijgen om Gebruikers en Teams toe te voegen en te wijzigen." - -#: client/features/output/output.strings.js:68 -#: client/src/instance-groups/instance-groups.strings.js:78 -msgid "Container Group" -msgstr "Containergroep" - -#: client/src/instance-groups/instance-groups.strings.js:38 -msgid "Container Groups Help" -msgstr "Hulp containergroepen" - -#: client/lib/components/components.strings.js:130 -msgid "Continue workflow job?" -msgstr "Doorgaan met de workflowtaak?" - -#: client/features/templates/templates.strings.js:61 -#: client/src/templates/job_templates/job-template.form.js:195 -msgid "Control the level of output ansible will produce as the playbook executes." -msgstr "Stel in hoeveel output Ansible produceert bij het uitvoeren van het draaiboek." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:336 -msgid "Control the level of output ansible will produce for inventory source update jobs." -msgstr "Stel in hoeveel output Ansible produceert bij taken die de inventarisbron updaten." - -#: client/features/templates/templates.strings.js:159 -msgid "Convergence" -msgstr "Convergentie" - -#: client/lib/components/components.strings.js:54 -msgid "Copied to clipboard." -msgstr "Gekopieerd naar klembord." - -#: client/src/credentials/credentials.list.js:73 -#: client/src/inventories-hosts/inventories/inventory.list.js:109 -#: client/src/inventory-scripts/inventory-scripts.list.js:61 -#: client/src/notifications/notificationTemplates.list.js:87 -#: client/src/projects/projects.list.js:106 -#: client/src/templates/templates.list.js:93 -msgid "Copy" -msgstr "Kopiëren" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:55 -msgid "Copy Inventory" -msgstr "Inventaris kopiëren" - -#: client/src/credentials/credentials.list.js:76 -msgid "Copy credential" -msgstr "Toegangsgegevens kopiëren" - -#: client/lib/components/components.strings.js:53 -msgid "Copy full revision to clipboard." -msgstr "Volledige herziening kopiëren naar klembord." - -#: client/src/inventory-scripts/inventory-scripts.list.js:64 -msgid "Copy inventory script" -msgstr "Inventarisscript kopiëren" - -#: client/src/notifications/notificationTemplates.list.js:90 -msgid "Copy notification" -msgstr "Bericht kopiëren" - -#: client/src/projects/projects.list.js:109 -msgid "Copy project" -msgstr "Project kopiëren" - -#: client/src/templates/templates.list.js:96 -msgid "Copy template" -msgstr "Sjabloon kopiëren" - -#: client/lib/services/base-string.service.js:120 -msgid "Copy {{resourceType}}" -msgstr "{{resourceType}} kopiëren" - -#: client/src/about/about.partial.html:31 -msgid "" -"Copyright © 2019 Red Hat, Inc.
\n" -" Visit Ansible.com for more information.
" -msgstr "Auteursrechten © 2019 Red Hat, Inc.
\n" -" Ga voor meer informatie naar Ansible.com.
" - -#: client/lib/components/components.strings.js:90 -msgid "Copyright © 2019 Red Hat, Inc." -msgstr "Copyright © 2019 Red Hat, Inc." - -#: client/src/workflow-results/workflow-results.service.js:78 -msgid "Could not cancel workflow. Returned status:" -msgstr "Workflow kan niet geannuleerd worden. Teruggegeven status:" - -#: client/src/workflow-results/workflow-results.service.js:58 -msgid "Could not delete job. Returned status:" -msgstr "Taak kan niet verwijderd worden. Teruggegeven status:" - -#: client/src/users/users.list.js:44 -msgid "Create New" -msgstr "Nieuw aanmaken" - -#: client/features/applications/applications.strings.js:32 -msgid "Create a new Application" -msgstr "Een nieuwe toepassing aanmaken" - -#: client/src/instance-groups/instance-groups.strings.js:35 -msgid "Create a new Instance Group" -msgstr "Een nieuwe instantiegroep aanmaken" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:48 -msgid "Create a new Smart Inventory from search results.

Note: changing the organization of the Smart Inventory could change the hosts included in the Smart Inventory." -msgstr "Een nieuwe Smart-inventaris aanmaken vanuit zoekresultaten.

Let op: wijzigen van de organisatie van de Smart-inventaris kon de hosts in de Smart-inventaris niet wijzigen." - -#: client/src/credentials/credentials.list.js:52 -msgid "Create a new credential" -msgstr "Nieuwe toegangsgegevens aanmaken" - -#: client/src/credential-types/credential-types.list.js:42 -msgid "Create a new credential type" -msgstr "Een nieuwe soort toegangsgegevens aanmaken" - -#: client/src/inventory-scripts/inventory-scripts.list.js:40 -msgid "Create a new custom inventory" -msgstr "Een nieuwe aangepaste inventaris aanmaken" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:75 -msgid "Create a new group" -msgstr "Een nieuwe groep aanmaken" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:139 -msgid "Create a new host" -msgstr "Een nieuwe host aanmaken" - -#: client/src/inventories-hosts/inventories/inventory.list.js:80 -msgid "Create a new inventory" -msgstr "Een nieuwe inventaris aanmaken" - -#: client/src/notifications/notificationTemplates.list.js:57 -msgid "Create a new notification template" -msgstr "Een nieuw berichtsjabloon aanmaken" - -#: client/src/organizations/list/organizations-list.partial.html:22 -msgid "Create a new organization" -msgstr "Een nieuwe organisatie aanmaken" - -#: client/src/projects/projects.list.js:81 -msgid "Create a new project" -msgstr "Een nieuw project aanmaken" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:72 -msgid "Create a new source" -msgstr "Een nieuwe bron aanmaken" - -#: client/src/teams/teams.list.js:43 -msgid "Create a new team" -msgstr "Een nieuw team aanmaken" - -#: client/src/templates/templates.list.js:56 -msgid "Create a new template" -msgstr "Een nieuw sjabloon aanmaken" - -#: client/src/users/users.list.js:48 -msgid "Create a new user" -msgstr "Een nieuwe gebruiker aanmaken" - -#: client/lib/services/base-string.service.js:128 -msgid "Created (Ascending)" -msgstr "Aangemaakt (Oplopend)" - -#: client/lib/services/base-string.service.js:129 -msgid "Created (Descending)" -msgstr "Aangemaakt (Aflopend)" - -#: client/features/output/output.strings.js:60 -#: client/features/templates/templates.strings.js:29 -#: client/src/instance-groups/container-groups/add-container-group.controller.js:24 -#: client/src/instance-groups/container-groups/edit-container-group.controller.js:38 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:73 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:73 -#: client/src/projects/add/projects-add.controller.js:140 -#: client/src/projects/add/projects-add.controller.js:153 -#: client/src/projects/add/projects-add.controller.js:162 -#: client/src/projects/add/projects-add.controller.js:181 -#: client/src/projects/edit/projects-edit.controller.js:263 -#: client/src/projects/edit/projects-edit.controller.js:274 -#: client/src/projects/edit/projects-edit.controller.js:283 -#: client/src/projects/edit/projects-edit.controller.js:302 -msgid "Credential" -msgstr "Toegangsgegeven" - -#: client/features/templates/templates.strings.js:40 -msgid "Credential Type" -msgstr "Soort toegangsgegevens" - -#: client/lib/components/components.strings.js:76 -#: client/lib/models/models.strings.js:12 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 -msgid "Credential Types" -msgstr "Soorten toegangsgegevens" - -#: client/src/instance-groups/instance-groups.strings.js:80 -msgid "Credential to authenticate with Kubernetes or OpenShift.  Must be of type \"Kubernetes/OpenShift API Bearer Token”." -msgstr "Toegangsgevevens om te authenticeren met Kubernetes of OpenShift. Moet van het type ‘Kubernetes/OpenShift API Bearer Token‘ zijn." - -#: client/features/jobs/jobs.strings.js:16 -#: client/features/templates/templates.strings.js:21 -#: client/lib/components/components.strings.js:75 -#: client/lib/models/models.strings.js:8 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:128 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:58 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 -#: client/src/templates/job_templates/job-template.form.js:140 -#: client/src/templates/job_templates/job-template.form.js:152 -msgid "Credentials" -msgstr "Toegangsgegevens" - -#: client/features/templates/templates.strings.js:41 -msgid "Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:" -msgstr "Toegangsgegevens die wachtwoorden nodig hebben bij het starten kunnen niet gebruikt worden bij sjabloonschema's en workflowknooppunten. De volgende toegangsgegevens moeten verwijderd of vervangen worden voordat u door kunt gaan:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:17 -msgid "Critical" -msgstr "Cruciaal" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:12 -msgid "Critical Risk" -msgstr "Kritisch risico" - -#: client/src/shared/directives.js:93 -msgid "Current Image:" -msgstr "Huidige afbeelding:" - -#: client/features/output/output.strings.js:40 -msgid "Currently following output as it arrives. Click to unfollow" -msgstr "Output wordt op dit moment gevolgd wanneer het binnenkomt. Klik om te stoppen met volgen." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:170 -msgid "Custom Inventory Script" -msgstr "Aangepast inventarisscript" - -#: client/lib/services/base-string.service.js:85 -msgid "Custom Logo" -msgstr "Aangepast logo" - -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 -msgid "Custom Script" -msgstr "Aangepast script" - -#: client/src/instance-groups/instance-groups.strings.js:79 -msgid "Customize Pod Spec" -msgstr "Podspec aanpassen" - -#: client/src/notifications/notificationTemplates.form.js:577 -msgid "Customize messages…" -msgstr "Berichten aanpassen..." - -#: client/src/home/home.route.js:16 -msgid "DASHBOARD" -msgstr "DASHBOARD" - -#: client/features/users/tokens/tokens.strings.js:28 -#: client/lib/services/base-string.service.js:74 -#: client/src/credential-types/list/list.controller.js:110 -#: client/src/credentials/list/credentials-list.controller.js:155 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:160 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:51 -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:131 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:184 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:24 -#: client/src/inventory-scripts/list/list.controller.js:130 -#: client/src/notifications/notification-templates-list/list.controller.js:235 -#: client/src/organizations/edit/organizations-edit.controller.js:164 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:69 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:68 -#: client/src/organizations/list/organizations-list.controller.js:202 -#: client/src/partials/survey-maker-modal.html:18 -#: client/src/projects/edit/projects-edit.controller.js:244 -#: client/src/scheduler/factories/delete-schedule.factory.js:60 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -#: client/src/teams/list/teams-list.controller.js:82 -#: client/src/users/list/users-list.controller.js:95 -#: client/src/workflow-results/workflow-results.service.js:62 -msgid "DELETE" -msgstr "VERWIJDEREN" - -#: client/src/partials/survey-maker-modal.html:81 -msgid "DELETE SURVEY" -msgstr "VRAGENLIJST VERWIJDEREN" - -#: client/features/templates/templates.strings.js:133 -msgid "DELETED" -msgstr "VERWIJDERD" - -#: client/features/templates/templates.strings.js:158 -msgid "DENIED" -msgstr "GEWEIGERD" - -#: client/lib/components/components.strings.js:129 -msgid "DENY" -msgstr "AFWIJZEN" - -#: client/features/projects/projects.strings.js:9 -#: client/features/users/tokens/tokens.strings.js:36 -msgid "DESCRIPTION" -msgstr "BESCHRIJVING" - -#: client/features/templates/templates.strings.js:135 -#: client/src/instance-groups/instance-groups.strings.js:29 -#: client/src/workflow-results/workflow-results.controller.js:83 -msgid "DETAILS" -msgstr "MEER INFORMATIE" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:32 -msgid "DISASSOCIATE" -msgstr "LOSKOPPELEN" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:5 -msgid "DYNAMIC HOSTS" -msgstr "DYNAMISCHE HOSTS" - -#: client/lib/components/components.strings.js:70 -msgid "Dashboard" -msgstr "Dashboard" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:576 -#: client/src/scheduler/scheduler.strings.js:52 -msgid "Date format" -msgstr "Datumindeling" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:170 -#: client/src/scheduler/scheduler.strings.js:64 -msgid "Days of data to keep" -msgstr "Dagen van te behouden gegevens" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:101 -msgid "Default" -msgstr "Standaard" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:196 -#: client/src/templates/survey-maker/shared/question-definition.form.js:213 -#: client/src/templates/survey-maker/shared/question-definition.form.js:228 -#: client/src/templates/survey-maker/shared/question-definition.form.js:242 -#: client/src/templates/survey-maker/shared/question-definition.form.js:256 -#: client/src/templates/survey-maker/shared/question-definition.form.js:272 -msgid "Default Answer" -msgstr "Standaard antwoord" - -#: client/src/configuration/settings.partial.html:9 -msgid "Define system-level features and functions" -msgstr "Kenmerken en functies op systeemniveau definiëren" - -#: client/features/output/output.strings.js:20 -#: client/lib/services/base-string.service.js:89 -#: client/src/credential-types/credential-types.list.js:73 -#: client/src/credential-types/list/list.controller.js:106 -#: client/src/credentials/credentials.list.js:92 -#: client/src/credentials/list/credentials-list.controller.js:151 -#: client/src/inventories-hosts/inventories/inventory.list.js:125 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:156 -#: client/src/inventory-scripts/inventory-scripts.list.js:79 -#: client/src/inventory-scripts/list/list.controller.js:126 -#: client/src/notifications/notification-templates-list/list.controller.js:231 -#: client/src/notifications/notificationTemplates.list.js:105 -#: client/src/organizations/edit/organizations-edit.controller.js:161 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:66 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:65 -#: client/src/organizations/list/organizations-list.controller.js:198 -#: client/src/projects/edit/projects-edit.controller.js:241 -#: client/src/scheduler/schedules.list.js:108 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:37 -#: client/src/teams/list/teams-list.controller.js:78 -#: client/src/teams/teams.list.js:72 -#: client/src/templates/templates.list.js:109 -#: client/src/users/list/users-list.controller.js:91 -#: client/src/users/users.list.js:79 -#: client/src/workflow-results/workflow-results.controller.js:57 -msgid "Delete" -msgstr "Verwijderen" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:6 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:6 -msgid "Delete Group" -msgstr "Groep verwijderen" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:128 -msgid "Delete Host" -msgstr "Host verwijderen" - -#: client/features/output/output.strings.js:55 -#: client/src/workflow-results/workflow-results.service.js:39 -msgid "Delete Job" -msgstr "Taak verwijderen" - -#: client/src/organizations/list/organizations-list.partial.html:73 -msgid "Delete Organization" -msgstr "Organisatie verwijderen" - -#: client/src/templates/survey-maker/surveys/init.factory.js:23 -msgid "Delete Question" -msgstr "Vraag verwijderen" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:180 -msgid "Delete Source" -msgstr "Bron verwijderen" - -#: client/src/credentials/credentials.list.js:94 -msgid "Delete credential" -msgstr "Toegangsgegevens verwijderen" - -#: client/src/credential-types/credential-types.list.js:75 -msgid "Delete credential type" -msgstr "Soort toegangsgegevens verwijderen" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:107 -#: client/src/inventories-hosts/inventory-hosts.strings.js:19 -msgid "Delete group" -msgid_plural "Delete groups" -msgstr[0] "Groep verwijderen" -msgstr[1] "Groepen verwijderen" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:116 -#: client/src/inventories-hosts/inventory-hosts.strings.js:21 -msgid "Delete host" -msgid_plural "Delete hosts" -msgstr[0] "Host verwijderen" -msgstr[1] "Hosts verwijderen" - -#: client/src/inventories-hosts/inventories/inventory.list.js:127 -msgid "Delete inventory" -msgstr "Inventaris verwijderen" - -#: client/src/inventory-scripts/inventory-scripts.list.js:81 -msgid "Delete inventory script" -msgstr "Inventarisscript verwijderen" - -#: client/src/workflow-results/workflow-results.partial.html:52 -msgid "Delete job" -msgstr "Taak verwijderen" - -#: client/src/notifications/notificationTemplates.list.js:107 -msgid "Delete notification" -msgstr "Bericht verwijderen" - -#: client/src/projects/projects.form.js:186 -msgid "Delete on Update" -msgstr "Verwijderen bij update" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:26 -msgid "Delete or promote the group's children?" -msgstr "De kinderen van de groep verwijderen of promoveren?" - -#: client/src/partials/survey-maker-modal.html:67 -msgid "Delete question" -msgstr "Vraag verwijderen" - -#: client/src/scheduler/schedules.list.js:111 -msgid "Delete schedule" -msgstr "Schema verwijderen" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:121 -msgid "Delete source" -msgstr "Bron verwijderen" - -#: client/src/teams/teams.list.js:76 -msgid "Delete team" -msgstr "Team verwijderen" - -#: client/src/templates/templates.list.js:112 -msgid "Delete template" -msgstr "Sjabloon verwijderen" - -#: client/src/projects/projects.form.js:188 -msgid "Delete the local repository in its entirety prior to performing an update." -msgstr "De lokale opslagplaats dient volledig verwijderd te worden voordat een update uitgevoerd wordt." - -#: client/src/projects/projects.list.js:122 -msgid "Delete the project" -msgstr "Het project verwijderen" - -#: client/src/scheduler/scheduled-jobs.list.js:86 -msgid "Delete the schedule" -msgstr "Het schema verwijderen" - -#: client/lib/services/base-string.service.js:121 -msgid "Delete the {{resourceType}}" -msgstr "De {{resourceType}} verwijderen" - -#: client/src/users/users.list.js:83 -msgid "Delete user" -msgstr "Gebruiker verwijderen" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:14 -msgid "Delete {{ group }} and {{ host }}" -msgstr "{{ group }} en {{ host }} verwijderen" - -#: client/lib/services/base-string.service.js:91 -msgid "Deleting this {{ resourceType }} will make the following resources unavailable." -msgstr "Als u deze {{ resourceType }} verwijdert, zijn de volgende hulpbronnen niet meer beschikbaar." - -#: client/src/projects/projects.form.js:188 -msgid "Depending on the size of the repository this may significantly increase the amount of time required to complete an update." -msgstr "Afhankelijk van het formaat van de opslagplaats kan de tijd die nodig is om een update uit te voeren hierdoor sterk verlengd worden." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "Describe Instances documentation" -msgstr "Documentatie Instances beschrijven" - -#: client/features/applications/add-applications.controller.js:36 -#: client/features/templates/templates.strings.js:17 -#: client/features/users/tokens/users-tokens-add.controller.js:26 -#: client/src/credential-types/credential-types.form.js:34 -#: client/src/credentials/credentials.form.js:39 -#: client/src/inventories-hosts/hosts/host.form.js:62 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:39 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:61 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:74 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:63 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:72 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:28 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:36 -#: client/src/inventory-scripts/inventory-scripts.form.js:35 -#: client/src/notifications/notificationTemplates.form.js:39 -#: client/src/organizations/organizations.form.js:33 -#: client/src/projects/projects.form.js:37 -#: client/src/teams/teams.form.js:35 -#: client/src/templates/job_templates/job-template.form.js:41 -#: client/src/templates/survey-maker/shared/question-definition.form.js:36 -#: client/src/templates/workflows.form.js:49 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:128 -#: client/src/users/users.form.js:147 -#: client/src/users/users.form.js:175 -msgid "Description" -msgstr "Omschrijving" - -#: client/src/notifications/notificationTemplates.form.js:156 -#: client/src/notifications/notificationTemplates.form.js:160 -#: client/src/notifications/notificationTemplates.form.js:172 -#: client/src/notifications/notificationTemplates.form.js:176 -msgid "Destination Channels" -msgstr "Bestemmingskanalen" - -#: client/src/notifications/notificationTemplates.form.js:535 -#: client/src/notifications/notificationTemplates.form.js:539 -msgid "Destination Channels or Users" -msgstr "Bestemmingskanalen of -gebruikers" - -#: client/src/notifications/notificationTemplates.form.js:225 -#: client/src/notifications/notificationTemplates.form.js:226 -msgid "Destination SMS Number" -msgstr "Sms-nummer bestemming" - -#: client/features/applications/applications.strings.js:15 -#: client/features/credentials/credentials.strings.js:13 -#: client/features/output/output.strings.js:46 -#: client/features/users/tokens/tokens.strings.js:14 -#: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1431 -msgid "Details" -msgstr "Meer informatie" - -#: client/src/notifications/notificationTemplates.form.js:341 -#: client/src/notifications/notificationTemplates.form.js:403 -#: client/src/notifications/notificationTemplates.form.js:474 -#: client/src/notifications/notificationTemplates.form.js:506 -msgid "Disable SSL Verification" -msgstr "SSL-verificatie uitschakelen" - -#: client/src/templates/survey-maker/surveys/init.factory.js:21 -msgid "Disable Survey" -msgstr "Vragenlijst uitschakelen" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Disable survey" -msgstr "Vragenlijst uitschakelen" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Group From Group" -msgstr "Groep van groep loskoppelen" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:6 -msgid "Disassociate Host" -msgstr "Host loskoppelen" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:6 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Host From Group" -msgstr "Host van groep loskoppelen" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:70 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:103 -msgid "Disassociate group" -msgstr "Groep loskoppelen" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:104 -msgid "Disassociate host" -msgstr "Host loskoppelen" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:54 -#: client/src/configuration/forms/settings-form.controller.js:446 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:52 -msgid "Discard changes" -msgstr "Wijzigingen annuleren" - -#: client/src/teams/teams.form.js:161 -msgid "Dissassociate permission from team" -msgstr "Machtiging loskoppelen van team" - -#: client/src/users/users.form.js:234 -msgid "Dissassociate permission from user" -msgstr "Machtiging loskoppelen van gebruiker" - -#: client/src/templates/job_templates/job-template.form.js:286 -msgid "Divide the work done by this job template into the specified number of job slices, each running the same tasks against a portion of the inventory." -msgstr "Verdeel het uitgevoerde werk met behulp van dit taaksjabloon in het opgegeven aantal taakdelen, elk deel voert dezelfde taken uit voor een deel van de inventaris." - -#: client/src/credentials/credentials.form.js:383 -#: client/src/credentials/factories/become-method-change.factory.js:54 -#: client/src/credentials/factories/kind-change.factory.js:110 -msgid "Domain Name" -msgstr "Domeinnaam" - -#: client/features/output/output.strings.js:21 -msgid "Download Output" -msgstr "Download output" - -#: client/src/inventory-scripts/inventory-scripts.form.js:59 -msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. Refer to the Ansible Tower documentation for example syntax." -msgstr "Sleep uw aangepaste inventarisscriptbestand hierheen of maak een nieuwe aan in het veld om uw aangepaste inventaris te importeren. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis." - -#: client/src/templates/survey-maker/surveys/init.factory.js:24 -msgid "Drag to reorder question" -msgstr "Sleep om vragen opnieuw te ordenen" - -#: client/src/partials/survey-maker-modal.html:74 -msgid "Drop question here to reorder" -msgstr "Sleep een vraag hierheen om opnieuw te ordenen" - -#: client/features/applications/applications.strings.js:10 -msgid "EDIT APPLICATION" -msgstr "TOEPASSING WIJZIGEN" - -#: client/features/credentials/credentials.strings.js:9 -msgid "EDIT CREDENTIAL" -msgstr "TOEGANGSGEGEVENS WIJZIGEN" - -#: client/features/templates/templates.strings.js:142 -msgid "EDIT LINK" -msgstr "LINK WIJZIGEN" - -#: client/src/scheduler/scheduler.strings.js:9 -msgid "EDIT SCHEDULE" -msgstr "SCHEMA WIJZIGEN" - -#: client/src/management-jobs/scheduler/main.js:97 -msgid "EDIT SCHEDULED JOB" -msgstr "GEPLANDE TAAK WIJZIGEN" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:17 -msgid "EDIT SURVEY PROMPT" -msgstr "MELDING VRAGENLIJST WIJZIGEN" - -#: client/features/templates/templates.strings.js:124 -msgid "EDIT TEMPLATE" -msgstr "SJABLOON WIJZIGEN" - -#: client/lib/components/components.strings.js:9 -msgid "ENCRYPTED" -msgstr "VERSLEUTELD" - -#: client/features/output/output.strings.js:105 -msgid "EXAMPLES" -msgstr "VOORBEELDEN" - -#: client/src/shared/smart-search/smart-search.partial.html:36 -msgid "EXAMPLES:" -msgstr "VOORBEELDEN:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:15 -msgid "EXECUTE COMMAND" -msgstr "COMMANDO UITVOEREN" - -#: client/features/templates/templates.strings.js:150 -msgid "EXIT" -msgstr "AFSLUITEN" - -#: client/lib/components/code-mirror/code-mirror.strings.js:12 -msgid "EXPAND" -msgstr "UITKLAPPEN" - -#: client/features/applications/applications.strings.js:29 -#: client/features/users/tokens/tokens.strings.js:37 -msgid "EXPIRATION" -msgstr "VERLOOPDATUM" - -#: client/features/users/tokens/tokens.strings.js:24 -msgid "EXPIRES" -msgstr "VERLOOPT OP" - -#: client/lib/components/code-mirror/code-mirror.strings.js:10 -#: client/lib/components/code-mirror/code-mirror.strings.js:50 -msgid "EXTRA VARIABLES" -msgstr "EXTRA VARIABELEN" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:375 -msgid "Each time a job runs using this inventory, refresh the inventory from the selected source before executing job tasks." -msgstr "Elke keer dat een taak uitgevoerd wordt met dit inventaris, dient het inventaris vernieuwd te worden vanuit de geselecteerde bron voordat de opdrachten van de taak uitgevoerd worden." - -#: client/src/projects/projects.form.js:199 -msgid "Each time a job runs using this project, update the revision of the project prior to starting the job." -msgstr "Voer iedere keer dat een taak uitgevoerd wordt met dit project een update uit voor de herziening van het project voordat u de taak start." - -#: client/src/credential-types/credential-types.list.js:56 -#: client/src/credentials/credentials.list.js:66 -#: client/src/inventories-hosts/inventories/inventory.list.js:102 -#: client/src/inventory-scripts/inventory-scripts.list.js:54 -#: client/src/notifications/notificationTemplates.list.js:71 -#: client/src/notifications/notificationTemplates.list.js:80 -#: client/src/scheduler/schedules.list.js:93 -#: client/src/teams/teams.list.js:55 -#: client/src/templates/templates.list.js:80 -#: client/src/users/users.list.js:60 -msgid "Edit" -msgstr "Wijzigen" - -#: client/src/organizations/list/organizations-list.partial.html:55 -msgid "Edit Organization" -msgstr "Organisatie wijzigen" - -#: client/src/templates/survey-maker/surveys/init.factory.js:22 -msgid "Edit Question" -msgstr "Vraag wijzigen" - -#: client/src/shared/form-generator.js:1668 -#: client/src/templates/job_templates/job-template.form.js:602 -#: client/src/templates/workflows.form.js:357 -msgid "Edit Survey" -msgstr "Vragenlijst wijzigen" - -#: client/src/credentials/credentials.list.js:68 -msgid "Edit credential" -msgstr "Toegangsgegevens wijzigen" - -#: client/src/credential-types/credential-types.list.js:58 -msgid "Edit credential type" -msgstr "De toegangsgegevens wijzigen" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:91 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:85 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:89 -msgid "Edit group" -msgstr "Groep wijzigen" - -#: client/src/inventories-hosts/hosts/host.list.js:89 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:95 -#: client/src/inventories-hosts/inventory-hosts.strings.js:25 -msgid "Edit host" -msgstr "Host wijzigen" - -#: client/src/inventories-hosts/inventories/inventory.list.js:104 -msgid "Edit inventory" -msgstr "Inventaris wijzigen" - -#: client/src/inventory-scripts/inventory-scripts.list.js:56 -msgid "Edit inventory script" -msgstr "Inventarisscript wijzigen" - -#: client/src/notifications/notificationTemplates.list.js:73 -msgid "Edit notification" -msgstr "Bericht wijzigen" - -#: client/src/partials/survey-maker-modal.html:64 -msgid "Edit question" -msgstr "Vraag wijzigen" - -#: client/src/scheduler/schedules.list.js:96 -msgid "Edit schedule" -msgstr "Schema wijzigen" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:87 -msgid "Edit source" -msgstr "Bron wijzigen" - -#: client/src/teams/teams.list.js:59 -msgid "Edit team" -msgstr "Team wijzigen" - -#: client/src/templates/templates.list.js:82 -msgid "Edit template" -msgstr "Sjabloon wijzigen" - -#: client/src/workflow-results/workflow-results.controller.js:62 -msgid "Edit the inventory" -msgstr "De inventaris wijzigen" - -#: client/src/projects/projects.list.js:93 -msgid "Edit the project" -msgstr "Het project wijzigen" - -#: client/src/scheduler/scheduled-jobs.list.js:72 -#: client/src/workflow-results/workflow-results.controller.js:61 -msgid "Edit the schedule" -msgstr "Het schema wijzigen" - -#: client/src/workflow-results/workflow-results.controller.js:60 -msgid "Edit the slice job template" -msgstr "Het taakdeelsjabloon wijzigen" - -#: client/src/workflow-results/workflow-results.controller.js:58 -msgid "Edit the user" -msgstr "De gebruiker wijzigen" - -#: client/src/workflow-results/workflow-results.controller.js:59 -msgid "Edit the workflow job template" -msgstr "Het workflow-taaksjabloon wijzigen" - -#: client/src/users/users.list.js:64 -msgid "Edit user" -msgstr "Gebruiker wijzigen" - -#: client/features/projects/projects.strings.js:24 -msgid "Either you do not have access or the SCM update process completed" -msgstr "U heeft mogelijk geen toegang, of het SCM-updateproces is al voltooid." - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Either you do not have access or the SCM update process completed. Click the" -msgstr "U heeft mogelijk geen toegang, of het SCM-updateproces is al voltooid. Klik op" - -#: client/features/output/output.strings.js:116 -#: client/src/workflow-results/workflow-results.controller.js:92 -msgid "Elapsed" -msgstr "Verlopen" - -#: client/src/credentials/credentials.form.js:191 -#: client/src/users/users.form.js:52 -msgid "Email" -msgstr "E-mail" - -#: client/src/notifications/notificationTemplates.form.js:558 -#: client/src/notifications/notificationTemplates.form.js:559 -msgid "Email Options" -msgstr "E-mailopties" - -#: client/src/templates/job_templates/job-template.form.js:353 -#: client/src/templates/job_templates/job-template.form.js:358 -#: client/src/templates/workflows.form.js:157 -#: client/src/templates/workflows.form.js:162 -msgid "Enable Concurrent Jobs" -msgstr "Gelijktijdige taken inschakelen" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:31 -msgid "Enable External Logging" -msgstr "Externe logboekregistratie inschakelen" - -#: client/src/templates/job_templates/job-template.form.js:363 -#: client/src/templates/job_templates/job-template.form.js:368 -msgid "Enable Fact Cache" -msgstr "Feitcache inschakelen" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:326 -msgid "Enable Privilege Escalation" -msgstr "Verhoging van rechten inschakelen" - -#: client/src/templates/job_templates/job-template.form.js:331 -#: client/src/templates/job_templates/job-template.form.js:338 -msgid "Enable Provisioning Callbacks" -msgstr "Provisioning terugkoppelingen inschakelen" - -#: client/src/templates/job_templates/job-template.form.js:343 -#: client/src/templates/job_templates/job-template.form.js:348 -#: client/src/templates/workflows.form.js:167 -#: client/src/templates/workflows.form.js:172 -msgid "Enable Webhook" -msgstr "Webhook inschakelen" - -#: client/src/configuration/settings.partial.html:3 -msgid "Enable simplified login for your Tower applications" -msgstr "Eenvoudig inloggen inschakelen voor uw Tower-toepassingen" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Enable survey" -msgstr "Vragenlijst inschakelen" - -#: client/src/templates/job_templates/job-template.form.js:346 -msgid "Enable webhook for this job template." -msgstr "Webhook inschakelen voor dit taaksjabloon." - -#: client/src/templates/workflows.form.js:170 -msgid "Enable webhook for this workflow job template." -msgstr "Webhook inschakelen voor dit workflowtaaksjabloon." - -#: client/src/templates/job_templates/job-template.form.js:335 -msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact {{BRAND_NAME}} and request a configuration update using this job template." -msgstr "Maakt het mogelijk een provisioning terugkoppelings-URL aan te maken. Met deze URL kan een host contact opnemen met {{BRAND_NAME}} en een verzoek indienen voor een configuratie-update met behulp van dit taaksjabloon." - -#: client/src/credentials/factories/credential-form-save.factory.js:73 -msgid "Encrypted credentials are not supported." -msgstr "Versleutelde toegangsgegevens worden niet ondersteund." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:487 -#: client/src/scheduler/scheduler.strings.js:44 -msgid "End" -msgstr "Einde" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:532 -#: client/src/scheduler/scheduler.strings.js:46 -msgid "End Date" -msgstr "Einddatum" - -#: client/src/scheduler/scheduler.strings.js:48 -msgid "End Time" -msgstr "Eindtijd" - -#: client/src/license/license.partial.html:163 -msgid "End User License Agreement" -msgstr "Licentie-overeenkomst voor eindgebruikers" - -#: client/src/inventories-hosts/hosts/host.form.js:72 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:71 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:73 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:68 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "Voer variabelen van de inventaris in met JSON- of YAML-syntaxis. Gebruik de radioknop om tussen de twee te wisselen." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:74 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Voer de variabelen van het inventaris in met JSON- of YAML-syntaxis. Gebruik de radio-knop om tussen de twee te wisselen. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis." - -#: client/src/notifications/notificationTemplates.form.js:335 -msgid "Enter one Annotation Tag per line, without commas." -msgstr "Voer een opmerkingstas in per regel, zonder komma's." - -#: client/src/notifications/notificationTemplates.form.js:175 -msgid "Enter one HipChat channel per line. The pound symbol (#) is not required." -msgstr "Voer één HipChat-kanaal per regel in. Het hekje (#) is hierbij niet vereist." - -#: client/src/notifications/notificationTemplates.form.js:538 -msgid "Enter one IRC channel or username per line. The pound symbol (#) for channels, and the at (@) symbol for users, are not required." -msgstr "Voer één IRC-kanaal of gebruikersnaam per regel in. Het hekje (#) voor kanalen en het apenstaartje (@) voor gebruikers zijn hierbij niet vereist." - -#: client/src/notifications/notificationTemplates.form.js:159 -msgid "Enter one Slack channel per line. The pound symbol (#) is required for channels." -msgstr "Voer één Slack-kanaal per regel in. Het hekje (#) is hierbij vereist." - -#: client/src/notifications/notificationTemplates.form.js:97 -msgid "Enter one email address per line to create a recipient list for this type of notification." -msgstr "Voer één e-mailadres per regel in om een lijst met ontvangers te maken voor dit type bericht." - -#: client/src/notifications/notificationTemplates.form.js:229 -msgid "Enter one phone number per line to specify where to route SMS messages." -msgstr "Voer één telefoonnummer per regel in om aan te geven waar sms-berichten naartoe gestuurd moeten worden." - -#: client/src/credentials/factories/become-method-change.factory.js:81 -#: client/src/credentials/factories/kind-change.factory.js:137 -msgid "Enter the URL for the virtual machine which %scorresponds to your CloudForms instance. %sFor example, %s" -msgstr "Voer de URL in voor de virtuele machine die %sovereenkomt met uw CloudForms-instantie. %sBijvoorbeeld, %s" - -#: client/src/credentials/factories/become-method-change.factory.js:71 -#: client/src/credentials/factories/kind-change.factory.js:127 -msgid "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor example, %s" -msgstr "Voer de URL in die overeenkomt met uw %sRed Hat Satellite 6-server. %sBijvoorbeeld %s" - -#: client/src/credentials/factories/become-method-change.factory.js:49 -#: client/src/credentials/factories/kind-change.factory.js:105 -msgid "Enter the hostname or IP address which corresponds to your VMware vCenter." -msgstr "Voer de hostnaam of het IP-adres in dat overeenkomt met uw VMware vCenter." - -#: client/src/notifications/notificationTemplates.form.js:215 -msgid "Enter the number associated with the \"Messaging Service\" in Twilio in the format +18005550199." -msgstr "Voer het telefoonnummer in dat hoort bij de 'Berichtenservice' in Twilio in de indeling +18005550199." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:196 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:220 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:319 -msgid "Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "Voer variabelen in met JSON- of YAML-syntaxis. Gebruik de radioknop om tussen de twee te wisselen." - -#: client/features/output/output.strings.js:61 -msgid "Environment" -msgstr "Omgeving" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:186 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:193 -msgid "Environment Variables" -msgstr "Omgevingsvariabelen" - -#: client/src/license/license.controller.js:232 -msgid "Error Applying License" -msgstr "Fout bij het toepassen van de licentie" - -#: client/features/output/output.strings.js:89 -msgid "Error Details" -msgstr "Foutinformatie" - -#: client/src/license/license.controller.js:166 -msgid "Error Fetching Licenses" -msgstr "Fout bij het ophalen van licenties" - -#: client/src/notifications/notificationTemplates.form.js:643 -msgid "Error Message" -msgstr "Foutbericht" - -#: client/src/notifications/notificationTemplates.form.js:654 -msgid "Error Message Body" -msgstr "Foutbericht body" - -#: client/lib/services/base-string.service.js:115 -#: client/src/app.js:228 -#: client/src/configuration/forms/settings-form.controller.js:285 -#: client/src/configuration/forms/settings-form.controller.js:429 -#: client/src/configuration/forms/settings-form.controller.js:554 -#: client/src/configuration/forms/settings-form.controller.js:614 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:234 -#: client/src/credentials/factories/credential-form-save.factory.js:77 -#: client/src/credentials/factories/credential-form-save.factory.js:93 -#: client/src/home/home.controller.js:104 -#: client/src/home/home.controller.js:223 -#: client/src/home/home.controller.js:233 -#: client/src/home/home.controller.js:242 -#: client/src/home/home.controller.js:29 -#: client/src/home/home.controller.js:43 -#: client/src/home/home.controller.js:78 -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:34 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:37 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:47 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:116 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:126 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:153 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:203 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:222 -#: client/src/login/loginModal/loginModal.controller.js:143 -#: client/src/management-jobs/card/card.controller.js:122 -#: client/src/management-jobs/card/card.controller.js:28 -#: client/src/management-jobs/card/card.controller.js:58 -#: client/src/organizations/main.js:111 -#: client/src/organizations/main.js:124 -#: client/src/organizations/main.js:139 -#: client/src/projects/add/projects-add.controller.js:120 -#: client/src/projects/edit/projects-edit.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:220 -#: client/src/projects/edit/projects-edit.controller.js:236 -#: client/src/projects/main.js:121 -#: client/src/shared/stateDefinitions.factory.js:230 -#: client/src/templates/main.js:102 -#: client/src/templates/main.js:116 -#: client/src/templates/main.js:132 -#: client/src/templates/main.js:143 -#: client/src/templates/main.js:177 -#: client/src/templates/main.js:194 -#: client/src/templates/main.js:219 -#: client/src/templates/main.js:245 -#: client/src/templates/main.js:257 -#: client/src/templates/main.js:270 -#: client/src/templates/main.js:281 -#: client/src/templates/main.js:295 -#: client/src/templates/main.js:312 -#: client/src/templates/main.js:341 -#: client/src/templates/main.js:355 -#: client/src/templates/main.js:371 -#: client/src/templates/main.js:409 -#: client/src/templates/main.js:423 -#: client/src/templates/main.js:436 -#: client/src/templates/main.js:449 -#: client/src/templates/main.js:473 -#: client/src/templates/main.js:490 -#: client/src/templates/main.js:71 -#: client/src/templates/main.js:88 -#: client/src/users/add/users-add.controller.js:101 -#: client/src/users/edit/users-edit.controller.js:171 -#: client/src/users/list/users-list.controller.js:84 -#: client/src/workflow-results/workflow-results.service.js:57 -#: client/src/workflow-results/workflow-results.service.js:77 -#: client/src/workflow-results/workflow-results.service.js:99 -msgid "Error!" -msgstr "Fout!" - -#: client/src/activity-stream/streams.list.js:40 -msgid "Event" -msgstr "Gebeurtenis" - -#: client/src/activity-stream/factories/build-description.factory.js:157 -msgid "Event summary not available" -msgstr "Samenvatting van de gebeurtenis niet beschikbaar" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:190 -#: client/src/scheduler/scheduler.strings.js:29 -msgid "Every" -msgstr "Iedere" - -#: client/src/projects/add/projects-add.controller.js:142 -#: client/src/projects/edit/projects-edit.controller.js:264 -msgid "Example URLs for GIT SCM include:" -msgstr "Voorbeelden van URL's voor GIT SCM zijn onder andere:" - -#: client/src/projects/add/projects-add.controller.js:163 -#: client/src/projects/edit/projects-edit.controller.js:284 -msgid "Example URLs for Mercurial SCM include:" -msgstr "Voorbeelden van URL's voor Mercurial SCM zijn onder andere:" - -#: client/src/projects/add/projects-add.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:275 -msgid "Example URLs for Subversion SCM include:" -msgstr "Voorbeelden van URL's voor Subversion SCM zijn onder andere:" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Example: ansible_facts.ansible_distribution:\"RedHat\"" -msgstr "Voorbeeld: ansible_facts.ansible_distribution:\"RedHat\"" - -#: client/src/projects/projects.form.js:140 -msgid "Examples include:" -msgstr "Voorbeelden hiervan zijn:" - -#: client/features/output/output.strings.js:62 -msgid "Execution Node" -msgstr "Uitvoeringsknooppunt" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:65 -msgid "Existing Group" -msgstr "Bestaande groep" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:142 -msgid "Existing Host" -msgstr "Bestaande host" - -#: client/features/output/output.strings.js:23 -#: client/src/workflow-results/workflow-results.controller.js:203 -#: client/src/workflow-results/workflow-results.controller.js:64 -msgid "Expand Output" -msgstr "Output uitklappen" - -#: client/lib/components/components.strings.js:121 -msgid "Expanded" -msgstr "Uitgeklapt" - -#: client/src/license/license.partial.html:246 -msgid "Expires" -msgstr "Verloopt" - -#: client/lib/services/base-string.service.js:132 -msgid "Expires (Ascending)" -msgstr "Vervalt (Oplopend)" - -#: client/lib/services/base-string.service.js:133 -msgid "Expires (Descending)" -msgstr "Vervalt (Aflopend)" - -#: client/src/license/license.partial.html:39 -msgid "Expires On" -msgstr "Verloopt op" - -#: client/lib/components/components.strings.js:133 -msgid "Expires:" -msgstr "Verloopt:" - -#: client/lib/components/components.strings.js:134 -msgid "Expires: Never" -msgstr "Verloopt: nooit" - -#: client/features/output/output.strings.js:71 -#: client/src/workflow-results/workflow-results.controller.js:76 -msgid "Explanation" -msgstr "Uitleg" - -#: client/features/output/output.strings.js:63 -#: client/features/templates/templates.strings.js:64 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:133 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:145 -#: client/src/partials/logviewer.html:8 -#: client/src/scheduler/scheduler.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:480 -#: client/src/templates/job_templates/job-template.form.js:487 -#: client/src/templates/workflows.form.js:136 -#: client/src/templates/workflows.form.js:143 -#: client/src/workflow-results/workflow-results.controller.js:180 -msgid "Extra Variables" -msgstr "Extra variabelen" - -#: client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js:7 -msgid "FACTS" -msgstr "FEITEN" - -#: client/features/output/output.strings.js:141 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:59 -msgid "FAILED" -msgstr "MISLUKT" - -#: client/features/output/output.strings.js:106 -msgid "FIELDS" -msgstr "VELDEN" - -#: client/src/shared/smart-search/smart-search.partial.html:42 -msgid "FIELDS:" -msgstr "VELDEN:" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "FINISHED" -msgstr "VOLTOOID" - -#: client/src/inventories-hosts/hosts/host.form.js:103 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:105 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:114 -msgid "Facts" -msgstr "Feiten" - -#: client/lib/components/components.strings.js:106 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:86 -msgid "Failed" -msgstr "Mislukt" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:44 -msgid "Failed Hosts" -msgstr "Mislukte hosts" - -#: client/src/projects/factories/get-project-path.factory.js:68 -msgid "Failed to access API config. GET status:" -msgstr "API-configuratie status kon niet geopend worden. Status OPHALEN:" - -#: client/src/users/add/users-add.controller.js:101 -msgid "Failed to add new user. POST returned status:" -msgstr "Nieuwe gebruiker toevoegen mislukt. Geretourneerde status POSTEN:" - -#: client/src/credentials/factories/credential-form-save.factory.js:78 -msgid "Failed to create new Credential. POST status:" -msgstr "Nieuwe toegangsgegevens aanmaken mislukt. Status POSTEN:" - -#: client/src/projects/add/projects-add.controller.js:121 -msgid "Failed to create new project. POST returned status:" -msgstr "Nieuw project aanmaken mislukt. Geretourneerde status POSTEN:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:35 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:48 -#: client/src/templates/main.js:144 -#: client/src/templates/main.js:282 -msgid "Failed to get config. GET returned status:" -msgstr "Configuratie OPHALEN geretourneerde status kon niet verkregen worden:" - -#: client/src/home/home.controller.js:43 -msgid "Failed to get dashboard graph data:" -msgstr "Kon gegevens van de dashboardgrafiek niet ophalen:" - -#: client/src/home/home.controller.js:29 -msgid "Failed to get dashboard host graph data:" -msgstr "Kon gegevens van de dashboardhostgrafiek niet ophalen:" - -#: client/src/home/home.controller.js:242 -msgid "Failed to get dashboard job templates list:" -msgstr "Kon taaksjablonenlijst van dashboard niet ophalen:" - -#: client/src/home/home.controller.js:233 -msgid "Failed to get dashboard jobs list:" -msgstr "Kon takenlijst van dashboard niet ophalen:" - -#: client/src/home/home.controller.js:223 -msgid "Failed to get dashboard:" -msgstr "Kon dashboard niet weergeven:" - -#: client/src/templates/main.js:246 -msgid "Failed to get instance groups. GET returned status:" -msgstr "Instantiegroepen OPHALEN geretourneerde status konden niet verkregen worden:" - -#: client/src/templates/main.js:342 -#: client/src/templates/main.js:410 -#: client/src/templates/main.js:72 -msgid "Failed to get inventory info. GET returned status:" -msgstr "Inventarisinformatie OPHALEN geretourneerde status kon niet verkregen worden:" - -#: client/src/templates/main.js:133 -msgid "Failed to get job template options. OPTIONS returned status:" -msgstr "Kon opties voor taaksjabloon niet ophalen. Geretourneerde status OPHALEN:" - -#: client/src/templates/main.js:178 -msgid "Failed to get job template. GET returned status:" -msgstr "Kon taaksjabloon niet ophalen. Geretourneerde status OPHALEN:" - -#: client/src/templates/main.js:117 -#: client/src/templates/main.js:258 -#: client/src/templates/main.js:356 -#: client/src/templates/main.js:424 -msgid "Failed to get labels. GET returned status:" -msgstr "Kon labels niet ophalen. Geretourneerde status OPHALEN:" - -#: client/src/home/home.controller.js:79 -msgid "Failed to get new jobs for dashboard:" -msgstr "Nieuwe taken voor het dashboard konden niet opgehaald worden:" - -#: client/src/home/home.controller.js:105 -msgid "Failed to get new templates for dashboard:" -msgstr "Nieuwe sjablonen voor het dashboard konden niet opgehaald worden:" - -#: client/src/organizations/main.js:140 -msgid "Failed to get organizations for which this user is a notification admin. GET returned" -msgstr "Kon organisaties niet ophalen waarvoor deze gebruiker een meldingsbeheerder is. Geretourneerd OPHALEN" - -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:38 -#: client/src/projects/main.js:122 -#: client/src/templates/main.js:296 -#: client/src/templates/main.js:474 -msgid "Failed to get organizations for which this user is a notification administrator. GET returned" -msgstr "Kon organisaties niet ophalen waarvoor deze gebruiker een meldingsbeheerder is. Geretourneerd GET" - -#: client/src/templates/main.js:103 -#: client/src/templates/main.js:89 -msgid "Failed to get project info. GET returned status:" -msgstr "Kon projectinformatie niet ophalen. GET geretourneerde status:" - -#: client/src/templates/main.js:195 -#: client/src/templates/main.js:220 -msgid "Failed to get project. GET returned status:" -msgstr "Kon project niet ophalen. GET geretourneerde status:" - -#: client/src/templates/main.js:313 -#: client/src/templates/main.js:491 -msgid "Failed to get webhook key GET returned" -msgstr "Niet in staat om webhooksleutel GET terug te krijgen" - -#: client/src/templates/main.js:271 -#: client/src/templates/main.js:437 -msgid "Failed to get workflow job template labels. GET returned status:" -msgstr "Kon labels sjabloon workflowtaak niet ophalen. GET geretourneerde status:" - -#: client/src/templates/main.js:372 -msgid "Failed to get workflow job template options. OPTIONS returned status:" -msgstr "Kon opties sjabloon workflowtaak niet ophalen. OPTIES geretourneerde status:" - -#: client/src/templates/main.js:450 -msgid "Failed to get workflow job template. GET returned status:" -msgstr "Kon sjabloon workflowtaak niet ophalen. GET geretourneerde status:" - -#: client/src/app.js:229 -#: client/src/login/loginModal/loginModal.controller.js:144 -msgid "Failed to get workflow jobs pending approval. GET returned status:" -msgstr "Kon workflowtaken in afwachting van goedkeuring niet ophalen. GET geretourneerde status:" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:223 -msgid "Failed to retrieve job template extra variables." -msgstr "Extra variabelen van taaksjabloon ophalen mislukt." - -#: client/src/projects/edit/projects-edit.controller.js:155 -msgid "Failed to retrieve project: %s. GET status:" -msgstr "Project ophalen mislukt: %s. Status OPHALEN:" - -#: client/src/users/edit/users-edit.controller.js:172 -msgid "Failed to retrieve user: %s. GET status:" -msgstr "Gebruiker ophalen mislukt: %s. Status OPHALEN:" - -#: client/src/configuration/forms/settings-form.controller.js:430 -msgid "Failed to save settings. Returned status:" -msgstr "Instellingen opslaan mislukt. Geretourneerde status:" - -#: client/src/configuration/forms/settings-form.controller.js:555 -msgid "Failed to save toggle settings. Returned status:" -msgstr "Instellingen wisselen mislukt. Geretourneerde status:" - -#: client/src/credentials/factories/credential-form-save.factory.js:94 -msgid "Failed to update Credential. PUT status:" -msgstr "Toegangsgegevens updaten mislukt. Status PLAATSEN:" - -#: client/src/projects/edit/projects-edit.controller.js:220 -msgid "Failed to update project: %s. PUT status:" -msgstr "Project bijwerken mislukt: %s. Status PLAATSEN:" - -#: client/features/output/output.strings.js:110 -msgid "Failed to update search results." -msgstr "Zoekresultaten bijwerken mislukt." - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:204 -#: client/src/management-jobs/card/card.controller.js:123 -#: client/src/management-jobs/card/card.controller.js:59 -msgid "Failed updating job %s with variables. POST returned: %d" -msgstr "Taak %s met variabelen bijwerken mislukt. Geretourneerde POST: %d" - -#: client/src/organizations/main.js:112 -msgid "Failed while checking to see if user is a notification administrator of this organization. GET returned" -msgstr "Fout bij controleren of een gebruiker een meldingsbeheerder is voor deze organisatie. Geretourneerd GET" - -#: client/src/organizations/main.js:125 -msgid "Failed while checking to see if user is an administrator of this organization. GET returned" -msgstr "Fout bij controleren of een gebruiker een beheerder is voor deze organisatie. Geretourneerd GET" - -#: client/src/notifications/notifications.list.js:77 -msgid "Failure" -msgstr "Mislukking" - -#: client/src/instance-groups/instance-groups.strings.js:81 -msgid "Field for passing a custom Kubernetes or OpenShift Pod specification." -msgstr "Veld voor het opgeven van een aangepaste Kubernetes of OpenShift Pod-specificatie." - -#: client/src/scheduler/schedules.list.js:63 -msgid "Final Run" -msgstr "Laatste uitvoering" - -#: client/lib/services/base-string.service.js:142 -msgid "Finish Time (Ascending)" -msgstr "Tijd van afronden (Oplopend)" - -#: client/lib/services/base-string.service.js:143 -msgid "Finish Time (Descending)" -msgstr "Tijd van afronden (Aflopend)" - -#: client/features/jobs/jobs.strings.js:10 -#: client/features/output/output.strings.js:52 -#: client/features/output/output.strings.js:64 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:56 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:44 -#: client/src/workflow-results/workflow-results.controller.js:72 -msgid "Finished" -msgstr "Voltooid" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 -#: client/src/teams/teams.form.js:101 -#: client/src/users/users.form.js:29 -#: client/src/users/users.list.js:33 -msgid "First Name" -msgstr "Voornaam" - -#: client/src/scheduler/schedules.list.js:53 -msgid "First Run" -msgstr "Eerste uitvoering" - -#: client/src/organizations/organizations.form.js:124 -msgid "First name" -msgstr "Voornaam" - -#: client/src/templates/survey-maker/surveys/init.factory.js:19 -msgid "Float" -msgstr "Drijven" - -#: client/features/output/output.strings.js:102 -#: client/src/shared/smart-search/smart-search.partial.html:49 -msgid "For additional information on advanced search syntax please see the Ansible Tower" -msgstr "Zie de Ansible Tower voor meer informatie over geavanceerde zoeksyntaxis" - -#: client/src/credentials/factories/become-method-change.factory.js:63 -#: client/src/credentials/factories/kind-change.factory.js:119 -msgid "For example, %s" -msgstr "Bijvoorbeeld %s" - -#: client/index.template.ejs:113 -msgid "For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept." -msgstr "Voor verzamelde feiten die ouder zijn dan de opgegeven periode, slaat u één feitenscan (momentopname) per tijdvenster (frequentie) op. Bijvoorbeeld feiten ouder dan 30 dagen worden verwijderd, terwijl één wekelijkse feitenscan wordt bewaard." - -#: client/src/inventories-hosts/hosts/host.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:34 -msgid "For hosts that are part of an external inventory, this flag may be reset by the inventory sync process." -msgstr "Deze vlag wordt mogelijk gereset door het synchronisatieproces van de inventaris bij hosts die onderdeel zijn van een externe inventaris." - -#: client/src/inventories-hosts/hosts/host.form.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:32 -#: client/src/inventories-hosts/inventory-hosts.strings.js:33 -msgid "For hosts that are part of an external inventory, this may be reset by the inventory sync process." -msgstr "Deze wordt mogelijk gereset door het synchronisatieproces van de inventaris bij hosts die onderdeel zijn van een externe inventaris." - -#: client/features/templates/templates.strings.js:59 -#: client/src/templates/job_templates/job-template.form.js:54 -msgid "For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook." -msgstr "Voor taaksjablonen selecteer \"uitvoeren\" om het draaiboek uit te voeren. Selecteer \"controleren\" om slechts de syntaxis van het draaiboek te controleren, de installatie van de omgeving te testen en problemen te rapporteren zonder het draaiboek uit te voeren." - -#: client/src/projects/projects.form.js:145 -msgid "For more information, refer to the" -msgstr "Bekijk voor meer informatie de" - -#: client/features/output/output.strings.js:65 -#: client/src/instance-groups/instance-groups.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:110 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:97 -#: client/src/templates/job_templates/job-template.form.js:162 -#: client/src/templates/job_templates/job-template.form.js:168 -msgid "Forks" -msgstr "Vorken" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:179 -#: client/src/scheduler/scheduler.strings.js:28 -msgid "Frequency Details" -msgstr "Frequentie-informatie" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:454 -#: client/src/scheduler/scheduler.strings.js:41 -msgid "Fri" -msgstr "Vrij" - -#: client/src/license/license.partial.html:150 -msgid "GET LICENSES" -msgstr "LICENTIES OPHALEN" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "GO TO NOTIFICATIONS TO" -msgstr "GA NAAR MELDINGEN OM" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js:45 -msgid "GROUPS" -msgstr "GROEPEN" - -#: client/src/shared/form-generator.js:801 -msgid "Generate field" -msgstr "Veld genereren" - -#: client/features/projects/projects.strings.js:18 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:28 -#: client/src/projects/edit/projects-edit.controller.js:119 -msgid "Get latest SCM revision" -msgstr "De nieuwste SCM-herziening ophalen" - -#: client/features/output/output.strings.js:37 -msgid "Get next page" -msgstr "Volgende pagina ophalen" - -#: client/features/output/output.strings.js:38 -msgid "Get previous page" -msgstr "Vorige pagina ophalen" - -#: client/src/credential-types/add/add.controller.js:41 -msgid "Getting Started with Credential Types" -msgstr "Beginnen met soorten toegangsgegevens" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:92 -msgid "GitHub" -msgstr "GitHub" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:110 -msgid "GitHub (Default)" -msgstr "GitHub (standaard)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:31 -msgid "GitHub Category" -msgstr "GitHub-categorie" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:111 -msgid "GitHub Org" -msgstr "GitHub Org" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:112 -msgid "GitHub Team" -msgstr "GitHub Team" - -#: client/src/shared/paginate/paginate.partial.html:18 -msgid "Go to current page of list" -msgstr "Ga naar de huidige pagina van de lijst" - -#: client/features/output/output.strings.js:36 -msgid "Go to first page" -msgstr "Ga naar de eerste pagina" - -#: client/features/output/output.strings.js:39 -msgid "Go to last page of available output" -msgstr "Ga naar de laatste pagina met beschikbare output" - -#: client/src/shared/paginate/paginate.partial.html:28 -msgid "Go to last page of list" -msgstr "Ga naar de laatste pagina van de lijst" - -#: client/src/shared/paginate/paginate.partial.html:22 -msgid "Go to next page of list" -msgstr "Ga naar de volgende pagina van de lijst" - -#: client/src/shared/paginate/paginate.partial.html:6 -msgid "Go to page 1 of list" -msgstr "Ga naar pagina 1 van de lijst" - -#: client/src/shared/paginate/paginate.partial.html:12 -msgid "Go to previous page of list" -msgstr "Ga naar de vorige pagina van de lijst" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:93 -msgid "Google OAuth2" -msgstr "Google OAuth2" - -#: client/src/notifications/notificationTemplates.form.js:300 -msgid "Grafana API Key" -msgstr "Grafana API-sleutel" - -#: client/src/notifications/notificationTemplates.form.js:285 -msgid "Grafana URL" -msgstr "Grafana URL" - -#: client/src/teams/teams.form.js:170 -#: client/src/users/users.form.js:222 -msgid "Grant Permission" -msgstr "Machtiging toekennen" - -#: client/src/notifications/add/add.controller.js:84 -#: client/src/notifications/edit/edit.controller.js:147 -msgid "Gray" -msgstr "Grijs" - -#: client/src/notifications/add/add.controller.js:85 -#: client/src/notifications/edit/edit.controller.js:148 -msgid "Green" -msgstr "Groen" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:51 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:52 -msgid "Group Variables" -msgstr "Variabelen ordenen" - -#: client/src/inventories-hosts/hosts/host.form.js:111 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:89 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:23 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:88 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:22 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:113 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:122 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:38 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:145 -msgid "Groups" -msgstr "Groepen" - -#: client/src/scheduler/scheduler.strings.js:61 -msgid "HH24" -msgstr "UU24" - -#: client/lib/services/base-string.service.js:69 -#: client/src/templates/survey-maker/surveys/init.factory.js:499 -msgid "HIDE" -msgstr "VERBERGEN" - -#: client/lib/components/components.strings.js:44 -msgid "HINT: Drag and drop private file on the field below." -msgstr "TIP: sleep een privé bestand naar het onderstaande veld." - -#: client/src/activity-stream/get-target-title.factory.js:41 -#: client/src/inventories-hosts/hosts/hosts.partial.html:9 -#: client/src/inventories-hosts/hosts/main.js:81 -#: client/src/inventories-hosts/inventories/inventories.partial.html:15 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.route.js:18 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js:17 -msgid "HOSTS" -msgstr "HOSTS" - -#: client/src/notifications/notificationTemplates.form.js:410 -#: client/src/notifications/notificationTemplates.form.js:411 -msgid "HTTP Headers" -msgstr "HTTP-koppen" - -#: client/src/notifications/notificationTemplates.form.js:427 -#: client/src/notifications/notificationTemplates.form.js:428 -msgid "HTTP Method" -msgstr "HTTP-methode" - -#: client/lib/components/components.strings.js:12 -msgid "Hide" -msgstr "Verbergen" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "Hide Activity Stream" -msgstr "Activiteitenlogboek verbergen" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:23 -msgid "High" -msgstr "Hoog" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:13 -msgid "High Risk" -msgstr "Hoog risico" - -#: client/src/credentials/credentials.form.js:139 -#: client/src/notifications/notificationTemplates.form.js:83 -msgid "Host" -msgstr "Host" - -#: client/src/credentials/factories/become-method-change.factory.js:52 -#: client/src/credentials/factories/kind-change.factory.js:108 -msgid "Host (Authentication URL)" -msgstr "Host (authenticatie-URL)" - -#: client/src/templates/job_templates/job-template.form.js:387 -#: client/src/templates/job_templates/job-template.form.js:396 -msgid "Host Config Key" -msgstr "Configuratiesleutel host" - -#: client/src/inventories-hosts/hosts/host.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:39 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:39 -msgid "Host Enabled" -msgstr "Host ingeschakeld" - -#: client/features/output/output.strings.js:66 -msgid "Host Limit Error" -msgstr "Fout hostlimiet" - -#: client/src/inventories-hosts/hosts/host.form.js:45 -#: client/src/inventories-hosts/hosts/host.form.js:56 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:44 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:55 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:46 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:57 -msgid "Host Name" -msgstr "Hostnaam" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:78 -msgid "Host Variables" -msgstr "Hostvariabelen" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is available" -msgstr "Host is beschikbaar" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is available. Click to toggle." -msgstr "Host is beschikbaar. Klik om te wisselen." - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is not available" -msgstr "Host is niet beschikbaar" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is not available. Click to toggle." -msgstr "Host is niet beschikbaar. Klik om te wisselen." - -#: client/features/output/output.strings.js:13 -msgid "Host status information for this job is unavailable." -msgstr "Statusinformatie van de host is niet beschikbaar voor deze taak." - -#: client/features/output/output.strings.js:119 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:39 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:98 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:64 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:149 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:155 -msgid "Hosts" -msgstr "Hosts" - -#: client/src/license/license.partial.html:52 -#: client/src/license/license.partial.html:58 -msgid "Hosts Available" -msgstr "Beschikbare hosts" - -#: client/src/license/license.partial.html:68 -msgid "Hosts Remaining" -msgstr "Overgebleven hosts" - -#: client/src/license/license.partial.html:62 -msgid "Hosts Used" -msgstr "Gebruikte hosts" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "Hosts are imported to" -msgstr "Hosts worden geïmporteerd naar" - -#: client/features/output/output.strings.js:129 -msgid "ID" -msgstr "ID" - -#: client/src/notifications/notificationTemplates.form.js:313 -msgid "ID of the Dashboard (optional)" -msgstr "ID van het dashboard (optioneel)" - -#: client/src/notifications/notificationTemplates.form.js:321 -msgid "ID of the Panel (optional)" -msgstr "ID van het paneel (optioneel)" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:14 -msgid "INITIATED BY" -msgstr "GESTART DOOR" - -#: client/src/inventories-hosts/inventories/insights/insights.route.js:7 -msgid "INSIGHTS" -msgstr "INZICHTEN" - -#: client/src/instance-groups/instance-groups.list.js:6 -#: client/src/instance-groups/instance-groups.list.js:7 -#: client/src/instance-groups/instance-groups.strings.js:10 -#: client/src/instance-groups/instance-groups.strings.js:19 -msgid "INSTANCE GROUPS" -msgstr "INSTANTIEGROEPEN" - -#: client/src/instance-groups/instance-groups.strings.js:11 -#: client/src/instance-groups/instance-groups.strings.js:30 -msgid "INSTANCES" -msgstr "INSTANTIES" - -#: client/src/activity-stream/get-target-title.factory.js:14 -#: client/src/inventories-hosts/hosts/hosts.partial.html:8 -#: client/src/inventories-hosts/inventories/inventories.partial.html:14 -#: client/src/inventories-hosts/inventories/inventories.route.js:8 -#: client/src/inventories-hosts/inventories/inventory.list.js:14 -#: client/src/inventories-hosts/inventories/inventory.list.js:15 -#: client/src/organizations/linkout/organizations-linkout.route.js:138 -#: client/src/organizations/list/organizations-list.controller.js:69 -msgid "INVENTORIES" -msgstr "INVENTARISSEN" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:138 -msgid "INVENTORY" -msgstr "INVENTARIS" - -#: client/src/inventory-scripts/inventory-scripts.form.js:23 -msgid "INVENTORY SCRIPT" -msgstr "INVENTARISSCRIPT" - -#: client/src/activity-stream/get-target-title.factory.js:35 -#: client/src/inventory-scripts/inventory-scripts.list.js:12 -#: client/src/inventory-scripts/main.js:65 -msgid "INVENTORY SCRIPTS" -msgstr "INVENTARISSCRIPTS" - -#: client/src/notifications/notificationTemplates.form.js:524 -msgid "IRC Nick" -msgstr "IRC-bijnaam" - -#: client/src/notifications/notificationTemplates.form.js:513 -msgid "IRC Server Address" -msgstr "IRC-serveradres" - -#: client/src/notifications/shared/type-change.service.js:72 -msgid "IRC Server Password" -msgstr "IRC-serverwachtwoord" - -#: client/src/notifications/shared/type-change.service.js:71 -msgid "IRC Server Port" -msgstr "IRC-serverpoort" - -#: client/src/instance-groups/instance-groups.strings.js:21 -msgid "ISOLATED" -msgstr "GEÏSOLEERD" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:79 -msgid "ISSUE: {{report.rule.description}}" -msgstr "PROBLEEM: {{report.rule.description}}" - -#: client/src/shared/paginate/paginate.partial.html:43 -msgid "ITEMS" -msgstr "ITEMS" - -#: client/src/notifications/notificationTemplates.form.js:467 -#: client/src/notifications/notificationTemplates.form.js:499 -msgid "Icon URL" -msgstr "Icoon-URL" - -#: client/src/login/authenticationServices/timer.factory.js:157 -msgid "Idle Session" -msgstr "Inactieve sessie" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "If blank, all groups above are created except" -msgstr "Als dit vakje leeg wordt gelaten, worden alle bovenstaande groepen aangemaakt, behalve" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:364 -msgid "If checked, all variables for child groups and hosts will be removed and replaced by those found on the external source." -msgstr "Als dit vakje aangevinkt is, worden alle variabelen voor onderliggende groepen en hosts verwijderd en worden ze vervangen door de variabelen die aangetroffen worden in de externe bron." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:353 -msgid "If checked, any hosts and groups that were previously present on the external source but are now removed will be removed from the Tower inventory. Hosts and groups that were not managed by the inventory source will be promoted to the next manually created group or if there is no manually created group to promote them into, they will be left in the \"all\" default group for the inventory." -msgstr "Als dit vakje aangevinkt is, worden alle groepen en hosts die eerder aanwezig waren in de externe bron, maar die nu verwijderd zijn, verwijderd uit de inventaris. Hosts en groepen die niet beheerd werden door de inventarisbron, worden omhoog verplaatst naar de volgende handmatig gemaakte groep. Als er geen handmatig gemaakte groep is waar ze naartoe kunnen worden verplaatst, blijven ze staan in de standaard inventarisgroep 'Alle'." - -#: client/src/templates/job_templates/job-template.form.js:324 -msgid "If enabled, run this playbook as an administrator." -msgstr "Als deze optie ingeschakeld is, wordt het draaiboek uitgevoerd als beheerder." - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:121 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Als deze mogelijkheid ingeschakeld is, worden de wijzigingen die aangebracht zijn door Ansible-taken weergegeven, waar ondersteund. Dit staat gelijk aan de diff-modus van Ansible." - -#: client/features/templates/templates.strings.js:51 -#: client/src/templates/job_templates/job-template.form.js:309 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "Als deze mogelijkheid ingeschakeld is, worden de wijzigingen die aangebracht zijn door Ansible-taken weergegeven, waar ondersteund. Dit staat gelijk aan de diff-modus van Ansible." - -#: client/src/templates/job_templates/job-template.form.js:356 -msgid "If enabled, simultaneous runs of this job template will be allowed." -msgstr "Indien deze mogelijkheid ingeschakeld is, zijn gelijktijdige uitvoeringen van dit taaksjabloon toegestaan." - -#: client/src/templates/workflows.form.js:160 -msgid "If enabled, simultaneous runs of this workflow job template will be allowed." -msgstr "Indien deze mogelijkheid ingeschakeld is, zijn gelijktijdige uitvoeringen van deze workflow-taaksjabloon toegestaan." - -#: client/src/templates/job_templates/job-template.form.js:366 -msgid "If enabled, use cached facts if available and store discovered facts in the cache." -msgstr "Gebruik gecachete feiten als deze beschikbaar zijn en sla feiten die ontdekt zijn op in de cache, indien deze mogelijkheid ingeschakeld is." - -#: client/src/credentials/credentials.form.js:52 -msgid "If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization." -msgstr "Als er geen organisatie opgegeven is, kunnen de toegangsgegevens alleen gebruikt worden door de gebruiker die de toegangsgegevens aangemaakt heeft. Beheerders van organisaties en systeembeheerders kunnen een organisatie toewijzen zodat rollen voor de toegangsgegevens toegewezen kunnen worden aan gebruikers en teams binnen die organisatie." - -#: client/src/license/license.partial.html:74 -msgid "If you are ready to upgrade, please contact us by clicking the button below" -msgstr "Neem zodra u klaar bent om te updaten contact met ons op door op de onderstaande knop te klikken" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:242 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:254 -msgid "Image ID:" -msgstr "Afbeelding-ID:" - -#: client/src/inventories-hosts/hosts/host.form.js:34 -#: client/src/inventories-hosts/hosts/host.list.js:35 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:32 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:33 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:30 -#: client/src/inventories-hosts/inventory-hosts.strings.js:32 -msgid "Indicates if a host is available and should be included in running jobs." -msgstr "Geeft aan of een host beschikbaar is, moet opgenomen worden in taken die in uitvoering zijn." - -#: client/src/activity-stream/activity-detail.form.js:31 -#: client/src/activity-stream/streams.list.js:33 -msgid "Initiated by" -msgstr "Gestart door" - -#: client/src/credential-types/credential-types.form.js:53 -#: client/src/credential-types/credential-types.form.js:61 -msgid "Injector Configuration" -msgstr "Configuratie-injector" - -#: client/src/credential-types/credential-types.form.js:39 -#: client/src/credential-types/credential-types.form.js:47 -msgid "Input Configuration" -msgstr "Configuratie-input" - -#: client/src/inventories-hosts/hosts/host.form.js:119 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:129 -msgid "Insights" -msgstr "Inzichten" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:52 -msgid "Insights Credential" -msgstr "Inzichten toegangsgegevens" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:144 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:147 -msgid "Instance Filters" -msgstr "Instantiefilters" - -#: client/features/output/output.strings.js:67 -#: client/src/instance-groups/instance-groups.strings.js:43 -msgid "Instance Group" -msgstr "Instantiegroep" - -#: client/src/instance-groups/instance-groups.strings.js:71 -msgid "Instance Group parameter is missing." -msgstr "Parameter van instantiegroep ontbreekt." - -#: client/lib/components/components.strings.js:86 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:54 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:57 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:61 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:64 -#: client/src/organizations/organizations.form.js:38 -#: client/src/organizations/organizations.form.js:41 -#: client/src/templates/job_templates/job-template.form.js:268 -#: client/src/templates/job_templates/job-template.form.js:271 -msgid "Instance Groups" -msgstr "Instantiegroepen" - -#: client/src/instance-groups/instance-groups.strings.js:37 -msgid "Instance Groups Help" -msgstr "Instantiegroepen, Help" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "Instance ID" -msgstr "Instantie-id" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:243 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:255 -msgid "Instance ID:" -msgstr "Instantie-ID:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:244 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:256 -msgid "Instance Type:" -msgstr "Instantietype:" - -#: client/lib/components/components.strings.js:85 -#: client/src/instance-groups/instance-groups.strings.js:20 -msgid "Instances" -msgstr "Instanties" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "Insufficient Permissions" -msgstr "Onvoldoende machtigingen" - -#: client/src/templates/survey-maker/surveys/init.factory.js:18 -msgid "Integer" -msgstr "Geheel getal" - -#: client/src/license/license.partial.html:11 -msgid "Invalid License" -msgstr "Ongeldige licentie" - -#: client/src/license/license.controller.js:109 -#: client/src/license/license.controller.js:117 -msgid "Invalid file format. Please upload valid JSON." -msgstr "Ongeldige bestandsindeling. Upload een geldige JSON." - -#: client/lib/components/components.strings.js:16 -msgid "Invalid input for this type." -msgstr "Ongeldige input voor dit type." - -#: client/features/output/output.strings.js:111 -msgid "Invalid search filter provided." -msgstr "Ongeldige zoekfilter verschaft." - -#: client/src/login/loginModal/loginModal.partial.html:46 -msgid "Invalid username and/or password. Please try again." -msgstr "Ongeldige gebruikersnaam en/of wachtwoord. Probeer het opnieuw." - -#: client/lib/components/components.strings.js:77 -#: client/lib/models/models.strings.js:16 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:121 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:52 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/organizations/linkout/organizations-linkout.route.js:147 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "Inventories" -msgstr "Inventarissen" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:43 -msgid "Inventories with sources cannot be copied" -msgstr "Inventarissen met bronnen kunnen niet gekopieerd worden" - -#: client/features/jobs/jobs.strings.js:14 -#: client/features/output/output.strings.js:69 -#: client/features/templates/templates.strings.js:19 -#: client/features/templates/templates.strings.js:28 -#: client/src/inventories-hosts/hosts/host.list.js:75 -#: client/src/inventories-hosts/inventories/inventory.list.js:85 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/templates/job_templates/job-template.form.js:66 -#: client/src/templates/job_templates/job-template.form.js:80 -#: client/src/templates/workflows.form.js:72 -#: client/src/templates/workflows.form.js:82 -#: client/src/workflow-results/workflow-results.controller.js:78 -msgid "Inventory" -msgstr "Inventaris" - -#: client/lib/services/base-string.service.js:148 -msgid "Inventory (Ascending)" -msgstr "Inventaris (Oplopend)" - -#: client/lib/services/base-string.service.js:149 -msgid "Inventory (Descending)" -msgstr "Inventaris (Aflopend)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:109 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:123 -msgid "Inventory File" -msgstr "Inventarisbestand" - -#: client/src/workflow-results/workflow-results.controller.js:79 -msgid "Inventory Limit" -msgstr "Inventarisgrens" - -#: client/lib/components/components.strings.js:82 -#: client/lib/models/models.strings.js:20 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 -msgid "Inventory Scripts" -msgstr "Inventarisscript" - -#: client/lib/models/models.strings.js:25 -msgid "Inventory Sources" -msgstr "Inventarisbronnen" - -#: client/features/templates/templates.strings.js:118 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:52 -#: client/src/workflow-results/workflow-results.controller.js:99 -msgid "Inventory Sync" -msgstr "Inventarissynchronisatie" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:55 -msgid "Inventory Sync Failures" -msgstr "Fouten bij inventarissynchronisatie" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:75 -msgid "Inventory Variables" -msgstr "Inventarisvariabelen" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:72 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:67 -msgid "Inventory contains 0 hosts." -msgstr "Inventaris bevat 0 hosts." - -#: client/features/output/output.strings.js:47 -msgid "Isolated" -msgstr "Geïsoleerd" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "JOB ID" -msgstr "TAAK-ID" - -#: client/features/output/output.strings.js:109 -msgid "JOB IS STILL RUNNING" -msgstr "TAAK NOG IN UITVOERING" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:4 -msgid "JOB STATUS" -msgstr "TAAKSTATUS" - -#: client/src/templates/job_templates/job-template.form.js:22 -msgid "JOB TEMPLATE" -msgstr "TAAKSJABLOON" - -#: client/features/portalMode/portalMode.strings.js:8 -#: client/features/templates/routes/organizationsTemplatesList.route.js:28 -#: client/features/templates/routes/projectsTemplatesList.route.js:29 -#: client/src/organizations/list/organizations-list.controller.js:83 -msgid "JOB TEMPLATES" -msgstr "TAAKSJABLONEN" - -#: client/features/jobs/jobs.strings.js:8 -#: client/features/jobs/routes/instanceGroupJobs.route.js:13 -#: client/features/jobs/routes/instanceGroupJobs.route.js:75 -#: client/features/jobs/routes/instanceJobs.route.js:13 -#: client/features/jobs/routes/inventoryCompletedJobs.route.js:29 -#: client/features/jobs/routes/jobs.route.js:12 -#: client/features/portalMode/portalMode.strings.js:9 -#: client/src/activity-stream/get-target-title.factory.js:32 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:115 -#: client/src/instance-groups/instance-groups.strings.js:31 -msgid "JOBS" -msgstr "TAKEN" - -#: client/lib/components/code-mirror/code-mirror.strings.js:14 -#: client/lib/services/base-string.service.js:73 -msgid "JSON" -msgstr "JSON" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:197 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:221 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:245 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:320 -msgid "JSON:" -msgstr "JSON:" - -#: client/features/jobs/jobs.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:118 -msgid "Job" -msgstr "Taak" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Job Not Found" -msgstr "Taak niet gevonden" - -#: client/src/templates/job_templates/job-template.form.js:277 -msgid "Job Slicing" -msgstr "Taken verdelen" - -#: client/features/output/output.strings.js:72 -#: client/features/templates/templates.strings.js:54 -#: client/src/templates/job_templates/job-template.form.js:206 -#: client/src/templates/job_templates/job-template.form.js:213 -msgid "Job Tags" -msgstr "Taaktags" - -#: client/features/jobs/jobs.strings.js:13 -#: client/features/output/output.strings.js:73 -#: client/features/templates/templates.strings.js:116 -#: client/features/templates/templates.strings.js:13 -#: client/src/templates/templates.list.js:61 -msgid "Job Template" -msgstr "Taaksjabloon" - -#: client/lib/models/models.strings.js:30 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:102 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:36 -#: client/src/projects/projects.form.js:334 -msgid "Job Templates" -msgstr "Taaksjablonen" - -#: client/features/output/output.strings.js:75 -#: client/features/templates/templates.strings.js:58 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:35 -#: client/src/templates/job_templates/job-template.form.js:47 -#: client/src/templates/job_templates/job-template.form.js:55 -msgid "Job Type" -msgstr "Soort taak" - -#: client/src/workflow-results/workflow-results.service.js:100 -msgid "Job has completed. Unable to be canceled." -msgstr "Taak is voltooid. Kan niet geannuleerd worden." - -#: client/features/output/output.strings.js:30 -msgid "Job is one of several from a JT that slices on inventory" -msgstr "Taak is één van verschillende jobs in een Taaksjabloon dat inventaris verdeelt" - -#: client/features/jobs/jobs.strings.js:20 -msgid "Job {{status}}. Click for details." -msgstr "Taak {{status}}. Klik voor meer informatie." - -#: client/features/templates/templates.strings.js:125 -#: client/lib/components/components.strings.js:71 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 -#: client/src/configuration/settings.partial.html:5 -#: client/src/instance-groups/instance-groups.strings.js:60 -msgid "Jobs" -msgstr "Taken" - -#: client/features/output/output.strings.js:107 -#: client/features/templates/templates.strings.js:111 -#: client/src/workflow-results/workflow-results.controller.js:101 -msgid "KEY" -msgstr "SLEUTEL" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:61 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:153 -#: client/src/shared/smart-search/smart-search.partial.html:14 -msgid "Key" -msgstr "Sleutel" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:245 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:257 -msgid "Key Name:" -msgstr "Naam sleutel:" - -#: client/src/credential-types/credential-types.list.js:31 -#: client/src/credentials/credentials.list.js:33 -msgid "Kind" -msgstr "Type" - -#: client/features/applications/applications.strings.js:31 -#: client/features/projects/projects.strings.js:12 -msgid "LAST MODIFIED" -msgstr "LAATST AANGEPAST" - -#: client/features/projects/projects.strings.js:13 -#: client/features/users/tokens/tokens.strings.js:38 -msgid "LAST USED" -msgstr "LAATST GEBRUIKT" - -#: client/features/templates/templates.strings.js:34 -#: client/lib/components/components.strings.js:112 -msgid "LAUNCH" -msgstr "OPSTARTEN" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:94 -msgid "LDAP" -msgstr "LDAP" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:102 -msgid "LDAP 1 (Optional)" -msgstr "LDAP 1 (optioneel)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:103 -msgid "LDAP 2 (Optional)" -msgstr "LDAP 2 (optioneel)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:104 -msgid "LDAP 3 (Optional)" -msgstr "LDAP 3 (optioneel)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:105 -msgid "LDAP 4 (Optional)" -msgstr "LDAP 4 (optioneel)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:106 -msgid "LDAP 5 (Optional)" -msgstr "LDAP 5 (optioneel)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:18 -msgid "LDAP Server" -msgstr "LDAP-server" - -#: client/src/license/license.route.js:18 -msgid "LICENSE" -msgstr "LICENTIE" - -#: client/features/output/output.strings.js:76 -#: client/src/templates/job_templates/job-template.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:244 -#: client/src/templates/templates.list.js:43 -#: client/src/templates/workflows.form.js:121 -#: client/src/templates/workflows.form.js:125 -#: client/src/workflow-results/workflow-results.controller.js:73 -msgid "Labels" -msgstr "Labels" - -#: client/features/templates/templates.strings.js:22 -msgid "Last Modified" -msgstr "Laatst aangepast" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 -#: client/src/teams/teams.form.js:105 -#: client/src/users/users.form.js:35 -#: client/src/users/users.list.js:37 -msgid "Last Name" -msgstr "Achternaam" - -#: client/features/templates/templates.strings.js:23 -msgid "Last Ran" -msgstr "Laatst uitgevoerd" - -#: client/lib/services/base-string.service.js:134 -msgid "Last Run (Ascending)" -msgstr "Laatste uitvoering (Oplopend)" - -#: client/lib/services/base-string.service.js:135 -msgid "Last Run (Descending)" -msgstr "Laatste uitvoering (Aflopend)" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:56 -msgid "Last Sync" -msgstr "Laatste synchronisatie" - -#: client/src/projects/projects.list.js:62 -msgid "Last Updated" -msgstr "Laatst geüpdatet" - -#: client/lib/services/base-string.service.js:136 -msgid "Last Used (Ascending)" -msgstr "Laatst gebruikt (Oplopend)" - -#: client/lib/services/base-string.service.js:137 -msgid "Last Used (Descending)" -msgstr "Laatst gebruikt (Aflopend)" - -#: client/src/shared/form-generator.js:1402 -msgid "Last logged in:" -msgstr "Laatst ingelogd:" - -#: client/src/organizations/organizations.form.js:128 -msgid "Last name" -msgstr "Achternaam" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:33 -#: client/src/shared/form-generator.js:1660 -msgid "Launch" -msgstr "Starten" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:49 -msgid "Launch Configuration" -msgstr "Opstartconfiguratie" - -#: client/src/management-jobs/card/card.partial.html:21 -#: client/src/management-jobs/card/card.partial.html:24 -msgid "Launch Management Job" -msgstr "Beheertaak starten" - -#: client/features/jobs/jobs.strings.js:12 -#: client/features/output/output.strings.js:77 -#: client/src/workflow-results/workflow-results.controller.js:70 -msgid "Launched By" -msgstr "Gestart door" - -#: client/lib/services/base-string.service.js:146 -msgid "Launched By (Ascending)" -msgstr "Gestart door (Oplopend)" - -#: client/lib/services/base-string.service.js:147 -msgid "Launched By (Descending)" -msgstr "Gestart door (Aflopend)" - -#: client/features/templates/templates.strings.js:42 -msgid "Launching this job requires the passwords listed below. Enter each password before continuing." -msgstr "Voor het starten van deze taak zijn onderstaande wachtwoorden nodig. Ieder wachtwoord dient ingevoerd te worden voordat u verdergaat." - -#: client/features/users/tokens/tokens.strings.js:32 -msgid "Leaving this field blank will result in the creation of a Personal Access Token which is not linked to an Application." -msgstr "Als dit veld leeg wordt gelaten, wordt er een persoonlijke toegangstoken aangemaakt die niet gekoppeld is aan een toepassing." - -#: client/features/credentials/legacy.credentials.js:350 -msgid "Legacy state configuration for does not exist" -msgstr "Er bestaat geen oude staat van configuratie voor" - -#: client/lib/components/components.strings.js:98 -#: client/src/configuration/settings.partial.html:14 -#: client/src/license/license.controller.js:47 -#: client/src/license/license.partial.html:109 -#: client/src/license/license.partial.html:8 -msgid "License" -msgstr "Licentie" - -#: client/features/output/output.strings.js:78 -msgid "License Error" -msgstr "Licentiefout" - -#: client/src/license/license.partial.html:33 -msgid "License Key" -msgstr "Licentiesleutel" - -#: client/src/license/license.controller.js:49 -msgid "License Management" -msgstr "Licentiebeheer" - -#: client/src/license/license.partial.html:21 -msgid "License Type" -msgstr "Licentiesoort" - -#: client/features/output/output.strings.js:79 -#: client/features/templates/templates.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:45 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:55 -#: client/src/templates/job_templates/job-template.form.js:175 -#: client/src/templates/job_templates/job-template.form.js:179 -#: client/src/templates/workflows.form.js:93 -#: client/src/templates/workflows.form.js:97 -msgid "Limit" -msgstr "Limiet" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:255 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:268 -msgid "Limit to hosts having a tag:" -msgstr "Beperken tot hosts met een tag:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:257 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:270 -msgid "Limit to hosts using either key pair:" -msgstr "Beperken tot hosts die één van de sleutelparen gebruiken:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "Limit to hosts where the Name tag begins with" -msgstr "Beperken tot hosts waarvan de naam begint met" - -#: client/src/scheduler/scheduler.strings.js:51 -msgid "Limited to first 10" -msgstr "Beperkt tot de eerste 10" - -#: client/src/shared/socket/socket.service.js:225 -msgid "Live events: attempting to connect to the server." -msgstr "Livegebeurtenissen: er wordt geprobeerd verbinding met de server te maken." - -#: client/src/shared/socket/socket.service.js:229 -msgid "Live events: connected. Pages containing job status information will automatically update in real-time." -msgstr "Livegebeurtenissen: verbonden. Pagina's met informatie over de status van taken worden automatisch geüpdatet in realtime." - -#: client/src/shared/socket/socket.service.js:233 -msgid "Live events: error connecting to the server." -msgstr "Livegebeurtenissen: fout bij het verbinding maken met de server." - -#: client/src/shared/form-generator.js:1935 -msgid "Loading..." -msgstr "Laden..." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:136 -#: client/src/scheduler/scheduler.strings.js:26 -msgid "Local Time Zone" -msgstr "Lokale tijdzone" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:588 -msgid "Local time" -msgstr "Plaatselijke tijd" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:228 -msgid "Log aggregator test failed.
Detail:" -msgstr "Log aggregator-test mislukt.
Details:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:218 -msgid "Log aggregator test sent successfully." -msgstr "Logboekaggregatortest met succes verzonden." - -#: client/lib/components/components.strings.js:67 -msgid "Logged in as" -msgstr "Aangemeld als" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:85 -msgid "Logging" -msgstr "Logboekregistratie" - -#: client/lib/components/components.strings.js:69 -#: client/lib/components/layout/layout.partial.html:39 -msgid "Logout" -msgstr "Afmelden" - -#: client/src/shared/form-generator.js:1258 -msgid "Lookup field" -msgstr "Opzoekveld" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:35 -msgid "Low" -msgstr "Laag" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:15 -msgid "Low Risk" -msgstr "Laag risico" - -#: client/src/management-jobs/card/card.partial.html:6 -#: client/src/management-jobs/card/card.route.js:19 -msgid "MANAGEMENT JOBS" -msgstr "BEHEERDERSTAKEN" - -#: client/src/instance-groups/instance-groups.strings.js:18 -msgid "MANUAL" -msgstr "HANDMATIG" - -#: client/features/credentials/credentials.strings.js:32 -msgid "METADATA" -msgstr "METADATA" - -#: client/src/scheduler/scheduler.strings.js:62 -msgid "MM" -msgstr "MM" - -#: client/features/output/output.strings.js:132 -msgid "MODULE" -msgstr "MODULE" - -#: client/features/portalMode/routes/portalModeTemplatesList.route.js:13 -msgid "MY VIEW" -msgstr "MIJN BEELD" - -#: client/src/credentials/credentials.form.js:67 -msgid "Machine" -msgstr "Machine" - -#: client/features/output/output.strings.js:80 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:60 -msgid "Machine Credential" -msgstr "Toegangsgegevens machine" - -#: client/src/license/license.partial.html:240 -msgid "Managed Nodes" -msgstr "Beheerde knooppunten" - -#: client/lib/components/components.strings.js:84 -msgid "Management Jobs" -msgstr "Beheerderstaken" - -#: client/features/projects/projects.strings.js:20 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:45 -#: client/src/projects/edit/projects-edit.controller.js:126 -msgid "Manual projects do not require an SCM update" -msgstr "Voor handmatige projecten is geen SCM-update nodig" - -#: client/src/templates/job_templates/job-template.form.js:250 -#: client/src/templates/workflows.form.js:131 -msgid "Max 512 characters per label." -msgstr "Max. 512 tekens per label." - -#: client/src/organizations/organizations.form.js:59 -#: client/src/organizations/organizations.form.js:66 -msgid "Max Hosts" -msgstr "Max. hosts" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:161 -msgid "Maximum" -msgstr "Maximum" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:119 -#: client/src/templates/survey-maker/shared/question-definition.form.js:140 -#: client/src/templates/survey-maker/shared/question-definition.form.js:98 -msgid "Maximum Length" -msgstr "Maximumlengte" - -#: client/src/login/loginModal/loginModal.partial.html:40 -msgid "Maximum per-user sessions reached. Please sign in." -msgstr "Maximaal aantal sessies per gebruiker bereikt. Meld u aan." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:181 -msgid "Maximum<" -msgstr "Maximum<" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:29 -msgid "Medium" -msgstr "Medium" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:14 -msgid "Medium Risk" -msgstr "Middelgroot risico" - -#: client/src/shared/stateDefinitions.factory.js:607 -msgid "Member" -msgstr "Lid" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:156 -#: client/src/templates/survey-maker/shared/question-definition.form.js:176 -msgid "Minimum" -msgstr "Minimum" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:113 -#: client/src/templates/survey-maker/shared/question-definition.form.js:134 -#: client/src/templates/survey-maker/shared/question-definition.form.js:92 -msgid "Minimum Length" -msgstr "Minimumlengte" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:83 -msgid "Misc. System" -msgstr "Overig systeem" - -#: client/src/templates/workflows.form.js:35 -msgid "Missing Job Templates found in the Workflow Editor" -msgstr "Ontbrekende taaksjablonen gevonden in de Workfloweditor" - -#: client/lib/services/base-string.service.js:130 -msgid "Modified (Ascending)" -msgstr "Aangepast (Oplopend)" - -#: client/lib/services/base-string.service.js:131 -msgid "Modified (Descending)" -msgstr "Aangepast (Aflopend)" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:22 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:30 -msgid "Module" -msgstr "Module" - -#: client/features/output/output.strings.js:81 -msgid "Module Args" -msgstr "Module Args" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:414 -#: client/src/scheduler/scheduler.strings.js:37 -msgid "Mon" -msgstr "Ma" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:25 -msgid "Most recent job failed. Click to view jobs." -msgstr "Meest recente taak is mislukt. Klik om taken te bekijken." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:29 -msgid "Most recent job successful. Click to view jobs." -msgstr "Meest recente taak is gelukt. Klik om taken te bekijken." - -#: client/src/templates/survey-maker/surveys/init.factory.js:17 -msgid "Multiple Choice (multiple select)" -msgstr "Meerkeuze-opties (meerdere keuzes mogelijk)" - -#: client/src/templates/survey-maker/surveys/init.factory.js:16 -msgid "Multiple Choice (single select)" -msgstr "Meerkeuze-opties (één keuze mogelijk)" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:77 -msgid "Multiple Choice Options" -msgstr "Meerkeuze-opties" - -#: client/features/portalMode/index.view.html:26 -msgid "My Jobs" -msgstr "Mijn taken" - -#: client/lib/components/components.strings.js:73 -msgid "My View" -msgstr "Mijn beeld" - -#: client/features/applications/applications.strings.js:24 -msgid "NAME" -msgstr "NAAM" - -#: client/features/applications/applications.strings.js:20 -msgid "NEW APPLICATION" -msgstr "NIEUWE TOEPASSING" - -#: client/features/credentials/credentials.strings.js:40 -msgid "NEW CREDENTIAL" -msgstr "NIEUWE TOEGANGSGEGEVENS" - -#: client/src/credential-types/credential-types.form.js:16 -msgid "NEW CREDENTIAL TYPE" -msgstr "NIEUWE SOORT TOEGANGSGEGEVENS" - -#: client/src/inventory-scripts/inventory-scripts.form.js:16 -msgid "NEW CUSTOM INVENTORY" -msgstr "NIEUWE AANGEPASTE INVENTARIS" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:17 -msgid "NEW INVENTORY" -msgstr "NIEUWE INVENTARIS" - -#: client/src/templates/job_templates/job-template.form.js:19 -msgid "NEW JOB TEMPLATE" -msgstr "NIEUWE TAAKSJABLOON" - -#: client/src/notifications/notificationTemplates.form.js:16 -msgid "NEW NOTIFICATION TEMPLATE" -msgstr "NIEUWE BERICHTSJABLOON" - -#: client/src/organizations/organizations.form.js:18 -msgid "NEW ORGANIZATION" -msgstr "NIEUWE ORGANISATIE" - -#: client/src/projects/projects.form.js:17 -msgid "NEW PROJECT" -msgstr "NIEUW PROJECT" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:10 -msgid "NEW SMART INVENTORY" -msgstr "NIEUW SMART-INVENTARIS" - -#: client/src/teams/teams.form.js:16 -msgid "NEW TEAM" -msgstr "NIEUW TEAM" - -#: client/src/users/users.form.js:16 -msgid "NEW USER" -msgstr "NIEUWE GEBRUIKER" - -#: client/src/templates/workflows.form.js:17 -msgid "NEW WORKFLOW JOB TEMPLATE" -msgstr "NIEUWE WORKFLOW-TAAKSJABLOON" - -#: client/lib/services/base-string.service.js:67 -msgid "NEXT" -msgstr "VOLGENDE" - -#: client/src/inventories-hosts/hosts/hosts.partial.html:38 -msgid "NO HOSTS HAVE BEEN CREATED" -msgstr "GEEN HOSTS AANGEMAAKT" - -#: client/features/output/output.strings.js:142 -msgid "NO JOBS FINISHED" -msgstr "GEEN TAKEN AFGEROND" - -#: client/lib/components/components.strings.js:40 -msgid "NO OPTIONS AVAILABLE" -msgstr "GEEN OPTIES BESCHIKBAAR" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:117 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:120 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:123 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:127 -msgid "NONE SELECTED" -msgstr "GEEN GESELECTEERD" - -#: client/src/projects/projects.form.js:139 -msgid "NOTE: This field assumes the remote name is \"origin\"." -msgstr "OPMERKING: dit veld gaat ervan uit dat de naam op afstand \"oorsprong\" is." - -#: client/src/login/loginModal/loginModal.partial.html:101 -msgid "NOTICE" -msgstr "MEDEDELING" - -#: client/src/notifications/notificationTemplates.form.js:21 -msgid "NOTIFICATION TEMPLATE" -msgstr "BERICHTSJABLOON" - -#: client/src/activity-stream/get-target-title.factory.js:26 -#: client/src/notifications/notificationTemplates.list.js:14 -msgid "NOTIFICATION TEMPLATES" -msgstr "BERICHTSJABLONEN" - -#: client/lib/components/components.strings.js:131 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js:9 -#: client/src/management-jobs/notifications/notification.route.js:46 -#: client/src/notifications/main.js:44 -#: client/src/notifications/main.js:95 -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "NOTIFICATIONS" -msgstr "BERICHTEN" - -#: client/features/output/output.strings.js:82 -#: client/src/credential-types/credential-types.form.js:27 -#: client/src/credential-types/credential-types.list.js:24 -#: client/src/credentials/credentials.form.js:32 -#: client/src/credentials/credentials.list.js:26 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:15 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:15 -#: client/src/instance-groups/instance-groups.list.js:15 -#: client/src/inventories-hosts/hosts/host.list.js:68 -#: client/src/inventories-hosts/inventories/inventory.list.js:52 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:33 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:37 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:21 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:28 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:45 -#: client/src/inventory-scripts/inventory-scripts.form.js:28 -#: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 -#: client/src/notifications/notificationTemplates.form.js:32 -#: client/src/notifications/notificationTemplates.list.js:37 -#: client/src/notifications/notifications.list.js:27 -#: client/src/organizations/organizations.form.js:26 -#: client/src/projects/projects.form.js:30 -#: client/src/projects/projects.list.js:43 -#: client/src/scheduler/scheduled-jobs.list.js:36 -#: client/src/scheduler/scheduler.strings.js:21 -#: client/src/scheduler/schedules.list.js:48 -#: client/src/teams/teams.form.js:135 -#: client/src/teams/teams.form.js:28 -#: client/src/teams/teams.list.js:23 -#: client/src/templates/job_templates/job-template.form.js:34 -#: client/src/templates/templates.list.js:24 -#: client/src/templates/workflows.form.js:42 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:119 -#: client/src/users/users.form.js:143 -#: client/src/users/users.form.js:171 -#: client/src/users/users.form.js:199 -msgid "Name" -msgstr "Naam" - -#: client/lib/services/base-string.service.js:126 -msgid "Name (Ascending)" -msgstr "Naam (Oplopend)" - -#: client/lib/services/base-string.service.js:127 -msgid "Name (Descending)" -msgstr "Naam (Aflopend)" - -#: client/lib/components/layout/layout.partial.html:4 -msgid "Navigate to dashboard" -msgstr "Navigeer naar dashboard" - -#: client/features/output/details.partial.html:244 -msgid "Navigate to inventory sync job" -msgstr "Navigeer naar inventarisatiesynchronisatietaak" - -#: client/features/output/details.partial.html:212 -msgid "Navigate to project sync job" -msgstr "Navigeer naar projectsynchronisatietaak" - -#: client/features/output/details.partial.html:164 -msgid "Navigate to workflow job" -msgstr "Navigeer naar workflowtaak" - -#: client/src/credentials/credentials.form.js:71 -msgid "Network" -msgstr "Netwerk" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:70 -msgid "New Group" -msgstr "Nieuwe groep" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:147 -msgid "New Host" -msgstr "Nieuwe host" - -#: client/src/users/add/users-add.controller.js:93 -msgid "New user successfully created!" -msgstr "Nieuwe gebruiker aanmaken gelukt!" - -#: client/src/scheduler/scheduled-jobs.list.js:56 -#: client/src/scheduler/schedules.list.js:58 -msgid "Next Run" -msgstr "Volgende uitvoering" - -#: client/src/credentials/credentials.list.js:21 -msgid "No Credentials Have Been Created" -msgstr "Nog geen toegangsgegevens aangemaakt" - -#: client/features/templates/templates.strings.js:74 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:15 -msgid "No Credentials Matching This Type Have Been Created" -msgstr "Nog geen toegangsgegevens die overeenkomen met deze soort aangemaakt" - -#: client/features/output/host-event/host-event-codemirror.partial.html:3 -msgid "No JSON data returned by the module" -msgstr "Module heeft geen JSON-gegevens geretourneerd" - -#: client/src/license/license.controller.js:158 -msgid "No Licenses Found" -msgstr "Geen licenties gevonden" - -#: client/src/projects/projects.list.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:64 -msgid "No Projects Have Been Created" -msgstr "Nog geen projecten aangemaakt" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:50 -msgid "No Remediation Playbook Available" -msgstr "Geen draaiboek voor herstel beschikbaar" - -#: client/features/projects/projects.strings.js:32 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "No SCM Configuration" -msgstr "Geen SCM-configuratie" - -#: client/features/projects/projects.strings.js:38 -#: client/src/projects/factories/get-project-tool-tip.factory.js:9 -msgid "No SCM updates have run for this project" -msgstr "Geen SCM-updates uitgevoerd voor dit project" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:17 -msgid "No Teams exist" -msgstr "Er bestaan geen teams" - -#: client/features/projects/projects.strings.js:29 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "No Updates Available" -msgstr "Er zijn geen updates beschikbaar" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:18 -msgid "No Users to add" -msgstr "Geen gebruikers om toe te voegen" - -#: client/features/credentials/credentials.strings.js:36 -msgid "No credential selected" -msgstr "Geen inloggegevens geselecteerd" - -#: client/features/templates/templates.strings.js:37 -msgid "No credentials selected" -msgstr "Geen toegangsgegevens geselecteerd" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:63 -msgid "No data is available. There are no issues to report." -msgstr "Geen gegevens beschikbaar. Er zijn geen problemen om te rapporteren." - -#: client/features/credentials/credentials.strings.js:34 -msgid "No external credentials available." -msgstr "Geen externe inloggegevens beschikbaar." - -#: client/src/license/license.controller.js:44 -msgid "No file selected." -msgstr "Geen bestand geselecteerd." - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js:48 -msgid "No groups to add" -msgstr "Geen groepen om toe te voegen" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js:45 -msgid "No hosts to add" -msgstr "Geen hosts om toe te voegen" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:68 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:64 -msgid "No hosts with failures. Click for details." -msgstr "Geen host met mislukkingen. Klik voor meer informatie." - -#: client/features/templates/templates.strings.js:38 -msgid "No inventory selected" -msgstr "Geen inventaris geselecteerd" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:51 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:52 -msgid "No inventory sync failures. Click for details." -msgstr "Geen mislukte inventarissynchronisaties. Klik voor meer informatie." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:16 -msgid "No job data" -msgstr "Geen taakgegevens" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:75 -msgid "No job data available." -msgstr "Geen taakgegevens beschikbaar." - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:54 -msgid "No job templates were recently used." -msgstr "Geen taaksjablonen die recent gebruikt zijn." - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:51 -msgid "No jobs were recently run." -msgstr "Er zijn recent geen taken uitgevoerd." - -#: client/src/teams/teams.form.js:132 -#: client/src/users/users.form.js:196 -msgid "No permissions have been granted" -msgstr "Geen machtigingen toegekend" - -#: client/features/templates/templates.strings.js:147 -msgid "No promptable values were provided when this node was created." -msgstr "Er zijn geen opvraagbare waarden geleverd bij het aanmaken van dit knooppunt." - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:17 -msgid "No recent job data available for this host." -msgstr "Er zijn geen recente taakgegevens beschikbaar voor deze host." - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:98 -msgid "No recent job data available for this inventory." -msgstr "Er zijn geen recente taakgegevens beschikbaar voor dit inventaris." - -#: client/src/notifications/notification-templates-list/list.controller.js:86 -msgid "No recent notifications." -msgstr "Geen recente berichten." - -#: client/features/credentials/credentials.strings.js:33 -#: client/src/inventories-hosts/hosts/hosts.partial.html:36 -#: client/src/shared/form-generator.js:1833 -#: client/src/shared/list-generator/list-generator.factory.js:240 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:25 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:62 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:92 -msgid "No records matched your search." -msgstr "Er zijn geen gegevens die overeenkomen met uw zoekopdracht." - -#: client/features/output/output.strings.js:133 -msgid "No result found" -msgstr "Geen resultaat gevonden" - -#: client/src/scheduler/scheduled-jobs.list.js:16 -msgid "No schedules exist" -msgstr "Er bestaan geen schema's" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:71 -msgid "No sync data" -msgstr "Geen synchronisatiegegevens" - -#: client/src/organizations/linkout/addUsers/addUsers.controller.js:60 -msgid "No users available to add as adminstrators" -msgstr "Geen gebruikers beschikbaar om toe te voegen als beheerders" - -#: client/src/users/add/users-add.controller.js:10 -#: client/src/users/edit/users-edit.controller.js:10 -#: client/src/users/list/users-list.controller.js:10 -msgid "Normal User" -msgstr "Normale gebruiker" - -#: client/features/output/output.strings.js:48 -#: client/src/workflow-results/workflow-results.controller.js:84 -msgid "Not Finished" -msgstr "Niet voltooid" - -#: client/features/output/output.strings.js:49 -#: client/src/workflow-results/workflow-results.controller.js:85 -msgid "Not Started" -msgstr "Niet gestart" - -#: client/features/projects/projects.strings.js:37 -msgid "Not configured for SCM" -msgstr "Niet geconfigureerd voor SCM" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:58 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:56 -msgid "Not configured for inventory sync." -msgstr "Niet geconfigureerd voor inventarissynchronisatie." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -msgid "Note that only hosts directly in this group can be disassociated. Hosts in sub-groups must be disassociated directly from the sub-group level that they belong." -msgstr "Let op: Alleen hosts die zich direct in deze groep bevinden, kunnen worden losgekoppeld. Hosts in subgroepen moeten rechtstreeks worden losgekoppeld van het subgroepniveau waar ze bij horen." - -#: client/src/notifications/notificationTemplates.form.js:371 -#: client/src/notifications/notificationTemplates.form.js:372 -#: client/src/notifications/notificationTemplates.form.js:568 -#: client/src/notifications/notificationTemplates.form.js:569 -msgid "Notification Color" -msgstr "Berichtkleur" - -#: client/src/notifications/notification-templates-list/list.controller.js:140 -msgid "Notification Failed." -msgstr "Bericht mislukt" - -#: client/src/notifications/notificationTemplates.form.js:360 -msgid "Notification Label" -msgstr "Berichtlabel" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 -msgid "Notification Templates" -msgstr "Berichtsjablonen" - -#: client/src/notifications/notification-templates-list/list.controller.js:157 -msgid "Notification timed out." -msgstr "Time-out voor melding." - -#: client/lib/components/components.strings.js:83 -#: client/src/management-jobs/notifications/notification.route.js:21 -#: client/src/notifications/notifications.list.js:17 -msgid "Notifications" -msgstr "Berichten" - -#: client/src/notifications/notificationTemplates.form.js:385 -msgid "Notify Channel" -msgstr "Bericht naar kanaal sturen" - -#: client/lib/services/base-string.service.js:71 -msgid "OFF" -msgstr "UIT" - -#: client/index.template.ejs:71 -#: client/lib/services/base-string.service.js:65 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -msgid "OK" -msgstr "OK" - -#: client/lib/services/base-string.service.js:70 -msgid "ON" -msgstr "AAN" - -#: client/lib/components/components.strings.js:10 -msgid "OPTIONS" -msgstr "OPTIES" - -#: client/src/license/license.partial.html:121 -msgid "OR" -msgstr "OF" - -#: client/features/applications/applications.strings.js:30 -msgid "ORG" -msgstr "ORG" - -#: client/features/projects/projects.strings.js:11 -msgid "ORGANIZATION" -msgstr "ORGANISATIE" - -#: client/src/activity-stream/get-target-title.factory.js:29 -#: client/src/organizations/list/organizations-list.partial.html:6 -#: client/src/organizations/main.js:51 -msgid "ORGANIZATIONS" -msgstr "ORGANISATIES" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:507 -msgid "Occurrence(s)" -msgstr "Voorval(len)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:567 -#: client/src/scheduler/scheduler.strings.js:45 -msgid "Occurrences" -msgstr "Voorvallen" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:396 -msgid "On Days" -msgstr "Op dagen" - -#: client/features/templates/templates.strings.js:113 -#: client/src/workflow-results/workflow-results.controller.js:96 -msgid "On Failure" -msgstr "Bij mislukken" - -#: client/features/templates/templates.strings.js:112 -#: client/src/workflow-results/workflow-results.controller.js:95 -msgid "On Success" -msgstr "Bij slagen" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:156 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:161 -msgid "Only Group By" -msgstr "Alleen ordenen op" - -#: client/src/templates/job_templates/multi-credential/multi-credential.partial.html:4 -msgid "Open credential lookup" -msgstr "Opzoeken toegangsgegevens openen" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:42 -msgid "Open host filter" -msgstr "Hostfilter openen" - -#: client/src/shared/instance-groups-multiselect/instance-groups.partial.html:3 -msgid "Open instance groups" -msgstr "Instantiegroepen openen" - -#: client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html:4 -msgid "Open webhook credential lookup" -msgstr "Opzoeken toegangsgegevens Webhook openen" - -#: client/src/credentials/credentials.form.js:378 -msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" -msgstr "Domeinen van OpenStack bepalen administratieve grenzen. Het is alleen nodig voor Keystone v3 authenticatie-URL's. Veel voorkomende scenario's zijn:" - -#: client/src/templates/job_templates/job-template.form.js:246 -#: client/src/templates/workflows.form.js:127 -msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs." -msgstr "Optionele labels die de taaksjabloon beschrijven, zoals 'dev' of 'test'. Labels kunnen gebruikt worden om taaksjablonen en uitgevoerde taken te ordenen en filteren." - -#: client/src/templates/job_templates/job-template.form.js:472 -msgid "Optionally, select the credential to use to send status updates back to the webhook service" -msgstr "Optioneel: selecteer de toegangsgegevens die u wilt gebruiken om statusupdates terug te sturen naar de webhookservice" - -#: client/src/templates/workflows.form.js:245 -msgid "Optionally, select the credential to use to send status updates back to the webhook service." -msgstr "Optioneel: selecteer de toegangsgegevens die u wilt gebruiken om statusupdates terug te sturen naar de webhookservice." - -#: client/src/partials/logviewer.html:7 -#: client/src/templates/job_templates/job-template.form.js:317 -#: client/src/templates/workflows.form.js:153 -msgid "Options" -msgstr "Opties" - -#: client/features/applications/add-applications.controller.js:31 -#: client/features/templates/templates.strings.js:16 -#: client/src/credentials/credentials.form.js:46 -#: client/src/credentials/credentials.form.js:53 -#: client/src/inventories-hosts/inventories/inventory.list.js:65 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:33 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:40 -#: client/src/inventory-scripts/inventory-scripts.list.js:27 -#: client/src/notifications/notificationTemplates.form.js:44 -#: client/src/projects/projects.form.js:42 -#: client/src/projects/projects.form.js:48 -#: client/src/teams/teams.form.js:40 -#: client/src/teams/teams.list.js:30 -#: client/src/templates/workflows.form.js:55 -#: client/src/templates/workflows.form.js:61 -#: client/src/users/users.form.js:41 -msgid "Organization" -msgstr "Organisatie" - -#: client/lib/services/base-string.service.js:152 -msgid "Organization (Ascending)" -msgstr "Organisatie (Oplopend)" - -#: client/lib/services/base-string.service.js:153 -msgid "Organization (Descending)" -msgstr "Organisatie (Aflopend)" - -#: client/lib/components/components.strings.js:79 -#: client/lib/models/models.strings.js:35 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:135 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:64 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 -#: client/src/users/users.form.js:133 -msgid "Organizations" -msgstr "Organisaties" - -#: client/features/templates/templates.strings.js:31 -msgid "Other Prompts" -msgstr "Overige meldingen" - -#: client/src/credentials/credentials.form.js:79 -msgid "Others (Cloud Providers)" -msgstr "Overigen (cloudproviders)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:316 -msgid "Override variables found in azure_rm.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Variabelen overschrijven die aangetroffen zijn in azure_rm.ini en die gebruikt worden in het script van de inventarisupdate. Voor een gedetailleerde beschrijving van deze variabelen" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:282 -msgid "" -"Override variables found in cloudforms.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view cloudforms.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Variabelen overschrijven die zijn aangetroffen in cloudforms.ini en die gebruikt worden door het script van de inventarisupdate. Zie voor een voorbeeld van de configuratie van de variabele \n" -" a href=\\\"https://github.com/ansible-collections/community.general/blob/master/scripts/inventory/cloudforms.ini\\\" target=\\\"_blank\\\">\n" -" cloudfroms.ini in de Ansible Collections github repo.Voer de variabelen van de inventaris in met JSON- of YAML-syntaxis. Gebruik de radio-knop om tussen de twee de wisselen. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:217 -msgid "Override variables found in ec2.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Variabelen overschrijven die aangetroffen zijn in ec2.ini en die gebruikt worden door het script van de inventarisupdate. Voor een gedetailleerde beschrijving van deze variabelen" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:299 -msgid "" -"Override variables found in foreman.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view foreman.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Variabelen overschrijven die aangetroffen zijn in foreman.ini en die gebruikt worden door het script van de inventarisupdate. Zie voor een voorbeeld van de configuratie van de variabelen\n" -" \n" -" foreman.ini in de Ansible Collections github repo.Voer de variabelen van de inventaris in met JSON- of YAML-syntaxis. Gebruik de radioknop om tussen de twee te wisselen. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:265 -msgid "" -"Override variables found in openstack.yml and used by the inventory update script. For an example variable configuration\n" -" \n" -" view openstack.yml in the Openstack github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "Variabelen overschrijven die aangetroffen zijn in openstack.yml en die gebruikt worden door het script van de inventarisupdate. Zie voor een voorbeeld van de configuratie van de variabelen\n" -" \n" -" openstack.yml in de Openstack github repo.Voer de variabelen van de inventaris in met JSON- of YAML-syntaxis. Gebruik de radioknop om tussen de twee te wisselen. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:241 -msgid "Override variables found in vmware.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "Variabelen overschrijven die aangetroffen zijn in vmware.ini en die gebruikt worden in het script van de inventarisupdate. Voor een gedetailleerde beschrijving van deze variabelen" - -#: client/features/output/output.strings.js:83 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:350 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:355 -msgid "Overwrite" -msgstr "Overschrijven" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:361 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:366 -msgid "Overwrite Variables" -msgstr "Variabelen overschrijven" - -#: client/features/output/output.strings.js:84 -msgid "Overwrite Vars" -msgstr "Variabelen overschrijven" - -#: client/src/credentials/credentials.list.js:40 -msgid "Owners" -msgstr "Eigenaren" - -#: client/src/license/license.partial.html:136 -#: client/src/login/loginModal/loginModal.partial.html:80 -msgid "PASSWORD" -msgstr "WACHTWOORD" - -#: client/features/credentials/legacy.credentials.js:117 -msgid "PERMISSIONS" -msgstr "MACHTIGINGEN" - -#: client/features/output/output.strings.js:130 -msgid "PLAY" -msgstr "AFSPELEN" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:146 -msgid "PLAYBOOK" -msgstr "DRAAIBOEK" - -#: client/src/partials/survey-maker-modal.html:42 -msgid "PLEASE ADD A SURVEY PROMPT." -msgstr "VOEG EEN MELDING VOOR DE VRAGENLIJST TOE." - -#: client/src/organizations/list/organizations-list.partial.html:38 -#: client/src/shared/form-generator.js:1839 -#: client/src/shared/list-generator/list-generator.factory.js:248 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:27 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:94 -msgid "PLEASE ADD ITEMS TO THIS LIST" -msgstr "VOEG ITEMS AAN DEZE LIJST TOE" - -#: client/src/notifications/add/add.controller.js:106 -#: client/src/notifications/edit/edit.controller.js:160 -msgid "POST" -msgstr "BERICHT" - -#: client/src/partials/survey-maker-modal.html:40 -msgid "PREVIEW" -msgstr "VOORVERTONING" - -#: client/src/workflow-results/workflow-results.service.js:105 -msgid "PROCEED" -msgstr "DOORGAAN" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:142 -msgid "PROJECT" -msgstr "PROJECT" - -#: client/features/projects/projects.strings.js:8 -#: client/features/projects/routes/projectsList.route.js:13 -#: client/src/activity-stream/get-target-title.factory.js:8 -#: client/src/organizations/linkout/organizations-linkout.route.js:182 -#: client/src/organizations/list/organizations-list.controller.js:76 -#: client/src/projects/projects.list.js:14 -#: client/src/projects/projects.list.js:15 -msgid "PROJECTS" -msgstr "PROJECTEN" - -#: client/features/templates/templates.strings.js:30 -msgid "PROMPT" -msgstr "MELDING" - -#: client/src/notifications/add/add.controller.js:107 -#: client/src/notifications/edit/edit.controller.js:161 -msgid "PUT" -msgstr "PUT" - -#: client/src/shared/paginate/paginate.partial.html:33 -msgid "Page" -msgstr "Pagina" - -#: client/src/notifications/notificationTemplates.form.js:252 -msgid "Pagerduty subdomain" -msgstr "Subdomein Pagerduty" - -#: client/src/templates/job_templates/job-template.form.js:486 -msgid "Pass extra command line variables to the playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "Geef extra commandoregelvariabelen op in het draaiboek. Geef sleutel/waarde-paren op met YAML of JSON. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis." - -#: client/src/templates/workflows.form.js:142 -msgid "Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "Geef extra commandoregelvariabelen op in het draaiboek. Dit is de commandoregelparameter -e of --extra-vars voor het ansible-draaiboek. Geef sleutel/waarde-paren op met YAML of JSON. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:139 -msgid "Pass extra command line variables. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." -msgstr "Geef extra commandoregelvariabelen op. Dit is de %s of %s commandoregelparameter voor %s. Geef sleutel/waarde-paren op met YAML of JSON." - -#: client/src/credentials/credentials.form.js:226 -#: client/src/credentials/factories/become-method-change.factory.js:21 -#: client/src/credentials/factories/become-method-change.factory.js:40 -#: client/src/credentials/factories/become-method-change.factory.js:48 -#: client/src/credentials/factories/become-method-change.factory.js:68 -#: client/src/credentials/factories/become-method-change.factory.js:78 -#: client/src/credentials/factories/become-method-change.factory.js:88 -#: client/src/credentials/factories/kind-change.factory.js:104 -#: client/src/credentials/factories/kind-change.factory.js:124 -#: client/src/credentials/factories/kind-change.factory.js:134 -#: client/src/credentials/factories/kind-change.factory.js:144 -#: client/src/credentials/factories/kind-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:77 -#: client/src/credentials/factories/kind-change.factory.js:96 -#: client/src/notifications/shared/type-change.service.js:31 -#: client/src/templates/survey-maker/surveys/init.factory.js:15 -#: client/src/users/users.form.js:69 -msgid "Password" -msgstr "Wachtwoord" - -#: client/src/credentials/factories/kind-change.factory.js:57 -msgid "Password (API Key)" -msgstr "Wachtwoord (API-sleutel)" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:23 -msgid "Past 24 Hours" -msgstr "Afgelopen 24 uur" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:16 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:29 -msgid "Past Month" -msgstr "Afgelopen maand" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:26 -msgid "Past Week" -msgstr "Afgelopen week" - -#: client/src/credentials/factories/become-method-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:85 -msgid "Paste the contents of the PEM file associated with the service account email." -msgstr "Plak hier de inhoud van het PEM-bestand dat bij de e-mail van het serviceaccount hoort." - -#: client/src/credentials/factories/kind-change.factory.js:50 -msgid "Paste the contents of the SSH private key file." -msgstr "Plak hier de inhoud van het SSH-privésleutelbestand." - -#: client/src/credentials/factories/kind-change.factory.js:25 -msgid "Paste the contents of the SSH private key file.%s or click to close%s" -msgstr "Plak hier de inhoud van het SSH-privésleutelbestand.%s of klik om af te sluiten%s" - -#: client/src/inventories-hosts/inventories/inventory.list.js:133 -#: client/src/shared/list-generator/list-generator.factory.js:415 -msgid "Pending Delete" -msgstr "In afwachting om verwijderd te worden" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js:60 -msgid "Perform a search above to define a host filter" -msgstr "Voer hierboven een zoekopdracht uit om een hostfilter te definiëren" - -#: client/lib/components/components.strings.js:49 -msgid "Perform lookup" -msgstr "Opzoeken uitvoeren" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:8 -msgid "Period" -msgstr "Periode" - -#: client/src/projects/add/projects-add.controller.js:35 -#: client/src/templates/main.js:128 -#: client/src/templates/main.js:367 -#: client/src/users/add/users-add.controller.js:45 -msgid "Permission Error" -msgstr "Machtigingsfout" - -#: client/features/credentials/credentials.strings.js:14 -#: client/features/credentials/legacy.credentials.js:63 -#: client/src/credentials/credentials.form.js:438 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:104 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:101 -#: client/src/organizations/organizations.form.js:143 -#: client/src/projects/projects.form.js:278 -#: client/src/teams/teams.form.js:128 -#: client/src/templates/job_templates/job-template.form.js:532 -#: client/src/templates/workflows.form.js:287 -#: client/src/users/users.form.js:192 -msgid "Permissions" -msgstr "Machtigingen" - -#: client/features/users/tokens/tokens.strings.js:41 -msgid "Personal Access Token" -msgstr "Persoonlijke toegangstoken" - -#: client/features/output/output.strings.js:85 -#: client/src/shared/form-generator.js:1044 -#: client/src/templates/job_templates/job-template.form.js:123 -#: client/src/templates/job_templates/job-template.form.js:134 -msgid "Playbook" -msgstr "Draaiboek" - -#: client/src/projects/projects.form.js:91 -msgid "Playbook Directory" -msgstr "Draaiboekmap" - -#: client/features/templates/templates.strings.js:70 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:58 -msgid "Playbook Run" -msgstr "Draaiboek uitvoering" - -#: client/features/output/output.strings.js:117 -msgid "Plays" -msgstr "Uitvoeringen van het draaiboek" - -#: client/lib/components/components.strings.js:116 -msgid "Please add items to this list." -msgstr "Voeg items aan deze lijst toe." - -#: client/src/users/users.form.js:127 -msgid "Please add user to an Organization." -msgstr "Voeg gebruiker toe aan een organisatie" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:99 -msgid "Please assign roles to the selected resources" -msgstr "Wijs rollen toe aan de geselecteerde bronnen" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:60 -msgid "Please assign roles to the selected users/teams" -msgstr "Wijs rollen toe aan de geselecteerde gebruikers/teams" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "Please check the server and make sure the directory exists and file permissions are set correctly." -msgstr "Controleer de server om er zeker van te zijn dat de map bestaat en de bestandsmachtigingen juist zijn ingesteld." - -#: client/features/templates/templates.strings.js:144 -msgid "Please click on an available node to form a new link." -msgstr "Klik op een beschikbaar knooppunt om een nieuwe link te vormen." - -#: client/src/license/license.partial.html:91 -msgid "Please click the button below to visit Ansible's website to get a Tower license key." -msgstr "Klik op onderstaande knop om de website van Ansible te bezoeken en een licentiesleutel voor Tower te bemachtigen." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:40 -msgid "Please click the icon to edit the host filter." -msgstr "Klik op het icoon om de hostfilter te wijzigen." - -#: client/features/templates/templates.strings.js:126 -msgid "Please click the start button to build your workflow." -msgstr "Klik op de startknop om uw workflow op te bouwen." - -#: client/lib/services/base-string.service.js:98 -msgid "Please confirm that you would like to remove {{ role }} access from the team {{ name }}. This will affect all members of the team. If you would like to only remove access for this particular user, please remove them from the team." -msgstr "Bevestig dat u de toegang tot {{ role }} wilt verwijderen voor het team {{ name }}. Dit heeft gevolgen voor alle leden van het team. Als u alleen de toegang voor deze specifieke gebruiker wilt verwijderen, verwijder deze dan uit het team." - -#: client/lib/services/base-string.service.js:104 -msgid "Please confirm that you would like to remove {{ role }} access from {{ name }}." -msgstr "Bevestig dat u toegang tot {{ role }} wilt verwijderen voor {{ name }}." - -#: client/src/shared/form-generator.js:833 -#: client/src/shared/form-generator.js:925 -msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." -msgstr "Voer een URL in die begint met ssh, http of https. De URL mag niet het teken '@' bevatten." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:183 -msgid "Please enter a larger float." -msgstr "Voer een hogere float in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:163 -msgid "Please enter a larger integer." -msgstr "Voer een hoger geheel getal in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:246 -msgid "Please enter a maximum default of {{float_max}}." -msgstr "Voer een maximumstandaard in van {{float_max}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:232 -msgid "Please enter a maximum default of {{int_max}}." -msgstr "Voer een maximumstandaard in van {{int_max}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:245 -msgid "Please enter a minimum default of {{float_min}}." -msgstr "Voer een minimumstandaard in van {{float_min}}." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:231 -msgid "Please enter a minimum default of {{int_min}}." -msgstr "Voer een minimumstandaard in van {{int_min}}." - -#: client/src/shared/form-generator.js:1134 -msgid "Please enter a number greater than %d and less than %d." -msgstr "Voer een getal in dat groter is dan %d en kleiner dan %d." - -#: client/src/shared/form-generator.js:1136 -msgid "Please enter a number greater than %d." -msgstr "Voer een getal in dat groter is dan %d." - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:151 -msgid "Please enter a number greater than or equal to 0." -msgstr "Voer een getal in dat groter is dan of gelijk staat aan 0." - -#: client/src/shared/form-generator.js:1128 -msgid "Please enter a number." -msgstr "Voer een getal in." - -#: client/features/templates/templates.strings.js:43 -#: client/src/login/loginModal/loginModal.partial.html:90 -msgid "Please enter a password." -msgstr "Voer een wachtwoord in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:178 -msgid "Please enter a smaller float." -msgstr "Voer een lagere float in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:158 -msgid "Please enter a smaller integer." -msgstr "Voer een lager geheel getal in." - -#: client/src/login/loginModal/loginModal.partial.html:70 -msgid "Please enter a username." -msgstr "Voer een gebruikersnaam in." - -#: client/src/shared/form-generator.js:823 -#: client/src/shared/form-generator.js:915 -msgid "Please enter a valid email address." -msgstr "Voer een geldig e-mailadres in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:177 -#: client/src/templates/survey-maker/shared/question-definition.form.js:182 -#: client/src/templates/survey-maker/shared/question-definition.form.js:244 -msgid "Please enter a valid float." -msgstr "Voer een geldige float in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:157 -#: client/src/templates/survey-maker/shared/question-definition.form.js:162 -#: client/src/templates/survey-maker/shared/question-definition.form.js:230 -msgid "Please enter a valid integer." -msgstr "Voer een geldig geheel getal in." - -#: client/lib/components/components.strings.js:15 -#: client/src/shared/form-generator.js:818 -#: client/src/shared/form-generator.js:910 -#: client/src/shared/form-generator.js:982 -msgid "Please enter a value." -msgstr "Voer een waarde in." - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:36 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "Please enter an answer between" -msgstr "Voer een antwoord in tussen" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:199 -msgid "Please enter an answer from the choices listed." -msgstr "Voer een antwoord in uit de vermelde keuzes." - -#: client/features/templates/templates.strings.js:69 -msgid "Please enter an answer that is a decimal number." -msgstr "Voer een antwoord in dat een decimaal getal is." - -#: client/features/templates/templates.strings.js:68 -msgid "Please enter an answer that is a valid integer." -msgstr "Voer een antwoord in dat een geldig geheel getal is." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:47 -msgid "Please enter an answer variable name." -msgstr "Voer een variabele naam in voor het antwoord." - -#: client/features/templates/templates.strings.js:66 -msgid "Please enter an answer." -msgstr "Voer een antwoord in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:216 -msgid "Please enter an answer/answers from the choices listed." -msgstr "Voer een antwoord/antwoorden in. Kies uit de vermelde keuzes." - -#: client/index.template.ejs:149 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Geef een geheel getal op dat niet negatief is dat kleiner is dan 9999." - -#: client/index.template.ejs:132 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Geef een geheel getal op dat niet negatief is dat kleiner is dan 9999." - -#: client/index.template.ejs:105 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Geef een geheel getal opdat niet negatief is dat kleiner is dan 9999." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:47 -msgid "Please enter at least one search term to create a new Smart Inventory." -msgstr "Voer ten minste één zoekterm in om een nieuwe SMAT-inventaris aan te maken." - -#: client/features/templates/templates.strings.js:127 -msgid "Please hover over a template for additional options." -msgstr "Houd de muis een tijdje op een sjabloon om meer opties te zien." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:175 -msgid "Please input a number greater than 1." -msgstr "Voer een getal in dat groter is dan 1." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:538 -#: client/src/scheduler/scheduler.strings.js:47 -msgid "Please provide a valid date." -msgstr "Geef een geldige datum op." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:208 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:521 -#: client/src/scheduler/scheduler.strings.js:30 -msgid "Please provide a value between 1 and 999." -msgstr "Geef een waarde tussen 1 en 999 op." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:48 -msgid "Please remove the illegal character from the survey question variable name." -msgstr "Verwijder het ongeldige teken uit de variabele naam van de enquêtevraag." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:169 -msgid "Please save before adding a survey to this job template." -msgstr "Sla op voordat u een vragenlijst toevoegt aan dit taaksjabloon." - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:53 -msgid "Please save before adding a survey to this workflow." -msgstr "Sla op voordat u een vragenlijst toevoegt aan deze workflow." - -#: client/src/notifications/notifications.list.js:15 -msgid "Please save before adding notifications." -msgstr "Sla op voordat u berichten toevoegt." - -#: client/src/organizations/organizations.form.js:95 -#: client/src/teams/teams.form.js:72 -msgid "Please save before adding users." -msgstr "Sla op voordat u gebruikers toevoegt." - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:100 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:97 -#: client/src/organizations/organizations.form.js:135 -#: client/src/projects/projects.form.js:270 -#: client/src/teams/teams.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:525 -#: client/src/templates/workflows.form.js:280 -msgid "Please save before assigning permissions." -msgstr "Sla op voordat u machtigingen toekent." - -#: client/src/users/users.form.js:125 -#: client/src/users/users.form.js:188 -msgid "Please save before assigning to organizations." -msgstr "Sla op voordat u toewijst aan organisaties." - -#: client/src/users/users.form.js:155 -msgid "Please save before assigning to teams." -msgstr "Sla op voordat u toewijst aan teams." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:142 -msgid "Please save before creating groups." -msgstr "Sla op voordat u groepen aanmaakt." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:152 -msgid "Please save before creating hosts." -msgstr "Sla op voordat u hosts aanmaakt." - -#: client/src/inventories-hosts/hosts/host.form.js:108 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:86 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:110 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:119 -msgid "Please save before defining groups." -msgstr "Sla op voordat u groepen bepaalt." - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:94 -msgid "Please save before defining hosts." -msgstr "Sla op voordat u hosts bepaalt." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:161 -msgid "Please save before defining inventory sources." -msgstr "Sla op voordat u inventarisbronnen bepaalt." - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:52 -msgid "Please save before defining the workflow graph." -msgstr "Sla op voordat u de workflowgrafiek bepaalt." - -#: client/lib/components/components.strings.js:111 -msgid "Please save before launching this template." -msgstr "Sla de wijzigingen op voor u dit sjabloon start." - -#: client/src/inventories-hosts/hosts/host.form.js:117 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:127 -msgid "Please save before viewing Insights." -msgstr "Sla op voordat u Insights bekijkt." - -#: client/src/inventories-hosts/hosts/host.form.js:101 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:103 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:112 -msgid "Please save before viewing facts." -msgstr "Sla op voordat u feiten bekijkt." - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:146 -msgid "Please save before viewing hosts." -msgstr "Sla op voordat u hosts bekijkt." - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 -msgid "Please select Users / Teams from the lists below." -msgstr "Selecteer gebruikers/teams uit de onderstaande lijsten." - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 -msgid "Please select Users from the list below." -msgstr "Selecteer gebruikers uit de onderstaande lijst." - -#: client/src/shared/form-generator.js:1169 -msgid "Please select a number between" -msgstr "Selecteer een getal tussen" - -#: client/src/shared/form-generator.js:1165 -msgid "Please select a number." -msgstr "Selecteer een getal." - -#: client/features/templates/templates.strings.js:67 -msgid "Please select a value" -msgstr "Selecteer een waarde" - -#: client/src/shared/form-generator.js:1056 -#: client/src/shared/form-generator.js:1125 -#: client/src/shared/form-generator.js:1298 -msgid "Please select a value." -msgstr "Selecteer een waarde." - -#: client/src/templates/job_templates/job-template.form.js:77 -msgid "Please select an Inventory or check the Prompt on launch option." -msgstr "Selecteer een inventaris of vink de optie Melding bij opstarten aan." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:39 -msgid "Please select an organization before editing the host filter." -msgstr "Selecteer een organisatie voordat u het hostfilter wijzigt." - -#: client/src/shared/form-generator.js:1162 -msgid "Please select at least one value." -msgstr "Selecteer ten minste één waarde." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:476 -#: client/src/scheduler/scheduler.strings.js:43 -msgid "Please select one or more days." -msgstr "Selecteer ten minste één dag." - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:30 -msgid "Please select resources from the lists below." -msgstr "Selecteer hulpbronnen uit de onderstaande lijsten." - -#: client/src/instance-groups/instance-groups.strings.js:77 -msgid "Pod Spec Override" -msgstr "Overschrijven Podspec" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Populate the hosts for this inventory by using a search filter." -msgstr "Vul de hosts voor dit inventaris in door een zoekfilter te gebruiken." - -#: client/src/notifications/shared/type-change.service.js:30 -msgid "Port" -msgstr "Poort" - -#: client/features/templates/templates.strings.js:33 -msgid "Preview" -msgstr "Voorvertoning" - -#: client/src/credentials/credentials.form.js:257 -#: client/src/credentials/factories/kind-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:44 -msgid "Private Key" -msgstr "Privésleutel" - -#: client/features/templates/templates.strings.js:46 -#: client/src/credentials/credentials.form.js:264 -msgid "Private Key Passphrase" -msgstr "Privésleutel wachtwoordzin" - -#: client/src/credentials/credentials.form.js:279 -#: client/src/credentials/credentials.form.js:283 -msgid "Privilege Escalation" -msgstr "Verhoging van rechten" - -#: client/features/templates/templates.strings.js:47 -#: client/src/credentials/credentials.form.js:304 -msgid "Privilege Escalation Password" -msgstr "Wachtwoord verhoging van rechten" - -#: client/src/credentials/credentials.form.js:294 -msgid "Privilege Escalation Username" -msgstr "Gebruikersnaam verhoging van rechten" - -#: client/features/jobs/jobs.strings.js:15 -#: client/features/output/output.strings.js:86 -#: client/features/templates/templates.strings.js:20 -#: client/src/credentials/factories/become-method-change.factory.js:30 -#: client/src/credentials/factories/kind-change.factory.js:86 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:92 -#: client/src/templates/job_templates/job-template.form.js:100 -#: client/src/templates/job_templates/job-template.form.js:113 -#: client/src/templates/job_templates/job-template.form.js:91 -msgid "Project" -msgstr "Project" - -#: client/lib/services/base-string.service.js:150 -msgid "Project (Ascending)" -msgstr "Project (Oplopend)" - -#: client/lib/services/base-string.service.js:151 -msgid "Project (Descending)" -msgstr "Project (Aflopend)" - -#: client/src/credentials/factories/become-method-change.factory.js:53 -#: client/src/credentials/factories/kind-change.factory.js:109 -msgid "Project (Tenant Name)" -msgstr "Projecten (naam huurder)" - -#: client/src/projects/projects.form.js:77 -#: client/src/projects/projects.form.js:85 -msgid "Project Base Path" -msgstr "Basispad project" - -#: client/src/credentials/credentials.form.js:364 -msgid "Project Name" -msgstr "Projectnaam" - -#: client/src/projects/projects.form.js:102 -msgid "Project Path" -msgstr "Projectpad" - -#: client/features/templates/templates.strings.js:117 -#: client/src/workflow-results/workflow-results.controller.js:98 -msgid "Project Sync" -msgstr "Projectsynchronisatie" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:66 -msgid "Project Sync Failures" -msgstr "Mislukte projectsynchronisaties" - -#: client/lib/components/components.strings.js:74 -#: client/lib/models/models.strings.js:40 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:114 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:47 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/organizations/linkout/organizations-linkout.route.js:190 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "Projects" -msgstr "Projecten" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:18 -msgid "Promote group" -msgid_plural "Promote groups" -msgstr[0] "Groep promoveren" -msgstr[1] "Groepen promoveren" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:20 -msgid "Promote host" -msgid_plural "Promote hosts" -msgstr[0] "Host promoveren" -msgstr[1] "Hosts promoveren" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:10 -msgid "Promote {{ group }} and {{ host }}" -msgstr "{{ group }} en {{ host }} promoveren" - -#: client/src/scheduler/scheduler.strings.js:54 -#: client/src/templates/survey-maker/shared/question-definition.form.js:27 -msgid "Prompt" -msgstr "Melding" - -#: client/lib/components/components.strings.js:35 -#: client/src/templates/job_templates/job-template.form.js:116 -#: client/src/templates/job_templates/job-template.form.js:157 -#: client/src/templates/job_templates/job-template.form.js:184 -#: client/src/templates/job_templates/job-template.form.js:201 -#: client/src/templates/job_templates/job-template.form.js:218 -#: client/src/templates/job_templates/job-template.form.js:235 -#: client/src/templates/job_templates/job-template.form.js:312 -#: client/src/templates/job_templates/job-template.form.js:493 -#: client/src/templates/job_templates/job-template.form.js:60 -#: client/src/templates/job_templates/job-template.form.js:86 -#: client/src/templates/workflows.form.js:102 -#: client/src/templates/workflows.form.js:116 -#: client/src/templates/workflows.form.js:148 -#: client/src/templates/workflows.form.js:88 -msgid "Prompt on launch" -msgstr "Melding bij opstarten" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:253 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:266 -msgid "Provide a comma-separated list of filter expressions." -msgstr "Voer een lijst van filteruitdrukkingen in, gescheiden door komma's." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:269 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:284 -msgid "Provide a comma-separated list of filter expressions. Hosts are imported when all of the filters match. Refer to Ansible Tower documentation for more detail." -msgstr "Voer een lijst van filteruitdrukkingen in, gescheiden door komma's. Hosts worden geïmporteerd wanneer alle filters overeenkomen. Raadpleeg de documentatie van Ansible Tower voor meer informatie." - -#: client/src/inventories-hosts/hosts/host.form.js:49 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:48 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:50 -msgid "Provide a host name, ip address, or ip address:port. Examples include:" -msgstr "Geef een hostnaam, IP-adres, of IP-adres:poort op. Voorbeelden:" - -#: client/features/templates/templates.strings.js:57 -#: client/src/templates/job_templates/job-template.form.js:178 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns." -msgstr "Geef een hostpatroon op om de lijst van hosts die beheerd of beïnvloed worden door het draaiboek verder te beperken. Meerdere patronen zijn toegestaan. Raadpleeg de documentatie van Ansible voor meer informatie over en voorbeelden van patronen." - -#: client/src/templates/workflows.form.js:96 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the workflow. This limit is applied to all job template nodes that prompt for a limit. Refer to Ansible documentation for more information and examples on patterns." -msgstr "Geef een hostpatroon op om de lijst van hosts die beheerd of beïnvloed worden door de workflow verder te beperken. Deze limiet wordt toegepast op alle taaksjabloonknooppunten die om een limiet vragen. Raadpleeg de documentatie van Ansible voor meer informatie over en voorbeelden van patronen." - -#: client/features/credentials/credentials.strings.js:22 -msgid "Provide account information using Google Compute Engine JSON credentials file." -msgstr "Geef accountgegevens met het JSON-toegangsgegevensbestand van Google Compute Engine." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:195 -msgid "Provide environment variables to pass to the custom inventory script." -msgstr "Geef omgevingsvariabelen op om door te geven aan het aangepaste inventarisscript." - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:272 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:287 -msgid "Provide the named URL encoded name or id of the remote Tower inventory to be imported." -msgstr "Voer de URL, versleutelde naam of ID of de externe inventaris in die geïmporteerd moet worden." - -#: client/src/license/license.partial.html:128 -msgid "Provide your Red Hat customer credentials and you can choose from a list of your available licenses. The credentials you use will be stored for future use in retrieving renewal or expanded licenses. You can update or remove them in SETTINGS > SYSTEM." -msgstr "Geef uw Red Hat-klantengegevens door en u kunt kiezen uit een lijst met beschikbare licenties. De toegangsgegevens die u gebruikt, worden opgeslagen voor toekomstig gebruik bij het ophalen van verlengingen of uitbreidingen van licenties. U kunt deze updaten of verwijderen in INSTELLINGEN > SYSTEEM." - -#: client/src/templates/job_templates/job-template.form.js:374 -#: client/src/templates/job_templates/job-template.form.js:382 -msgid "Provisioning Callback URL" -msgstr "Provisioning terugkoppelings-URL" - -#: client/src/notifications/add/add.controller.js:86 -#: client/src/notifications/edit/edit.controller.js:149 -msgid "Purple" -msgstr "Paars" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:95 -msgid "RADIUS" -msgstr "RADIUS" - -#: client/src/instance-groups/instance-groups.strings.js:55 -msgid "RAM" -msgstr "RAM" - -#: client/lib/components/code-mirror/code-mirror.strings.js:15 -msgid "READ ONLY" -msgstr "ALLEEN-LEZEN" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:4 -msgid "RECENT JOB RUNS" -msgstr "RECENTE TAAKUITVOERINGEN" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:47 -msgid "RECENTLY RUN JOBS" -msgstr "TAKEN DIE RECENT UITGEVOERD ZIJN" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:50 -msgid "RECENTLY USED JOB TEMPLATES" -msgstr "TAAKSJABLONEN DIE RECENT GEBRUIKT ZIJN" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:4 -msgid "RECENTLY USED TEMPLATES" -msgstr "SJABLONEN DIE RECENT GEBRUIKT ZIJN" - -#: client/src/activity-stream/streams.list.js:54 -#: client/src/inventories-hosts/hosts/host.list.js:108 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:51 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:52 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:58 -#: client/src/projects/projects.list.js:76 -#: client/src/scheduler/schedules.list.js:76 -msgid "REFRESH" -msgstr "VERNIEUWEN" - -#: client/features/users/tokens/tokens.strings.js:23 -msgid "REFRESH TOKEN" -msgstr "TOKEN VERVERSEN" - -#: client/src/shared/smart-search/smart-search.partial.html:45 -msgid "RELATED FIELDS:" -msgstr "VERWANTE VELDEN:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:91 -msgid "REMEDIATE INVENTORY" -msgstr "INVENTARIS HERSTELLEN" - -#: client/lib/services/base-string.service.js:79 -#: client/src/access/permissions-list.controller.js:57 -#: client/src/access/permissions-list.controller.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:84 -#: client/src/shared/directives.js:94 -#: client/src/templates/labels/labelsList.directive.js:96 -msgid "REMOVE" -msgstr "VERWIJDEREN" - -#: client/lib/services/base-string.service.js:103 -msgid "REMOVE ACCESS" -msgstr "TOEGANG VERWIJDEREN" - -#: client/lib/services/base-string.service.js:97 -msgid "REMOVE TEAM ACCESS" -msgstr "TEAMTOEGANG VERWIJDEREN" - -#: client/features/output/output.strings.js:8 -msgid "RESULTS" -msgstr "RESULTATEN" - -#: client/features/templates/templates.strings.js:39 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:50 -msgid "REVERT" -msgstr "TERUGZETTEN" - -#: client/features/projects/projects.strings.js:10 -msgid "REVISION" -msgstr "REVISIE" - -#: client/src/inventories-hosts/inventories/main.js:301 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:49 -msgid "ROOT GROUPS" -msgstr "WORTELGROEPEN" - -#: client/src/credentials/factories/become-method-change.factory.js:25 -#: client/src/credentials/factories/kind-change.factory.js:81 -msgid "RSA Private Key" -msgstr "RSA-privésleutel" - -#: client/features/templates/templates.strings.js:130 -#: client/lib/services/base-string.service.js:66 -msgid "RUN" -msgstr "UITVOEREN" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.route.js:45 -msgid "RUN COMMAND" -msgstr "COMMANDO UITVOEREN" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:62 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:45 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:118 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:61 -msgid "RUN COMMANDS" -msgstr "COMMANDO'S UITVOEREN" - -#: client/src/notifications/add/add.controller.js:89 -#: client/src/notifications/edit/edit.controller.js:152 -msgid "Random" -msgstr "Willekeurig" - -#: client/features/users/tokens/tokens.strings.js:30 -msgid "Read" -msgstr "Lezen" - -#: client/src/workflow-results/workflow-results.controller.js:179 -msgid "Read only view of extra variables added to the workflow." -msgstr "Alleen-lezen-beeld van extra variabelen toegevoegd aan de workflow." - -#: client/features/output/output.strings.js:17 -msgid "Read-only view of artifacts added to the job template" -msgstr "Alleen-lezen-beeld van artefacten toegevoegd aan taaksjabloon" - -#: client/features/output/output.strings.js:24 -msgid "Read-only view of extra variables added to the job template" -msgstr "Alleen-lezen-beeld van extra variabelen toegevoegd aan taaksjabloon." - -#: client/lib/components/code-mirror/code-mirror.strings.js:51 -msgid "Read-only view of extra variables added to the job template." -msgstr "Alleen-lezen-beeld van extra variabelen toegevoegd aan taaksjabloon." - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Failed Jobs" -msgstr "Recent mislukte taken" - -#: client/src/notifications/notificationTemplates.list.js:28 -msgid "Recent Notifications" -msgstr "Recente berichten" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Successful Jobs" -msgstr "Recente succesvolle taken" - -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:98 -msgid "Recipient List" -msgstr "Lijst van ontvangers" - -#: client/src/notifications/add/add.controller.js:87 -#: client/src/notifications/edit/edit.controller.js:150 -msgid "Red" -msgstr "Rood" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Refer to the Ansible Tower documentation for further syntax and examples." -msgstr "Raadpleeg de documentatie van Ansible Tower voor meer syntaxis en voorbeelden." - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "Refer to the Ansible documentation for details about the configuration file." -msgstr "Raadpleeg de documentatie van Ansible voor meer informatie over het configuratiebestand." - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Refresh" -msgstr "Vernieuwen" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:8 -msgid "Refresh Insights" -msgstr "Inzichten vernieuwen" - -#: client/src/configuration/settings.service.js:44 -msgid "Refresh Token Expiration" -msgstr "Vernieuwingstoken vervallen" - -#: client/src/activity-stream/streams.list.js:51 -#: client/src/bread-crumb/bread-crumb.partial.html:6 -#: client/src/inventories-hosts/hosts/host.list.js:104 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:47 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:126 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:48 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:54 -#: client/src/projects/projects.list.js:72 -#: client/src/scheduler/schedules.list.js:72 -msgid "Refresh the page" -msgstr "Pagina vernieuwen" - -#: client/features/output/output.strings.js:88 -msgid "Refspec" -msgstr "Refspec" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:246 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:258 -msgid "Region:" -msgstr "Regio:" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:130 -msgid "Regions" -msgstr "Regio's" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:81 -msgid "Related Groups" -msgstr "Gerelateerde groepen" - -#: client/lib/components/components.strings.js:104 -msgid "Relaunch On" -msgstr "Opnieuw starten bij" - -#: client/src/workflow-results/workflow-results.partial.html:26 -msgid "Relaunch job" -msgstr "Taak opnieuw starten" - -#: client/lib/components/components.strings.js:103 -msgid "Relaunch using host parameters" -msgstr "Opnieuw opstarten met hostparameters" - -#: client/lib/components/components.strings.js:102 -#: client/src/workflow-results/workflow-results.controller.js:55 -msgid "Relaunch using the same parameters" -msgstr "Opnieuw opstarten met dezelfde parameters" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:176 -msgid "Remediate Inventory" -msgstr "Inventaris herstellen" - -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:106 -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:107 -#: client/src/teams/teams.form.js:157 -#: client/src/users/users.form.js:231 -msgid "Remove" -msgstr "Verwijderen" - -#: client/src/templates/labels/labelsList.directive.js:93 -msgid "Remove Label from" -msgstr "Verwijder label van" - -#: client/src/projects/projects.form.js:178 -msgid "Remove any local modifications prior to performing an update." -msgstr "Verwijder alle plaatselijke aanpassingen voordat een update uitgevoerd wordt." - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:81 -msgid "Remove host from" -msgstr "Verwijder host van" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:152 -#: client/src/scheduler/scheduler.strings.js:27 -msgid "Repeat frequency" -msgstr "Frequentie herhalen" - -#: client/lib/components/components.strings.js:7 -msgid "Replace" -msgstr "Vervangen" - -#: client/src/license/license.strings.js:7 -msgid "Replace password" -msgstr "Wachtwoord vervangen" - -#: client/lib/components/components.strings.js:139 -msgid "Replace secret" -msgstr "Geheim vervangen" - -#: client/src/license/license.partial.html:96 -msgid "Request License" -msgstr "Licentie opvragen" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:291 -msgid "Required" -msgstr "Vereist" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:154 -msgid "Reset" -msgstr "Resetten" - -#: client/lib/components/components.strings.js:92 -msgid "Resources" -msgstr "Hulpbronnen" - -#: client/features/templates/templates.strings.js:97 -#: client/src/scheduler/schedules.list.js:25 -msgid "Resources are missing from this template." -msgstr "Er ontbreken hulpbronnen uit dit sjabloon." - -#: client/lib/services/base-string.service.js:111 -msgid "Return" -msgstr "Teruggeven" - -#: client/features/users/tokens/tokens.strings.js:26 -msgid "Returned status:" -msgstr "Teruggegeven status:" - -#: client/lib/components/components.strings.js:8 -#: client/src/shared/form-generator.js:658 -msgid "Revert" -msgstr "Terugzetten" - -#: client/src/configuration/forms/auth-form/sub-forms/auth-azure.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-org.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-team.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-google-oauth2.form.js:59 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap1.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap2.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap3.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap4.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap5.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-radius.form.js:34 -#: client/src/configuration/forms/auth-form/sub-forms/auth-saml.form.js:121 -#: client/src/configuration/forms/auth-form/sub-forms/auth-tacacs.form.js:47 -#: client/src/configuration/forms/jobs-form/configuration-jobs.form.js:129 -#: client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js:26 -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:74 -#: client/src/configuration/forms/system-form/sub-forms/system-misc.form.js:95 -#: client/src/configuration/forms/ui-form/configuration-ui.form.js:36 -msgid "Revert all to default" -msgstr "Alles terugzetten naar standaardinstellingen" - -#: client/features/output/output.strings.js:90 -#: client/src/projects/projects.list.js:56 -msgid "Revision" -msgstr "Herziening" - -#: client/src/projects/add/projects-add.controller.js:159 -#: client/src/projects/edit/projects-edit.controller.js:280 -msgid "Revision #" -msgstr "Herziening #" - -#: client/features/credentials/legacy.credentials.js:85 -#: client/src/credentials/credentials.form.js:461 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:130 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:127 -#: client/src/organizations/organizations.form.js:165 -#: client/src/projects/projects.form.js:301 -#: client/src/teams/teams.form.js:109 -#: client/src/teams/teams.form.js:148 -#: client/src/templates/workflows.form.js:311 -#: client/src/users/users.form.js:212 -msgid "Role" -msgstr "Rol" - -#: client/lib/services/base-string.service.js:102 -msgid "Role access removal" -msgstr "Toegang voor rol verwijderen" - -#: client/src/templates/job_templates/job-template.form.js:440 -#: client/src/templates/job_templates/job-template.form.js:444 -#: client/src/templates/workflows.form.js:213 -#: client/src/templates/workflows.form.js:217 -msgid "Rotate Webhook Key" -msgstr "Webhooksleutel draaien" - -#: client/src/instance-groups/instance-groups.list.js:26 -#: client/src/instance-groups/instance-groups.strings.js:22 -#: client/src/instance-groups/instance-groups.strings.js:61 -msgid "Running Jobs" -msgstr "Taken in uitvoering" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:96 -msgid "SAML" -msgstr "SAML" - -#: client/lib/services/base-string.service.js:63 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:17 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:17 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:17 -#: client/src/partials/survey-maker-modal.html:84 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:18 -msgid "SAVE" -msgstr "OPSLAAN" - -#: client/features/templates/templates.strings.js:152 -msgid "SAVE & EXIT" -msgstr "OPSLAAN EN AFSLUITEN" - -#: client/src/scheduler/scheduled-jobs.list.js:13 -#: client/src/scheduler/scheduled-jobs.list.js:14 -msgid "SCHEDULED JOBS" -msgstr "GEPLANDE TAKEN" - -#: client/src/activity-stream/get-target-title.factory.js:38 -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js:9 -#: client/src/management-jobs/scheduler/main.js:28 -#: client/src/management-jobs/scheduler/main.js:34 -#: client/src/scheduler/schedules.route.js:102 -#: client/src/scheduler/schedules.route.js:14 -#: client/src/scheduler/schedules.route.js:189 -#: client/src/scheduler/schedules.route.js:283 -msgid "SCHEDULES" -msgstr "SCHEMA'S" - -#: client/features/templates/templates.strings.js:71 -#: client/src/projects/add/projects-add.controller.js:130 -#: client/src/projects/edit/projects-edit.controller.js:252 -#: client/src/projects/projects.form.js:130 -#: client/src/templates/job_templates/job-template.form.js:107 -#: client/src/templates/workflows.form.js:107 -#: client/src/templates/workflows.form.js:111 -#: client/src/workflow-results/workflow-results.controller.js:80 -msgid "SCM Branch" -msgstr "SCM-vertakking" - -#: client/src/projects/add/projects-add.controller.js:150 -#: client/src/projects/edit/projects-edit.controller.js:271 -msgid "SCM Branch/Tag/Commit" -msgstr "SCM-vertakking/tag/binding" - -#: client/src/projects/add/projects-add.controller.js:171 -#: client/src/projects/edit/projects-edit.controller.js:292 -msgid "SCM Branch/Tag/Revision" -msgstr "SCM-vertakking/tag/herziening" - -#: client/src/projects/projects.form.js:179 -msgid "SCM Clean" -msgstr "SCM-zuiveren" - -#: client/src/projects/projects.form.js:190 -msgid "SCM Delete" -msgstr "SCM-verwijderen" - -#: client/src/credentials/factories/become-method-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:76 -msgid "SCM Private Key" -msgstr "SCM-privésleutel" - -#: client/src/projects/add/projects-add.controller.js:131 -#: client/src/projects/edit/projects-edit.controller.js:253 -#: client/src/projects/projects.form.js:146 -msgid "SCM Refspec" -msgstr "SCM Refspec" - -#: client/src/projects/projects.form.js:57 -msgid "SCM Type" -msgstr "Type SCM" - -#: client/src/projects/projects.form.js:108 -#: client/src/projects/projects.form.js:119 -msgid "SCM URL" -msgstr "SCM URL" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:55 -#: client/src/projects/projects.form.js:200 -msgid "SCM Update" -msgstr "SCM-update" - -#: client/features/projects/projects.strings.js:30 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "SCM Update Cancel" -msgstr "SCM-updatekanaal" - -#: client/src/projects/projects.form.js:170 -msgid "SCM Update Options" -msgstr "SCM-update-opties" - -#: client/features/projects/projects.strings.js:19 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:126 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:36 -#: client/src/projects/edit/projects-edit.controller.js:122 -msgid "SCM update currently running" -msgstr "SCM-update nu in uitvoering" - -#: client/features/users/tokens/tokens.strings.js:39 -msgid "SCOPE" -msgstr "BEREIK" - -#: client/features/output/output.strings.js:108 -msgid "SEARCH" -msgstr "ZOEKEN" - -#: client/features/templates/templates.strings.js:132 -#: client/lib/services/base-string.service.js:64 -#: client/src/license/license.partial.html:260 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:137 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:186 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:74 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:155 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:194 -msgid "SELECT" -msgstr "SELECTEREN" - -#: client/src/instance-groups/instance-groups.strings.js:76 -msgid "SELECT A CREDENTIAL" -msgstr "EEN TOEGANGSGEGEVEN SELECTEREN" - -#: client/features/credentials/credentials.strings.js:20 -msgid "SELECT A CREDENTIAL TYPE" -msgstr "SELECTEER EEN SOORT TOEGANGSGEGEVENS" - -#: client/features/users/tokens/tokens.strings.js:19 -msgid "SELECT AN APPLICATION" -msgstr "TOEPASSING SELECTEREN" - -#: client/features/applications/applications.strings.js:36 -#: client/features/credentials/credentials.strings.js:19 -msgid "SELECT AN ORGANIZATION" -msgstr "SELECTEER EEN ORGANISATIE" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:6 -msgid "SELECT GROUPS" -msgstr "SELECTEER GROEPEN" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:6 -msgid "SELECT HOSTS" -msgstr "SELECTEER HOSTS" - -#: client/src/instance-groups/instance-groups.strings.js:42 -msgid "SELECT INSTANCE" -msgstr "INSTANTIE SELECTEREN" - -#: client/features/templates/templates.strings.js:36 -msgid "SELECTED" -msgstr "GESELECTEERD" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:18 -msgid "SELECTED:" -msgstr "GESELECTEERD:" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:22 -msgid "SETTING CATEGORY" -msgstr "CATEGORIE SELECTEREN" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:26 -msgid "SETTING NAME" -msgstr "NAAM INSTELLEN" - -#: client/src/configuration/settings.route.js:10 -msgid "SETTINGS" -msgstr "INSTELLINGEN" - -#: client/lib/services/base-string.service.js:68 -#: client/src/templates/survey-maker/surveys/init.factory.js:502 -msgid "SHOW" -msgstr "TONEN" - -#: client/src/login/loginModal/loginModal.partial.html:109 -msgid "SIGN IN" -msgstr "AANMELDEN" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html:2 -msgid "SIGN IN WITH" -msgstr "AANMELDEN MET" - -#: client/src/inventories-hosts/hosts/host.list.js:116 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:14 -msgid "SMART INVENTORY" -msgstr "SMART-INVENTARIS" - -#: client/lib/components/components.strings.js:122 -msgid "SORT BY" -msgstr "SORTEREN OP" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js:27 -msgid "SOURCES" -msgstr "BRONNEN" - -#: client/src/scheduler/scheduler.strings.js:63 -msgid "SS" -msgstr "SS" - -#: client/src/credentials/factories/become-method-change.factory.js:89 -#: client/src/credentials/factories/kind-change.factory.js:145 -msgid "SSH Key" -msgstr "SSH-sleutel" - -#: client/features/templates/templates.strings.js:45 -msgid "SSH Password" -msgstr "SSH-wachtwoord" - -#: client/src/credentials/credentials.form.js:255 -msgid "SSH key description" -msgstr "Beschrijving SSH-sleutel" - -#: client/src/notifications/notificationTemplates.form.js:551 -msgid "SSL Connection" -msgstr "SSL-verbinding" - -#: client/features/templates/templates.strings.js:134 -msgid "START" -msgstr "BEGINNEN" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "STATUS" -msgstr "STATUS" - -#: client/src/credentials/credentials.form.js:119 -#: client/src/credentials/credentials.form.js:127 -msgid "STS Token" -msgstr "STS-token" - -#: client/features/output/output.strings.js:140 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:56 -msgid "SUCCESSFUL" -msgstr "GESLAAGD" - -#: client/src/partials/survey-maker-modal.html:24 -msgid "SURVEY" -msgstr "VRAGENLIJST" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:66 -msgid "SYNC ALL" -msgstr "ALLES SYNCHRONISEREN" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:464 -#: client/src/scheduler/scheduler.strings.js:42 -msgid "Sat" -msgstr "Zat" - -#: client/src/credentials/factories/become-method-change.factory.js:70 -#: client/src/credentials/factories/kind-change.factory.js:126 -msgid "Satellite 6 URL" -msgstr "Satellite 6-URL" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:113 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:192 -#: client/src/credentials/credentials.form.js:416 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:158 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:630 -#: client/src/scheduler/scheduler.strings.js:57 -#: client/src/shared/form-generator.js:1644 -msgid "Save" -msgstr "Opslaan" - -#: client/src/configuration/forms/settings-form.controller.js:416 -msgid "Save Complete" -msgstr "Opslaan voltooid" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:199 -msgid "Save and enable log aggregation before testing the log aggregator." -msgstr "Sla logboekaggregatie op en schakel deze in voordat u de logboekaggregator test." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:66 -#: client/src/configuration/forms/settings-form.controller.js:454 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:63 -msgid "Save changes" -msgstr "Wijzigingen opslaan" - -#: client/src/license/license.partial.html:200 -msgid "Save successful!" -msgstr "Opslaan gelukt!" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:558 -#: client/src/scheduler/scheduler.strings.js:50 -msgid "Schedule Description" -msgstr "Omschrijving schema" - -#: client/src/management-jobs/card/card.partial.html:28 -#: client/src/management-jobs/card/card.partial.html:30 -msgid "Schedule Management Job" -msgstr "Schema beheertaak" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:7 -msgid "Schedule inventory syncs" -msgstr "Inventarissynchronisaties inplannen" - -#: client/src/scheduler/scheduler.strings.js:14 -msgid "Schedule is active." -msgstr "Schema is actief." - -#: client/src/scheduler/scheduler.strings.js:15 -msgid "Schedule is active. Click to stop." -msgstr "Schema is actief. Klik om stop te zetten." - -#: client/src/scheduler/scheduler.strings.js:16 -msgid "Schedule is stopped." -msgstr "Schema is gestopt." - -#: client/src/scheduler/scheduler.strings.js:17 -msgid "Schedule is stopped. Click to activate." -msgstr "Schema is gestopt. Klik om te activeren." - -#: client/src/scheduler/scheduler.strings.js:60 -msgid "Schedule name" -msgstr "Schemanaam" - -#: client/lib/components/components.strings.js:72 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:434 -#: client/src/projects/projects.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:578 -#: client/src/templates/workflows.form.js:333 -msgid "Schedules" -msgstr "Schema's" - -#: client/features/users/tokens/users-tokens-add.controller.js:38 -msgid "Scope" -msgstr "Bereik" - -#: client/src/shared/smart-search/smart-search.controller.js:127 -#: client/src/shared/smart-search/smart-search.controller.js:169 -msgid "Search" -msgstr "Zoeken" - -#: client/src/credentials/credentials.form.js:104 -msgid "Secret Key" -msgstr "Geheime sleutel" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:247 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:259 -msgid "Security Group:" -msgstr "Veiligheidsgroep:" - -#: client/src/credentials/credentials.form.js:124 -msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." -msgstr "Security Token Service (STS) is een webdienst waarmee u tijdelijke toegangsgegevens met beperkte rechten aan kunt vragen voor gebruikers van AWS Identity en Access Management (IAM)" - -#: client/src/shared/form-generator.js:1648 -#: client/src/shared/lookup/lookup-modal.directive.js:59 -#: client/src/shared/lookup/lookup-modal.partial.html:20 -msgid "Select" -msgstr "Selecteren" - -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:5 -msgid "Select Instance Groups" -msgstr "Instantiegroepen selecteren" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:58 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:100 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:84 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:108 -msgid "Select Webhook Credential" -msgstr "Toegangsgegevens Webhook selecteren" - -#: client/src/templates/workflows.form.js:110 -msgid "Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch." -msgstr "Selecteer een vertakking voor de workflow. Deze vertakking wordt toegepast op alle jobsjabloonknooppunten die vragen naar een vertakking." - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:73 -msgid "Select a credential" -msgstr "Toegangsgegevens selecteren" - -#: client/index.template.ejs:139 -msgid "Select a frequency for snapshot retention" -msgstr "Een frequentie selecteren voor het behoud van momentopnames" - -#: client/src/license/license.partial.html:214 -msgid "Select a license" -msgstr "Een licentie selecteren" - -#: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:70 -msgid "Select a role" -msgstr "Rol selecteren" - -#: client/features/users/tokens/tokens.strings.js:29 -msgid "Select a scope" -msgstr "Een bereik kiezen" - -#: client/index.template.ejs:122 -msgid "Select a time period after which to remove old facts" -msgstr "Selecteer een tijdsperiode waarna oude feiten worden verwijderd." - -#: client/src/templates/job_templates/job-template.form.js:413 -#: client/src/templates/workflows.form.js:186 -msgid "Select a webhook service." -msgstr "Selecteer een webhookservice." - -#: client/src/templates/workflows.form.js:81 -msgid "Select an inventory for the workflow. This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "Selecteer een inventaris voor de workflow. Deze inventaris wordt toegepast op alle jobsjabloonknooppunten die vragen naar een inventaris." - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:59 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or a selection of multiple groups." -msgstr "Selecteer een inventarisbron door het selectievak ernaast aan te klikken. De inventarisbron kan een enkele groep of een selectie van meerdere groepen zijn." - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:42 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:115 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:58 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups." -msgstr "Selecteer een inventarisbron door het selectievak ernaast aan te klikken. De inventarisbron kan een enkele groep of host, een selectie van meerdere hosts of een selectie van meerdere groepen zijn." - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:127 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single host or a selection of multiple hosts." -msgstr "Selecteer een inventarisbron door het selectievak ernaast aan te klikken. De inventarisbron kan een enkele host of een selectie van meerdere hosts zijn." - -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:107 -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:132 -#: client/src/configuration/forms/ui-form/configuration-ui.controller.js:94 -msgid "Select commands" -msgstr "Commando's selecteren" - -#: client/src/templates/job_templates/job-template.form.js:151 -msgid "Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking \"Prompt on launch\" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check \"Prompt on launch\", the selected credential(s) become the defaults that can be updated at run time." -msgstr "Selecteer toegangsgegevens waarmee Tower toegang kan krijgen tot de knooppunten waartegen deze taak uitgevoerd zal worden. U kunt slechts één set toegangsgegevens van iedere soort kiezen. In het geval van machine-toegangsgegevens (SSH) moet u, als u 'melding bij opstarten' aanvinkt zonder toegangsgegevens te kiezen, bij het opstarten de machinetoegangsgegevens kiezen. Als u toegangsgegevens selecteert en 'melding bij opstarten' aanvinkt, worden de geselecteerde toegangsgegevens de standaardtoegangsgegevens en kunnen deze bij het opstarten gewijzigd worden." - -#: client/src/scheduler/schedulerDatePicker.partial.html:2 -msgid "Select date" -msgstr "Selecteer datum" - -#: client/lib/components/components.strings.js:21 -msgid "Select file" -msgstr "Selecteer bestand" - -#: client/src/projects/projects.form.js:100 -msgid "Select from the list of directories found in the Project Base Path. Together the base path and the playbook directory provide the full path used to locate playbooks." -msgstr "Kies uit de lijst mappen die in het basispad van het project gevonden zijn. Het basispad en de map van het draaiboek vormen samen het volledige pad dat gebruikt wordt op draaiboeken te vinden." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:317 -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:336 -msgid "Select group types" -msgstr "Selecteer soorten groepen" - -#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:24 -msgid "Select roles" -msgstr "Selecteer rollen" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:56 -msgid "Select the Instance Groups for this Inventory to run on." -msgstr "Selecteer de instantiegroepen waar deze inventaris op uitgevoerd wordt." - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:63 -msgid "Select the Instance Groups for this Inventory to run on. Refer to the Ansible Tower documentation for more detail." -msgstr "Selecteer de instantiegroepen waar deze inventaris op uitgevoerd wordt. Raadpleeg de documentatie van Ansible Tower voor meer informatie." - -#: client/src/templates/job_templates/job-template.form.js:270 -msgid "Select the Instance Groups for this Job Template to run on." -msgstr "Selecteer de instantiegroepen waar dit taaksjabloon op uitgevoerd wordt." - -#: client/src/organizations/organizations.form.js:40 -msgid "Select the Instance Groups for this Organization to run on." -msgstr "Selecteer de instantiegroepen waar de organisatie op uitgevoerd wordt." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:65 -msgid "Select the custom Python virtual environment for this inventory source sync to run on." -msgstr "Selecteer de aangepaste virtuele Python-omgeving waarop de synchronisatie van deze inventarisbron uitgevoerd moet worden." - -#: client/src/templates/job_templates/job-template.form.js:260 -msgid "Select the custom Python virtual environment for this job template to run on." -msgstr "Selecteer de aangepaste virtuele Python-omgeving waarop u dit taaksjabloon uit wilt voeren." - -#: client/src/organizations/organizations.form.js:51 -msgid "Select the custom Python virtual environment for this organization to run on." -msgstr "Selecteer de aangepaste virtuele Python-omgeving waarop u deze organisatie uit wilt voeren." - -#: client/src/projects/projects.form.js:242 -msgid "Select the custom Python virtual environment for this project to run on." -msgstr "Selecteer de aangepaste virtuele Python-omgeving waarop dit project uitgevoerd moet worden." - -#: client/src/templates/job_templates/job-template.form.js:79 -msgid "Select the inventory containing the hosts you want this job to manage." -msgstr "Selecteer de inventaris met de hosts waarvan u wilt dat deze taak ze beheert." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:121 -msgid "Select the inventory file to be synced by this source. You can select from the dropdown or enter a file within the input." -msgstr "Selecteer het inventarisbestand dat gesynchroniseerd moet worden door deze bron. U kunt kiezen uit het uitklapbare menu of een bestand invoeren in het invoerveld." - -#: client/src/templates/job_templates/job-template.form.js:132 -msgid "Select the playbook to be executed by this job.You can select from the dropdown or enter a file within the input." -msgstr "Selecteer het draaiboek dat door deze taak uitgevoerd moet worden. U kunt kiezen uit het uitklapbare menu of een bestand invoeren in het invoerveld." - -#: client/src/templates/job_templates/job-template.form.js:99 -msgid "Select the project containing the playbook you want this job to execute." -msgstr "Selecteer het project dat het draaiboek bevat waarvan u wilt dat deze taak hem uitvoert." - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:188 -msgid "Select types" -msgstr "Selecteer soorten" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:239 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:251 -msgid "Select which groups to create automatically." -msgstr "Selecteer welke groepen automatisch aangemaakt moeten worden." - -#: client/src/license/license.partial.html:153 -msgid "Selected" -msgstr "Geselecteerd" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:202 -msgid "Send a test log message to the configured log aggregator." -msgstr "Stuur een testlogboekbericht naar de geconfigureerde logboekaggregator." - -#: client/src/notifications/notificationTemplates.form.js:110 -msgid "Sender Email" -msgstr "Afzender e-mail" - -#: client/src/credentials/factories/become-method-change.factory.js:24 -#: client/src/credentials/factories/kind-change.factory.js:80 -msgid "Service Account Email Address" -msgstr "E-mailadres service-account" - -#: client/features/credentials/credentials.strings.js:21 -msgid "Service Account JSON File" -msgstr "JSON-bestand service-account" - -#: client/features/credentials/credentials.strings.js:30 -msgid "Set Input Source" -msgstr "Inputbron instellen" - -#: client/index.template.ejs:102 -msgid "Set how many days of data should be retained." -msgstr "Stel in hoeveel dagen aan gegevens er moet worden bewaard." - -#: client/src/configuration/settings.partial.html:12 -msgid "Set preferences for data collection, logos, and logins" -msgstr "Stel voorkeuren in voor gegevensverzameling, logo's en aanmeldingen" - -#: client/lib/components/components.strings.js:88 -msgid "Settings" -msgstr "Instellingen" - -#: client/lib/components/components.strings.js:11 -#: client/src/shared/form-generator.js:845 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:24 -msgid "Show" -msgstr "Tonen" - -#: client/features/templates/templates.strings.js:50 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:115 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:118 -#: client/src/templates/job_templates/job-template.form.js:303 -#: client/src/templates/job_templates/job-template.form.js:306 -msgid "Show Changes" -msgstr "Wijzigingen tonen" - -#: client/features/output/output.strings.js:50 -#: client/src/workflow-results/workflow-results.controller.js:86 -msgid "Show Less" -msgstr "Minder tonen" - -#: client/features/output/output.strings.js:51 -#: client/src/workflow-results/workflow-results.controller.js:87 -msgid "Show More" -msgstr "Meer weergeven" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:34 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:8 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:104 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:125 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:136 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:28 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:44 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:6 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:61 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:83 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:138 -msgid "Show help text" -msgstr "Helptekst weergeven" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html:1 -msgid "Show host summary" -msgstr "Hostoverzicht weergeven" - -#: client/src/shared/paginate/paginate.partial.html:51 -msgid "Show page size options" -msgstr "Opties voor paginagrootte weergeven" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html:1 -msgid "Show source summary" -msgstr "Bronoverzicht weergeven" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:33 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:44 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:55 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:76 -msgid "Sign in with %s" -msgstr "Aanmelden met %s" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:63 -msgid "Sign in with %s Organizations" -msgstr "Aanmelden met %s organisaties" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:61 -msgid "Sign in with %s Teams" -msgstr "Aanmelden met %s teams" - -#: client/features/output/output.strings.js:91 -#: client/features/templates/templates.strings.js:52 -#: client/src/templates/job_templates/job-template.form.js:223 -#: client/src/templates/job_templates/job-template.form.js:230 -msgid "Skip Tags" -msgstr "Tags overslaan" - -#: client/features/templates/templates.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:229 -msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "Tags overslaan is nuttig wanneer u een groot draaiboek heeft en specifieke delen van het draaiboek of een taak wilt overslaan. Gebruik een komma om meerdere tags van elkaar te scheiden. Raadpleeg de documentatie van Ansible Tower voor meer informatie over het gebruik van tags." - -#: client/features/jobs/jobs.strings.js:21 -#: client/features/output/output.strings.js:74 -msgid "Slice Job" -msgstr "Taakdeel" - -#: client/src/templates/job_templates/job-template.form.js:283 -msgid "Slice Job Count" -msgstr "Aantal taakdelen" - -#: client/src/workflow-results/workflow-results.controller.js:75 -msgid "Slice Job Template" -msgstr "Taakdeelsjabloon" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:48 -msgid "Smart Host Filter" -msgstr "Smart-hostfilter" - -#: client/src/inventories-hosts/inventories/inventory.list.js:90 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/shared/form-generator.js:1406 -msgid "Smart Inventory" -msgstr "Smart-inventaris" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:44 -msgid "Solvable With Playbook" -msgstr "Op te lossen met draaiboek" - -#: client/features/output/output.strings.js:92 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:50 -msgid "Source" -msgstr "Bron" - -#: client/src/credentials/credentials.form.js:75 -msgid "Source Control" -msgstr "Broncontrole" - -#: client/features/output/output.strings.js:93 -msgid "Source Credential" -msgstr "Toegangsgegevens bron" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:33 -#: client/src/projects/projects.form.js:26 -msgid "Source Details" -msgstr "Broninformatie" - -#: client/src/notifications/notificationTemplates.form.js:212 -#: client/src/notifications/notificationTemplates.form.js:213 -msgid "Source Phone Number" -msgstr "Brontelefoonnummer" - -#: client/features/output/output.strings.js:70 -msgid "Source Project" -msgstr "Bronproject" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:135 -msgid "Source Regions" -msgstr "Bronregio's" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:208 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:215 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:232 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:239 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:256 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:263 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:273 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:280 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:290 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:297 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:307 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:314 -msgid "Source Variables" -msgstr "Bronvariabelen" - -#: client/src/partials/logviewer.html:9 -msgid "Source Vars" -msgstr "Bronvariabelen" - -#: client/features/output/output.strings.js:94 -#: client/src/workflow-results/workflow-results.controller.js:77 -msgid "Source Workflow" -msgstr "Bronworkflow" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:39 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:163 -msgid "Sources" -msgstr "Bronnen" - -#: client/src/notifications/notificationTemplates.form.js:420 -msgid "Specify HTTP Headers in JSON format. Refer to the Ansible Tower documentation for example syntax." -msgstr "Specificeer HTTP-koppen in JSON-formaat. Raadpleeg de documentatie van Ansible Tower voor voorbeeldsyntaxis." - -#: client/src/credentials/credentials.form.js:284 -msgid "Specify a method for %s operations. This is equivalent to specifying the %s parameter, where %s could be %s" -msgstr "Specificeer een methode voor %s-operaties. Dit staat gelijk aan het specificeren van de %s-parameter, waar %s %s kan zijn" - -#: client/src/notifications/notificationTemplates.form.js:574 -msgid "Specify a notification color. Acceptable colors are hex color code (example: #3af or #789abc) ." -msgstr "Kies een berichtkleur. Mogelijke kleuren zijn kleuren uit de hexidecimale kleurencode (bijvoorbeeld: #3af of #789abc)." - -#: client/src/notifications/notificationTemplates.form.js:375 -msgid "Specify a notification color. Acceptable colors are: yellow, green, red purple, gray or random." -msgstr "Kies een berichtkleur. Mogelijke kleuren zijn: geel, groen, rood, paars, grijs of willekeurig." - -#: client/features/users/tokens/tokens.strings.js:20 -msgid "Specify a scope for the token's access" -msgstr "Geef een bereik op voor de toegang van de token" - -#: client/src/notifications/notificationTemplates.form.js:432 -msgid "Specify an HTTP method for the webhook. Acceptable choices are: POST or PUT" -msgstr "Geef een HTTP-methode op voor de webhook. Mogelijke keuzes zijn: POST of PUT" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:268 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:283 -msgid "Specify which groups to create automatically. Group names will be created similar to the options selected. If blank, all groups above are created. Refer to Ansible Tower documentation for more detail." -msgstr "Specificeer welke groepen automatisch aangemaakt moeten worden. De namen van de groepen zullen vergelijkbaar zijn met de geselecteerde opties. Indien dit leeg gelaten wordt, zullen alle bovenstaande groepen aangemaakt worden. Raadpleeg de documentatie van Ansible Tower voor meer informatie." - -#: client/features/output/output.strings.js:135 -msgid "Standard Error" -msgstr "Standaardfout" - -#: client/features/output/output.strings.js:134 -#: client/src/partials/logviewer.html:5 -msgid "Standard Out" -msgstr "Standaardoutput" - -#: client/src/notifications/notifications.list.js:53 -msgid "Start" -msgstr "Starten" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:42 -#: client/src/scheduler/scheduler.strings.js:23 -msgid "Start Date" -msgstr "Startdatum" - -#: client/src/notifications/notificationTemplates.form.js:597 -msgid "Start Message" -msgstr "Startbericht" - -#: client/src/notifications/notificationTemplates.form.js:608 -msgid "Start Message Body" -msgstr "Body startbericht" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 -#: client/src/scheduler/scheduler.strings.js:24 -msgid "Start Time" -msgstr "Starttijd" - -#: client/lib/services/base-string.service.js:140 -msgid "Start Time (Ascending)" -msgstr "Starttijd (Oplopend)" - -#: client/lib/services/base-string.service.js:141 -msgid "Start Time (Descending)" -msgstr "Starttijd (Aflopend)" - -#: client/lib/components/components.strings.js:110 -msgid "Start a job using this template" -msgstr "Start een taak met dit sjabloon" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:6 -msgid "Start sync process" -msgstr "Start het synchronisatieproces" - -#: client/features/jobs/jobs.strings.js:9 -#: client/features/output/output.strings.js:95 -#: client/src/workflow-results/workflow-results.controller.js:71 -msgid "Started" -msgstr "Gestart" - -#: client/features/output/output.strings.js:96 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:55 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:55 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:43 -#: client/src/notifications/notification-templates-list/list.controller.js:71 -#: client/src/partials/logviewer.html:4 -#: client/src/workflow-results/workflow-results.controller.js:74 -msgid "Status" -msgstr "Status" - -#: client/src/license/license.partial.html:203 -msgid "Submit" -msgstr "Indienen" - -#: client/features/output/output.strings.js:112 -msgid "Submit search" -msgstr "Zoekopdracht indienen" - -#: client/src/license/license.partial.html:27 -msgid "Subscription" -msgstr "Abonnement" - -#: client/src/credentials/credentials.form.js:151 -#: client/src/credentials/credentials.form.js:162 -msgid "Subscription ID" -msgstr "Abonnement-ID" - -#: client/src/credentials/credentials.form.js:161 -msgid "Subscription ID is an Azure construct, which is mapped to a username." -msgstr "Abonnement-ID is een concept van Azure en is gelinkt aan een gebruikersnaam." - -#: client/src/notifications/notifications.list.js:65 -msgid "Success" -msgstr "Geslaagd" - -#: client/src/notifications/notificationTemplates.form.js:620 -msgid "Success Message" -msgstr "Succesbericht" - -#: client/src/notifications/notificationTemplates.form.js:631 -msgid "Success Message Body" -msgstr "Body succesbericht" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:83 -msgid "Successful" -msgstr "Geslaagd" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:404 -#: client/src/scheduler/scheduler.strings.js:36 -msgid "Sun" -msgstr "Zon" - -#: client/features/templates/templates.strings.js:32 -msgid "Survey" -msgstr "Vragenlijst" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:73 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:478 -msgid "Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch." -msgstr "Met vragenlijsten kunnen gebruikers bij het starten van een taak een melding krijgen met een lijst vragen die bij de taak horen. Zo kunnen variabelen die van invloed zijn op de uitvoering van het draaiboek bepaald worden bij het opstarten." - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:79 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:186 -msgid "Sync Status" -msgstr "Synchronisatiestatus" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:62 -msgid "Sync all inventory sources" -msgstr "Alle inventarisbronnen synchroniseren" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:29 -msgid "Sync canceled. Click to view log." -msgstr "Synchronisatie geannuleerd. Klik om logboek te bekijken." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:35 -msgid "Sync completed. Click to view log." -msgstr "Synchronisatie voltooid. Klik om logboek te bekijken." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:32 -msgid "Sync failed. Click to view log." -msgstr "Synchronisatie mislukt. Klik om logboek te bekijken." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "Sync not performed. Click" -msgstr "Synchronisatie niet uitgevoerd. Klik" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:38 -msgid "Sync pending." -msgstr "Synchronisatie in afwachting." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:45 -msgid "Sync running" -msgstr "Synchronisatie in uitvoering" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:46 -msgid "Sync running. Click to view log." -msgstr "Synchronisatie in uitvoering. Klik om logboek te bekijken." - -#: client/lib/components/components.strings.js:96 -#: client/src/configuration/settings.partial.html:8 -msgid "System" -msgstr "Systeem" - -#: client/src/users/add/users-add.controller.js:12 -#: client/src/users/edit/users-edit.controller.js:12 -#: client/src/users/list/users-list.controller.js:12 -msgid "System Administrator" -msgstr "Systeembeheerder" - -#: client/src/shared/form-generator.js:1846 -msgid "System Administrators have access to all s" -msgstr "Systeembeheerders hebben toegang tot alle s" - -#: client/src/users/add/users-add.controller.js:11 -#: client/src/users/edit/users-edit.controller.js:11 -#: client/src/users/list/users-list.controller.js:11 -msgid "System Auditor" -msgstr "Systeemcontroleur" - -#: client/src/configuration/forms/settings-form.partial.html:3 -msgid "System auditors have read-only permissions in this section." -msgstr "Systeemcontroleurs hebben een alleen-lezen-machtiging in deze sectie." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:97 -msgid "TACACS+" -msgstr "TACACS+" - -#: client/features/output/output.strings.js:131 -msgid "TASK" -msgstr "TAAK" - -#: client/src/activity-stream/get-target-title.factory.js:23 -#: client/src/organizations/linkout/organizations-linkout.route.js:95 -#: client/src/organizations/list/organizations-list.controller.js:62 -#: client/src/teams/main.js:65 -#: client/src/teams/teams.list.js:14 -#: client/src/teams/teams.list.js:15 -msgid "TEAMS" -msgstr "TEAMS" - -#: client/features/templates/routes/templatesList.route.js:12 -#: client/features/templates/templates.strings.js:12 -#: client/features/templates/templates.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:44 -#: client/src/templates/templates.list.js:15 -#: client/src/templates/templates.list.js:16 -msgid "TEMPLATES" -msgstr "SJABLONEN" - -#: client/lib/services/base-string.service.js:78 -msgid "TEST" -msgstr "TEST" - -#: client/src/instance-groups/instance-groups.list.js:8 -msgid "THERE ARE CURRENTLY NO INSTANCE GROUPS DEFINED" -msgstr "ER ZIJN OP DIT MOMENT GEEN INSTANTIEGROEPEN GEDEFINIEERD" - -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:103 -msgid "TIME" -msgstr "TIJD" - -#: client/features/users/tokens/tokens.strings.js:22 -msgid "TOKEN" -msgstr "TOKEN" - -#: client/features/users/tokens/tokens.strings.js:21 -msgid "TOKEN INFORMATION" -msgstr "TOKENINFORMATIE" - -#: client/features/applications/applications.strings.js:11 -#: client/features/users/tokens/tokens.strings.js:10 -#: client/features/users/tokens/tokens.strings.js:8 -#: client/features/users/tokens/users-tokens-list.route.js:24 -#: client/src/activity-stream/get-target-title.factory.js:50 -msgid "TOKENS" -msgstr "TOKENS" - -#: client/features/templates/templates.strings.js:122 -msgid "TOTAL NODES" -msgstr "TOTAAL KNOOPPUNTEN" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:250 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:262 -msgid "Tag None:" -msgstr "Tag geen:" - -#: client/features/templates/templates.strings.js:55 -#: client/src/templates/job_templates/job-template.form.js:212 -msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "Tags zijn nuttig wanneer u een groot draaiboek heeft en specifieke delen van het draaiboek of een taak wilt uitvoeren. Gebruik een komma om meerdere tags van elkaar te scheiden. Raadpleeg de documentatie van Ansible Tower voor meer informatie over het gebruik van tags." - -#: client/src/notifications/notificationTemplates.form.js:330 -msgid "Tags for the Annotation" -msgstr "Tags voor de melding" - -#: client/src/notifications/notificationTemplates.form.js:329 -msgid "Tags for the Annotation (optional)" -msgstr "Tags voor de melding (optioneel)" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:248 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:260 -msgid "Tags:" -msgstr "Tags:" - -#: client/src/notifications/notificationTemplates.form.js:392 -#: client/src/notifications/notificationTemplates.form.js:442 -#: client/src/notifications/notificationTemplates.form.js:481 -msgid "Target URL" -msgstr "Doel-URL" - -#: client/features/output/output.strings.js:118 -msgid "Tasks" -msgstr "Taken" - -#: client/features/credentials/legacy.credentials.js:91 -#: client/src/credentials/credentials.form.js:467 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:136 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:133 -#: client/src/organizations/organizations.form.js:171 -#: client/src/projects/projects.form.js:307 -#: client/src/templates/workflows.form.js:317 -msgid "Team Roles" -msgstr "Teamrollen" - -#: client/lib/services/base-string.service.js:96 -msgid "Team access removal" -msgstr "Verwijderen toegang voor team" - -#: client/lib/components/components.strings.js:81 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:36 -#: client/src/organizations/linkout/organizations-linkout.route.js:103 -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/users/users.form.js:162 -msgid "Teams" -msgstr "Teams" - -#: client/features/templates/templates.strings.js:120 -#: client/src/templates/templates.list.js:14 -#: client/src/workflow-results/workflow-results.controller.js:69 -msgid "Template" -msgstr "Sjabloon" - -#: client/features/templates/templates.strings.js:79 -msgid "Template parameter is missing." -msgstr "Sjabloonparameter ontbreekt." - -#: client/lib/components/components.strings.js:78 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:37 -msgid "Templates" -msgstr "Sjablonen" - -#: client/src/credentials/credentials.form.js:336 -msgid "Tenant ID" -msgstr "Huurder-ID" - -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:80 -msgid "Test" -msgstr "Test" - -#: client/features/credentials/credentials.strings.js:26 -msgid "Test External Credential" -msgstr "Test externe inloggegevens" - -#: client/features/credentials/credentials.strings.js:45 -msgid "Test failed." -msgstr "Test mislukt." - -#: client/src/notifications/notificationTemplates.list.js:82 -msgid "Test notification" -msgstr "Testbericht" - -#: client/features/credentials/credentials.strings.js:44 -msgid "Test passed." -msgstr "Test geslaagd." - -#: client/src/templates/survey-maker/surveys/init.factory.js:13 -msgid "Text" -msgstr "Tekst" - -#: client/src/templates/survey-maker/surveys/init.factory.js:14 -msgid "Textarea" -msgstr "Tekstgebied" - -#: client/src/shared/form-generator.js:1306 -#: client/src/shared/form-generator.js:1312 -msgid "That value was not found. Please enter or select a valid value." -msgstr "De waarde is niet gevonden. Voer een geldige waarde in of selecteer er een." - -#: client/lib/components/components.strings.js:48 -msgid "That value was not found. Please enter or select a valid value." -msgstr "De waarde is niet gevonden. Voer een geldige waarde in of selecteer er een." - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:66 -msgid "The Insights Credential for {{inventory.name}} was not found." -msgstr "De Insights-toegangsgegevens voor {{inventory.name}} konden niet gevonden worden." - -#: client/src/credentials/factories/become-method-change.factory.js:32 -#: client/src/credentials/factories/kind-change.factory.js:88 -msgid "The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:" -msgstr "Het project-ID is de toegewezen GCE-identificatie. Dit bestaat uit twee woorden, gevolgd door drie getallen, zoals:" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "The Project selected has a status of" -msgstr "Het geselecteerde project heeft de status" - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "The SCM update process is running." -msgstr "Het SCM-updateproces is nu in uitvoering." - -#: client/src/notifications/notificationTemplates.form.js:150 -msgid "The amount of time (in seconds) before the email notification stops trying to reach the host and times out. Ranges from 1 to 120 seconds." -msgstr "De tijd (in seconden) voordat de e-mailmelding de host probeert te bereiken en een time-out oplevert. Varieert van 1 tot 120 seconden." - -#: client/src/templates/job_templates/job-template.form.js:299 -msgid "The amount of time (in seconds) to run before the task is canceled. Defaults to 0 for no job timeout." -msgstr "De tijd (in seconden) die het heeft geduurd voordat de taak werd geannuleerd. Standaard 0 voor geen taak time-out." - -#: client/features/templates/templates.strings.js:154 -msgid "The amount of time to wait before this approval step is automatically denied. Defaults to 0 for no timeout." -msgstr "De tijd die moet worden gewacht voordat deze goedkeuringsstap automatisch wordt geweigerd. Wordt standaard op 0 gezet voor geen time-out." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:201 -#: client/src/templates/survey-maker/shared/question-definition.form.js:260 -#: client/src/templates/survey-maker/shared/question-definition.form.js:281 -msgid "The answer is longer than the maximum length. Please make the answer shorter." -msgstr "Het antwoord is langer dan de maximumlengte. Maak het antwoord korter." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:200 -#: client/src/templates/survey-maker/shared/question-definition.form.js:259 -#: client/src/templates/survey-maker/shared/question-definition.form.js:280 -msgid "The answer is shorter than the minimium length. Please make the answer longer." -msgstr "Het antwoord is korter dan de minimumlengte. Maak het antwoord langer." - -#: client/src/notifications/notificationTemplates.form.js:287 -msgid "The base URL of the Grafana server - the /api/annotations endpoint will be added automatically to the base Grafana URL." -msgstr "De basis-URL van de Grafana-server - het /api/annotations-eindpunt wordt automatisch toegevoegd aan de basis-URL voor Grafana." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:241 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:328 -#: client/src/scheduler/scheduler.strings.js:32 -msgid "The day must be between 1 and 31." -msgstr "De dag moet tussen 1 en 31 vallen" - -#: client/src/configuration/settings.service.js:39 -msgid "The duration (in seconds) access tokens remain valid since their creation." -msgstr "De duur (in seconden) die gebruikerstokens geldig blijven na het aanmaken." - -#: client/src/configuration/settings.service.js:47 -msgid "The duration (in seconds) authorization codes remain valid since their creation." -msgstr "De duur (in seconden) die autorisatietokens geldig blijven na het aanmaken." - -#: client/src/configuration/settings.service.js:43 -msgid "The duration (in seconds) refresh tokens remain valid after the expiration of their associated access token." -msgstr "De duur (in seconden) dat vernieuwde tokens geldig blijven na het verlopen van de bijbehorende toegangstoken." - -#: client/src/credentials/credentials.form.js:190 -msgid "The email address assigned to the Google Compute Engine %sservice account." -msgstr "Het e-mailadres dat toegewezen is aan het Google Compute Engine %sserviceaccount." - -#: client/src/projects/projects.form.js:143 -msgid "The first fetches all references. The second fetches the Github pull request number 62, in this example the branch needs to be `pull/62/head`." -msgstr "De eerste haalt alle referenties op. De tweede haalt het Github pullverzoek nummer 62 op, in dit voorbeeld moet de vertakking `pull/62/head` zijn." - -#: client/features/templates/templates.strings.js:146 -msgid "The following promptable values were provided when this node was created:" -msgstr "De volgende opvraagbare waarden zijn geleverd bij het aanmaken van dit knooppunt:" - -#: client/features/output/output.strings.js:12 -msgid "The host status bar will update when the job is complete." -msgstr "De statusbalk van de host wordt bijgewerkt wanneer de taak voltooid is." - -#: client/src/credentials/factories/become-method-change.factory.js:62 -#: client/src/credentials/factories/kind-change.factory.js:118 -msgid "The host to authenticate with." -msgstr "De host waarmee geauthenticeerd moet worden." - -#: client/src/credentials/factories/kind-change.factory.js:59 -msgid "The host value" -msgstr "De hostwaarde" - -#: client/features/templates/templates.strings.js:137 -msgid "The inventory of this node will be overridden by the parent workflow inventory." -msgstr "De inventaris van dit knooppunt zal overschreven worden door de bovenliggende workflowinventaris." - -#: client/features/templates/templates.strings.js:139 -msgid "The inventory of this node will be overridden if a parent workflow inventory is provided at launch." -msgstr "De inventaris van dit knooppunt zal overschreven worden als er een bovenliggende workflowinventaris wordt aangeleverd bij het opstarten." - -#: client/features/templates/templates.strings.js:138 -msgid "The inventory of this node will not be overridden by the parent workflow inventory." -msgstr "De inventaris van dit knooppunt zal niet worden overschreven door de bovenliggende workflowinventaris." - -#: client/features/templates/templates.strings.js:140 -msgid "The inventory of this node will not be overridden if a parent workflow inventory is provided at launch." -msgstr "De inventaris van dit knooppunt zal niet overschreven worden als er een bovenliggende workflowinventaris wordt aangeleverd bij het opstarten." - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:153 -msgid "The inventory will be in a pending status until the final delete is processed." -msgstr "De inventaris zal de status 'in afwachting' hebben totdat het laatste verwijderproces verwerkt is." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:100 -#: client/src/templates/survey-maker/shared/question-definition.form.js:121 -#: client/src/templates/survey-maker/shared/question-definition.form.js:142 -msgid "The maximum length is too low. Please enter a number larger than the minimum length you set." -msgstr "De maximumlengte is te kort. Voer een getal in dat groter is dan de ingestelde minimumlengte." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:120 -#: client/src/templates/survey-maker/shared/question-definition.form.js:141 -#: client/src/templates/survey-maker/shared/question-definition.form.js:99 -msgid "The maximum length you entered is not a valid number. Please enter a whole number." -msgstr "De ingevoerde maximumlengte is geen geldig getal. Voer een geheel getal in." - -#: client/src/organizations/organizations.form.js:69 -msgid "The maximum number of hosts allowed to be managed by this organization. Value defaults to 0 which means no limit. Refer to the Ansible documentation for more details." -msgstr "Maximumaantal hosts dat beheerd mag worden door deze organisatie. De standaardwaarde is 0, wat betekent dat er geen limiet is. Raadpleeg de Ansible-documentatie voor meer informatie." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:115 -#: client/src/templates/survey-maker/shared/question-definition.form.js:136 -#: client/src/templates/survey-maker/shared/question-definition.form.js:94 -msgid "The minimium length is too high. Please enter a lower number." -msgstr "De minimumlengte is te hoog. Voer een lager getal in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:116 -#: client/src/templates/survey-maker/shared/question-definition.form.js:137 -#: client/src/templates/survey-maker/shared/question-definition.form.js:95 -msgid "The minimum length is too low. Please enter a positive number." -msgstr "De minimumlengte is te laag. Voer een positief getal in." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:114 -#: client/src/templates/survey-maker/shared/question-definition.form.js:135 -#: client/src/templates/survey-maker/shared/question-definition.form.js:93 -msgid "The minimum length you entered is not a valid number. Please enter a whole number." -msgstr "De ingevoerde minimumlengte is geen geldig getal. Voer een volledig getal in." - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. An empty value, or a value less than 1 will use the Ansible default which is usually 5. The default number of forks can be overwritten with a change to" -msgstr "Het aantal parallelle of gelijktijdige processen dat tijdens de uitvoering van het draaiboek gebruikt wordt. Een lege waarde, of een waarde minder dan 1 zal de Ansible-standaard gebruiken die meestal 5 is. Het standaard aantal vorken kan overgeschreven worden met een wijziging naar" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:105 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. Inputting no value will use the default value from the %sansible configuration file%s." -msgstr "Het aantal parallelle of gelijktijdige processen dat gebruikt wordt bij het uitvoeren van het draaiboek. Als u geen waarde invoert, wordt de standaardwaarde van de %sgeregistreerde Ansible-configuratie%s gebruikt." - -#: client/src/credentials/factories/kind-change.factory.js:58 -msgid "The project value" -msgstr "De projectwaarde" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:552 -msgid "The scheduler options are invalid or incomplete." -msgstr "De opties voor de planner zijn ongeldig of niet compleet." - -#: client/src/scheduler/scheduler.strings.js:49 -msgid "The scheduler options are invalid, incomplete, or a date is in the past." -msgstr "De opties voor de planner zijn ongeldig, niet compleet, of een datum is al voorbij." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "The selected project has a status of" -msgstr "Het geselecteerde project heeft de status" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings and then run an update." -msgstr "Het geselecteerde project is niet geconfigureerd voor SCM. Om het project te configureren voor SCM, dient u het te wijzigen en SCM-instellingen op te geven, om vervolgens een update uit te voeren." - -#: client/features/projects/projects.strings.js:23 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." -msgstr "Het geselecteerde project is niet geconfigureerd voor SCM. Om het project te configureren voor SCM, dient u het te wijzigen en SCM-instellingen op te geven, om vervolgens een update uit te voeren." - -#: client/src/templates/survey-maker/shared/question-definition.form.js:52 -msgid "The suggested format for variable names is lowercase and underscore-separated (for example, foo_bar, user_id, host_name, etc.). Variable names with spaces are not allowed." -msgstr "De voorgestelde indeling voor namen van variabelen: kleine letters en gescheiden door middel van een underscore (bijvoorbeeld foo_bar, user_id, host_name etc.) De naam van een variabele mag geen spaties bevatten." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:126 -#: client/src/scheduler/scheduler.strings.js:25 -msgid "The time must be in HH24:MM:SS format." -msgstr "De tijd moet weergegeven worden in de indeling HH24:MM:SS." - -#: client/lib/services/base-string.service.js:90 -msgid "The {{ resourceType }} is currently being used by other resources." -msgstr "De {{ resourceType }} wordt op dit moment gebruikt door andere hulpbronnen." - -#: client/src/activity-stream/streams.list.js:17 -msgid "There are no events to display at this time" -msgstr "Er zijn op dit moment geen evenementen om weer te geven" - -#: client/lib/components/components.strings.js:127 -msgid "There are no jobs awaiting approval" -msgstr "Er zijn geen banen die op goedkeuring wachten" - -#: client/features/jobs/jobs.strings.js:18 -msgid "There are no running jobs." -msgstr "Er worden op dit moment geen taken uitgevoerd." - -#: client/features/projects/projects.strings.js:22 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "Er is geen SCM-update-informatie beschikbaar voor dit project. Er is nog geen update voltooid. Start een update voor dit project, indien u dit nog niet gedaan heeft." - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "Er is geen SCM-update-informatie beschikbaar voor dit project. Er is nog geen update voltooid. Start een update voor dit project, indien u dit nog niet gedaan heeft." - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:127 -msgid "There was an error deleting inventory source groups. Returned status:" -msgstr "Er is iets misgegaan bij het verwijderen van de inventarisbrongroepen. Retourstatus:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:117 -msgid "There was an error deleting inventory source hosts. Returned status:" -msgstr "Er is iets misgegaan bij het verwijderen van de inventarisbrongroepen. Retourstatus:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:154 -msgid "There was an error deleting inventory source. Returned status:" -msgstr "Er is iets misgegaan bij het verwijderen van de inventarisbron. Status:" - -#: client/src/configuration/forms/settings-form.controller.js:286 -msgid "There was an error resetting value. Returned status:" -msgstr "Er was een fout bij het resetten van de waarde. Teruggegeven status:" - -#: client/src/configuration/forms/settings-form.controller.js:615 -msgid "There was an error resetting values. Returned status:" -msgstr "Er was een fout bij het resetten van de waardes. Teruggegeven status:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:235 -msgid "There was an error testing the log aggregator. Returned status:" -msgstr "Er was een fout bij het testen van de log aggregator. Teruggegeven status:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:29 -msgid "These are the modules that {{BRAND_NAME}} supports running commands against." -msgstr "Dit zijn de modules waar {{BRAND_NAME}} commando's tegen kan uitvoeren." - -#: client/features/templates/templates.strings.js:106 -msgid "This Job Template has a credential that requires a password. Credentials requiring passwords on launch are not permitted on workflow nodes." -msgstr "Dit taaksjabloon heeft toegangsgegevens waar een wachtwoord bij hoort. Toegangsgegevens die wachtwoordgegevens nodig hebben bij het opstarten zijn niet toegestaan op workflowknooppunten." - -#: client/src/scheduler/scheduler.strings.js:59 -msgid "This Job Template has a default credential that requires a password before launch. Adding or editing schedules is prohibited while this credential is selected. To add or edit a schedule, credentials that require a password must be removed from the Job Template." -msgstr "Dit taaksjabloon heeft standaardtoegangsgegevens waar een wachtwoord voor nodig is bij het opstarten. Zo lang deze toegangsgegevens geselecteerd zijn, is het niet toegestaan schema's toe te voegen of te wijzigen. Om een schema toe te voegen of te wijzigen moeten de toegangsgegevens waar een wachtwoord voor nodig is, eerst verwijderd worden uit de taaksjabloon." - -#: client/features/templates/templates.strings.js:105 -msgid "This Job Template is missing a default inventory or project. This must be addressed in the Job Template form before this node can be saved." -msgstr "Er ontbreekt een standaardinventaris of -project uit dit taaksjabloon. Dit moet behandeld worden in het formulier voor de taaksjabloon voordat dit knooppunt opgeslagen kan worden." - -#: client/src/credential-types/credential-types.strings.js:8 -msgid "This credential type is currently being used by one or more credentials. Credentials that use this credential type must be deleted before the credential type can be deleted." -msgstr "Deze soort toegangsgegevens wordt op dit moment door één of meerdere toegangsgegevens gebruikt. Toegangsgegevens die deze soort gebruiken moeten verwijderd worden voordat de soort verwijderd kan worden." - -#: client/src/instance-groups/instance-groups.strings.js:14 -msgid "This feature is currently in tech preview and is subject to change in a future release. Click here for documentation." -msgstr "Deze functie is momenteel in tech-voorvertoning en kan in een toekomstige release worden gewijzigd. Klik hier voor documentatie." - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:25 -msgid "This group contains at least one group or host" -msgstr "Deze groep bevat ten minste één groep of host" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:50 -#: client/src/templates/workflows.form.js:74 -msgid "This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "Deze inventaris wordt toegepast op alle jobsjabloonknooppunten die vragen naar een inventaris." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:174 -msgid "This is not a valid number." -msgstr "Dit is geen geldig nummer." - -#: client/src/credentials/factories/become-method-change.factory.js:59 -#: client/src/credentials/factories/kind-change.factory.js:115 -msgid "This is the tenant name. This value is usually the same as the username." -msgstr "Dit is de naam van de huurder. Deze waarde is vaak gelijk aan de gebruikersnaam." - -#: client/features/templates/templates.strings.js:75 -msgid "This job template has a default {{typeLabel}} credential which must be included or replaced before proceeding." -msgstr "Dit taaksjabloon heeft een standaard {{typeLabel}}-toegangsgegevens die bijgevoegd of vervangen moet worden voordat u verder kunt gaan." - -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "This list is populated by inventories added from the" -msgstr "Deze lijst is gevuld met inventarissen die toegevoegd zijn vanuit de" - -#: client/src/notifications/notifications.list.js:21 -msgid "This list is populated by notification templates added from the %sNotifications%s section" -msgstr "Deze lijst is gevuld met berichtsjablonen die toegevoegd zijn vanuit de sectie %sBerichten%s" - -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "This list is populated by projects added from the" -msgstr "Deze lijst is gevuld met projecten die toegevoegd zijn vanuit de" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -msgid "This list is populated by teams added from the" -msgstr "Deze lijst is gevuld met teams die toegevoegd zijn vanuit de" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:4 -msgid "This machine has not checked in with Insights in {{last_check_in}} hours" -msgstr "Deze machine heeft {{last_check_in}} uur geleden voor het laatst ingecheckt bij Insights" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:49 -msgid "This question variable is already in use. Please enter a different variable name." -msgstr "Deze vraagvariabele wordt al gebruikt. Voer een andere variabele naam in." - -#: client/src/shared/form-generator.js:707 -msgid "This setting has been set manually in a settings file and is now disabled." -msgstr "Deze instelling is handmatig gekozen in een instellingenbestand en is nu uitgeschakeld." - -#: client/src/users/users.form.js:167 -msgid "This user is not a member of any teams" -msgstr "Deze gebruiker is niet lid van een team" - -#: client/src/shared/form-generator.js:828 -#: client/src/shared/form-generator.js:920 -msgid "This value does not match the password you entered previously. Please confirm that password." -msgstr "Deze waarde komt niet overeen met het wachtwoord dat u eerder ingevoerd heeft. Bevestig dat wachtwoord." - -#: client/src/configuration/forms/settings-form.controller.js:488 -msgid "This will reset all configuration values to their factory defaults. Are you sure you want to proceed?" -msgstr "Op deze manier worden alle configuratiewaarden gereset naar de fabrieksinstellingen. Weet u zeker dat u verder wilt gaan?" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:51 -msgid "This workflow job template has a default inventory which must be included or replaced before proceeding." -msgstr "Dit worklowtaaksjabloon heeft een standaardinventaris die voordat u verdergaat dient te worden opgenomen of vervangen." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:444 -#: client/src/scheduler/scheduler.strings.js:40 -msgid "Thu" -msgstr "Do" - -#: client/src/activity-stream/streams.list.js:25 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:18 -#: client/src/notifications/notification-templates-list/list.controller.js:72 -msgid "Time" -msgstr "Tijd" - -#: client/src/license/license.partial.html:45 -msgid "Time Remaining" -msgstr "Tijd over" - -#: client/src/projects/projects.form.js:228 -msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." -msgstr "Tijd in seconden waarmee een project actueel genoemd kan worden. Tijdens taken in uitvoering en terugkoppelingen wil het taaksysteem de tijdstempel van de meest recente projectupdate bekijken. Indien dit ouder is dan de Cache-timeout wordt het project niet gezien als actueel en moet er een nieuwe projectupdate uitgevoerd worden." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:405 -msgid "Time in seconds to consider an inventory sync to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest sync. If it is older than Cache Timeout, it is not considered current, and a new inventory sync will be performed." -msgstr "Tijd in seconden waarmee een inventarissynchronisatie actueel genoemd kan worden. Tijdens taken in uitvoering en terugkoppelingen zal het taaksysteem de tijdstempel van de meest recente synchronisatie bekijken. Indien dit ouder is dan de Cache-timeout wordt het project niet gezien als actueel en moet er een nieuwe inventarissynchronisatie uitgevoerd worden." - -#: client/features/templates/templates.strings.js:156 -#: client/src/notifications/notificationTemplates.form.js:136 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/templates/job_templates/job-template.form.js:290 -#: client/src/templates/job_templates/job-template.form.js:296 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:137 -msgid "Timeout" -msgstr "Time-out" - -#: client/src/credentials/credentials.form.js:125 -msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." -msgstr "Raadpleeg de %sAmazondocumentatie%s voor meer informatie over de IAM STS-token." - -#: client/features/output/output.strings.js:120 -msgid "Toggle expanded output" -msgstr "Uitgebreide output schakelen" - -#: client/src/shared/form-generator.js:850 -msgid "Toggle the display of plaintext." -msgstr "Tekst tonen/verbergen" - -#: client/src/notifications/shared/type-change.service.js:37 -#: client/src/notifications/shared/type-change.service.js:46 -msgid "Token" -msgstr "Token" - -#: client/features/applications/applications.strings.js:16 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 -#: client/src/users/users.form.js:242 -msgid "Tokens" -msgstr "Tokens" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:10 -msgid "Total Issues" -msgstr "Totale problemen" - -#: client/src/instance-groups/instance-groups.strings.js:23 -msgid "Total Jobs" -msgstr "Totale taken" - -#: client/src/workflow-results/workflow-results.controller.js:91 -msgid "Total Nodes" -msgstr "Totaalaantal knooppunten" - -#: client/src/partials/logviewer.html:6 -msgid "Traceback" -msgstr "Traceback" - -#: client/src/license/license.partial.html:176 -msgid "Tracking and Analytics" -msgstr "Tracking en analyse" - -#: client/src/license/license.partial.html:233 -msgid "Trial" -msgstr "Proefperiode" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:424 -#: client/src/scheduler/scheduler.strings.js:38 -msgid "Tue" -msgstr "Di" - -#: client/src/credentials/credentials.form.js:60 -#: client/src/credentials/credentials.form.js:84 -#: client/src/inventories-hosts/inventories/inventory.list.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:45 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:44 -#: client/src/notifications/notifications.list.js:33 -#: client/src/projects/projects.list.js:50 -#: client/src/scheduler/scheduled-jobs.list.js:47 -#: client/src/teams/teams.form.js:142 -#: client/src/templates/templates.list.js:31 -#: client/src/users/users.form.js:206 -msgid "Type" -msgstr "Soort" - -#: client/features/credentials/credentials.strings.js:18 -#: client/src/credentials/credentials.form.js:23 -#: client/src/notifications/notificationTemplates.form.js:26 -msgid "Type Details" -msgstr "Soortdetails" - -#: client/features/templates/templates.strings.js:145 -msgid "UNLINK" -msgstr "LINK VERWIJDEREN" - -#: client/src/projects/add/projects-add.controller.js:182 -#: client/src/projects/edit/projects-edit.controller.js:303 -msgid "URL popover text" -msgstr "URL-popovertekst" - -#: client/src/license/license.partial.html:132 -#: client/src/login/loginModal/loginModal.partial.html:61 -msgid "USERNAME" -msgstr "GEBRUIKERSNAAM" - -#: client/src/activity-stream/get-target-title.factory.js:20 -#: client/src/organizations/linkout/organizations-linkout.route.js:43 -#: client/src/organizations/list/organizations-list.controller.js:55 -#: client/src/users/users.list.js:18 -#: client/src/users/users.list.js:19 -#: client/src/users/users.route.js:8 -msgid "USERS" -msgstr "GEBRUIKERS" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:597 -msgid "UTC" -msgstr "UTC" - -#: client/lib/services/base-string.service.js:144 -msgid "UUID (Ascending)" -msgstr "UUID (Oplopend)" - -#: client/lib/services/base-string.service.js:145 -msgid "UUID (Descending)" -msgstr "UUID (Aflopend)" - -#: client/lib/components/components.strings.js:25 -msgid "Unable to Submit" -msgstr "Kon niet indienen" - -#: client/features/templates/templates.strings.js:96 -msgid "Unable to copy template." -msgstr "Kon sjabloon niet kopiëren." - -#: client/src/instance-groups/instance-groups.strings.js:67 -msgid "Unable to delete instance group." -msgstr "Kon instantiegroep niet verwijderen." - -#: client/features/templates/templates.strings.js:92 -msgid "Unable to delete template." -msgstr "Kon sjabloon niet verwijderen." - -#: client/features/templates/templates.strings.js:94 -msgid "Unable to determine template type." -msgstr "Kon soort sjabloon niet bepalen." - -#: client/features/templates/templates.strings.js:81 -msgid "Unable to determine this template's type while copying." -msgstr "Kon het soort van dit sjabloon niet bepalen tijdens het kopiëren." - -#: client/features/templates/templates.strings.js:82 -msgid "Unable to determine this template's type while deleting." -msgstr "Kon het soort van dit sjabloon niet bepalen tijdens het verwijderen." - -#: client/features/templates/templates.strings.js:83 -msgid "Unable to determine this template's type while editing." -msgstr "Kon het soort van dit sjabloon niet bepalen tijdens het bewerken." - -#: client/features/templates/templates.strings.js:84 -msgid "Unable to determine this template's type while launching." -msgstr "Kon het soort van dit sjabloon niet bepalen tijdens het opstarten." - -#: client/features/templates/templates.strings.js:85 -msgid "Unable to determine this template's type while scheduling." -msgstr "Kon het soort van dit sjabloon niet bepalen tijdens het inplannen." - -#: client/features/templates/templates.strings.js:91 -msgid "Unable to edit template." -msgstr "Kon het sjabloon niet bewerken." - -#: client/src/shared/stateDefinitions.factory.js:231 -msgid "Unable to get resource:" -msgstr "Kon de volgende hulpbron niet ophalen:" - -#: client/features/templates/templates.strings.js:93 -msgid "Unable to launch template." -msgstr "Kon sjabloon niet opstarten." - -#: client/features/templates/templates.strings.js:95 -msgid "Unable to schedule job." -msgstr "Kon taak niet inplannen." - -#: client/src/instance-groups/instance-groups.strings.js:49 -msgid "Unavailable" -msgstr "Niet beschikbaar" - -#: client/src/instance-groups/instance-groups.strings.js:48 -msgid "Unavailable to run jobs." -msgstr "Kan geen taken uitvoeren." - -#: client/lib/components/components.strings.js:27 -msgid "Unexpected Error" -msgstr "Onverwachte fout" - -#: client/lib/components/components.strings.js:26 -msgid "Unexpected server error. View the console for more information" -msgstr "Onverwachte serverfout. Bekijk de console voor meer informatie" - -#: client/src/license/license.partial.html:59 -msgid "Unlimited" -msgstr "Onbeperkt" - -#: client/lib/components/components.strings.js:39 -msgid "Unsupported display model type" -msgstr "Soort weergavemodel niet ondersteund" - -#: client/lib/components/components.strings.js:31 -msgid "Unsupported input type" -msgstr "Soort input niet ondersteund" - -#: client/features/projects/projects.strings.js:33 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Update Not Found" -msgstr "Update niet gevonden" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:344 -msgid "Update Options" -msgstr "Update-opties" - -#: client/src/projects/projects.form.js:197 -msgid "Update Revision on Launch" -msgstr "Herziening updaten bij opstarten" - -#: client/features/projects/projects.strings.js:44 -#: client/src/projects/factories/get-project-tool-tip.factory.js:30 -msgid "Update canceled. Click for details" -msgstr "Update geannuleerd. Klik voor meer informatie" - -#: client/features/projects/projects.strings.js:42 -#: client/src/projects/factories/get-project-tool-tip.factory.js:24 -msgid "Update failed. Click for details" -msgstr "Update mislukt. Klik voor meer informatie" - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "Update in Progress" -msgstr "Update in uitvoering" - -#: client/features/projects/projects.strings.js:43 -#: client/src/projects/factories/get-project-tool-tip.factory.js:27 -msgid "Update missing. Click for details" -msgstr "Update ontbreekt. Klik voor meer informatie" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:372 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:377 -msgid "Update on Launch" -msgstr "Update bij opstarten" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:383 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:389 -msgid "Update on Project Update" -msgstr "Update voor projectupdate" - -#: client/features/projects/projects.strings.js:39 -#: client/src/projects/factories/get-project-tool-tip.factory.js:14 -msgid "Update queued. Click for details" -msgstr "Update in de wachtrij gezet. Klik voor meer informatie" - -#: client/features/projects/projects.strings.js:40 -#: client/src/projects/factories/get-project-tool-tip.factory.js:18 -msgid "Update running. Click for details" -msgstr "Update in uitvoering. Klik voor meer informatie" - -#: client/src/configuration/settings.partial.html:6 -msgid "Update settings pertaining to Jobs within Tower" -msgstr "Werk de instellingen bij die betrekking hebben tot taken binnen Tower" - -#: client/features/projects/projects.strings.js:41 -#: client/src/projects/factories/get-project-tool-tip.factory.js:21 -msgid "Update succeeded. Click for details" -msgstr "Update gelukt. Klik voor meer informatie" - -#: client/src/license/license.partial.html:75 -msgid "Upgrade" -msgstr "Upgrade" - -#: client/src/license/license.partial.html:111 -msgid "Upload a license file" -msgstr "Een licentiebestand uploaden" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:62 -#: client/src/organizations/organizations.form.js:48 -#: client/src/projects/projects.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:257 -msgid "Use Default Environment" -msgstr "Standaardomgeving gebruiken" - -#: client/src/notifications/add/add.controller.js:98 -#: client/src/notifications/edit/edit.controller.js:139 -msgid "Use SSL" -msgstr "SSL gebruiken" - -#: client/src/notifications/add/add.controller.js:97 -#: client/src/notifications/edit/edit.controller.js:138 -msgid "Use TLS" -msgstr "TLS gebruiken" - -#: client/src/notifications/notificationTemplates.form.js:586 -msgid "Use custom messages to change the content of notifications sent when a job starts, succeeds, or fails. Use curly braces to access information about the job: {{ job_friendly_name }}, {{ url }}, or attributes of the job such as {{ job.status }}. You may apply a number of possible variables in the message. Refer to the Ansible Tower documentation for more details." -msgstr "Gebruik aangepaste berichten om de inhoud van meldingen te wijzigen die worden verzonden wanneer een taak begint, slaagt of mislukt. Gebruik accolades om toegang te krijgen tot informatie over de taak: {{ job_friendly_name }}, {{ url }}, of attributen van de taak zoals {{ job.status }}. U kunt een aantal mogelijke variabelen in het bericht toepassen. Raadpleeg de Ansible Tower documentatie voor meer details." - -#: client/src/instance-groups/instance-groups.strings.js:24 -#: client/src/instance-groups/instance-groups.strings.js:50 -msgid "Used Capacity" -msgstr "Gebruikte capaciteit" - -#: client/src/credentials/credentials.form.js:76 -msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." -msgstr "Wordt gebruikt om draaiboekopslagplaatsen te bekijken en te synchroniseren met een broncontrole-beheersysteem op afstand, zoals Git, Subversion (svn) of Mercurial (hg). Deze toegangsgegevens worden gebruikt door projecten." - -#: client/features/credentials/legacy.credentials.js:80 -#: client/src/credentials/credentials.form.js:456 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:125 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:122 -#: client/src/organizations/organizations.form.js:119 -#: client/src/organizations/organizations.form.js:160 -#: client/src/projects/projects.form.js:296 -#: client/src/teams/teams.form.js:96 -#: client/src/templates/workflows.form.js:306 -msgid "User" -msgstr "Gebruiker" - -#: client/lib/components/components.strings.js:97 -#: client/src/configuration/settings.partial.html:11 -msgid "User Interface" -msgstr "Gebruikersinterface" - -#: client/src/users/users.form.js:96 -msgid "User Type" -msgstr "Soort gebruiker" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 -#: client/src/credentials/factories/become-method-change.factory.js:17 -#: client/src/credentials/factories/become-method-change.factory.js:38 -#: client/src/credentials/factories/kind-change.factory.js:16 -#: client/src/credentials/factories/kind-change.factory.js:40 -#: client/src/credentials/factories/kind-change.factory.js:73 -#: client/src/credentials/factories/kind-change.factory.js:94 -#: client/src/notifications/notificationTemplates.form.js:453 -#: client/src/notifications/notificationTemplates.form.js:492 -#: client/src/notifications/notificationTemplates.form.js:64 -#: client/src/users/users.form.js:59 -#: client/src/users/users.list.js:29 -msgid "Username" -msgstr "Gebruikersnaam" - -#: client/lib/services/base-string.service.js:138 -msgid "Username (Ascending)" -msgstr "Gebruikersnaam (Oplopend)" - -#: client/lib/services/base-string.service.js:139 -msgid "Username (Descending)" -msgstr "Gebruikersnaam (Aflopend)" - -#: client/src/credentials/credentials.form.js:80 -msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for smart inventory sources and for cloud provisioning and deployment in playbook runs." -msgstr "Gebruikersnamen, wachtwoorden en toegangssleutels voor authenticatie bij de gespecificeerde cloud- of infrastructuurprovider. Deze worden gebruikt voor smart-inventarisbronnen, voor cloudvoorziening en om in te zetten bij uitvoeringen van het draaiboek." - -#: client/lib/components/components.strings.js:80 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:38 -#: client/src/organizations/organizations.form.js:101 -#: client/src/teams/teams.form.js:78 -msgid "Users" -msgstr "Gebruikers" - -#: client/src/scheduler/schedulerList.controller.js:46 -msgid "Using a credential that requires a password on launch is prohibited when creating a Job Template schedule" -msgstr "Het is niet toegestaan toegangsgegevens die een wachtwoord nodig hebben bij het opstarten te gebruiken bij het aanmaken van een taaksjabloonschema" - -#: client/lib/components/code-mirror/code-mirror.strings.js:11 -msgid "VARIABLES" -msgstr "VARIABELEN" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:7 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:7 -msgid "VIEW ALL" -msgstr "ALLE WEERGEVEN" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:90 -msgid "VIEW DATA IN INSIGHTS" -msgstr "GEGEVENS BEKIJKEN IN INSIGHTS" - -#: client/lib/components/components.strings.js:59 -msgid "VIEW LESS" -msgstr "MINDER WEERGEVEN" - -#: client/features/templates/templates.strings.js:143 -msgid "VIEW LINK" -msgstr "LINK BEKIJKEN" - -#: client/lib/components/components.strings.js:58 -msgid "VIEW MORE" -msgstr "MEER WEERGEVEN" - -#: client/src/shared/paginate/paginate.partial.html:48 -msgid "VIEW PER PAGE" -msgstr "WEERGEVEN PER PAGINA" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:249 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:261 -msgid "VPC ID:" -msgstr "VPC-ID:" - -#: client/src/license/license.partial.html:10 -msgid "Valid License" -msgstr "Geldige licentie" - -#: client/src/inventories-hosts/hosts/host.form.js:67 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:46 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:47 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:68 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:63 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:70 -msgid "Variables" -msgstr "Variabelen" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:25 -#: client/src/templates/prompt/steps/credential/prompt-credential.directive.js:37 -msgid "Vault ID" -msgstr "Kluis-id" - -#: client/features/templates/templates.strings.js:48 -#: client/src/credentials/credentials.form.js:390 -msgid "Vault Password" -msgstr "Wachtwoord kluis" - -#: client/features/output/output.strings.js:97 -#: client/features/templates/templates.strings.js:60 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:82 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:91 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:330 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:337 -#: client/src/templates/job_templates/job-template.form.js:189 -#: client/src/templates/job_templates/job-template.form.js:196 -msgid "Verbosity" -msgstr "Verbositeit" - -#: client/src/license/license.partial.html:15 -msgid "Version" -msgstr "Versie" - -#: client/src/activity-stream/streams.list.js:63 -#: client/src/credential-types/credential-types.list.js:64 -#: client/src/credentials/credentials.list.js:82 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:64 -#: client/src/inventories-hosts/inventories/inventory.list.js:118 -#: client/src/inventory-scripts/inventory-scripts.list.js:70 -#: client/src/notifications/notificationTemplates.list.js:96 -#: client/src/scheduler/schedules.list.js:101 -#: client/src/teams/teams.list.js:64 -#: client/src/templates/templates.list.js:101 -#: client/src/users/users.list.js:70 -msgid "View" -msgstr "weergeven" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "View Activity Stream" -msgstr "Activiteitenlogboek weergeven" - -#: client/lib/components/components.strings.js:68 -msgid "View Documentation" -msgstr "Documentatie weergeven" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:52 -msgid "View Insights" -msgstr "Insights weergeven" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:102 -#: client/src/inventories-hosts/inventory-hosts.strings.js:27 -msgid "View Insights Data" -msgstr "Insights-gegevens weergeven" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:201 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:225 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:249 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:324 -msgid "View JSON examples at" -msgstr "Bekijk JSON-voorbeelden op" - -#: client/src/inventories-hosts/hosts/host.form.js:77 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:76 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:84 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:73 -msgid "View JSON examples at %s" -msgstr "Bekijk JSON-voorbeelden op %s" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:13 -msgid "View Less" -msgstr "Minder weergeven" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:11 -msgid "View More" -msgstr "Meer weergeven" - -#: client/src/organizations/list/organizations-list.partial.html:64 -msgid "View Organization" -msgstr "Organisatie weergeven" - -#: client/features/output/output.strings.js:28 -#: client/features/output/output.strings.js:32 -msgid "View Project checkout results" -msgstr "Resultaten project-checkout weergeven" - -#: client/src/shared/form-generator.js:1672 -#: client/src/templates/job_templates/job-template.form.js:588 -#: client/src/templates/workflows.form.js:343 -msgid "View Survey" -msgstr "Vragenlijst weergeven" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:202 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:226 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:250 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:325 -msgid "View YAML examples at" -msgstr "Bekijk YAML-voorbeelden op" - -#: client/src/inventories-hosts/hosts/host.form.js:78 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:77 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:88 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:74 -msgid "View YAML examples at %s" -msgstr "Bekijk YAML-voorbeelden op %s" - -#: client/src/configuration/settings.partial.html:15 -msgid "View and edit your license information" -msgstr "Uw licentie-informatie weergeven en bewerken" - -#: client/src/credentials/credentials.list.js:84 -msgid "View credential" -msgstr "Toegangsgegevens weergeven" - -#: client/src/credential-types/credential-types.list.js:66 -msgid "View credential type" -msgstr "Soort toegangsgegevens weergeven" - -#: client/lib/components/layout/layout.partial.html:29 -msgid "View documentation" -msgstr "Documentatie weergeven" - -#: client/src/activity-stream/streams.list.js:67 -msgid "View event details" -msgstr "Evenementinformatie weergeven" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:92 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:96 -msgid "View group" -msgstr "Groep weergeven" - -#: client/src/inventories-hosts/hosts/host.list.js:95 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:96 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:109 -#: client/src/inventories-hosts/inventory-hosts.strings.js:26 -msgid "View host" -msgstr "Host weergeven" - -#: client/src/inventories-hosts/inventories/inventory.list.js:120 -msgid "View inventory" -msgstr "Inventaris weergeven" - -#: client/src/inventory-scripts/inventory-scripts.list.js:72 -msgid "View inventory script" -msgstr "Inventarisscript weergeven" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:83 -msgid "View job" -msgstr "Taak weergeven" - -#: client/src/notifications/notificationTemplates.list.js:98 -msgid "View notification" -msgstr "Bericht weergeven" - -#: client/src/scheduler/schedules.list.js:103 -msgid "View schedule" -msgstr "Schema weergeven" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:114 -msgid "View source" -msgstr "Bron weergeven" - -#: client/src/teams/teams.list.js:67 -msgid "View team" -msgstr "Team weergeven" - -#: client/src/templates/templates.list.js:103 -msgid "View template" -msgstr "Sjabloon weergeven" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "View the" -msgstr "Bekijk de" - -#: client/features/output/output.strings.js:22 -#: client/lib/components/components.strings.js:63 -msgid "View the Credential" -msgstr "De toegangsgegevens weergeven" - -#: client/features/output/output.strings.js:26 -msgid "View the Inventory" -msgstr "Het inventaris weergeven" - -#: client/features/output/output.strings.js:29 -msgid "View the Job Template" -msgstr "Het taaksjabloon weergeven" - -#: client/features/output/output.strings.js:27 -#: client/features/output/output.strings.js:31 -msgid "View the Project" -msgstr "Het project weergeven" - -#: client/features/output/output.strings.js:33 -msgid "View the Schedule" -msgstr "Het schema weergeven" - -#: client/features/output/output.strings.js:35 -msgid "View the User" -msgstr "De gebruiker weergeven" - -#: client/src/projects/projects.list.js:115 -msgid "View the project" -msgstr "Het project weergeven" - -#: client/src/scheduler/scheduled-jobs.list.js:79 -msgid "View the schedule" -msgstr "Het schema weergeven" - -#: client/features/output/output.strings.js:34 -#: client/src/workflow-results/workflow-results.controller.js:63 -msgid "View the source Workflow Job" -msgstr "De bron-workflowtaak weergeven" - -#: client/features/output/output.strings.js:41 -msgid "View the webhook configuration on the job template." -msgstr "Bekijk de webhook-configuratie op het taaksjabloon." - -#: client/features/output/output.strings.js:42 -#: client/src/workflow-results/workflow-results.controller.js:65 -msgid "View the webhook configuration on the workflow job template." -msgstr "Bekijk de webhook-configuratie op het workflowtaaksjabloon." - -#: client/src/users/users.list.js:73 -msgid "View user" -msgstr "Gebruiker weergeven" - -#: client/lib/components/components.strings.js:91 -msgid "Views" -msgstr "Weergaven" - -#: client/features/templates/templates.strings.js:148 -msgid "WARNING: UNSAVED CHANGES" -msgstr "WAARSCHUWING: ONOPGESLAGEN WIJZIGINGEN" - -#: client/src/templates/workflows.form.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js:47 -msgid "WORKFLOW" -msgstr "WORKFLOW" - -#: client/features/templates/templates.strings.js:136 -msgid "WORKFLOW VISUALIZER" -msgstr "WORKFLOWWEERGAVE" - -#: client/features/templates/templates.strings.js:115 -msgid "Wait For Approval" -msgstr "Wacht op goedkeuring" - -#: client/features/templates/templates.strings.js:121 -#: client/src/scheduler/scheduler.strings.js:58 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:369 -msgid "Warning" -msgstr "Waarschuwing" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:52 -#: client/src/configuration/forms/settings-form.controller.js:444 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:50 -msgid "Warning: Unsaved Changes" -msgstr "Waarschuwing: niet-opgeslagen wijzigingen" - -#: client/src/license/license.controller.js:159 -msgid "We were unable to locate licenses associated with this account" -msgstr "We waren niet in staat om de aan deze account gekoppelde licenties te lokaliseren" - -#: client/features/jobs/jobs.strings.js:17 -#: client/features/output/output.strings.js:53 -#: client/src/workflow-results/workflow-results.controller.js:88 -msgid "Webhook" -msgstr "Webhook" - -#: client/src/templates/job_templates/job-template.form.js:462 -#: client/src/templates/job_templates/job-template.form.js:473 -#: client/src/templates/workflows.form.js:235 -#: client/src/templates/workflows.form.js:246 -msgid "Webhook Credential" -msgstr "Webhook toegangsgegevens" - -#: client/src/templates/job_templates/job-template.form.js:430 -#: client/src/templates/job_templates/job-template.form.js:456 -#: client/src/templates/workflows.form.js:203 -#: client/src/templates/workflows.form.js:229 -msgid "Webhook Key" -msgstr "Webhooksleutel" - -#: client/src/templates/job_templates/job-template.form.js:405 -#: client/src/templates/job_templates/job-template.form.js:414 -#: client/src/templates/workflows.form.js:178 -#: client/src/templates/workflows.form.js:187 -msgid "Webhook Service" -msgstr "Webhookservice" - -#: client/src/templates/job_templates/job-template.form.js:419 -#: client/src/templates/job_templates/job-template.form.js:425 -#: client/src/templates/workflows.form.js:192 -#: client/src/templates/workflows.form.js:198 -msgid "Webhook URL" -msgstr "Webhook-URL" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:78 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:69 -msgid "Webhook services can launch jobs with this job template by making a POST request to this URL." -msgstr "Webhook-diensten kunnen banen met dit taaksjabloon lanceren door het indienen van een POST-verzoek naar deze URL." - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:47 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:79 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:70 -msgid "Webhook services can use this as a shared secret." -msgstr "Webhook-diensten kunnen dit gebruiken als een gedeeld geheim." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:434 -#: client/src/scheduler/scheduler.strings.js:39 -msgid "Wed" -msgstr "Woe" - -#: client/src/license/license.partial.html:82 -msgid "Welcome to Ansible Tower! Please complete the steps below to acquire a license." -msgstr "Welkom bij Ansible Tower! Volg de onderstaande stappen op om een licentie te verkrijgen." - -#: client/src/login/loginModal/loginModal.partial.html:23 -msgid "Welcome to Ansible {{BRAND_NAME}}!  Please sign in." -msgstr "Welkom bij Ansible {{BRAND_NAME}}! Meld u eerst aan." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:365 -msgid "When not checked, a merge will be performed, combining local variables with those found on the external source." -msgstr "Als dit vakje niet aangevinkt is, worden lokale variabelen samengevoegd met de variabelen die aangetroffen zijn in de externe bron." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:354 -msgid "When not checked, local child hosts and groups not found on the external source will remain untouched by the inventory update process." -msgstr "Als dit vakje niet aangevinkt is, worden lokale onderliggende hosts en groepen die niet aangetroffen zijn in de externe bron niet behandeld in het synchronisatieproces van de inventaris." - -#: client/features/output/output.strings.js:25 -msgid "When this field is true, the job's inventory belongs to an organization that has exceeded it's limit of hosts as defined by the system administrator." -msgstr "Als dit veld True is, hoort de inventaris van de taak bij een organisatie die de limiet van hosts heeft overschreden zoals bepaald door de systeembeheerder." - -#: client/src/projects/projects.form.js:50 -msgid "When this project is used by a Job Template, Organization cannot be changed." -msgstr "Wanneer dit project wordt gebruikt door een taaksjabloon, kan organisatie niet worden gewijzigd." - -#: client/features/templates/templates.strings.js:119 -#: client/src/workflow-results/workflow-results.controller.js:100 -msgid "Workflow" -msgstr "Workflow" - -#: client/src/notifications/notificationTemplates.form.js:666 -msgid "Workflow Approved Message" -msgstr "Workflow Goedgekeurd bericht" - -#: client/src/notifications/notificationTemplates.form.js:677 -msgid "Workflow Approved Message Body" -msgstr "Workflow Goedgekeurde berichtbody" - -#: client/src/notifications/notificationTemplates.form.js:689 -msgid "Workflow Denied Message" -msgstr "Workflow Geweigerd bericht" - -#: client/src/notifications/notificationTemplates.form.js:700 -msgid "Workflow Denied Message Body" -msgstr "Workflow Geweigerde berichtenbody" - -#: client/features/jobs/jobs.strings.js:11 -msgid "Workflow Job" -msgstr "Workflowtaak" - -#: client/lib/models/models.strings.js:49 -msgid "Workflow Job Template Nodes" -msgstr "Sjabloonknooppunten workflowtaak" - -#: client/lib/models/models.strings.js:45 -msgid "Workflow Job Templates" -msgstr "Workflowtaaksjablonen" - -#: client/src/notifications/notificationTemplates.form.js:712 -msgid "Workflow Pending Approval Message" -msgstr "Workflow in afwachting van goedkeuring bericht" - -#: client/src/notifications/notificationTemplates.form.js:723 -msgid "Workflow Pending Approval Message Body" -msgstr "Workflow in afwachting van goedkeuring bericht" - -#: client/features/templates/templates.strings.js:14 -#: client/lib/components/components.strings.js:132 -#: client/src/templates/templates.list.js:66 -msgid "Workflow Template" -msgstr "Workflowsjabloon" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:41 -msgid "Workflow Templates" -msgstr "Workflowsjablonen" - -#: client/src/notifications/notificationTemplates.form.js:735 -msgid "Workflow Timed Out Message" -msgstr "Workflow Verlopen bericht" - -#: client/src/notifications/notificationTemplates.form.js:746 -msgid "Workflow Timed Out Message Body" -msgstr "Workflow Verlopen berichtbody" - -#: client/src/shared/form-generator.js:1676 -#: client/src/templates/workflows.form.js:367 -msgid "Workflow Visualizer" -msgstr "Workflowweergave" - -#: client/features/users/tokens/tokens.strings.js:31 -msgid "Write" -msgstr "Schrijven" - -#: client/lib/components/code-mirror/code-mirror.strings.js:13 -#: client/lib/services/base-string.service.js:72 -msgid "YAML" -msgstr "YAML" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:199 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:223 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:247 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:322 -msgid "YAML:" -msgstr "YAML:" - -#: client/lib/services/base-string.service.js:76 -msgid "YES" -msgstr "JA" - -#: client/src/notifications/add/add.controller.js:88 -#: client/src/notifications/edit/edit.controller.js:151 -msgid "Yellow" -msgstr "Geel" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:57 -msgid "You can create a job template here." -msgstr "U kunt hier een taaksjabloon maken." - -#: client/features/templates/templates.strings.js:101 -msgid "You do not have access to all resources used by this workflow. Resources that you don't have access to will not be copied and will result in an incomplete workflow." -msgstr "U heeft geen toegang tot alle hulpbronnen die door deze workflow gebruikt worden. Als u geen toegang heeft tot een hulpbron, wordt deze niet gekopieerd en krijgt u een incomplete workflow." - -#: client/src/projects/factories/get-project-path.factory.js:56 -msgid "You do not have access to view this property" -msgstr "U heeft geen toestemming om dit eigendom weer te geven" - -#: client/src/templates/main.js:128 -msgid "You do not have permission to add a job template, or there are no projects available." -msgstr "U heeft geen toestemming om een taaksjabloon toe te voegen, of er zijn geen projecten beschikbaar." - -#: client/src/projects/add/projects-add.controller.js:35 -msgid "You do not have permission to add a project." -msgstr "U heeft geen machtiging om een project toe te voegen." - -#: client/src/users/add/users-add.controller.js:45 -msgid "You do not have permission to add a user." -msgstr "U heeft geen machtiging om een gebruiker toe te voegen." - -#: client/src/templates/main.js:367 -msgid "You do not have permission to add a workflow job template." -msgstr "U hebt geen toestemming om een sjabloon voor de werkstroom toe te voegen." - -#: client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js:190 -msgid "You do not have permission to manage this user" -msgstr "U bent niet gemachtigd deze gebruiker te beheren" - -#: client/features/templates/templates.strings.js:80 -msgid "You do not have permission to perform this action." -msgstr "U bent niet gemachtigd deze actie uit te voeren." - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "You do not have permission to view this job." -msgstr "U bent niet gemachtigd deze taak te bekijken." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:41 -msgid "You do not have sufficient permissions to edit the host filter." -msgstr "U hebt geen toestemming om het hostfilter te bewerken." - -#: client/src/login/loginModal/loginModal.partial.html:34 -msgid "You have been logged out. Please sign in." -msgstr "U bent afgemeld. Meld u opnieuw aan." - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:51 -#: client/src/configuration/forms/settings-form.controller.js:443 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:49 -msgid "You have unsaved changes. Would you like to proceed without saving?" -msgstr "U heeft niet-opgeslagen wijzigingen. Wilt u doorgaan zonder op te slaan?" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook." -msgstr "U dient een succesvolle update uit te voeren voordat u een draaiboek kunt selecteren. U kunt dit taaksjabloon niet opslaan zonder geldig draaiboek." - -#: client/features/projects/projects.strings.js:21 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "Your request to cancel the update was submitted to the task manager." -msgstr "Uw verzoek om de update te annuleren is ingediend bij de taakbeheerder." - -#: client/src/login/loginModal/loginModal.partial.html:28 -msgid "Your session timed out due to inactivity. Please sign in." -msgstr "Uw sessie is verlopen vanwege inactiviteit. Meld u opnieuw aan." - -#: client/index.template.ejs:32 -msgid "Your session will expire in 60 seconds, would you like to continue?" -msgstr "Uw sessie verloopt over 60 seconden. Wilt u doorgaan?" - -#: client/src/shared/form-generator.js:1169 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "and" -msgstr "en" - -#: client/src/activity-stream/factories/build-description.factory.js:133 -msgid "approved" -msgstr "goedgekeurd" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "button to view the latest status." -msgstr "knop om de nieuwste status te zien." - -#: client/features/users/tokens/tokens.strings.js:27 -msgid "by" -msgstr "door" - -#: client/features/jobs/jobs.strings.js:29 -msgid "canceled" -msgstr "geannuleerd" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "characters long." -msgstr "tekens lang." - -#: client/src/activity-stream/factories/build-description.factory.js:138 -msgid "denied" -msgstr "geweigerd" - -#: client/features/output/output.strings.js:104 -#: client/src/shared/smart-search/smart-search.partial.html:50 -msgid "documentation" -msgstr "documentatie" - -#: client/features/jobs/jobs.strings.js:28 -msgid "error" -msgstr "fout" - -#: client/features/jobs/jobs.strings.js:27 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -msgid "failed" -msgstr "mislukt" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:262 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:275 -msgid "for a complete list of supported filters." -msgstr "voor een volledige lijst van ondersteunde filters." - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "from the" -msgstr "van de" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -#: client/src/inventories-hosts/inventory-hosts.strings.js:8 -msgid "group" -msgid_plural "groups" -msgstr[0] "groep" -msgstr[1] "groepen" - -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:49 -msgid "groups with sync failures. Click for details" -msgstr "groepen met synchronisatiefouten. Klik voor meer informatie" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:9 -msgid "host" -msgid_plural "hosts" -msgstr[0] "host" -msgstr[1] "hosts" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:64 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:61 -msgid "hosts with failures. Click for details." -msgstr "hosts met mislukkingen. Klik voor meer informatie." - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:146 -msgid "min" -msgstr "min" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "missing" -msgstr "ontbreekt" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:21 -msgid "name" -msgstr "naam" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "never updated" -msgstr "nooit bijgewerkt" - -#: client/features/jobs/jobs.strings.js:22 -msgid "new" -msgstr "nieuw" - -#: client/src/shared/paginate/paginate.partial.html:34 -#: client/src/shared/paginate/paginate.partial.html:45 -msgid "of" -msgstr "van" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "of the filters match." -msgstr "van de filters komen overeen." - -#: client/src/scheduler/scheduler.strings.js:34 -msgid "on" -msgstr "op" - -#: client/src/scheduler/scheduler.strings.js:31 -msgid "on day" -msgstr "op dag" - -#: client/src/scheduler/scheduler.strings.js:35 -msgid "on days" -msgstr "op dagen" - -#: client/src/scheduler/scheduler.strings.js:33 -msgid "on the" -msgstr "op de" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:24 -msgid "organization" -msgstr "organisatie" - -#: client/features/jobs/jobs.strings.js:23 -msgid "pending" -msgstr "in afwachting" - -#: client/src/shared/form-generator.js:1044 -msgid "playbook" -msgstr "draaiboek" - -#: client/features/jobs/jobs.strings.js:25 -msgid "running" -msgstr "uitvoeren" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:150 -msgid "sec" -msgstr "sec" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "section" -msgstr "sectie" - -#: client/features/credentials/credentials.strings.js:35 -msgid "selected" -msgstr "geselecteerd" - -#: client/src/credentials/credentials.form.js:138 -#: client/src/credentials/credentials.form.js:363 -msgid "set in helpers/credentials" -msgstr "ingesteld in helpers/toegangsgegevens" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:47 -msgid "sources with sync failures. Click for details" -msgstr "bronnen met synchronisatiefouten. Klik voor meer informatie" - -#: client/features/jobs/jobs.strings.js:26 -msgid "successful" -msgstr "geslaagd" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "test" -msgstr "test" - -#: client/src/activity-stream/factories/build-description.factory.js:136 -msgid "timed out" -msgstr "time-out" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "to" -msgstr "om" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "to include all regions. Only Hosts associated with the selected regions will be updated." -msgstr "om alle regio's te omvatten. Alleen hosts die bij de gekozen regio's horen worden geüpdatet." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "to start it now." -msgstr "om nu te beginnen." - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "to update." -msgstr "om te updaten." - -#: client/src/activity-stream/factories/build-description.factory.js:141 -msgid "updated" -msgstr "bijgewerkt" - -#: client/src/credentials/credentials.form.js:380 -msgid "v2 URLs%s - leave blank" -msgstr "v2 URL's%s - leeg laten" - -#: client/src/credentials/credentials.form.js:381 -msgid "v3 default%s - set to 'default'" -msgstr "v3 standaard%s - instellen op 'standaard'" - -#: client/src/credentials/credentials.form.js:382 -msgid "v3 multi-domain%s - your domain name" -msgstr "v3 multi-domein%s - uw domeinnaam" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:318 -msgid "view azure_rm.ini in the Ansible community.general github repo." -msgstr "bekijk azure_rm.ini in de Ansible community.general github repo." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:219 -msgid "view ec2.ini in the community.aws repo." -msgstr "bekijk ec2.ini in de community.aws repo." - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:243 -msgid "view vmware_inventory.ini in the vmware community repo." -msgstr "bekijk vmware_inventory.ini in de vmware community repo." - -#: client/features/jobs/jobs.strings.js:24 -msgid "waiting" -msgstr "wachten" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "when" -msgstr "wanneer" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:240 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:252 -msgid "will create group names similar to the following examples based on the options selected:" -msgstr "zullen groepsnamen aangemaakt worden die vergelijkbaar zijn met de volgende voorbeelden op basis van de geselecteerde opties:" - -#: client/index.template.ejs:158 -msgid "working..." -msgstr "bezig..." - -#: client/features/users/tokens/tokens.strings.js:42 -msgid "{{ appName }} Token" -msgstr "{{ appName }}-token" - -#: client/lib/services/base-string.service.js:158 -msgid "{{ header }} {{ body }}" -msgstr "{{ header }} {{ body }}" - -#: client/lib/services/base-string.service.js:80 -msgid "{{ resource }} successfully created" -msgstr "{{resource}} aangemaakt" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:31 -msgid "{{ str1 }}

{{ str2 }}

" -msgstr "{{ str1 }}

{{ str2 }}

" - -#: client/lib/components/cards/card.partial.html:2 -msgid "{{ title }}" -msgstr "{{ title }}" - -#: client/src/instance-groups/container-groups/add-container-group.view.html:24 -msgid "{{ vm.form.extraVars.toggleLabel }}" -msgstr "{{ vm.form.extraVars.toggleLabel }}" - -#: client/src/configuration/forms/settings-form.partial.html:10 -#: client/src/configuration/forms/settings-form.route.js:15 -msgid "{{ vm.getCurrentFormTitle() }}" -msgstr "{{ vm.getCurrentFormTitle() }}" - -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:5 -msgid "{{:: vm.strings.get('prompt.JOB_TYPE') }}" -msgstr "{{:: vm.strings.get('prompt.JOB_TYPE') }}" - -#: client/lib/components/input/label.partial.html:5 -msgid "{{::state._hint}}" -msgstr "{{::state._hint}}" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:6 -#: client/src/configuration/forms/system-form/configuration-system.partial.html:5 -msgid "{{opt.label}}" -msgstr "{{opt.label}}" - -#: client/src/shared/paginate/paginate.partial.html:56 -msgid "{{pageSize}}" -msgstr "{{pageSize}}" - diff --git a/awx/ui/po/zh.po b/awx/ui/po/zh.po deleted file mode 100644 index 957b5132f1..0000000000 --- a/awx/ui/po/zh.po +++ /dev/null @@ -1,8189 +0,0 @@ -msgid "" -msgstr "" -"Language: zh \n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" - -#: client/src/projects/add/projects-add.controller.js:166 -#: client/src/projects/edit/projects-edit.controller.js:287 -msgid "%sNote:%s Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." -msgstr "%sNote:%s Mercurial 不支持 SSH 的密码验证。不要在 URL 中加入用户名和密钥。如果使用 Bitbucket 和 SSH,请不要提供您的 Bitbucket 用户名。" - -#: client/src/projects/add/projects-add.controller.js:145 -#: client/src/projects/edit/projects-edit.controller.js:266 -msgid "%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." -msgstr "%sNote:%s 在将 SSH 协议用于 GitHub 或 Bitbucket 时,只需输入 SSH 密钥,而不要输入用户名(除 git 外)。另外,GitHub 和 Bitbucket 在使用 SSH 时不支持密码验证。GIT 只读协议 (git://) 不使用用户名或密码信息。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:62 -msgid "(HH24:MM:SS UTC)" -msgstr "(HH24:MM:SS UTC)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:57 -msgid "(HH24:MM:SS)" -msgstr "(HH24:MM:SS)" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:568 -msgid "(Limited to first 10)" -msgstr "(限制为前 10)" - -#: client/src/credentials/credentials.form.js:286 -msgid "(defaults to %s)" -msgstr "(默认为 %s)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -msgid "(seconds)" -msgstr "(秒)" - -#: client/src/shared/paginate/paginate.partial.html:67 -msgid "100" -msgstr "100" - -#: client/src/shared/paginate/paginate.partial.html:61 -msgid "20" -msgstr "20" - -#: client/src/shared/paginate/paginate.partial.html:64 -msgid "50" -msgstr "50" - -#: client/src/license/license.partial.html:193 -msgid "Automation analytics: This data is used to enhance future releases of the Tower Software and to provide Automation Analytics to Tower subscribers." -msgstr "自动化分析:这些数据用于增强将来的 Tower 软件发行版本,并为 Tower 订阅者提供 自动化分析。" - -#: client/src/license/license.partial.html:171 -msgid "I agree to the End User License Agreement" -msgstr "我同意最终用户许可证协议" - -#: client/src/license/license.partial.html:187 -msgid "User analytics: This data is used to enhance future releases of the Tower Software and help streamline customer experience and success." -msgstr "用户分析:这些数据用于增强未来的 Tower 软件发行版本,并帮助简化客户体验和成功。" - -#: client/src/login/loginModal/loginModal.partial.html:32 -msgid "" -"\n" -"
\n" -" You have been logged out. Please sign in.\n" -"
" -msgstr "\n" -"
\n" -" You have been logged out. Please sign in.\n" -"
" - -#: client/lib/components/code-mirror/code-mirror.strings.js:19 -msgid "" -"

\n" -" Enter inventory variables using either JSON or YAML\n" -" syntax. Use the radio button to toggle between the two.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" View YAML examples at\n" -" \n" -" docs.ansible.com\n" -"

" -msgstr "

\n" -" Enter inventory variables using either JSON or YAML\n" -" syntax. Use the radio button to toggle between the two.\n" -"

\n" -" JSON:\n" -"
\n" -"
\n" -" {\n" -"
\"somevar\": \"somevalue\",\n" -"
\"password\": \"magic\"\n" -"
\n" -" }\n" -"
\n" -" YAML:\n" -"
\n" -"
\n" -" ---\n" -"
somevar: somevalue\n" -"
password: magic\n" -"
\n" -"
\n" -"

\n" -" View JSON examples at\n" -" www.json.org\n" -"

\n" -"

\n" -" View YAML examples at\n" -" \n" -" docs.ansible.com\n" -"

" - -#: client/features/templates/templates.strings.js:65 -msgid "

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" -msgstr "

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
{
"somevar": "somevalue",
"password": "magic"
}
YAML:
---
somevar: somevalue
password: magic
" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:213 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:222 -msgid "A NEW WEBHOOK KEY WILL BE GENERATED ON SAVE" -msgstr "在保存时会生成一个新的 WEBHOOK 密钥" - -#: client/src/projects/projects.form.js:138 -msgid "A refspec to fetch (passed to the Ansible git module). This parameter allows access to references via the branch field not otherwise available." -msgstr "要获取的 refspec(传递至 Ansible git 模块)。此参数允许通过分支字段访问原本不可用的引用。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 -#: client/src/scheduler/scheduler.strings.js:22 -msgid "A schedule name is required." -msgstr "需要一个计划名称。" - -#: client/src/users/add/users-add.controller.js:104 -msgid "A value is required" -msgstr "需要一个值" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:173 -msgid "A value is required." -msgstr "需要一个值。" - -#: client/src/about/about.route.js:10 -msgid "ABOUT" -msgstr "关于" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:18 -msgid "ACTION" -msgstr "操作" - -#: client/src/activity-stream/activity-detail.form.js:23 -msgid "ACTIVITY DETAIL" -msgstr "活动详情" - -#: client/src/activity-stream/activitystream.route.js:28 -#: client/src/activity-stream/streams.list.js:14 -#: client/src/activity-stream/streams.list.js:15 -msgid "ACTIVITY STREAM" -msgstr "活动流" - -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:7 -msgid "ADD" -msgstr "添加" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:3 -msgid "ADD A NEW TEMPLATE" -msgstr "添加新模板" - -#: client/features/templates/templates.strings.js:123 -msgid "ADD A NODE" -msgstr "添加节点" - -#: client/features/templates/templates.strings.js:141 -msgid "ADD LINK" -msgstr "添加链接" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:16 -msgid "ADD SURVEY PROMPT" -msgstr "添加问卷调查提示" - -#: client/src/shared/smart-search/smart-search.partial.html:48 -msgid "ADDITIONAL INFORMATION" -msgstr "附加信息" - -#: client/features/output/output.strings.js:101 -msgid "ADDITIONAL_INFORMATION" -msgstr "ADDITIONAL_INFORMATION" - -#: client/src/organizations/linkout/organizations-linkout.route.js:241 -#: client/src/organizations/list/organizations-list.controller.js:90 -msgid "ADMINS" -msgstr "管理员" - -#: client/src/activity-stream/get-target-title.factory.js:4 -msgid "ALL ACTIVITY" -msgstr "所有活动" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:44 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.route.js:47 -msgid "ALL GROUPS" -msgstr "所有组" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "ANY" -msgstr "任何" - -#: client/src/credentials/credentials.form.js:198 -msgid "API Key" -msgstr "API 密钥" - -#: client/src/notifications/notificationTemplates.form.js:263 -msgid "API Service/Integration Key" -msgstr "API 服务/集成密钥" - -#: client/src/notifications/shared/type-change.service.js:66 -msgid "API Token" -msgstr "API 令牌" - -#: client/src/notifications/notificationTemplates.form.js:348 -msgid "API URL" -msgstr "API URL" - -#: client/features/users/tokens/tokens.strings.js:40 -msgid "APPLICATION" -msgstr "应用" - -#: client/features/applications/applications.strings.js:23 -msgid "APPLICATION INFORMATION" -msgstr "应用信息" - -#: client/features/applications/applications.strings.js:28 -#: client/features/applications/applications.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:47 -msgid "APPLICATIONS" -msgstr "应用" - -#: client/lib/components/components.strings.js:126 -msgid "APPROVAL" -msgstr "批准" - -#: client/features/templates/templates.strings.js:155 -msgid "APPROVAL TIMED OUT" -msgstr "批准超时" - -#: client/lib/components/components.strings.js:128 -msgid "APPROVE" -msgstr "批准" - -#: client/features/templates/templates.strings.js:157 -msgid "APPROVED" -msgstr "已批准" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.route.js:19 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.route.js:19 -msgid "ASSOCIATED GROUPS" -msgstr "关联的组" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.route.js:19 -msgid "ASSOCIATED HOSTS" -msgstr "关联的主机" - -#: client/lib/components/components.strings.js:89 -#: client/lib/components/layout/layout.partial.html:24 -msgid "About" -msgstr "关于" - -#: client/lib/components/components.strings.js:93 -msgid "Access" -msgstr "访问" - -#: client/src/credentials/credentials.form.js:91 -msgid "Access Key" -msgstr "访问密钥" - -#: client/src/configuration/settings.service.js:40 -msgid "Access Token Expiration" -msgstr "访问令牌过期" - -#: client/src/notifications/notificationTemplates.form.js:241 -msgid "Account SID" -msgstr "帐户 SID" - -#: client/src/notifications/notificationTemplates.form.js:200 -msgid "Account Token" -msgstr "帐户令牌" - -#: client/src/activity-stream/activity-detail.form.js:36 -msgid "Action" -msgstr "操作" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:21 -#: client/src/inventories-hosts/hosts/hosts.partial.html:49 -#: client/src/shared/form-generator.js:1872 -#: client/src/shared/list-generator/list-generator.factory.js:571 -msgid "Actions" -msgstr "操作" - -#: client/features/templates/templates.strings.js:18 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:18 -#: client/src/templates/templates.list.js:36 -msgid "Activity" -msgstr "活动" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:84 -msgid "Activity Stream" -msgstr "活动流" - -#: client/features/credentials/legacy.credentials.js:70 -#: client/src/credentials/credentials.form.js:446 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:113 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:110 -#: client/src/organizations/organizations.form.js:108 -#: client/src/organizations/organizations.form.js:150 -#: client/src/projects/projects.form.js:285 -#: client/src/teams/teams.form.js:169 -#: client/src/teams/teams.form.js:85 -#: client/src/templates/workflows.form.js:295 -#: client/src/users/users.form.js:221 -msgid "Add" -msgstr "添加" - -#: client/src/instance-groups/instance-groups.strings.js:74 -msgid "Add Container Group" -msgstr "添加容器组" - -#: client/src/instance-groups/instance-groups.strings.js:75 -msgid "Add Credential" -msgstr "添加凭证" - -#: client/src/credentials/credentials.list.js:14 -msgid "Add Credentials" -msgstr "添加凭证" - -#: client/src/inventories-hosts/inventories/inventory.list.js:13 -msgid "Add Inventories" -msgstr "添加清单" - -#: client/src/shared/stateDefinitions.factory.js:304 -msgid "Add Permissions" -msgstr "添加权限" - -#: client/src/projects/projects.list.js:13 -msgid "Add Project" -msgstr "添加项目" - -#: client/src/shared/form-generator.js:1664 -#: client/src/templates/job_templates/job-template.form.js:596 -#: client/src/templates/workflows.form.js:351 -msgid "Add Survey" -msgstr "添加问卷调查" - -#: client/src/teams/teams.list.js:13 -msgid "Add Team" -msgstr "添加团队" - -#: client/src/teams/teams.form.js:86 -msgid "Add User" -msgstr "添加用户" - -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/shared/stateDefinitions.factory.js:594 -#: client/src/users/users.list.js:17 -msgid "Add Users" -msgstr "添加用户" - -#: client/src/organizations/organizations.form.js:109 -msgid "Add Users to this organization." -msgstr "将用户添加到此机构。" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:58 -msgid "Add a group" -msgstr "添加组" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:135 -msgid "Add a host" -msgstr "添加主机" - -#: client/src/instance-groups/instance-groups.strings.js:44 -msgid "Add a new instance" -msgstr "添加新实例" - -#: client/src/instance-groups/instance-groups.strings.js:25 -msgid "Add a new instance group" -msgstr "添加新实例组" - -#: client/src/organizations/list/organizations-list.partial.html:20 -msgid "Add a new organization" -msgstr "添加新机构" - -#: client/features/projects/projects.strings.js:14 -msgid "Add a new project" -msgstr "添加新项目" - -#: client/src/scheduler/schedules.list.js:81 -msgid "Add a new schedule" -msgstr "添加新计划" - -#: client/features/templates/templates.strings.js:24 -msgid "Add a new template" -msgstr "添加新模板" - -#: client/features/users/tokens/tokens.strings.js:43 -msgid "Add a new token" -msgstr "添加新令牌" - -#: client/features/credentials/legacy.credentials.js:71 -#: client/src/credentials/credentials.form.js:447 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:115 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:112 -#: client/src/organizations/organizations.form.js:151 -#: client/src/projects/projects.form.js:286 -#: client/src/templates/job_templates/job-template.form.js:541 -#: client/src/templates/workflows.form.js:296 -msgid "Add a permission" -msgstr "添加权限" - -#: client/src/organizations/linkout/organizations-linkout.route.js:63 -msgid "Add existing user to organization" -msgstr "将现有用户添加到机构" - -#: client/src/organizations/linkout/organizations-linkout.route.js:256 -msgid "Add existing user to organization as administrator" -msgstr "将现有用户作为管理员添加到机构" - -#: client/src/shared/form-generator.js:1394 -msgid "Admin" -msgstr "管理员" - -#: client/lib/components/components.strings.js:94 -msgid "Administration" -msgstr "管理" - -#: client/src/organizations/linkout/organizations-linkout.route.js:262 -msgid "Admins" -msgstr "管理员" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:386 -msgid "After every project update where the SCM revision changes, refresh the inventory from the selected source before executing job tasks. This is intended for static content, like the Ansible inventory .ini file format." -msgstr "因 SCM 修订版本变更进行每次项目更新后,请在执行作业任务前从所选源刷新清单。这是面向静态内容,如 Ansible 清单 .ini 文件格式。" - -#: client/features/templates/templates.strings.js:160 -#: client/lib/components/components.strings.js:105 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:41 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:49 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:72 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:80 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "All" -msgstr "所有" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 -msgid "All Activity" -msgstr "所有活动" - -#: client/features/portalMode/index.view.html:33 -msgid "All Jobs" -msgstr "所有作业" - -#: client/src/projects/projects.form.js:208 -#: client/src/projects/projects.form.js:211 -msgid "Allow branch override" -msgstr "允许分支覆写" - -#: client/src/projects/projects.form.js:210 -msgid "Allow changing the SCM branch or revision in a job template that uses this project." -msgstr "允许在使用此项目的作业模板中更改 SCM 分支或修订版本。" - -#: client/features/templates/templates.strings.js:114 -#: client/src/workflow-results/workflow-results.controller.js:97 -msgid "Always" -msgstr "始终" - -#: client/features/projects/projects.strings.js:25 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "An SCM update does not appear to be running for project:" -msgstr "似乎没有为项目运行某个 SCM 更新:" - -#: client/lib/services/base-string.service.js:83 -msgid "Ansible AWX Logo" -msgstr "Ansible AWX Logo" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:66 -#: client/src/organizations/organizations.form.js:47 -#: client/src/organizations/organizations.form.js:52 -#: client/src/projects/projects.form.js:238 -#: client/src/projects/projects.form.js:243 -#: client/src/templates/job_templates/job-template.form.js:255 -#: client/src/templates/job_templates/job-template.form.js:261 -msgid "Ansible Environment" -msgstr "Ansible 环境" - -#: client/src/projects/projects.form.js:145 -msgid "Ansible Tower Documentation" -msgstr "Ansible Tower 文档" - -#: client/lib/services/base-string.service.js:84 -msgid "Ansible Tower Logo" -msgstr "Ansible Tower Logo" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:62 -#: client/src/templates/survey-maker/shared/question-definition.form.js:68 -msgid "Answer Type" -msgstr "回答类型" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:44 -#: client/src/templates/survey-maker/shared/question-definition.form.js:53 -msgid "Answer Variable Name" -msgstr "回答变量名称" - -#: client/features/templates/templates.strings.js:161 -msgid "Any" -msgstr "任何" - -#: client/features/users/tokens/users-tokens-add.controller.js:15 -msgid "Application" -msgstr "应用" - -#: client/lib/components/components.strings.js:87 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 -msgid "Applications" -msgstr "应用" - -#: client/features/templates/templates.strings.js:153 -#: client/src/notifications/notifications.list.js:40 -msgid "Approval" -msgstr "批准" - -#: client/src/workflow-results/workflow-results.service.js:87 -msgid "Are you sure you want to cancel this workflow job?" -msgstr "您确定要取消此工作流作业吗?" - -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:110 -msgid "Are you sure you want to delete this job?" -msgstr "您确定要删除此作业吗?" - -#: client/src/notifications/notification-templates-list/list.controller.js:233 -msgid "Are you sure you want to delete this notification template?" -msgstr "您确定要删除此通知模板吗?" - -#: client/src/scheduler/factories/delete-schedule.factory.js:58 -msgid "Are you sure you want to delete this schedule?" -msgstr "您确定要删除此计划吗?" - -#: client/src/teams/list/teams-list.controller.js:80 -msgid "Are you sure you want to delete this team?" -msgstr "您确定要删除此团队吗?" - -#: client/src/users/list/users-list.controller.js:93 -msgid "Are you sure you want to delete this user?" -msgstr "您确定要删除此用户吗?" - -#: client/features/templates/templates.strings.js:110 -msgid "Are you sure you want to delete this workflow node?" -msgstr "您确定要删除此工作流节点吗?" - -#: client/src/workflow-results/workflow-results.service.js:42 -msgid "Are you sure you want to delete this workflow?" -msgstr "您确定要删除此工作流吗?" - -#: client/lib/services/base-string.service.js:92 -msgid "Are you sure you want to delete this {{ resourceType }}?" -msgstr "您确定要删除此 {{ resourceType }} 吗?" - -#: client/src/partials/survey-maker-modal.html:13 -msgid "Are you sure you want to delete this {{deleteMode}}?" -msgstr "您确定要删除此 {{deleteMode}} 吗?" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:26 -msgid "Are you sure you want to disassociate the group below from" -msgstr "您确定要从中解除以下组的关联" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:24 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:27 -msgid "Are you sure you want to disassociate the host below from" -msgstr "您确定要从中解除以下主机的关联" - -#: client/features/templates/templates.strings.js:149 -msgid "Are you sure you want to exit the Workflow Creator without saving your changes?" -msgstr "您确定要退出 Workflow Creator 而不保存您的更改吗?" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:46 -msgid "Are you sure you want to permanently delete the group below from the inventory?" -msgstr "您确定要从清单中永久删除以下组吗?" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:104 -msgid "Are you sure you want to permanently delete the host below from the inventory?" -msgstr "您确定要从清单中永久删除以下主机吗?" - -#: client/src/projects/edit/projects-edit.controller.js:242 -msgid "Are you sure you want to remove the %s below from %s?" -msgstr "您确定要删除 %s (从 %s 下)吗?" - -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:67 -msgid "Are you sure you want to remove the following administrator from this organization?" -msgstr "您确定要从此机构中删除以下管理员吗?" - -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:66 -msgid "Are you sure you want to remove the following user from this organization?" -msgstr "您确定要从此机构中删除以下用户吗?" - -#: client/lib/services/base-string.service.js:109 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:109 -msgid "Are you sure you want to submit the request to cancel this job?" -msgstr "您确定要提交取消此作业的请求吗?" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:39 -msgid "Arguments" -msgstr "参数" - -#: client/features/output/output.strings.js:59 -msgid "Artifacts" -msgstr "工件" - -#: client/src/credentials/credentials.form.js:232 -#: client/src/credentials/credentials.form.js:271 -#: client/src/credentials/credentials.form.js:310 -#: client/src/credentials/credentials.form.js:396 -msgid "Ask at runtime?" -msgstr "是否在运行时询问?" - -#: client/src/instance-groups/instance-groups.strings.js:36 -msgid "Associate an existing Instance" -msgstr "关联现有实例" - -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:74 -msgid "Associate an existing group" -msgstr "关联现有组" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:56 -msgid "Associate this host with a new group" -msgstr "将此主机与新组关联" - -#: client/src/shared/form-generator.js:1396 -msgid "Auditor" -msgstr "审核员" - -#: client/lib/components/components.strings.js:95 -#: client/src/configuration/settings.partial.html:2 -msgid "Authentication" -msgstr "身份验证" - -#: client/src/credentials/credentials.form.js:72 -msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." -msgstr "网络设备访问的身份验证。这可以包括 SSH 密钥、用户名、密码和授权信息。当提交针对网络设备运行 playbook 的作业时,会使用网络凭证。" - -#: client/src/credentials/credentials.form.js:68 -msgid "Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts." -msgstr "远程机器访问的身份验证。这可以包括 SSH 密钥、用户名、密码和 sudo 信息。在提交针对远程主机运行 playbook 的作业时,会使用机器凭证。" - -#: client/src/configuration/settings.service.js:48 -msgid "Authorization Code Expiration" -msgstr "授权代码过期" - -#: client/src/credentials/credentials.form.js:342 -msgid "Authorize" -msgstr "授权" - -#: client/src/credentials/credentials.form.js:350 -msgid "Authorize Password" -msgstr "授权密码" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:241 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:253 -msgid "Availability Zone:" -msgstr "可用性区域:" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:91 -msgid "Azure AD" -msgstr "Azure AD" - -#: client/src/shared/directives.js:91 -msgid "BROWSE" -msgstr "浏览" - -#: client/features/output/output.strings.js:124 -msgid "Back to Top" -msgstr "返回顶部" - -#: client/src/projects/projects.form.js:82 -msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." -msgstr "用于定位 playbook 的基本路径。位于该路径中的目录将列在 playbook 目录下拉列表中。基本路径和所选 playbook 目录一起提供了用于定位 playbook 的完整路径。" - -#: client/src/notifications/shared/type-change.service.js:56 -msgid "Basic Auth Password" -msgstr "基本验证密码" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:129 -msgid "Become Privilege Escalation" -msgstr "成为权限升级" - -#: client/features/output/output.strings.js:87 -msgid "Branch" -msgstr "分支" - -#: client/src/projects/projects.form.js:129 -msgid "Branch to checkout. In addition to branches, you can input tags, commit hashes, and arbitrary refs. Some commit hashes and refs may not be availble unless you also provide a custom refspec." -msgstr "要签出的分支。除了分支外,您可以输入标签、提交散列和任意 refs。除非你还提供了自定义 refspec,否则某些提交散列和 refs 可能无法使用。" - -#: client/features/templates/templates.strings.js:72 -#: client/src/templates/job_templates/job-template.form.js:112 -msgid "Branch to use in job run. Project default used if blank." -msgstr "要在作业运行中使用的分支。如果为空,则使用项目默认值。" - -#: client/src/license/license.partial.html:113 -msgid "Browse" -msgstr "浏览" - -#: client/src/license/license.partial.html:180 -msgid "By default, Tower collects and transmits analytics data on Tower usage to Red Hat. There are two categories of data collected by Tower. For more information, see this Tower documentation page. Uncheck the following boxes to disable this feature." -msgstr "默认情况下,Tower 会收集关于 Tower 使用情况的分析数据并将其传送到红帽。Tower 收集的数据分为两类。如需更多信息,请参阅这个 Tower 文档页面。请取消选择以下复选框以禁用此功能。" - -#: client/features/templates/templates.strings.js:151 -#: client/lib/services/base-string.service.js:61 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:29 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:50 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:30 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:23 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:16 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:16 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:16 -#: client/src/license/license.partial.html:259 -#: client/src/partials/survey-maker-modal.html:17 -#: client/src/partials/survey-maker-modal.html:82 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:17 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:131 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:180 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:68 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:149 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:188 -msgid "CANCEL" -msgstr "取消" - -#: client/index.template.ejs:116 -msgid "CAUTION: Setting both numerical variables to \"0\" will delete all facts." -msgstr "注意:将两个数字变量设置为“0”会删除所有事实。" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:30 -msgid "CHANGES" -msgstr "更改" - -#: client/features/templates/templates.strings.js:131 -msgid "CHECK" -msgstr "选中" - -#: client/lib/components/components.strings.js:20 -msgid "CHOOSE A FILE" -msgstr "选择文件" - -#: client/features/output/output.strings.js:103 -#: client/src/shared/smart-search/smart-search.partial.html:26 -msgid "CLEAR ALL" -msgstr "全部清除" - -#: client/features/applications/applications.strings.js:21 -msgid "CLIENT ID" -msgstr "客户端 ID" - -#: client/features/applications/applications.strings.js:22 -msgid "CLIENT SECRET" -msgstr "客户端机密" - -#: client/lib/services/base-string.service.js:62 -#: client/lib/services/base-string.service.js:77 -#: client/src/partials/survey-maker-modal.html:83 -msgid "CLOSE" -msgstr "关闭" - -#: client/features/jobs/routes/hostCompletedJobs.route.js:27 -#: client/features/jobs/routes/templateCompletedJobs.route.js:28 -#: client/features/jobs/routes/workflowJobTemplateCompletedJobs.route.js:28 -msgid "COMPLETED JOBS" -msgstr "完成的作业" - -#: client/features/templates/templates.strings.js:35 -#: client/src/scheduler/scheduler.strings.js:68 -msgid "CONFIRM" -msgstr "确认" - -#: client/lib/services/base-string.service.js:75 -msgid "COPY" -msgstr "复制" - -#: client/features/users/tokens/tokens.strings.js:25 -msgid "COULD NOT CREATE TOKEN" -msgstr "无法创建令牌" - -#: client/src/instance-groups/instance-groups.strings.js:54 -msgid "CPU" -msgstr "CPU" - -#: client/src/shared/stateDefinitions.factory.js:161 -msgid "CREATE %s" -msgstr "CREATE %s" - -#: client/features/applications/applications.strings.js:9 -msgid "CREATE APPLICATION" -msgstr "创建应用" - -#: client/src/instance-groups/instance-groups.strings.js:13 -msgid "CREATE CONTAINER GROUP" -msgstr "创建容器组" - -#: client/features/credentials/credentials.strings.js:8 -#: client/src/credentials/credentials.form.js:16 -msgid "CREATE CREDENTIAL" -msgstr "创建凭证" - -#: client/src/inventories-hosts/inventories/related/groups/add/groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:16 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:16 -msgid "CREATE GROUP" -msgstr "创建组" - -#: client/src/inventories-hosts/hosts/host.form.js:17 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:17 -#: client/src/inventories-hosts/inventories/related/hosts/add/host-add.route.js:8 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:17 -msgid "CREATE HOST" -msgstr "创建主机" - -#: client/src/instance-groups/instance-groups.strings.js:12 -msgid "CREATE INSTANCE GROUP" -msgstr "创建实例组" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:8 -msgid "CREATE INVENTORY SOURCE" -msgstr "创建清单源" - -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule-add.route.js:9 -#: client/src/scheduler/scheduler.strings.js:8 -#: client/src/scheduler/schedules.route.js:161 -#: client/src/scheduler/schedules.route.js:242 -#: client/src/scheduler/schedules.route.js:73 -msgid "CREATE SCHEDULE" -msgstr "创建计划" - -#: client/src/management-jobs/scheduler/main.js:83 -msgid "CREATE SCHEDULED JOB" -msgstr "创建调度作业" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:18 -msgid "CREATE SOURCE" -msgstr "创建源" - -#: client/features/users/tokens/tokens.strings.js:18 -#: client/features/users/tokens/tokens.strings.js:9 -#: client/features/users/tokens/users-tokens-add.route.js:49 -msgid "CREATE TOKEN" -msgstr "创建令牌" - -#: client/features/output/output.strings.js:128 -msgid "CREATED" -msgstr "已创建" - -#: client/features/credentials/credentials.strings.js:31 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:150 -msgid "CREDENTIAL" -msgstr "凭证" - -#: client/src/credential-types/credential-types.form.js:21 -msgid "CREDENTIAL TYPE" -msgstr "凭证类型" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:60 -msgid "CREDENTIAL TYPE:" -msgstr "凭证类型:" - -#: client/src/activity-stream/get-target-title.factory.js:11 -#: client/src/credential-types/credential-types.list.js:12 -#: client/src/credential-types/main.js:44 -msgid "CREDENTIAL TYPES" -msgstr "凭证类型" - -#: client/features/credentials/legacy.credentials.js:11 -#: client/src/activity-stream/get-target-title.factory.js:17 -#: client/src/credentials/credentials.list.js:15 -#: client/src/credentials/credentials.list.js:16 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:5 -msgid "CREDENTIALS" -msgstr "凭证" - -#: client/features/credentials/credentials.strings.js:49 -msgid "CREDENTIALS PERMISSIONS" -msgstr "凭证权限" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:396 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:408 -#: client/src/projects/projects.form.js:231 -msgid "Cache Timeout" -msgstr "缓存超时" - -#: client/src/projects/projects.form.js:220 -msgid "Cache Timeout%s (seconds)%s" -msgstr "缓存超时%s (秒)%s" - -#: client/src/users/list/users-list.controller.js:85 -msgid "Call to %s failed. DELETE returned status:" -msgstr "调用 %s 失败。DELETE 返回的状态:" - -#: client/src/projects/edit/projects-edit.controller.js:236 -msgid "Call to %s failed. POST returned status:" -msgstr "调用 %s 失败。POST 返回的状态:" - -#: client/src/management-jobs/card/card.controller.js:29 -msgid "Call to %s failed. Return status: %d" -msgstr "调用 %s 失败。返回状态:%d" - -#: client/lib/services/base-string.service.js:116 -msgid "Call to {{ path }} failed. {{ action }} returned status: {{ status }}." -msgstr "调用 {{ path }} 失败. {{ action }} 返回的状态: {{ status }}。" - -#: client/features/output/output.strings.js:18 -#: client/lib/services/base-string.service.js:108 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:187 -#: client/src/configuration/forms/settings-form.controller.js:473 -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:24 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:624 -#: client/src/scheduler/scheduler.strings.js:56 -#: client/src/shared/form-generator.js:1652 -#: client/src/shared/lookup/lookup-modal.partial.html:19 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:33 -#: client/src/workflow-results/workflow-results.controller.js:56 -msgid "Cancel" -msgstr "取消" - -#: client/features/output/output.strings.js:54 -#: client/lib/services/base-string.service.js:110 -msgid "Cancel Job" -msgstr "取消作业" - -#: client/features/projects/projects.strings.js:31 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Cancel Not Allowed" -msgstr "不允许取消" - -#: client/src/workflow-results/workflow-results.service.js:84 -msgid "Cancel Workflow" -msgstr "取消工作流" - -#: client/src/workflow-results/workflow-results.partial.html:39 -msgid "Cancel job" -msgstr "取消作业" - -#: client/src/license/license.strings.js:8 -msgid "Cancel license lookup" -msgstr "取消许可证查询" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:104 -msgid "Cancel sync process" -msgstr "取消同步进程" - -#: client/src/projects/projects.list.js:128 -msgid "Cancel the SCM update" -msgstr "取消 SCM 更新" - -#: client/lib/services/base-string.service.js:122 -msgid "Cancel the {{resourceType}}" -msgstr "取消 {{resourcetype}}" - -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:34 -msgid "Cancel unsaved changes" -msgstr "取消未保存的更改" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:32 -msgid "Canceled. Click for details" -msgstr "已取消。请点击了解详情" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Cannot find job." -msgstr "无法找到作业。" - -#: client/src/shared/smart-search/smart-search.controller.js:167 -msgid "Cannot search running job" -msgstr "无法搜索正在运行的作业" - -#: client/src/instance-groups/instance-groups.list.js:22 -msgid "Capacity" -msgstr "容量" - -#: client/lib/services/base-string.service.js:154 -msgid "Capacity (Ascending)" -msgstr "容量(升序)" - -#: client/lib/services/base-string.service.js:155 -msgid "Capacity (Descending)" -msgstr "容量(降序)" - -#: client/src/projects/projects.form.js:84 -msgid "Change %s when deploying {{BRAND_NAME}} to change this location." -msgstr "当部署 {{BRAND_NAME}} 到这个位置时修改 %s。" - -#: client/src/activity-stream/activity-detail.form.js:41 -msgid "Changes" -msgstr "更改" - -#: client/src/notifications/notificationTemplates.form.js:460 -msgid "Channel" -msgstr "频道" - -#: client/features/templates/templates.strings.js:73 -msgid "Check" -msgstr "检查" - -#: client/src/shared/form-generator.js:1046 -msgid "Choose a %s" -msgstr "选择一个 %s" - -#: client/src/templates/job_templates/job-template.form.js:407 -#: client/src/templates/workflows.form.js:180 -msgid "Choose a Webhook Service" -msgstr "选择 Webhook 服务" - -#: client/features/templates/templates.strings.js:62 -msgid "Choose a job type" -msgstr "选择作业类型" - -#: client/src/templates/job_templates/job-template.form.js:125 -msgid "Choose a playbook" -msgstr "选择 playbook" - -#: client/features/templates/templates.strings.js:63 -msgid "Choose a verbosity" -msgstr "选择详细程度" - -#: client/src/projects/projects.form.js:60 -msgid "Choose an SCM Type" -msgstr "选择 SCM 类型" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:64 -msgid "Choose an answer type" -msgstr "选择回答类型" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:67 -msgid "Choose an answer type or format you want as the prompt for the user. Refer to the Ansible Tower Documentation for more additional information about each option." -msgstr "选择您想要作为用户提示的回答类型或格式。请参阅 Ansible Tower 文档来了解每个选项的更多其他信息。" - -#: client/src/notifications/notificationTemplates.form.js:560 -msgid "Choose an email option" -msgstr "选择电子邮件选项" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:111 -msgid "Choose an inventory file" -msgstr "选择清单文件" - -#: client/src/shared/directives.js:92 -msgid "Choose file" -msgstr "选择文件" - -#: client/src/license/license.partial.html:104 -msgid "Choose your license file, agree to the End User License Agreement, and click submit." -msgstr "选择您的许可证文件,同意最终用户许可证协议,并点击“提交”。" - -#: client/src/projects/projects.form.js:176 -msgid "Clean" -msgstr "清理" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:299 -msgid "Clear" -msgstr "清除" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:64 -msgid "Click for details" -msgstr "点击了解详情" - -#: client/src/shared/list-generator/list-actions.partial.html:59 -#: client/src/shared/list-generator/list-actions.partial.html:66 -msgid "Click for help" -msgstr "点击获得帮助" - -#: client/features/templates/templates.strings.js:15 -msgid "Click here to open the workflow visualizer" -msgstr "点击此处打开工作流可视化工具" - -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:477 -msgid "Click here to open the workflow visualizer." -msgstr "点击此处打开工作流可视化工具。" - -#: client/src/inventories-hosts/inventories/inventory.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new inventory." -msgstr "点击一行来选择它,然后在完成时点击“完成”。点击 %s 按钮创建新清单。" - -#: client/src/teams/teams.list.js:16 -msgid "Click on a row to select it, and click Finished when done. Click the %s button to create a new team." -msgstr "点击一行来选择它,然后在完成时点击“完成”。点击 %s 按钮创建新团队。" - -#: client/src/templates/templates.list.js:17 -msgid "Click on a row to select it, and click Finished when done. Use the %s button to create a new job template." -msgstr "点击一行来选择它,然后在完成时点击“完成”。点击 %s 按钮创建新作业模板。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:137 -msgid "Click on the regions field to see a list of regions for your cloud provider. You can select multiple regions, or choose" -msgstr "点击区域字段查看云提供商的区域列表。您可以选择多个区域,或者选择" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Click the" -msgstr "点击" - -#: client/features/templates/templates.strings.js:128 -msgid "Click to edit link" -msgstr "点击以编辑链接" - -#: client/src/scheduler/scheduler.strings.js:13 -msgid "Click to edit schedule." -msgstr "点击以编辑计划。" - -#: client/features/templates/templates.strings.js:129 -msgid "Click to view link" -msgstr "点击以查看链接" - -#: client/src/credentials/credentials.form.js:320 -msgid "Client ID" -msgstr "客户端 ID" - -#: client/src/notifications/notificationTemplates.form.js:274 -msgid "Client Identifier" -msgstr "客户端标识符" - -#: client/src/credentials/credentials.form.js:329 -msgid "Client Secret" -msgstr "客户端机密" - -#: client/lib/components/code-mirror/modal/code-mirror-modal.partial.html:67 -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:92 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:618 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:7 -#: client/src/organizations/linkout/addUsers/addUsers.partial.html:11 -#: client/src/partials/survey-maker-modal.html:28 -#: client/src/partials/survey-maker-modal.html:7 -#: client/src/scheduler/scheduler.strings.js:55 -#: client/src/scheduler/schedulerForm.partial.html:7 -#: client/src/shared/form-generator.js:1656 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:8 -#: client/src/shared/lookup/lookup-modal.partial.html:9 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:10 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:11 -#: client/src/templates/workflows/workflow-maker/workflow-maker.partial.html:61 -msgid "Close" -msgstr "关闭" - -#: client/lib/components/components.strings.js:135 -msgid "Close Approvals" -msgstr "关闭批准" - -#: client/features/output/output.strings.js:136 -msgid "Close host event modal" -msgstr "关闭主机事件模式" - -#: client/lib/components/code-mirror/code-mirror.strings.js:7 -msgid "Close variables modal" -msgstr "关闭变量模式" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:26 -msgid "Cloud source not configured." -msgstr "未配置云源。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "Cloud source not configured. Click" -msgstr "未配置云源。点击" - -#: client/src/credentials/factories/become-method-change.factory.js:80 -#: client/src/credentials/factories/kind-change.factory.js:136 -msgid "CloudForms URL" -msgstr "CloudForms URL" - -#: client/features/output/output.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:201 -msgid "Collapse Output" -msgstr "折叠输出" - -#: client/lib/components/components.strings.js:120 -msgid "Compact" -msgstr "紧凑" - -#: client/src/inventories-hosts/hosts/host.form.js:125 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:135 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:155 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:168 -#: client/src/templates/job_templates/job-template.form.js:573 -#: client/src/templates/workflows.form.js:328 -msgid "Completed Jobs" -msgstr "完成的作业" - -#: client/src/management-jobs/card/card.partial.html:34 -#: client/src/management-jobs/card/card.partial.html:37 -msgid "Configure Notifications" -msgstr "配置通知" - -#: client/src/users/users.form.js:82 -msgid "Confirm Password" -msgstr "确认密码" - -#: client/src/configuration/forms/settings-form.controller.js:480 -msgid "Confirm Reset" -msgstr "确认重置" - -#: client/src/configuration/forms/settings-form.controller.js:489 -msgid "Confirm factory reset" -msgstr "确认工厂重置" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "Confirm the removal of the" -msgstr "确认删除" - -#: client/src/teams/teams.form.js:24 -#: client/src/users/users.form.js:25 -msgid "Contact your System Administrator to grant you the appropriate permissions to add and edit Users and Teams." -msgstr "请与系统管理员联系,为您授予添加和编辑用户和团队的适当权限。" - -#: client/features/output/output.strings.js:68 -#: client/src/instance-groups/instance-groups.strings.js:78 -msgid "Container Group" -msgstr "容器组" - -#: client/src/instance-groups/instance-groups.strings.js:38 -msgid "Container Groups Help" -msgstr "容器组帮助" - -#: client/lib/components/components.strings.js:130 -msgid "Continue workflow job?" -msgstr "是否继续工作流作业?" - -#: client/features/templates/templates.strings.js:61 -#: client/src/templates/job_templates/job-template.form.js:195 -msgid "Control the level of output ansible will produce as the playbook executes." -msgstr "控制 ansible 在 playbook 执行时生成的输出级别。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:336 -msgid "Control the level of output ansible will produce for inventory source update jobs." -msgstr "控制 ansible 为清单源更新作业生成的输出级别。" - -#: client/features/templates/templates.strings.js:159 -msgid "Convergence" -msgstr "趋同" - -#: client/lib/components/components.strings.js:54 -msgid "Copied to clipboard." -msgstr "已复制到剪贴板。" - -#: client/src/credentials/credentials.list.js:73 -#: client/src/inventories-hosts/inventories/inventory.list.js:109 -#: client/src/inventory-scripts/inventory-scripts.list.js:61 -#: client/src/notifications/notificationTemplates.list.js:87 -#: client/src/projects/projects.list.js:106 -#: client/src/templates/templates.list.js:93 -msgid "Copy" -msgstr "复制" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:55 -msgid "Copy Inventory" -msgstr "复制清单" - -#: client/src/credentials/credentials.list.js:76 -msgid "Copy credential" -msgstr "复制凭证" - -#: client/lib/components/components.strings.js:53 -msgid "Copy full revision to clipboard." -msgstr "将完整修订复制到剪贴板。" - -#: client/src/inventory-scripts/inventory-scripts.list.js:64 -msgid "Copy inventory script" -msgstr "复制清单脚本" - -#: client/src/notifications/notificationTemplates.list.js:90 -msgid "Copy notification" -msgstr "复制通知" - -#: client/src/projects/projects.list.js:109 -msgid "Copy project" -msgstr "复制项目" - -#: client/src/templates/templates.list.js:96 -msgid "Copy template" -msgstr "复制模板" - -#: client/lib/services/base-string.service.js:120 -msgid "Copy {{resourceType}}" -msgstr "复制 {{resourceType}}" - -#: client/src/about/about.partial.html:31 -msgid "" -"Copyright © 2019 Red Hat, Inc.
\n" -" Visit Ansible.com for more information.
" -msgstr "Copyright © 2019 Red Hat, Inc.
\n" -" Visit Ansible.com for more information.
" - -#: client/lib/components/components.strings.js:90 -msgid "Copyright © 2019 Red Hat, Inc." -msgstr "Copyright © 2019 Red Hat, Inc." - -#: client/src/workflow-results/workflow-results.service.js:78 -msgid "Could not cancel workflow. Returned status:" -msgstr "无法取消工作流。返回的状态:" - -#: client/src/workflow-results/workflow-results.service.js:58 -msgid "Could not delete job. Returned status:" -msgstr "无法删除作业。返回的状态:" - -#: client/src/users/users.list.js:44 -msgid "Create New" -msgstr "创建新" - -#: client/features/applications/applications.strings.js:32 -msgid "Create a new Application" -msgstr "创建新应用" - -#: client/src/instance-groups/instance-groups.strings.js:35 -msgid "Create a new Instance Group" -msgstr "创建新实例组" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:48 -msgid "Create a new Smart Inventory from search results.

Note: changing the organization of the Smart Inventory could change the hosts included in the Smart Inventory." -msgstr "从搜索结果创建新智能清单。

注意:更改智能清单的机构可能会更改智能清单中包含的主机。" - -#: client/src/credentials/credentials.list.js:52 -msgid "Create a new credential" -msgstr "创建新凭证" - -#: client/src/credential-types/credential-types.list.js:42 -msgid "Create a new credential type" -msgstr "创建新凭证类型" - -#: client/src/inventory-scripts/inventory-scripts.list.js:40 -msgid "Create a new custom inventory" -msgstr "创建新自定义清单" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:75 -msgid "Create a new group" -msgstr "创建新组" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:139 -msgid "Create a new host" -msgstr "创建新主机" - -#: client/src/inventories-hosts/inventories/inventory.list.js:80 -msgid "Create a new inventory" -msgstr "创建新清单" - -#: client/src/notifications/notificationTemplates.list.js:57 -msgid "Create a new notification template" -msgstr "创建新通知模板" - -#: client/src/organizations/list/organizations-list.partial.html:22 -msgid "Create a new organization" -msgstr "创建新机构" - -#: client/src/projects/projects.list.js:81 -msgid "Create a new project" -msgstr "创建新项目" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:72 -msgid "Create a new source" -msgstr "创建新源" - -#: client/src/teams/teams.list.js:43 -msgid "Create a new team" -msgstr "创建新团队" - -#: client/src/templates/templates.list.js:56 -msgid "Create a new template" -msgstr "创建新模板" - -#: client/src/users/users.list.js:48 -msgid "Create a new user" -msgstr "创建新用户" - -#: client/lib/services/base-string.service.js:128 -msgid "Created (Ascending)" -msgstr "已创建(升序)" - -#: client/lib/services/base-string.service.js:129 -msgid "Created (Descending)" -msgstr "已创建(待定)" - -#: client/features/output/output.strings.js:60 -#: client/features/templates/templates.strings.js:29 -#: client/src/instance-groups/container-groups/add-container-group.controller.js:24 -#: client/src/instance-groups/container-groups/edit-container-group.controller.js:38 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:73 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:73 -#: client/src/projects/add/projects-add.controller.js:140 -#: client/src/projects/add/projects-add.controller.js:153 -#: client/src/projects/add/projects-add.controller.js:162 -#: client/src/projects/add/projects-add.controller.js:181 -#: client/src/projects/edit/projects-edit.controller.js:263 -#: client/src/projects/edit/projects-edit.controller.js:274 -#: client/src/projects/edit/projects-edit.controller.js:283 -#: client/src/projects/edit/projects-edit.controller.js:302 -msgid "Credential" -msgstr "凭证" - -#: client/features/templates/templates.strings.js:40 -msgid "Credential Type" -msgstr "凭证类型" - -#: client/lib/components/components.strings.js:76 -#: client/lib/models/models.strings.js:12 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 -msgid "Credential Types" -msgstr "凭证类型" - -#: client/src/instance-groups/instance-groups.strings.js:80 -msgid "Credential to authenticate with Kubernetes or OpenShift.  Must be of type \"Kubernetes/OpenShift API Bearer Token”." -msgstr "与 Kubernetes 或 OpenShift 进行身份验证的凭证。必须为“Kubernetes/OpenShift API Bearer Token”类型。" - -#: client/features/jobs/jobs.strings.js:16 -#: client/features/templates/templates.strings.js:21 -#: client/lib/components/components.strings.js:75 -#: client/lib/models/models.strings.js:8 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:128 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:58 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 -#: client/src/templates/job_templates/job-template.form.js:140 -#: client/src/templates/job_templates/job-template.form.js:152 -msgid "Credentials" -msgstr "凭证" - -#: client/features/templates/templates.strings.js:41 -msgid "Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:" -msgstr "模板计划和工作流节点不允许使用启动时需要密码的凭证。必须删除或替换以下凭证才能继续操作:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:17 -msgid "Critical" -msgstr "关键" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:12 -msgid "Critical Risk" -msgstr "关键风险" - -#: client/src/shared/directives.js:93 -msgid "Current Image:" -msgstr "当前镜像:" - -#: client/features/output/output.strings.js:40 -msgid "Currently following output as it arrives. Click to unfollow" -msgstr "当前在输出到达时跟随输出。点击以取消跟随" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:170 -msgid "Custom Inventory Script" -msgstr "自定义清单脚本" - -#: client/lib/services/base-string.service.js:85 -msgid "Custom Logo" -msgstr "自定义徽标" - -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 -msgid "Custom Script" -msgstr "自定义脚本" - -#: client/src/instance-groups/instance-groups.strings.js:79 -msgid "Customize Pod Spec" -msgstr "自定义 Pod 规格" - -#: client/src/notifications/notificationTemplates.form.js:577 -msgid "Customize messages…" -msgstr "自定义消息…" - -#: client/src/home/home.route.js:16 -msgid "DASHBOARD" -msgstr "仪表板" - -#: client/features/users/tokens/tokens.strings.js:28 -#: client/lib/services/base-string.service.js:74 -#: client/src/credential-types/list/list.controller.js:110 -#: client/src/credentials/list/credentials-list.controller.js:155 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:160 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:51 -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:131 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:184 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:24 -#: client/src/inventory-scripts/list/list.controller.js:130 -#: client/src/notifications/notification-templates-list/list.controller.js:235 -#: client/src/organizations/edit/organizations-edit.controller.js:164 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:69 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:68 -#: client/src/organizations/list/organizations-list.controller.js:202 -#: client/src/partials/survey-maker-modal.html:18 -#: client/src/projects/edit/projects-edit.controller.js:244 -#: client/src/scheduler/factories/delete-schedule.factory.js:60 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -#: client/src/teams/list/teams-list.controller.js:82 -#: client/src/users/list/users-list.controller.js:95 -#: client/src/workflow-results/workflow-results.service.js:62 -msgid "DELETE" -msgstr "删除" - -#: client/src/partials/survey-maker-modal.html:81 -msgid "DELETE SURVEY" -msgstr "删除问卷调查" - -#: client/features/templates/templates.strings.js:133 -msgid "DELETED" -msgstr "已删除" - -#: client/features/templates/templates.strings.js:158 -msgid "DENIED" -msgstr "已拒绝" - -#: client/lib/components/components.strings.js:129 -msgid "DENY" -msgstr "拒绝" - -#: client/features/projects/projects.strings.js:9 -#: client/features/users/tokens/tokens.strings.js:36 -msgid "DESCRIPTION" -msgstr "描述" - -#: client/features/templates/templates.strings.js:135 -#: client/src/instance-groups/instance-groups.strings.js:29 -#: client/src/workflow-results/workflow-results.controller.js:83 -msgid "DETAILS" -msgstr "详情" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:30 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:31 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:32 -msgid "DISASSOCIATE" -msgstr "解除关联" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:5 -msgid "DYNAMIC HOSTS" -msgstr "动态主机" - -#: client/lib/components/components.strings.js:70 -msgid "Dashboard" -msgstr "仪表板" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:576 -#: client/src/scheduler/scheduler.strings.js:52 -msgid "Date format" -msgstr "日期格式" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:170 -#: client/src/scheduler/scheduler.strings.js:64 -msgid "Days of data to keep" -msgstr "要保留数据的天数" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:101 -msgid "Default" -msgstr "默认" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:196 -#: client/src/templates/survey-maker/shared/question-definition.form.js:213 -#: client/src/templates/survey-maker/shared/question-definition.form.js:228 -#: client/src/templates/survey-maker/shared/question-definition.form.js:242 -#: client/src/templates/survey-maker/shared/question-definition.form.js:256 -#: client/src/templates/survey-maker/shared/question-definition.form.js:272 -msgid "Default Answer" -msgstr "默认回答" - -#: client/src/configuration/settings.partial.html:9 -msgid "Define system-level features and functions" -msgstr "定义系统级的特性和功能" - -#: client/features/output/output.strings.js:20 -#: client/lib/services/base-string.service.js:89 -#: client/src/credential-types/credential-types.list.js:73 -#: client/src/credential-types/list/list.controller.js:106 -#: client/src/credentials/credentials.list.js:92 -#: client/src/credentials/list/credentials-list.controller.js:151 -#: client/src/inventories-hosts/inventories/inventory.list.js:125 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:156 -#: client/src/inventory-scripts/inventory-scripts.list.js:79 -#: client/src/inventory-scripts/list/list.controller.js:126 -#: client/src/notifications/notification-templates-list/list.controller.js:231 -#: client/src/notifications/notificationTemplates.list.js:105 -#: client/src/organizations/edit/organizations-edit.controller.js:161 -#: client/src/organizations/linkout/controllers/organizations-admins.controller.js:66 -#: client/src/organizations/linkout/controllers/organizations-users.controller.js:65 -#: client/src/organizations/list/organizations-list.controller.js:198 -#: client/src/projects/edit/projects-edit.controller.js:241 -#: client/src/scheduler/schedules.list.js:108 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:37 -#: client/src/teams/list/teams-list.controller.js:78 -#: client/src/teams/teams.list.js:72 -#: client/src/templates/templates.list.js:109 -#: client/src/users/list/users-list.controller.js:91 -#: client/src/users/users.list.js:79 -#: client/src/workflow-results/workflow-results.controller.js:57 -msgid "Delete" -msgstr "删除" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:6 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:6 -msgid "Delete Group" -msgstr "删除组" - -#: client/src/inventories-hosts/inventories/related/hosts/list/host-list.controller.js:128 -msgid "Delete Host" -msgstr "删除主机" - -#: client/features/output/output.strings.js:55 -#: client/src/workflow-results/workflow-results.service.js:39 -msgid "Delete Job" -msgstr "删除作业" - -#: client/src/organizations/list/organizations-list.partial.html:73 -msgid "Delete Organization" -msgstr "删除机构" - -#: client/src/templates/survey-maker/surveys/init.factory.js:23 -msgid "Delete Question" -msgstr "删除问题" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:180 -msgid "Delete Source" -msgstr "删除源" - -#: client/src/credentials/credentials.list.js:94 -msgid "Delete credential" -msgstr "删除凭证" - -#: client/src/credential-types/credential-types.list.js:75 -msgid "Delete credential type" -msgstr "删除凭证类型" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:107 -#: client/src/inventories-hosts/inventory-hosts.strings.js:19 -msgid "Delete group" -msgid_plural "Delete groups" -msgstr[0] "删除组" -msgstr[1] "删除组" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:116 -#: client/src/inventories-hosts/inventory-hosts.strings.js:21 -msgid "Delete host" -msgid_plural "Delete hosts" -msgstr[0] "删除主机" -msgstr[1] "删除主机" - -#: client/src/inventories-hosts/inventories/inventory.list.js:127 -msgid "Delete inventory" -msgstr "删除清单" - -#: client/src/inventory-scripts/inventory-scripts.list.js:81 -msgid "Delete inventory script" -msgstr "删除清单脚本" - -#: client/src/workflow-results/workflow-results.partial.html:52 -msgid "Delete job" -msgstr "删除作业" - -#: client/src/notifications/notificationTemplates.list.js:107 -msgid "Delete notification" -msgstr "删除通知" - -#: client/src/projects/projects.form.js:186 -msgid "Delete on Update" -msgstr "更新时删除" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:26 -msgid "Delete or promote the group's children?" -msgstr "是删除还是提升组的子项?" - -#: client/src/partials/survey-maker-modal.html:67 -msgid "Delete question" -msgstr "删除问题" - -#: client/src/scheduler/schedules.list.js:111 -msgid "Delete schedule" -msgstr "删除计划" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:121 -msgid "Delete source" -msgstr "删除源" - -#: client/src/teams/teams.list.js:76 -msgid "Delete team" -msgstr "删除团队" - -#: client/src/templates/templates.list.js:112 -msgid "Delete template" -msgstr "删除模板" - -#: client/src/projects/projects.form.js:188 -msgid "Delete the local repository in its entirety prior to performing an update." -msgstr "在进行更新前,请删除整个本地存储库。" - -#: client/src/projects/projects.list.js:122 -msgid "Delete the project" -msgstr "删除项目" - -#: client/src/scheduler/scheduled-jobs.list.js:86 -msgid "Delete the schedule" -msgstr "删除计划" - -#: client/lib/services/base-string.service.js:121 -msgid "Delete the {{resourceType}}" -msgstr "删除 {{resourcetype}}" - -#: client/src/users/users.list.js:83 -msgid "Delete user" -msgstr "删除用户" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:14 -msgid "Delete {{ group }} and {{ host }}" -msgstr "删除 {{ group }} 和 {{ host }}" - -#: client/lib/services/base-string.service.js:91 -msgid "Deleting this {{ resourceType }} will make the following resources unavailable." -msgstr "删除此 {{ resourceType }} 会使以下资源不可用。" - -#: client/src/projects/projects.form.js:188 -msgid "Depending on the size of the repository this may significantly increase the amount of time required to complete an update." -msgstr "根据存储库的大小,这可能会显著增加完成更新所需的时间。" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "Describe Instances documentation" -msgstr "描述实例文档" - -#: client/features/applications/add-applications.controller.js:36 -#: client/features/templates/templates.strings.js:17 -#: client/features/users/tokens/users-tokens-add.controller.js:26 -#: client/src/credential-types/credential-types.form.js:34 -#: client/src/credentials/credentials.form.js:39 -#: client/src/inventories-hosts/hosts/host.form.js:62 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:39 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:61 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:74 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:63 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:72 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:28 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:36 -#: client/src/inventory-scripts/inventory-scripts.form.js:35 -#: client/src/notifications/notificationTemplates.form.js:39 -#: client/src/organizations/organizations.form.js:33 -#: client/src/projects/projects.form.js:37 -#: client/src/teams/teams.form.js:35 -#: client/src/templates/job_templates/job-template.form.js:41 -#: client/src/templates/survey-maker/shared/question-definition.form.js:36 -#: client/src/templates/workflows.form.js:49 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:128 -#: client/src/users/users.form.js:147 -#: client/src/users/users.form.js:175 -msgid "Description" -msgstr "描述" - -#: client/src/notifications/notificationTemplates.form.js:156 -#: client/src/notifications/notificationTemplates.form.js:160 -#: client/src/notifications/notificationTemplates.form.js:172 -#: client/src/notifications/notificationTemplates.form.js:176 -msgid "Destination Channels" -msgstr "目标频道" - -#: client/src/notifications/notificationTemplates.form.js:535 -#: client/src/notifications/notificationTemplates.form.js:539 -msgid "Destination Channels or Users" -msgstr "目标频道或用户" - -#: client/src/notifications/notificationTemplates.form.js:225 -#: client/src/notifications/notificationTemplates.form.js:226 -msgid "Destination SMS Number" -msgstr "目标 SMS 号码" - -#: client/features/applications/applications.strings.js:15 -#: client/features/credentials/credentials.strings.js:13 -#: client/features/output/output.strings.js:46 -#: client/features/users/tokens/tokens.strings.js:14 -#: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1431 -msgid "Details" -msgstr "详情" - -#: client/src/notifications/notificationTemplates.form.js:341 -#: client/src/notifications/notificationTemplates.form.js:403 -#: client/src/notifications/notificationTemplates.form.js:474 -#: client/src/notifications/notificationTemplates.form.js:506 -msgid "Disable SSL Verification" -msgstr "禁用 SSL 验证" - -#: client/src/templates/survey-maker/surveys/init.factory.js:21 -msgid "Disable Survey" -msgstr "禁用问卷调查" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Disable survey" -msgstr "禁用问卷调查" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Group From Group" -msgstr "从组中解除关联组" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:6 -msgid "Disassociate Host" -msgstr "解除关联主机" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:6 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:6 -msgid "Disassociate Host From Group" -msgstr "从组中解除关联主机" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:70 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:103 -msgid "Disassociate group" -msgstr "解除关联组" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:104 -msgid "Disassociate host" -msgstr "解除关联主机" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:54 -#: client/src/configuration/forms/settings-form.controller.js:446 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:52 -msgid "Discard changes" -msgstr "忽略更改" - -#: client/src/teams/teams.form.js:161 -msgid "Dissassociate permission from team" -msgstr "解除团队的权限关联" - -#: client/src/users/users.form.js:234 -msgid "Dissassociate permission from user" -msgstr "解除用户的权限关联" - -#: client/src/templates/job_templates/job-template.form.js:286 -msgid "Divide the work done by this job template into the specified number of job slices, each running the same tasks against a portion of the inventory." -msgstr "将此作业模板完成的工作分成指定作业分片数,每一分片都针对清单的一部分运行相同的任务。" - -#: client/src/credentials/credentials.form.js:383 -#: client/src/credentials/factories/become-method-change.factory.js:54 -#: client/src/credentials/factories/kind-change.factory.js:110 -msgid "Domain Name" -msgstr "域名" - -#: client/features/output/output.strings.js:21 -msgid "Download Output" -msgstr "下载输出" - -#: client/src/inventory-scripts/inventory-scripts.form.js:59 -msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. Refer to the Ansible Tower documentation for example syntax." -msgstr "在此处拖放自定义清单脚本文件,或者在该字段中创建一个文件来导入您的自定义清单。示例语法请参阅 Ansible Tower 文档。" - -#: client/src/templates/survey-maker/surveys/init.factory.js:24 -msgid "Drag to reorder question" -msgstr "拖动以对问题进行重新排序" - -#: client/src/partials/survey-maker-modal.html:74 -msgid "Drop question here to reorder" -msgstr "将问题放到此处以重新排序" - -#: client/features/applications/applications.strings.js:10 -msgid "EDIT APPLICATION" -msgstr "编辑应用" - -#: client/features/credentials/credentials.strings.js:9 -msgid "EDIT CREDENTIAL" -msgstr "编辑凭证" - -#: client/features/templates/templates.strings.js:142 -msgid "EDIT LINK" -msgstr "编辑链接" - -#: client/src/scheduler/scheduler.strings.js:9 -msgid "EDIT SCHEDULE" -msgstr "编辑计划" - -#: client/src/management-jobs/scheduler/main.js:97 -msgid "EDIT SCHEDULED JOB" -msgstr "编辑调度的作业" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:17 -msgid "EDIT SURVEY PROMPT" -msgstr "编辑问卷调查提示" - -#: client/features/templates/templates.strings.js:124 -msgid "EDIT TEMPLATE" -msgstr "编辑模板" - -#: client/lib/components/components.strings.js:9 -msgid "ENCRYPTED" -msgstr "已加密" - -#: client/features/output/output.strings.js:105 -msgid "EXAMPLES" -msgstr "示例" - -#: client/src/shared/smart-search/smart-search.partial.html:36 -msgid "EXAMPLES:" -msgstr "示例:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:15 -msgid "EXECUTE COMMAND" -msgstr "执行命令" - -#: client/features/templates/templates.strings.js:150 -msgid "EXIT" -msgstr "退出" - -#: client/lib/components/code-mirror/code-mirror.strings.js:12 -msgid "EXPAND" -msgstr "展开" - -#: client/features/applications/applications.strings.js:29 -#: client/features/users/tokens/tokens.strings.js:37 -msgid "EXPIRATION" -msgstr "过期" - -#: client/features/users/tokens/tokens.strings.js:24 -msgid "EXPIRES" -msgstr "过期" - -#: client/lib/components/code-mirror/code-mirror.strings.js:10 -#: client/lib/components/code-mirror/code-mirror.strings.js:50 -msgid "EXTRA VARIABLES" -msgstr "额外变量" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:375 -msgid "Each time a job runs using this inventory, refresh the inventory from the selected source before executing job tasks." -msgstr "每次使用此清单运行作业时,请在执行作业前从所选源中刷新清单。" - -#: client/src/projects/projects.form.js:199 -msgid "Each time a job runs using this project, update the revision of the project prior to starting the job." -msgstr "每次使用此项目运行作业时,请在启动该作业前更新项目的修订。" - -#: client/src/credential-types/credential-types.list.js:56 -#: client/src/credentials/credentials.list.js:66 -#: client/src/inventories-hosts/inventories/inventory.list.js:102 -#: client/src/inventory-scripts/inventory-scripts.list.js:54 -#: client/src/notifications/notificationTemplates.list.js:71 -#: client/src/notifications/notificationTemplates.list.js:80 -#: client/src/scheduler/schedules.list.js:93 -#: client/src/teams/teams.list.js:55 -#: client/src/templates/templates.list.js:80 -#: client/src/users/users.list.js:60 -msgid "Edit" -msgstr "编辑" - -#: client/src/organizations/list/organizations-list.partial.html:55 -msgid "Edit Organization" -msgstr "编辑机构" - -#: client/src/templates/survey-maker/surveys/init.factory.js:22 -msgid "Edit Question" -msgstr "编辑问题" - -#: client/src/shared/form-generator.js:1668 -#: client/src/templates/job_templates/job-template.form.js:602 -#: client/src/templates/workflows.form.js:357 -msgid "Edit Survey" -msgstr "编辑问卷调查" - -#: client/src/credentials/credentials.list.js:68 -msgid "Edit credential" -msgstr "编辑凭证" - -#: client/src/credential-types/credential-types.list.js:58 -msgid "Edit credential type" -msgstr "编辑凭证类型" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:91 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:85 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:89 -msgid "Edit group" -msgstr "编辑组" - -#: client/src/inventories-hosts/hosts/host.list.js:89 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:95 -#: client/src/inventories-hosts/inventory-hosts.strings.js:25 -msgid "Edit host" -msgstr "编辑主机" - -#: client/src/inventories-hosts/inventories/inventory.list.js:104 -msgid "Edit inventory" -msgstr "编辑清单" - -#: client/src/inventory-scripts/inventory-scripts.list.js:56 -msgid "Edit inventory script" -msgstr "编辑清单脚本" - -#: client/src/notifications/notificationTemplates.list.js:73 -msgid "Edit notification" -msgstr "编辑通知" - -#: client/src/partials/survey-maker-modal.html:64 -msgid "Edit question" -msgstr "编辑问题" - -#: client/src/scheduler/schedules.list.js:96 -msgid "Edit schedule" -msgstr "编辑计划" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:87 -msgid "Edit source" -msgstr "编辑源" - -#: client/src/teams/teams.list.js:59 -msgid "Edit team" -msgstr "编辑团队" - -#: client/src/templates/templates.list.js:82 -msgid "Edit template" -msgstr "编辑模板" - -#: client/src/workflow-results/workflow-results.controller.js:62 -msgid "Edit the inventory" -msgstr "编辑清单" - -#: client/src/projects/projects.list.js:93 -msgid "Edit the project" -msgstr "编辑项目" - -#: client/src/scheduler/scheduled-jobs.list.js:72 -#: client/src/workflow-results/workflow-results.controller.js:61 -msgid "Edit the schedule" -msgstr "编辑计划" - -#: client/src/workflow-results/workflow-results.controller.js:60 -msgid "Edit the slice job template" -msgstr "编辑分片作业模板" - -#: client/src/workflow-results/workflow-results.controller.js:58 -msgid "Edit the user" -msgstr "编辑用户" - -#: client/src/workflow-results/workflow-results.controller.js:59 -msgid "Edit the workflow job template" -msgstr "编辑工作流作业模板" - -#: client/src/users/users.list.js:64 -msgid "Edit user" -msgstr "编辑用户" - -#: client/features/projects/projects.strings.js:24 -msgid "Either you do not have access or the SCM update process completed" -msgstr "您没有访问权限,或者未完成 SCM 更新过程" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:251 -msgid "Either you do not have access or the SCM update process completed. Click the" -msgstr "您没有访问权限,或者未完成 SCM 更新过程。请点击" - -#: client/features/output/output.strings.js:116 -#: client/src/workflow-results/workflow-results.controller.js:92 -msgid "Elapsed" -msgstr "已经过" - -#: client/src/credentials/credentials.form.js:191 -#: client/src/users/users.form.js:52 -msgid "Email" -msgstr "电子邮件" - -#: client/src/notifications/notificationTemplates.form.js:558 -#: client/src/notifications/notificationTemplates.form.js:559 -msgid "Email Options" -msgstr "电子邮件选项" - -#: client/src/templates/job_templates/job-template.form.js:353 -#: client/src/templates/job_templates/job-template.form.js:358 -#: client/src/templates/workflows.form.js:157 -#: client/src/templates/workflows.form.js:162 -msgid "Enable Concurrent Jobs" -msgstr "启用并发作业" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:31 -msgid "Enable External Logging" -msgstr "启用外部日志记录" - -#: client/src/templates/job_templates/job-template.form.js:363 -#: client/src/templates/job_templates/job-template.form.js:368 -msgid "Enable Fact Cache" -msgstr "启用事实缓存" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:326 -msgid "Enable Privilege Escalation" -msgstr "启用权限升级" - -#: client/src/templates/job_templates/job-template.form.js:331 -#: client/src/templates/job_templates/job-template.form.js:338 -msgid "Enable Provisioning Callbacks" -msgstr "启用部署回调" - -#: client/src/templates/job_templates/job-template.form.js:343 -#: client/src/templates/job_templates/job-template.form.js:348 -#: client/src/templates/workflows.form.js:167 -#: client/src/templates/workflows.form.js:172 -msgid "Enable Webhook" -msgstr "启用 Webhook" - -#: client/src/configuration/settings.partial.html:3 -msgid "Enable simplified login for your Tower applications" -msgstr "为您的 Tower 应用启用简化的登录" - -#: client/src/templates/survey-maker/surveys/init.factory.js:534 -msgid "Enable survey" -msgstr "启用问卷调查" - -#: client/src/templates/job_templates/job-template.form.js:346 -msgid "Enable webhook for this job template." -msgstr "为此作业模板启用 Webhook。" - -#: client/src/templates/workflows.form.js:170 -msgid "Enable webhook for this workflow job template." -msgstr "为此工作流作业模板启用 Webhook。" - -#: client/src/templates/job_templates/job-template.form.js:335 -msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact {{BRAND_NAME}} and request a configuration update using this job template." -msgstr "允许创建部署回调 URL。使用此 URL,主机可访问 {{BRAND_NAME}} 并使用此作业模板请求配置更新。" - -#: client/src/credentials/factories/credential-form-save.factory.js:73 -msgid "Encrypted credentials are not supported." -msgstr "不支持加密凭证。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:487 -#: client/src/scheduler/scheduler.strings.js:44 -msgid "End" -msgstr "结束" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:532 -#: client/src/scheduler/scheduler.strings.js:46 -msgid "End Date" -msgstr "结束日期" - -#: client/src/scheduler/scheduler.strings.js:48 -msgid "End Time" -msgstr "结束时间" - -#: client/src/license/license.partial.html:163 -msgid "End User License Agreement" -msgstr "最终用户许可证协议" - -#: client/src/inventories-hosts/hosts/host.form.js:72 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:71 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:73 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:68 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "使用 JSON 或 YAML 语法输入清单变量。使用单选按钮在两者之间切换。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:74 -msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "使用 JSON 或 YAML 语法输入清单变量。使用单选按钮在两者之间切换。示例语法请参阅 Ansible Tower 文档。" - -#: client/src/notifications/notificationTemplates.form.js:335 -msgid "Enter one Annotation Tag per line, without commas." -msgstr "每行输入一个注解标签,不带逗号。" - -#: client/src/notifications/notificationTemplates.form.js:175 -msgid "Enter one HipChat channel per line. The pound symbol (#) is not required." -msgstr "每行输入一个 HipChat 频道。不需要输入 # 号。" - -#: client/src/notifications/notificationTemplates.form.js:538 -msgid "Enter one IRC channel or username per line. The pound symbol (#) for channels, and the at (@) symbol for users, are not required." -msgstr "每行输入一个 IRC 频道或用户名。频道不需要输入 # 号,用户不需要输入 @ 符号。" - -#: client/src/notifications/notificationTemplates.form.js:159 -msgid "Enter one Slack channel per line. The pound symbol (#) is required for channels." -msgstr "每行输入一个 Slack 频道。频道不需要输入 # 号。" - -#: client/src/notifications/notificationTemplates.form.js:97 -msgid "Enter one email address per line to create a recipient list for this type of notification." -msgstr "每行输入一封电子邮件地址,为这类通知创建一个接收者列表。" - -#: client/src/notifications/notificationTemplates.form.js:229 -msgid "Enter one phone number per line to specify where to route SMS messages." -msgstr "每行输入一个电话号码来指定 SMS 消息的传送目标。" - -#: client/src/credentials/factories/become-method-change.factory.js:81 -#: client/src/credentials/factories/kind-change.factory.js:137 -msgid "Enter the URL for the virtual machine which %scorresponds to your CloudForms instance. %sFor example, %s" -msgstr "输入与您的 CloudForms 实例 %s 对应的虚拟机URL。%s 例如:%s" - -#: client/src/credentials/factories/become-method-change.factory.js:71 -#: client/src/credentials/factories/kind-change.factory.js:127 -msgid "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor example, %s" -msgstr "输入与您的 Red Hat Satellite 6 服务器 %s 对应的 URL。%s 例如:%s" - -#: client/src/credentials/factories/become-method-change.factory.js:49 -#: client/src/credentials/factories/kind-change.factory.js:105 -msgid "Enter the hostname or IP address which corresponds to your VMware vCenter." -msgstr "输入与 VMware vCenter 对应的主机名或 IP 地址。" - -#: client/src/notifications/notificationTemplates.form.js:215 -msgid "Enter the number associated with the \"Messaging Service\" in Twilio in the format +18005550199." -msgstr "在 Twilio 中输入与“信息服务”关联的号码,格式为 +18005550199。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:196 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:220 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:244 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:319 -msgid "Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two." -msgstr "使用 JSON 或 YAML 语法输入变量。使用单选按钮在两者之间切换。" - -#: client/features/output/output.strings.js:61 -msgid "Environment" -msgstr "环境" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:186 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:193 -msgid "Environment Variables" -msgstr "环境变量" - -#: client/src/license/license.controller.js:232 -msgid "Error Applying License" -msgstr "应用许可证时出错" - -#: client/features/output/output.strings.js:89 -msgid "Error Details" -msgstr "错误详情" - -#: client/src/license/license.controller.js:166 -msgid "Error Fetching Licenses" -msgstr "获取许可证时出错" - -#: client/src/notifications/notificationTemplates.form.js:643 -msgid "Error Message" -msgstr "错误消息" - -#: client/src/notifications/notificationTemplates.form.js:654 -msgid "Error Message Body" -msgstr "错误消息正文" - -#: client/lib/services/base-string.service.js:115 -#: client/src/app.js:228 -#: client/src/configuration/forms/settings-form.controller.js:285 -#: client/src/configuration/forms/settings-form.controller.js:429 -#: client/src/configuration/forms/settings-form.controller.js:554 -#: client/src/configuration/forms/settings-form.controller.js:614 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:234 -#: client/src/credentials/factories/credential-form-save.factory.js:77 -#: client/src/credentials/factories/credential-form-save.factory.js:93 -#: client/src/home/home.controller.js:104 -#: client/src/home/home.controller.js:223 -#: client/src/home/home.controller.js:233 -#: client/src/home/home.controller.js:242 -#: client/src/home/home.controller.js:29 -#: client/src/home/home.controller.js:43 -#: client/src/home/home.controller.js:78 -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:34 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:37 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:47 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:116 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:126 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:153 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:203 -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:222 -#: client/src/login/loginModal/loginModal.controller.js:143 -#: client/src/management-jobs/card/card.controller.js:122 -#: client/src/management-jobs/card/card.controller.js:28 -#: client/src/management-jobs/card/card.controller.js:58 -#: client/src/organizations/main.js:111 -#: client/src/organizations/main.js:124 -#: client/src/organizations/main.js:139 -#: client/src/projects/add/projects-add.controller.js:120 -#: client/src/projects/edit/projects-edit.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:220 -#: client/src/projects/edit/projects-edit.controller.js:236 -#: client/src/projects/main.js:121 -#: client/src/shared/stateDefinitions.factory.js:230 -#: client/src/templates/main.js:102 -#: client/src/templates/main.js:116 -#: client/src/templates/main.js:132 -#: client/src/templates/main.js:143 -#: client/src/templates/main.js:177 -#: client/src/templates/main.js:194 -#: client/src/templates/main.js:219 -#: client/src/templates/main.js:245 -#: client/src/templates/main.js:257 -#: client/src/templates/main.js:270 -#: client/src/templates/main.js:281 -#: client/src/templates/main.js:295 -#: client/src/templates/main.js:312 -#: client/src/templates/main.js:341 -#: client/src/templates/main.js:355 -#: client/src/templates/main.js:371 -#: client/src/templates/main.js:409 -#: client/src/templates/main.js:423 -#: client/src/templates/main.js:436 -#: client/src/templates/main.js:449 -#: client/src/templates/main.js:473 -#: client/src/templates/main.js:490 -#: client/src/templates/main.js:71 -#: client/src/templates/main.js:88 -#: client/src/users/add/users-add.controller.js:101 -#: client/src/users/edit/users-edit.controller.js:171 -#: client/src/users/list/users-list.controller.js:84 -#: client/src/workflow-results/workflow-results.service.js:57 -#: client/src/workflow-results/workflow-results.service.js:77 -#: client/src/workflow-results/workflow-results.service.js:99 -msgid "Error!" -msgstr "错误!" - -#: client/src/activity-stream/streams.list.js:40 -msgid "Event" -msgstr "事件" - -#: client/src/activity-stream/factories/build-description.factory.js:157 -msgid "Event summary not available" -msgstr "事件摘要不可用" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:190 -#: client/src/scheduler/scheduler.strings.js:29 -msgid "Every" -msgstr "每" - -#: client/src/projects/add/projects-add.controller.js:142 -#: client/src/projects/edit/projects-edit.controller.js:264 -msgid "Example URLs for GIT SCM include:" -msgstr "GIT SCM 的 URL 示例包括:" - -#: client/src/projects/add/projects-add.controller.js:163 -#: client/src/projects/edit/projects-edit.controller.js:284 -msgid "Example URLs for Mercurial SCM include:" -msgstr "Mercurial SCM 的 URL 示例包括:" - -#: client/src/projects/add/projects-add.controller.js:154 -#: client/src/projects/edit/projects-edit.controller.js:275 -msgid "Example URLs for Subversion SCM include:" -msgstr "Subversion SCM 的 URL 示例包括:" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Example: ansible_facts.ansible_distribution:\"RedHat\"" -msgstr "示例:ansible_facts.ansible_distribution:\"RedHat\"" - -#: client/src/projects/projects.form.js:140 -msgid "Examples include:" -msgstr "示例包括::" - -#: client/features/output/output.strings.js:62 -msgid "Execution Node" -msgstr "执行节点" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:65 -msgid "Existing Group" -msgstr "现有组" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:142 -msgid "Existing Host" -msgstr "现有主机" - -#: client/features/output/output.strings.js:23 -#: client/src/workflow-results/workflow-results.controller.js:203 -#: client/src/workflow-results/workflow-results.controller.js:64 -msgid "Expand Output" -msgstr "展开输出" - -#: client/lib/components/components.strings.js:121 -msgid "Expanded" -msgstr "已展开" - -#: client/src/license/license.partial.html:246 -msgid "Expires" -msgstr "过期" - -#: client/lib/services/base-string.service.js:132 -msgid "Expires (Ascending)" -msgstr "过期(升序)" - -#: client/lib/services/base-string.service.js:133 -msgid "Expires (Descending)" -msgstr "过期(降序)" - -#: client/src/license/license.partial.html:39 -msgid "Expires On" -msgstr "过期日" - -#: client/lib/components/components.strings.js:133 -msgid "Expires:" -msgstr "过期:" - -#: client/lib/components/components.strings.js:134 -msgid "Expires: Never" -msgstr "过期:从不" - -#: client/features/output/output.strings.js:71 -#: client/src/workflow-results/workflow-results.controller.js:76 -msgid "Explanation" -msgstr "解释" - -#: client/features/output/output.strings.js:63 -#: client/features/templates/templates.strings.js:64 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:133 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:145 -#: client/src/partials/logviewer.html:8 -#: client/src/scheduler/scheduler.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:480 -#: client/src/templates/job_templates/job-template.form.js:487 -#: client/src/templates/workflows.form.js:136 -#: client/src/templates/workflows.form.js:143 -#: client/src/workflow-results/workflow-results.controller.js:180 -msgid "Extra Variables" -msgstr "额外变量" - -#: client/src/inventories-hosts/shared/ansible-facts/ansible-facts.route.js:7 -msgid "FACTS" -msgstr "事实" - -#: client/features/output/output.strings.js:141 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:59 -msgid "FAILED" -msgstr "失败" - -#: client/features/output/output.strings.js:106 -msgid "FIELDS" -msgstr "字段" - -#: client/src/shared/smart-search/smart-search.partial.html:42 -msgid "FIELDS:" -msgstr "字段:" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "FINISHED" -msgstr "完成" - -#: client/src/inventories-hosts/hosts/host.form.js:103 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:105 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:114 -msgid "Facts" -msgstr "事实" - -#: client/lib/components/components.strings.js:106 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:86 -msgid "Failed" -msgstr "失败" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:44 -msgid "Failed Hosts" -msgstr "失败的主机" - -#: client/src/projects/factories/get-project-path.factory.js:68 -msgid "Failed to access API config. GET status:" -msgstr "访问 API 配置失败。GET 状态:" - -#: client/src/users/add/users-add.controller.js:101 -msgid "Failed to add new user. POST returned status:" -msgstr "添加新用户失败。POST 返回的状态:" - -#: client/src/credentials/factories/credential-form-save.factory.js:78 -msgid "Failed to create new Credential. POST status:" -msgstr "创建新凭证失败。POST 状态:" - -#: client/src/projects/add/projects-add.controller.js:121 -msgid "Failed to create new project. POST returned status:" -msgstr "创建新项目失败。POST 返回的状态:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.route.js:35 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:48 -#: client/src/templates/main.js:144 -#: client/src/templates/main.js:282 -msgid "Failed to get config. GET returned status:" -msgstr "获取配置失败。GET 返回的状态:" - -#: client/src/home/home.controller.js:43 -msgid "Failed to get dashboard graph data:" -msgstr "获取仪表板图形数据失败:" - -#: client/src/home/home.controller.js:29 -msgid "Failed to get dashboard host graph data:" -msgstr "获取仪表板主机图形数据失败:" - -#: client/src/home/home.controller.js:242 -msgid "Failed to get dashboard job templates list:" -msgstr "获取仪表板作业模板列表失败:" - -#: client/src/home/home.controller.js:233 -msgid "Failed to get dashboard jobs list:" -msgstr "获取仪表板作业列表失败:" - -#: client/src/home/home.controller.js:223 -msgid "Failed to get dashboard:" -msgstr "获取仪表板失败:" - -#: client/src/templates/main.js:246 -msgid "Failed to get instance groups. GET returned status:" -msgstr "获取实例组失败。GET 返回的状态:" - -#: client/src/templates/main.js:342 -#: client/src/templates/main.js:410 -#: client/src/templates/main.js:72 -msgid "Failed to get inventory info. GET returned status:" -msgstr "获取清单信息失败。GET 返回的状态:" - -#: client/src/templates/main.js:133 -msgid "Failed to get job template options. OPTIONS returned status:" -msgstr "获取作业模板选项失败。OPTIONS 返回的状态:" - -#: client/src/templates/main.js:178 -msgid "Failed to get job template. GET returned status:" -msgstr "获取作业模板失败。GET 返回的状态:" - -#: client/src/templates/main.js:117 -#: client/src/templates/main.js:258 -#: client/src/templates/main.js:356 -#: client/src/templates/main.js:424 -msgid "Failed to get labels. GET returned status:" -msgstr "获取标签失败。GET 返回的状态:" - -#: client/src/home/home.controller.js:79 -msgid "Failed to get new jobs for dashboard:" -msgstr "为仪表板获取新作业失败:" - -#: client/src/home/home.controller.js:105 -msgid "Failed to get new templates for dashboard:" -msgstr "为仪表板获取新模板失败:" - -#: client/src/organizations/main.js:140 -msgid "Failed to get organizations for which this user is a notification admin. GET returned" -msgstr "获取此用户作为通知管理员的机构失败。GET 返回" - -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.route.js:38 -#: client/src/projects/main.js:122 -#: client/src/templates/main.js:296 -#: client/src/templates/main.js:474 -msgid "Failed to get organizations for which this user is a notification administrator. GET returned" -msgstr "获取此用户作为通知管理员的机构失败。GET 返回" - -#: client/src/templates/main.js:103 -#: client/src/templates/main.js:89 -msgid "Failed to get project info. GET returned status:" -msgstr "获取项目信息失败。GET 返回的状态:" - -#: client/src/templates/main.js:195 -#: client/src/templates/main.js:220 -msgid "Failed to get project. GET returned status:" -msgstr "获取项目失败。GET 返回的状态:" - -#: client/src/templates/main.js:313 -#: client/src/templates/main.js:491 -msgid "Failed to get webhook key GET returned" -msgstr "获取 Webhook 密钥失败 GET 返回" - -#: client/src/templates/main.js:271 -#: client/src/templates/main.js:437 -msgid "Failed to get workflow job template labels. GET returned status:" -msgstr "获取工作流作业模板标签失败。GET 返回的状态:" - -#: client/src/templates/main.js:372 -msgid "Failed to get workflow job template options. OPTIONS returned status:" -msgstr "获取工作流作业模板选项失败。OPTIONS 返回的状态:" - -#: client/src/templates/main.js:450 -msgid "Failed to get workflow job template. GET returned status:" -msgstr "获取工作流作业模板失败。GET 返回的状态:" - -#: client/src/app.js:229 -#: client/src/login/loginModal/loginModal.controller.js:144 -msgid "Failed to get workflow jobs pending approval. GET returned status:" -msgstr "获取等待批准的工作流作业失败。GET 返回的状态:" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:223 -msgid "Failed to retrieve job template extra variables." -msgstr "获取作业模板额外变量失败。" - -#: client/src/projects/edit/projects-edit.controller.js:155 -msgid "Failed to retrieve project: %s. GET status:" -msgstr "检索项目 %s 失败。GET 状态:" - -#: client/src/users/edit/users-edit.controller.js:172 -msgid "Failed to retrieve user: %s. GET status:" -msgstr "检索用户 %s 失败。GET 状态:" - -#: client/src/configuration/forms/settings-form.controller.js:430 -msgid "Failed to save settings. Returned status:" -msgstr "保存设置失败。返回的状态:" - -#: client/src/configuration/forms/settings-form.controller.js:555 -msgid "Failed to save toggle settings. Returned status:" -msgstr "保存切换设置失败。返回的状态:" - -#: client/src/credentials/factories/credential-form-save.factory.js:94 -msgid "Failed to update Credential. PUT status:" -msgstr "更新凭证失败。PUT 状态:" - -#: client/src/projects/edit/projects-edit.controller.js:220 -msgid "Failed to update project: %s. PUT status:" -msgstr "更新项目 %s 失败。PUT 状态:" - -#: client/features/output/output.strings.js:110 -msgid "Failed to update search results." -msgstr "更新搜索结果失败。" - -#: client/src/job-submission/job-submission-factories/launchjob.factory.js:204 -#: client/src/management-jobs/card/card.controller.js:123 -#: client/src/management-jobs/card/card.controller.js:59 -msgid "Failed updating job %s with variables. POST returned: %d" -msgstr "通过变量更新作业 %s 失败。POST 返回:%d" - -#: client/src/organizations/main.js:112 -msgid "Failed while checking to see if user is a notification administrator of this organization. GET returned" -msgstr "在检查用户是否为该机构的通知管理员时失败。GET 返回" - -#: client/src/organizations/main.js:125 -msgid "Failed while checking to see if user is an administrator of this organization. GET returned" -msgstr "在检查用户是否为该机构的管理员时失败。 GET 返回" - -#: client/src/notifications/notifications.list.js:77 -msgid "Failure" -msgstr "失败" - -#: client/src/instance-groups/instance-groups.strings.js:81 -msgid "Field for passing a custom Kubernetes or OpenShift Pod specification." -msgstr "用于传递自定义 Kubernetes 或 OpenShift Pod 规格的字段。" - -#: client/src/scheduler/schedules.list.js:63 -msgid "Final Run" -msgstr "最终运行" - -#: client/lib/services/base-string.service.js:142 -msgid "Finish Time (Ascending)" -msgstr "完成时间(升序)" - -#: client/lib/services/base-string.service.js:143 -msgid "Finish Time (Descending)" -msgstr "完成时间(降序)" - -#: client/features/jobs/jobs.strings.js:10 -#: client/features/output/output.strings.js:52 -#: client/features/output/output.strings.js:64 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:56 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:44 -#: client/src/workflow-results/workflow-results.controller.js:72 -msgid "Finished" -msgstr "完成" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 -#: client/src/teams/teams.form.js:101 -#: client/src/users/users.form.js:29 -#: client/src/users/users.list.js:33 -msgid "First Name" -msgstr "名字" - -#: client/src/scheduler/schedules.list.js:53 -msgid "First Run" -msgstr "首次运行" - -#: client/src/organizations/organizations.form.js:124 -msgid "First name" -msgstr "名字" - -#: client/src/templates/survey-maker/surveys/init.factory.js:19 -msgid "Float" -msgstr "浮点值" - -#: client/features/output/output.strings.js:102 -#: client/src/shared/smart-search/smart-search.partial.html:49 -msgid "For additional information on advanced search syntax please see the Ansible Tower" -msgstr "如需有关高级搜索语法的更多信息,请参阅 Ansible Tower" - -#: client/src/credentials/factories/become-method-change.factory.js:63 -#: client/src/credentials/factories/kind-change.factory.js:119 -msgid "For example, %s" -msgstr "例如:%s" - -#: client/index.template.ejs:113 -msgid "For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept." -msgstr "对于超过指定时间段的已收集事实,请每个时间窗口(频率)保存一份事实扫描(快照)。例如,超过 30 天的事实将被清除,但保留一份每周事实扫描。" - -#: client/src/inventories-hosts/hosts/host.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:34 -msgid "For hosts that are part of an external inventory, this flag may be reset by the inventory sync process." -msgstr "对于作为外部清单一部分的主机,此标记可由清单同步过程重置。" - -#: client/src/inventories-hosts/hosts/host.form.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:35 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:32 -#: client/src/inventories-hosts/inventory-hosts.strings.js:33 -msgid "For hosts that are part of an external inventory, this may be reset by the inventory sync process." -msgstr "对于作为外部清单一部分的主机,此标记可由清单同步过程重置。" - -#: client/features/templates/templates.strings.js:59 -#: client/src/templates/job_templates/job-template.form.js:54 -msgid "For job templates, select run to execute the playbook. Select check to only check playbook syntax, test environment setup, and report problems without executing the playbook." -msgstr "对于作业模板,选择“运行”来执行 playbook。选择“检查”将只检查 playbook 语法、测试环境设置和报告问题,而不执行 playbook。" - -#: client/src/projects/projects.form.js:145 -msgid "For more information, refer to the" -msgstr "有关详情请参阅" - -#: client/features/output/output.strings.js:65 -#: client/src/instance-groups/instance-groups.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:110 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:97 -#: client/src/templates/job_templates/job-template.form.js:162 -#: client/src/templates/job_templates/job-template.form.js:168 -msgid "Forks" -msgstr "分叉" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:179 -#: client/src/scheduler/scheduler.strings.js:28 -msgid "Frequency Details" -msgstr "频率详情" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:454 -#: client/src/scheduler/scheduler.strings.js:41 -msgid "Fri" -msgstr "周五" - -#: client/src/license/license.partial.html:150 -msgid "GET LICENSES" -msgstr "获取许可证" - -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "GO TO NOTIFICATIONS TO" -msgstr "Go TO NOTIFICATIONS TO" - -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.route.js:45 -msgid "GROUPS" -msgstr "组" - -#: client/src/shared/form-generator.js:801 -msgid "Generate field" -msgstr "生成字段" - -#: client/features/projects/projects.strings.js:18 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:28 -#: client/src/projects/edit/projects-edit.controller.js:119 -msgid "Get latest SCM revision" -msgstr "获取最新的 SCM 修订" - -#: client/features/output/output.strings.js:37 -msgid "Get next page" -msgstr "获取下一页" - -#: client/features/output/output.strings.js:38 -msgid "Get previous page" -msgstr "获得上一页" - -#: client/src/credential-types/add/add.controller.js:41 -msgid "Getting Started with Credential Types" -msgstr "凭证类型入门" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:92 -msgid "GitHub" -msgstr "GitHub" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:110 -msgid "GitHub (Default)" -msgstr "GitHub(默认)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:31 -msgid "GitHub Category" -msgstr "GitHub 类别" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:111 -msgid "GitHub Org" -msgstr "GitHub 机构" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:112 -msgid "GitHub Team" -msgstr "GitHub 团队" - -#: client/src/shared/paginate/paginate.partial.html:18 -msgid "Go to current page of list" -msgstr "进入列表的当前页面" - -#: client/features/output/output.strings.js:36 -msgid "Go to first page" -msgstr "前往第一页" - -#: client/features/output/output.strings.js:39 -msgid "Go to last page of available output" -msgstr "前往可用输出的最后一页" - -#: client/src/shared/paginate/paginate.partial.html:28 -msgid "Go to last page of list" -msgstr "进入列表的最后页" - -#: client/src/shared/paginate/paginate.partial.html:22 -msgid "Go to next page of list" -msgstr "进入列表的下一页" - -#: client/src/shared/paginate/paginate.partial.html:6 -msgid "Go to page 1 of list" -msgstr "进入列表的第 1 页" - -#: client/src/shared/paginate/paginate.partial.html:12 -msgid "Go to previous page of list" -msgstr "进入列表的上一个页" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:93 -msgid "Google OAuth2" -msgstr "Google OAuth2" - -#: client/src/notifications/notificationTemplates.form.js:300 -msgid "Grafana API Key" -msgstr "Grafana API 密钥" - -#: client/src/notifications/notificationTemplates.form.js:285 -msgid "Grafana URL" -msgstr "Grafana URL" - -#: client/src/teams/teams.form.js:170 -#: client/src/users/users.form.js:222 -msgid "Grant Permission" -msgstr "授权权限" - -#: client/src/notifications/add/add.controller.js:84 -#: client/src/notifications/edit/edit.controller.js:147 -msgid "Gray" -msgstr "灰色" - -#: client/src/notifications/add/add.controller.js:85 -#: client/src/notifications/edit/edit.controller.js:148 -msgid "Green" -msgstr "绿色" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:51 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:52 -msgid "Group Variables" -msgstr "组变量" - -#: client/src/inventories-hosts/hosts/host.form.js:111 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:89 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:23 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:88 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:22 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:113 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:122 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:38 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:145 -msgid "Groups" -msgstr "组" - -#: client/src/scheduler/scheduler.strings.js:61 -msgid "HH24" -msgstr "HH24" - -#: client/lib/services/base-string.service.js:69 -#: client/src/templates/survey-maker/surveys/init.factory.js:499 -msgid "HIDE" -msgstr "隐藏" - -#: client/lib/components/components.strings.js:44 -msgid "HINT: Drag and drop private file on the field below." -msgstr "提示:在以下字段上拖放专用文件。" - -#: client/src/activity-stream/get-target-title.factory.js:41 -#: client/src/inventories-hosts/hosts/hosts.partial.html:9 -#: client/src/inventories-hosts/hosts/main.js:81 -#: client/src/inventories-hosts/inventories/inventories.partial.html:15 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.route.js:18 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-hosts.route.js:17 -msgid "HOSTS" -msgstr "主机" - -#: client/src/notifications/notificationTemplates.form.js:410 -#: client/src/notifications/notificationTemplates.form.js:411 -msgid "HTTP Headers" -msgstr "HTTP 标头" - -#: client/src/notifications/notificationTemplates.form.js:427 -#: client/src/notifications/notificationTemplates.form.js:428 -msgid "HTTP Method" -msgstr "HTTP 方法" - -#: client/lib/components/components.strings.js:12 -msgid "Hide" -msgstr "隐藏" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "Hide Activity Stream" -msgstr "隐藏活动流" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:23 -msgid "High" -msgstr "高" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:13 -msgid "High Risk" -msgstr "高风险" - -#: client/src/credentials/credentials.form.js:139 -#: client/src/notifications/notificationTemplates.form.js:83 -msgid "Host" -msgstr "主机" - -#: client/src/credentials/factories/become-method-change.factory.js:52 -#: client/src/credentials/factories/kind-change.factory.js:108 -msgid "Host (Authentication URL)" -msgstr "主机(身份验证 URL)" - -#: client/src/templates/job_templates/job-template.form.js:387 -#: client/src/templates/job_templates/job-template.form.js:396 -msgid "Host Config Key" -msgstr "主机配置密钥" - -#: client/src/inventories-hosts/hosts/host.form.js:40 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:39 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:39 -msgid "Host Enabled" -msgstr "主机已启用" - -#: client/features/output/output.strings.js:66 -msgid "Host Limit Error" -msgstr "主机限制错误" - -#: client/src/inventories-hosts/hosts/host.form.js:45 -#: client/src/inventories-hosts/hosts/host.form.js:56 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:44 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:55 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:46 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:57 -msgid "Host Name" -msgstr "主机名" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:78 -msgid "Host Variables" -msgstr "主机变量" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is available" -msgstr "主机可用" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is available. Click to toggle." -msgstr "主机可用。点击即可切换。" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:6 -msgid "Host is not available" -msgstr "主机不可用" - -#: client/src/inventories-hosts/shared/factories/set-enabled-msg.factory.js:10 -msgid "Host is not available. Click to toggle." -msgstr "主机不可用。点击即可切换。" - -#: client/features/output/output.strings.js:13 -msgid "Host status information for this job is unavailable." -msgstr "此作业的主机状态信息不可用。" - -#: client/features/output/output.strings.js:119 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:39 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:98 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:64 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:149 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:155 -msgid "Hosts" -msgstr "主机" - -#: client/src/license/license.partial.html:52 -#: client/src/license/license.partial.html:58 -msgid "Hosts Available" -msgstr "主机可用" - -#: client/src/license/license.partial.html:68 -msgid "Hosts Remaining" -msgstr "剩余主机" - -#: client/src/license/license.partial.html:62 -msgid "Hosts Used" -msgstr "已使用的主机" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "Hosts are imported to" -msgstr "主机已导入到" - -#: client/features/output/output.strings.js:129 -msgid "ID" -msgstr "ID" - -#: client/src/notifications/notificationTemplates.form.js:313 -msgid "ID of the Dashboard (optional)" -msgstr "仪表板 ID(可选)" - -#: client/src/notifications/notificationTemplates.form.js:321 -msgid "ID of the Panel (optional)" -msgstr "面板 ID(可选)" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:14 -msgid "INITIATED BY" -msgstr "启动者" - -#: client/src/inventories-hosts/inventories/insights/insights.route.js:7 -msgid "INSIGHTS" -msgstr "INSIGHTS" - -#: client/src/instance-groups/instance-groups.list.js:6 -#: client/src/instance-groups/instance-groups.list.js:7 -#: client/src/instance-groups/instance-groups.strings.js:10 -#: client/src/instance-groups/instance-groups.strings.js:19 -msgid "INSTANCE GROUPS" -msgstr "实例组" - -#: client/src/instance-groups/instance-groups.strings.js:11 -#: client/src/instance-groups/instance-groups.strings.js:30 -msgid "INSTANCES" -msgstr "实例" - -#: client/src/activity-stream/get-target-title.factory.js:14 -#: client/src/inventories-hosts/hosts/hosts.partial.html:8 -#: client/src/inventories-hosts/inventories/inventories.partial.html:14 -#: client/src/inventories-hosts/inventories/inventories.route.js:8 -#: client/src/inventories-hosts/inventories/inventory.list.js:14 -#: client/src/inventories-hosts/inventories/inventory.list.js:15 -#: client/src/organizations/linkout/organizations-linkout.route.js:138 -#: client/src/organizations/list/organizations-list.controller.js:69 -msgid "INVENTORIES" -msgstr "清单" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:138 -msgid "INVENTORY" -msgstr "清单" - -#: client/src/inventory-scripts/inventory-scripts.form.js:23 -msgid "INVENTORY SCRIPT" -msgstr "清单脚本" - -#: client/src/activity-stream/get-target-title.factory.js:35 -#: client/src/inventory-scripts/inventory-scripts.list.js:12 -#: client/src/inventory-scripts/main.js:65 -msgid "INVENTORY SCRIPTS" -msgstr "清单脚本" - -#: client/src/notifications/notificationTemplates.form.js:524 -msgid "IRC Nick" -msgstr "IRC Nick" - -#: client/src/notifications/notificationTemplates.form.js:513 -msgid "IRC Server Address" -msgstr "IRC 服务器地址" - -#: client/src/notifications/shared/type-change.service.js:72 -msgid "IRC Server Password" -msgstr "IRC 服务器密码" - -#: client/src/notifications/shared/type-change.service.js:71 -msgid "IRC Server Port" -msgstr "IRC 服务器端口" - -#: client/src/instance-groups/instance-groups.strings.js:21 -msgid "ISOLATED" -msgstr "已隔离" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:79 -msgid "ISSUE: {{report.rule.description}}" -msgstr "问题: {{report.rule.description}}" - -#: client/src/shared/paginate/paginate.partial.html:43 -msgid "ITEMS" -msgstr "项" - -#: client/src/notifications/notificationTemplates.form.js:467 -#: client/src/notifications/notificationTemplates.form.js:499 -msgid "Icon URL" -msgstr "图标 URL" - -#: client/src/login/authenticationServices/timer.factory.js:157 -msgid "Idle Session" -msgstr "闲置会话" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "If blank, all groups above are created except" -msgstr "如果为空,会创建以上所有组,除了" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:364 -msgid "If checked, all variables for child groups and hosts will be removed and replaced by those found on the external source." -msgstr "如果选中,子组和主机的所有变量都将被删除,并替换为外部源上的变量。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:353 -msgid "If checked, any hosts and groups that were previously present on the external source but are now removed will be removed from the Tower inventory. Hosts and groups that were not managed by the inventory source will be promoted to the next manually created group or if there is no manually created group to promote them into, they will be left in the \"all\" default group for the inventory." -msgstr "如果选中,以前存在于外部源上的但现已被删除的任何主机和组都将从 Tower 清单中删除。不由清单源管理的主机和组将提升到下一个手动创建的组,如果没有手动创建组来提升它们,则它们将保留在清单的“all”默认组中。" - -#: client/src/templates/job_templates/job-template.form.js:324 -msgid "If enabled, run this playbook as an administrator." -msgstr "如果启用,则以管理员身份运行此 playbook。" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:121 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "如果启用,显示 Ansible 任务所做的更改(在支持的情况下)。这等同于 Ansible’s --diff 模式。" - -#: client/features/templates/templates.strings.js:51 -#: client/src/templates/job_templates/job-template.form.js:309 -msgid "If enabled, show the changes made by Ansible tasks, where supported. This is equivalent to Ansible’s --diff mode." -msgstr "如果启用,显示 Ansible 任务所做的更改(在支持的情况下)。这等同于 Ansible’s --diff 模式。" - -#: client/src/templates/job_templates/job-template.form.js:356 -msgid "If enabled, simultaneous runs of this job template will be allowed." -msgstr "如果启用,将允许同时运行此作业模板。" - -#: client/src/templates/workflows.form.js:160 -msgid "If enabled, simultaneous runs of this workflow job template will be allowed." -msgstr "如果启用,将允许同时运行此工作流作业模板。" - -#: client/src/templates/job_templates/job-template.form.js:366 -msgid "If enabled, use cached facts if available and store discovered facts in the cache." -msgstr "如果启用,则在可用时使用缓存的事实,并在缓存中存储发现的事实。" - -#: client/src/credentials/credentials.form.js:52 -msgid "If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization." -msgstr "如果没有提供机构,则凭证只能供创建凭证的用户使用。机构管理员和系统管理员可以分配一个机构,这样就可将凭证的角色分配给该机构中的用户和团队。" - -#: client/src/license/license.partial.html:74 -msgid "If you are ready to upgrade, please contact us by clicking the button below" -msgstr "如果您准备升级,请点击下面的按钮联系我们。" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:242 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:254 -msgid "Image ID:" -msgstr "镜像 ID:" - -#: client/src/inventories-hosts/hosts/host.form.js:34 -#: client/src/inventories-hosts/hosts/host.list.js:35 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:32 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:33 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:30 -#: client/src/inventories-hosts/inventory-hosts.strings.js:32 -msgid "Indicates if a host is available and should be included in running jobs." -msgstr "指明主机是否可用且应该包含在正在运行的作业中。" - -#: client/src/activity-stream/activity-detail.form.js:31 -#: client/src/activity-stream/streams.list.js:33 -msgid "Initiated by" -msgstr "启动者" - -#: client/src/credential-types/credential-types.form.js:53 -#: client/src/credential-types/credential-types.form.js:61 -msgid "Injector Configuration" -msgstr "注入程序配置" - -#: client/src/credential-types/credential-types.form.js:39 -#: client/src/credential-types/credential-types.form.js:47 -msgid "Input Configuration" -msgstr "输入配置" - -#: client/src/inventories-hosts/hosts/host.form.js:119 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:129 -msgid "Insights" -msgstr "Insights" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:52 -msgid "Insights Credential" -msgstr "Insights 凭证" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:144 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:147 -msgid "Instance Filters" -msgstr "实例过滤器" - -#: client/features/output/output.strings.js:67 -#: client/src/instance-groups/instance-groups.strings.js:43 -msgid "Instance Group" -msgstr "实例组" - -#: client/src/instance-groups/instance-groups.strings.js:71 -msgid "Instance Group parameter is missing." -msgstr "实例组参数缺失。" - -#: client/lib/components/components.strings.js:86 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:54 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:57 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:61 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:64 -#: client/src/organizations/organizations.form.js:38 -#: client/src/organizations/organizations.form.js:41 -#: client/src/templates/job_templates/job-template.form.js:268 -#: client/src/templates/job_templates/job-template.form.js:271 -msgid "Instance Groups" -msgstr "实例组" - -#: client/src/instance-groups/instance-groups.strings.js:37 -msgid "Instance Groups Help" -msgstr "实例组帮助" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:251 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:263 -msgid "Instance ID" -msgstr "实例 ID" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:243 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:255 -msgid "Instance ID:" -msgstr "实例 ID:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:244 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:256 -msgid "Instance Type:" -msgstr "实例类型:" - -#: client/lib/components/components.strings.js:85 -#: client/src/instance-groups/instance-groups.strings.js:20 -msgid "Instances" -msgstr "实例" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "Insufficient Permissions" -msgstr "权限不足" - -#: client/src/templates/survey-maker/surveys/init.factory.js:18 -msgid "Integer" -msgstr "整数" - -#: client/src/license/license.partial.html:11 -msgid "Invalid License" -msgstr "无效许可证" - -#: client/src/license/license.controller.js:109 -#: client/src/license/license.controller.js:117 -msgid "Invalid file format. Please upload valid JSON." -msgstr "无效的文件格式。请上传有效的 JSON。" - -#: client/lib/components/components.strings.js:16 -msgid "Invalid input for this type." -msgstr "对此类型无效的输入。" - -#: client/features/output/output.strings.js:111 -msgid "Invalid search filter provided." -msgstr "提供的搜索过滤器无效。" - -#: client/src/login/loginModal/loginModal.partial.html:46 -msgid "Invalid username and/or password. Please try again." -msgstr "无效的用户名和/或密码。请重试。" - -#: client/lib/components/components.strings.js:77 -#: client/lib/models/models.strings.js:16 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:121 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:52 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/organizations/linkout/organizations-linkout.route.js:147 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "Inventories" -msgstr "清单" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:43 -msgid "Inventories with sources cannot be copied" -msgstr "无法复制含有源的清单" - -#: client/features/jobs/jobs.strings.js:14 -#: client/features/output/output.strings.js:69 -#: client/features/templates/templates.strings.js:19 -#: client/features/templates/templates.strings.js:28 -#: client/src/inventories-hosts/hosts/host.list.js:75 -#: client/src/inventories-hosts/inventories/inventory.list.js:85 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/templates/job_templates/job-template.form.js:66 -#: client/src/templates/job_templates/job-template.form.js:80 -#: client/src/templates/workflows.form.js:72 -#: client/src/templates/workflows.form.js:82 -#: client/src/workflow-results/workflow-results.controller.js:78 -msgid "Inventory" -msgstr "清单" - -#: client/lib/services/base-string.service.js:148 -msgid "Inventory (Ascending)" -msgstr "清单(升序)" - -#: client/lib/services/base-string.service.js:149 -msgid "Inventory (Descending)" -msgstr "清单(降序)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:109 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:123 -msgid "Inventory File" -msgstr "清单文件" - -#: client/src/workflow-results/workflow-results.controller.js:79 -msgid "Inventory Limit" -msgstr "清单限制" - -#: client/lib/components/components.strings.js:82 -#: client/lib/models/models.strings.js:20 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 -msgid "Inventory Scripts" -msgstr "清单脚本" - -#: client/lib/models/models.strings.js:25 -msgid "Inventory Sources" -msgstr "清单源" - -#: client/features/templates/templates.strings.js:118 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:52 -#: client/src/workflow-results/workflow-results.controller.js:99 -msgid "Inventory Sync" -msgstr "清单同步" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:55 -msgid "Inventory Sync Failures" -msgstr "清单同步失败" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:75 -msgid "Inventory Variables" -msgstr "清单变量" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:72 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:67 -msgid "Inventory contains 0 hosts." -msgstr "清单包含 0 个主机。" - -#: client/features/output/output.strings.js:47 -msgid "Isolated" -msgstr "已隔离" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "JOB ID" -msgstr "作业 ID" - -#: client/features/output/output.strings.js:109 -msgid "JOB IS STILL RUNNING" -msgstr "作业仍然在运行" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:4 -msgid "JOB STATUS" -msgstr "作业状态" - -#: client/src/templates/job_templates/job-template.form.js:22 -msgid "JOB TEMPLATE" -msgstr "作业模板" - -#: client/features/portalMode/portalMode.strings.js:8 -#: client/features/templates/routes/organizationsTemplatesList.route.js:28 -#: client/features/templates/routes/projectsTemplatesList.route.js:29 -#: client/src/organizations/list/organizations-list.controller.js:83 -msgid "JOB TEMPLATES" -msgstr "作业模板" - -#: client/features/jobs/jobs.strings.js:8 -#: client/features/jobs/routes/instanceGroupJobs.route.js:13 -#: client/features/jobs/routes/instanceGroupJobs.route.js:75 -#: client/features/jobs/routes/instanceJobs.route.js:13 -#: client/features/jobs/routes/inventoryCompletedJobs.route.js:29 -#: client/features/jobs/routes/jobs.route.js:12 -#: client/features/portalMode/portalMode.strings.js:9 -#: client/src/activity-stream/get-target-title.factory.js:32 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:115 -#: client/src/instance-groups/instance-groups.strings.js:31 -msgid "JOBS" -msgstr "作业" - -#: client/lib/components/code-mirror/code-mirror.strings.js:14 -#: client/lib/services/base-string.service.js:73 -msgid "JSON" -msgstr "JSON" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:197 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:221 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:245 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:320 -msgid "JSON:" -msgstr "JSON:" - -#: client/features/jobs/jobs.strings.js:19 -#: client/src/workflow-results/workflow-results.controller.js:118 -msgid "Job" -msgstr "作业" - -#: client/src/workflow-results/workflow-results.route.js:32 -msgid "Job Not Found" -msgstr "未找到作业" - -#: client/src/templates/job_templates/job-template.form.js:277 -msgid "Job Slicing" -msgstr "作业分片" - -#: client/features/output/output.strings.js:72 -#: client/features/templates/templates.strings.js:54 -#: client/src/templates/job_templates/job-template.form.js:206 -#: client/src/templates/job_templates/job-template.form.js:213 -msgid "Job Tags" -msgstr "作业标签" - -#: client/features/jobs/jobs.strings.js:13 -#: client/features/output/output.strings.js:73 -#: client/features/templates/templates.strings.js:116 -#: client/features/templates/templates.strings.js:13 -#: client/src/templates/templates.list.js:61 -msgid "Job Template" -msgstr "作业模板" - -#: client/lib/models/models.strings.js:30 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:102 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:36 -#: client/src/projects/projects.form.js:334 -msgid "Job Templates" -msgstr "作业模板" - -#: client/features/output/output.strings.js:75 -#: client/features/templates/templates.strings.js:58 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:35 -#: client/src/templates/job_templates/job-template.form.js:47 -#: client/src/templates/job_templates/job-template.form.js:55 -msgid "Job Type" -msgstr "作业类型" - -#: client/src/workflow-results/workflow-results.service.js:100 -msgid "Job has completed. Unable to be canceled." -msgstr "作业已完成。无法取消。" - -#: client/features/output/output.strings.js:30 -msgid "Job is one of several from a JT that slices on inventory" -msgstr "作业是来自于清单上 JT 的几个分片之一" - -#: client/features/jobs/jobs.strings.js:20 -msgid "Job {{status}}. Click for details." -msgstr "作业 {{status}}。点击了解详情。" - -#: client/features/templates/templates.strings.js:125 -#: client/lib/components/components.strings.js:71 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 -#: client/src/configuration/settings.partial.html:5 -#: client/src/instance-groups/instance-groups.strings.js:60 -msgid "Jobs" -msgstr "作业" - -#: client/features/output/output.strings.js:107 -#: client/features/templates/templates.strings.js:111 -#: client/src/workflow-results/workflow-results.controller.js:101 -msgid "KEY" -msgstr "密钥" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:61 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:153 -#: client/src/shared/smart-search/smart-search.partial.html:14 -msgid "Key" -msgstr "密钥" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:245 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:257 -msgid "Key Name:" -msgstr "密钥名称:" - -#: client/src/credential-types/credential-types.list.js:31 -#: client/src/credentials/credentials.list.js:33 -msgid "Kind" -msgstr "种类" - -#: client/features/applications/applications.strings.js:31 -#: client/features/projects/projects.strings.js:12 -msgid "LAST MODIFIED" -msgstr "最后修改" - -#: client/features/projects/projects.strings.js:13 -#: client/features/users/tokens/tokens.strings.js:38 -msgid "LAST USED" -msgstr "最后使用" - -#: client/features/templates/templates.strings.js:34 -#: client/lib/components/components.strings.js:112 -msgid "LAUNCH" -msgstr "启动" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:94 -msgid "LDAP" -msgstr "LDAP" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:102 -msgid "LDAP 1 (Optional)" -msgstr "LDAP 1(可选)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:103 -msgid "LDAP 2 (Optional)" -msgstr "LDAP 2(可选)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:104 -msgid "LDAP 3 (Optional)" -msgstr "LDAP 3(可选)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:105 -msgid "LDAP 4 (Optional)" -msgstr "LDAP 4(可选)" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:106 -msgid "LDAP 5 (Optional)" -msgstr "LDAP 5(可选)" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:18 -msgid "LDAP Server" -msgstr "LDAP 服务器" - -#: client/src/license/license.route.js:18 -msgid "LICENSE" -msgstr "许可证" - -#: client/features/output/output.strings.js:76 -#: client/src/templates/job_templates/job-template.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:244 -#: client/src/templates/templates.list.js:43 -#: client/src/templates/workflows.form.js:121 -#: client/src/templates/workflows.form.js:125 -#: client/src/workflow-results/workflow-results.controller.js:73 -msgid "Labels" -msgstr "标签" - -#: client/features/templates/templates.strings.js:22 -msgid "Last Modified" -msgstr "最后修改" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 -#: client/src/teams/teams.form.js:105 -#: client/src/users/users.form.js:35 -#: client/src/users/users.list.js:37 -msgid "Last Name" -msgstr "姓氏" - -#: client/features/templates/templates.strings.js:23 -msgid "Last Ran" -msgstr "最后运行" - -#: client/lib/services/base-string.service.js:134 -msgid "Last Run (Ascending)" -msgstr "最后运行(升序)" - -#: client/lib/services/base-string.service.js:135 -msgid "Last Run (Descending)" -msgstr "最后运行(降序)" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:56 -msgid "Last Sync" -msgstr "最后同步" - -#: client/src/projects/projects.list.js:62 -msgid "Last Updated" -msgstr "最后更新" - -#: client/lib/services/base-string.service.js:136 -msgid "Last Used (Ascending)" -msgstr "最后使用(升序)" - -#: client/lib/services/base-string.service.js:137 -msgid "Last Used (Descending)" -msgstr "最后使用(降序)" - -#: client/src/shared/form-generator.js:1402 -msgid "Last logged in:" -msgstr "最后登录:" - -#: client/src/organizations/organizations.form.js:128 -msgid "Last name" -msgstr "姓氏" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:33 -#: client/src/shared/form-generator.js:1660 -msgid "Launch" -msgstr "启动" - -#: client/src/job-submission/job-submission-factories/create-launch-dialog.factory.js:49 -msgid "Launch Configuration" -msgstr "启动配置" - -#: client/src/management-jobs/card/card.partial.html:21 -#: client/src/management-jobs/card/card.partial.html:24 -msgid "Launch Management Job" -msgstr "启动管理作业" - -#: client/features/jobs/jobs.strings.js:12 -#: client/features/output/output.strings.js:77 -#: client/src/workflow-results/workflow-results.controller.js:70 -msgid "Launched By" -msgstr "启动者" - -#: client/lib/services/base-string.service.js:146 -msgid "Launched By (Ascending)" -msgstr "启动者(升序)" - -#: client/lib/services/base-string.service.js:147 -msgid "Launched By (Descending)" -msgstr "启动者(降序)" - -#: client/features/templates/templates.strings.js:42 -msgid "Launching this job requires the passwords listed below. Enter each password before continuing." -msgstr "启动此作业需要以下列出的密码。请在继续前输入每个密码。" - -#: client/features/users/tokens/tokens.strings.js:32 -msgid "Leaving this field blank will result in the creation of a Personal Access Token which is not linked to an Application." -msgstr "将此字段留空将创建一个未链接到应用的个人访问令牌。" - -#: client/features/credentials/legacy.credentials.js:350 -msgid "Legacy state configuration for does not exist" -msgstr "旧状态配置不存在" - -#: client/lib/components/components.strings.js:98 -#: client/src/configuration/settings.partial.html:14 -#: client/src/license/license.controller.js:47 -#: client/src/license/license.partial.html:109 -#: client/src/license/license.partial.html:8 -msgid "License" -msgstr "许可证" - -#: client/features/output/output.strings.js:78 -msgid "License Error" -msgstr "许可证错误" - -#: client/src/license/license.partial.html:33 -msgid "License Key" -msgstr "许可证密钥" - -#: client/src/license/license.controller.js:49 -msgid "License Management" -msgstr "许可证管理" - -#: client/src/license/license.partial.html:21 -msgid "License Type" -msgstr "许可证类型" - -#: client/features/output/output.strings.js:79 -#: client/features/templates/templates.strings.js:56 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:45 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:55 -#: client/src/templates/job_templates/job-template.form.js:175 -#: client/src/templates/job_templates/job-template.form.js:179 -#: client/src/templates/workflows.form.js:93 -#: client/src/templates/workflows.form.js:97 -msgid "Limit" -msgstr "限制" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:255 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:268 -msgid "Limit to hosts having a tag:" -msgstr "限制为具有标签的主机:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:257 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:270 -msgid "Limit to hosts using either key pair:" -msgstr "限制为使用任意密钥对主机:" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "Limit to hosts where the Name tag begins with" -msgstr "限制为特定的主机,其 Name 标签开头为" - -#: client/src/scheduler/scheduler.strings.js:51 -msgid "Limited to first 10" -msgstr "限制为前 10" - -#: client/src/shared/socket/socket.service.js:225 -msgid "Live events: attempting to connect to the server." -msgstr "实时事件:正在尝试连接到服务器。" - -#: client/src/shared/socket/socket.service.js:229 -msgid "Live events: connected. Pages containing job status information will automatically update in real-time." -msgstr "实时事件:已连接。包含作业状态信息的页面将实时自动更新。" - -#: client/src/shared/socket/socket.service.js:233 -msgid "Live events: error connecting to the server." -msgstr "实时事件:连接到服务器时出错。" - -#: client/src/shared/form-generator.js:1935 -msgid "Loading..." -msgstr "正在加载..." - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:136 -#: client/src/scheduler/scheduler.strings.js:26 -msgid "Local Time Zone" -msgstr "本地时区" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:588 -msgid "Local time" -msgstr "本地时间" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:228 -msgid "Log aggregator test failed.
Detail:" -msgstr "日志聚合器测试失败。
详情:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:218 -msgid "Log aggregator test sent successfully." -msgstr "日志聚合器测试发送成功。" - -#: client/lib/components/components.strings.js:67 -msgid "Logged in as" -msgstr "登录身份" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:85 -msgid "Logging" -msgstr "日志记录" - -#: client/lib/components/components.strings.js:69 -#: client/lib/components/layout/layout.partial.html:39 -msgid "Logout" -msgstr "退出" - -#: client/src/shared/form-generator.js:1258 -msgid "Lookup field" -msgstr "Lookup 字段" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:35 -msgid "Low" -msgstr "低" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:15 -msgid "Low Risk" -msgstr "低风险" - -#: client/src/management-jobs/card/card.partial.html:6 -#: client/src/management-jobs/card/card.route.js:19 -msgid "MANAGEMENT JOBS" -msgstr "管理作业" - -#: client/src/instance-groups/instance-groups.strings.js:18 -msgid "MANUAL" -msgstr "手动" - -#: client/features/credentials/credentials.strings.js:32 -msgid "METADATA" -msgstr "元数据" - -#: client/src/scheduler/scheduler.strings.js:62 -msgid "MM" -msgstr "MM" - -#: client/features/output/output.strings.js:132 -msgid "MODULE" -msgstr "模块" - -#: client/features/portalMode/routes/portalModeTemplatesList.route.js:13 -msgid "MY VIEW" -msgstr "我的视图" - -#: client/src/credentials/credentials.form.js:67 -msgid "Machine" -msgstr "机器" - -#: client/features/output/output.strings.js:80 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:60 -msgid "Machine Credential" -msgstr "机器凭证" - -#: client/src/license/license.partial.html:240 -msgid "Managed Nodes" -msgstr "受管的节点" - -#: client/lib/components/components.strings.js:84 -msgid "Management Jobs" -msgstr "管理作业" - -#: client/features/projects/projects.strings.js:20 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:45 -#: client/src/projects/edit/projects-edit.controller.js:126 -msgid "Manual projects do not require an SCM update" -msgstr "手动项目不需要 SCM 更新" - -#: client/src/templates/job_templates/job-template.form.js:250 -#: client/src/templates/workflows.form.js:131 -msgid "Max 512 characters per label." -msgstr "每个标签最多 512 个字符。" - -#: client/src/organizations/organizations.form.js:59 -#: client/src/organizations/organizations.form.js:66 -msgid "Max Hosts" -msgstr "最大主机数" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:161 -msgid "Maximum" -msgstr "最大值" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:119 -#: client/src/templates/survey-maker/shared/question-definition.form.js:140 -#: client/src/templates/survey-maker/shared/question-definition.form.js:98 -msgid "Maximum Length" -msgstr "最大长度" - -#: client/src/login/loginModal/loginModal.partial.html:40 -msgid "Maximum per-user sessions reached. Please sign in." -msgstr "已到达每位用户的最多会话数。请登录。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:181 -msgid "Maximum<" -msgstr "最大值<" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:29 -msgid "Medium" -msgstr "中" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:14 -msgid "Medium Risk" -msgstr "中度风险" - -#: client/src/shared/stateDefinitions.factory.js:607 -msgid "Member" -msgstr "成员" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:156 -#: client/src/templates/survey-maker/shared/question-definition.form.js:176 -msgid "Minimum" -msgstr "最小值" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:113 -#: client/src/templates/survey-maker/shared/question-definition.form.js:134 -#: client/src/templates/survey-maker/shared/question-definition.form.js:92 -msgid "Minimum Length" -msgstr "最小长度" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:83 -msgid "Misc. System" -msgstr "其他系统" - -#: client/src/templates/workflows.form.js:35 -msgid "Missing Job Templates found in the Workflow Editor" -msgstr "在 Workflow Editor 中找到缺少的作业模板" - -#: client/lib/services/base-string.service.js:130 -msgid "Modified (Ascending)" -msgstr "已修改(升序)" - -#: client/lib/services/base-string.service.js:131 -msgid "Modified (Descending)" -msgstr "已修改(降序)" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:22 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:30 -msgid "Module" -msgstr "模块" - -#: client/features/output/output.strings.js:81 -msgid "Module Args" -msgstr "模块参数" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:414 -#: client/src/scheduler/scheduler.strings.js:37 -msgid "Mon" -msgstr "周一" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:25 -msgid "Most recent job failed. Click to view jobs." -msgstr "最新作业失败。点击以查看作业。" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:29 -msgid "Most recent job successful. Click to view jobs." -msgstr "最新作业成功。点击以查看作业。" - -#: client/src/templates/survey-maker/surveys/init.factory.js:17 -msgid "Multiple Choice (multiple select)" -msgstr "多项选择(多选)" - -#: client/src/templates/survey-maker/surveys/init.factory.js:16 -msgid "Multiple Choice (single select)" -msgstr "多项选择(单选)" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:77 -msgid "Multiple Choice Options" -msgstr "多项选择选项" - -#: client/features/portalMode/index.view.html:26 -msgid "My Jobs" -msgstr "我的作业" - -#: client/lib/components/components.strings.js:73 -msgid "My View" -msgstr "我的视图" - -#: client/features/applications/applications.strings.js:24 -msgid "NAME" -msgstr "名称" - -#: client/features/applications/applications.strings.js:20 -msgid "NEW APPLICATION" -msgstr "新应用" - -#: client/features/credentials/credentials.strings.js:40 -msgid "NEW CREDENTIAL" -msgstr "新凭证" - -#: client/src/credential-types/credential-types.form.js:16 -msgid "NEW CREDENTIAL TYPE" -msgstr "新凭证类型" - -#: client/src/inventory-scripts/inventory-scripts.form.js:16 -msgid "NEW CUSTOM INVENTORY" -msgstr "新自定义清单" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:17 -msgid "NEW INVENTORY" -msgstr "新清单" - -#: client/src/templates/job_templates/job-template.form.js:19 -msgid "NEW JOB TEMPLATE" -msgstr "新作业模板" - -#: client/src/notifications/notificationTemplates.form.js:16 -msgid "NEW NOTIFICATION TEMPLATE" -msgstr "新通知模板" - -#: client/src/organizations/organizations.form.js:18 -msgid "NEW ORGANIZATION" -msgstr "新机构" - -#: client/src/projects/projects.form.js:17 -msgid "NEW PROJECT" -msgstr "新项目" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:10 -msgid "NEW SMART INVENTORY" -msgstr "新智能清单" - -#: client/src/teams/teams.form.js:16 -msgid "NEW TEAM" -msgstr "新团队" - -#: client/src/users/users.form.js:16 -msgid "NEW USER" -msgstr "新用户" - -#: client/src/templates/workflows.form.js:17 -msgid "NEW WORKFLOW JOB TEMPLATE" -msgstr "新工作流作业模板" - -#: client/lib/services/base-string.service.js:67 -msgid "NEXT" -msgstr "下一步" - -#: client/src/inventories-hosts/hosts/hosts.partial.html:38 -msgid "NO HOSTS HAVE BEEN CREATED" -msgstr "尚未创建主机" - -#: client/features/output/output.strings.js:142 -msgid "NO JOBS FINISHED" -msgstr "没有完成的作业" - -#: client/lib/components/components.strings.js:40 -msgid "NO OPTIONS AVAILABLE" -msgstr "没有可用的选项" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:117 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:120 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:123 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:127 -msgid "NONE SELECTED" -msgstr "无选定项" - -#: client/src/projects/projects.form.js:139 -msgid "NOTE: This field assumes the remote name is \"origin\"." -msgstr "注意:该字段假设远程名称为“origin”。" - -#: client/src/login/loginModal/loginModal.partial.html:101 -msgid "NOTICE" -msgstr "通知" - -#: client/src/notifications/notificationTemplates.form.js:21 -msgid "NOTIFICATION TEMPLATE" -msgstr "通知模板" - -#: client/src/activity-stream/get-target-title.factory.js:26 -#: client/src/notifications/notificationTemplates.list.js:14 -msgid "NOTIFICATION TEMPLATES" -msgstr "通知模板" - -#: client/lib/components/components.strings.js:131 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-notifications.route.js:9 -#: client/src/management-jobs/notifications/notification.route.js:46 -#: client/src/notifications/main.js:44 -#: client/src/notifications/main.js:95 -#: client/src/notifications/notification-templates-list/add-notifications-action.partial.html:2 -msgid "NOTIFICATIONS" -msgstr "通知" - -#: client/features/output/output.strings.js:82 -#: client/src/credential-types/credential-types.form.js:27 -#: client/src/credential-types/credential-types.list.js:24 -#: client/src/credentials/credentials.form.js:32 -#: client/src/credentials/credentials.list.js:26 -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:15 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:15 -#: client/src/instance-groups/instance-groups.list.js:15 -#: client/src/inventories-hosts/hosts/host.list.js:68 -#: client/src/inventories-hosts/inventories/inventory.list.js:52 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:33 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:37 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:21 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:28 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:45 -#: client/src/inventory-scripts/inventory-scripts.form.js:28 -#: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 -#: client/src/notifications/notificationTemplates.form.js:32 -#: client/src/notifications/notificationTemplates.list.js:37 -#: client/src/notifications/notifications.list.js:27 -#: client/src/organizations/organizations.form.js:26 -#: client/src/projects/projects.form.js:30 -#: client/src/projects/projects.list.js:43 -#: client/src/scheduler/scheduled-jobs.list.js:36 -#: client/src/scheduler/scheduler.strings.js:21 -#: client/src/scheduler/schedules.list.js:48 -#: client/src/teams/teams.form.js:135 -#: client/src/teams/teams.form.js:28 -#: client/src/teams/teams.list.js:23 -#: client/src/templates/job_templates/job-template.form.js:34 -#: client/src/templates/templates.list.js:24 -#: client/src/templates/workflows.form.js:42 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:119 -#: client/src/users/users.form.js:143 -#: client/src/users/users.form.js:171 -#: client/src/users/users.form.js:199 -msgid "Name" -msgstr "名称" - -#: client/lib/services/base-string.service.js:126 -msgid "Name (Ascending)" -msgstr "名称(升序)" - -#: client/lib/services/base-string.service.js:127 -msgid "Name (Descending)" -msgstr "名称(降序)" - -#: client/lib/components/layout/layout.partial.html:4 -msgid "Navigate to dashboard" -msgstr "导航到仪表板" - -#: client/features/output/details.partial.html:244 -msgid "Navigate to inventory sync job" -msgstr "导航到清单同步作业" - -#: client/features/output/details.partial.html:212 -msgid "Navigate to project sync job" -msgstr "导航到项目同步作业" - -#: client/features/output/details.partial.html:164 -msgid "Navigate to workflow job" -msgstr "导航到工作流作业" - -#: client/src/credentials/credentials.form.js:71 -msgid "Network" -msgstr "网络" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:70 -msgid "New Group" -msgstr "新组" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:147 -msgid "New Host" -msgstr "新主机" - -#: client/src/users/add/users-add.controller.js:93 -msgid "New user successfully created!" -msgstr "新用户已成功创建!" - -#: client/src/scheduler/scheduled-jobs.list.js:56 -#: client/src/scheduler/schedules.list.js:58 -msgid "Next Run" -msgstr "下次运行" - -#: client/src/credentials/credentials.list.js:21 -msgid "No Credentials Have Been Created" -msgstr "尚未创建凭证" - -#: client/features/templates/templates.strings.js:74 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:15 -msgid "No Credentials Matching This Type Have Been Created" -msgstr "尚未创建与此类型匹配的凭证" - -#: client/features/output/host-event/host-event-codemirror.partial.html:3 -msgid "No JSON data returned by the module" -msgstr "没有此模块返回的 JSON 数据" - -#: client/src/license/license.controller.js:158 -msgid "No Licenses Found" -msgstr "未找到许可证" - -#: client/src/projects/projects.list.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:64 -msgid "No Projects Have Been Created" -msgstr "尚未创建项目" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:50 -msgid "No Remediation Playbook Available" -msgstr "没有可用的修复 Playbook" - -#: client/features/projects/projects.strings.js:32 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "No SCM Configuration" -msgstr "没有 SCM 配置" - -#: client/features/projects/projects.strings.js:38 -#: client/src/projects/factories/get-project-tool-tip.factory.js:9 -msgid "No SCM updates have run for this project" -msgstr "没有为此项目运行 SCM 更新" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:17 -msgid "No Teams exist" -msgstr "不存在团队" - -#: client/features/projects/projects.strings.js:29 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "No Updates Available" -msgstr "没有可用的更新" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:18 -msgid "No Users to add" -msgstr "没有要添加的用户" - -#: client/features/credentials/credentials.strings.js:36 -msgid "No credential selected" -msgstr "没有选择凭证" - -#: client/features/templates/templates.strings.js:37 -msgid "No credentials selected" -msgstr "没有选择凭证" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:63 -msgid "No data is available. There are no issues to report." -msgstr "没有数据可用。没有问题可报告。" - -#: client/features/credentials/credentials.strings.js:34 -msgid "No external credentials available." -msgstr "没有可用的外部凭证。" - -#: client/src/license/license.controller.js:44 -msgid "No file selected." -msgstr "没有选择文件。" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.controller.js:48 -msgid "No groups to add" -msgstr "没有要添加的组" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.controller.js:45 -msgid "No hosts to add" -msgstr "没有要添加的主机" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:68 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:64 -msgid "No hosts with failures. Click for details." -msgstr "没有失败的主机。点击了解详情。" - -#: client/features/templates/templates.strings.js:38 -msgid "No inventory selected" -msgstr "没有选择清单" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:51 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:52 -msgid "No inventory sync failures. Click for details." -msgstr "没有清单同步失败。点击了解详情。" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:16 -msgid "No job data" -msgstr "没有作业数据" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:75 -msgid "No job data available." -msgstr "没有可用作业数据。" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:54 -msgid "No job templates were recently used." -msgstr "最近没有使用作业模板。" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:51 -msgid "No jobs were recently run." -msgstr "最近没有运行作业。" - -#: client/src/teams/teams.form.js:132 -#: client/src/users/users.form.js:196 -msgid "No permissions have been granted" -msgstr "未授予权限" - -#: client/features/templates/templates.strings.js:147 -msgid "No promptable values were provided when this node was created." -msgstr "创建此节点时未提供可提示值。" - -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:17 -msgid "No recent job data available for this host." -msgstr "没有可用于此主机的最近作业数据。" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:98 -msgid "No recent job data available for this inventory." -msgstr "没有可用于此清单的最近作业数据。" - -#: client/src/notifications/notification-templates-list/list.controller.js:86 -msgid "No recent notifications." -msgstr "没有最近的通知。" - -#: client/features/credentials/credentials.strings.js:33 -#: client/src/inventories-hosts/hosts/hosts.partial.html:36 -#: client/src/shared/form-generator.js:1833 -#: client/src/shared/list-generator/list-generator.factory.js:240 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:25 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:62 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:92 -msgid "No records matched your search." -msgstr "没有与搜索匹配的记录。" - -#: client/features/output/output.strings.js:133 -msgid "No result found" -msgstr "未找到结果" - -#: client/src/scheduler/scheduled-jobs.list.js:16 -msgid "No schedules exist" -msgstr "不存在计划" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:71 -msgid "No sync data" -msgstr "没有同步数据" - -#: client/src/organizations/linkout/addUsers/addUsers.controller.js:60 -msgid "No users available to add as adminstrators" -msgstr "没有可作为管理员添加的用户" - -#: client/src/users/add/users-add.controller.js:10 -#: client/src/users/edit/users-edit.controller.js:10 -#: client/src/users/list/users-list.controller.js:10 -msgid "Normal User" -msgstr "普通用户" - -#: client/features/output/output.strings.js:48 -#: client/src/workflow-results/workflow-results.controller.js:84 -msgid "Not Finished" -msgstr "未完成" - -#: client/features/output/output.strings.js:49 -#: client/src/workflow-results/workflow-results.controller.js:85 -msgid "Not Started" -msgstr "未启动" - -#: client/features/projects/projects.strings.js:37 -msgid "Not configured for SCM" -msgstr "没有为 SCM 配置" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:58 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:56 -msgid "Not configured for inventory sync." -msgstr "没有为清单同步配置。" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:26 -msgid "Note that only hosts directly in this group can be disassociated. Hosts in sub-groups must be disassociated directly from the sub-group level that they belong." -msgstr "请注意,只有直接属于此组的主机才能解除关联。子组中的主机必须与其所属的子组级别直接解除关联。" - -#: client/src/notifications/notificationTemplates.form.js:371 -#: client/src/notifications/notificationTemplates.form.js:372 -#: client/src/notifications/notificationTemplates.form.js:568 -#: client/src/notifications/notificationTemplates.form.js:569 -msgid "Notification Color" -msgstr "通知颜色" - -#: client/src/notifications/notification-templates-list/list.controller.js:140 -msgid "Notification Failed." -msgstr "通知失败。" - -#: client/src/notifications/notificationTemplates.form.js:360 -msgid "Notification Label" -msgstr "通知标签" - -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 -msgid "Notification Templates" -msgstr "通知模板" - -#: client/src/notifications/notification-templates-list/list.controller.js:157 -msgid "Notification timed out." -msgstr "通知超时。" - -#: client/lib/components/components.strings.js:83 -#: client/src/management-jobs/notifications/notification.route.js:21 -#: client/src/notifications/notifications.list.js:17 -msgid "Notifications" -msgstr "通知" - -#: client/src/notifications/notificationTemplates.form.js:385 -msgid "Notify Channel" -msgstr "通知频道" - -#: client/lib/services/base-string.service.js:71 -msgid "OFF" -msgstr "关" - -#: client/index.template.ejs:71 -#: client/lib/services/base-string.service.js:65 -#: client/src/standard-out/standard-out-factories/delete-job.factory.js:116 -msgid "OK" -msgstr "确定" - -#: client/lib/services/base-string.service.js:70 -msgid "ON" -msgstr "开" - -#: client/lib/components/components.strings.js:10 -msgid "OPTIONS" -msgstr "选项" - -#: client/src/license/license.partial.html:121 -msgid "OR" -msgstr "或者" - -#: client/features/applications/applications.strings.js:30 -msgid "ORG" -msgstr "机构" - -#: client/features/projects/projects.strings.js:11 -msgid "ORGANIZATION" -msgstr "机构" - -#: client/src/activity-stream/get-target-title.factory.js:29 -#: client/src/organizations/list/organizations-list.partial.html:6 -#: client/src/organizations/main.js:51 -msgid "ORGANIZATIONS" -msgstr "机构" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:507 -msgid "Occurrence(s)" -msgstr "发生次数" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:567 -#: client/src/scheduler/scheduler.strings.js:45 -msgid "Occurrences" -msgstr "发生次数" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:396 -msgid "On Days" -msgstr "日期" - -#: client/features/templates/templates.strings.js:113 -#: client/src/workflow-results/workflow-results.controller.js:96 -msgid "On Failure" -msgstr "失败时" - -#: client/features/templates/templates.strings.js:112 -#: client/src/workflow-results/workflow-results.controller.js:95 -msgid "On Success" -msgstr "成功时" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:156 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:161 -msgid "Only Group By" -msgstr "唯一分组标准" - -#: client/src/templates/job_templates/multi-credential/multi-credential.partial.html:4 -msgid "Open credential lookup" -msgstr "打开凭证查询" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:42 -msgid "Open host filter" -msgstr "打开主机过滤器" - -#: client/src/shared/instance-groups-multiselect/instance-groups.partial.html:3 -msgid "Open instance groups" -msgstr "打开实例组" - -#: client/src/templates/job_templates/webhook-credential/webhook-credential-input.partial.html:4 -msgid "Open webhook credential lookup" -msgstr "选择 webhook 凭证查询" - -#: client/src/credentials/credentials.form.js:378 -msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" -msgstr "OpenStack 域定义了管理边界。只有 Keystone v3 身份验证 URL 需要域。常见的情景包括:" - -#: client/src/templates/job_templates/job-template.form.js:246 -#: client/src/templates/workflows.form.js:127 -msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs." -msgstr "描述此作业模板的可选标签,如 'dev' 或 'test'。标签可用于对作业模板和完成的作业进行分组和过滤。" - -#: client/src/templates/job_templates/job-template.form.js:472 -msgid "Optionally, select the credential to use to send status updates back to the webhook service" -msgstr "(可选)选择要用来向 Webhook 服务发回状态更新的凭证" - -#: client/src/templates/workflows.form.js:245 -msgid "Optionally, select the credential to use to send status updates back to the webhook service." -msgstr "(可选)选择要用来向 Webhook 服务发回状态更新的凭证。" - -#: client/src/partials/logviewer.html:7 -#: client/src/templates/job_templates/job-template.form.js:317 -#: client/src/templates/workflows.form.js:153 -msgid "Options" -msgstr "选项" - -#: client/features/applications/add-applications.controller.js:31 -#: client/features/templates/templates.strings.js:16 -#: client/src/credentials/credentials.form.js:46 -#: client/src/credentials/credentials.form.js:53 -#: client/src/inventories-hosts/inventories/inventory.list.js:65 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:33 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:40 -#: client/src/inventory-scripts/inventory-scripts.list.js:27 -#: client/src/notifications/notificationTemplates.form.js:44 -#: client/src/projects/projects.form.js:42 -#: client/src/projects/projects.form.js:48 -#: client/src/teams/teams.form.js:40 -#: client/src/teams/teams.list.js:30 -#: client/src/templates/workflows.form.js:55 -#: client/src/templates/workflows.form.js:61 -#: client/src/users/users.form.js:41 -msgid "Organization" -msgstr "机构" - -#: client/lib/services/base-string.service.js:152 -msgid "Organization (Ascending)" -msgstr "机构(升序)" - -#: client/lib/services/base-string.service.js:153 -msgid "Organization (Descending)" -msgstr "机构(降序)" - -#: client/lib/components/components.strings.js:79 -#: client/lib/models/models.strings.js:35 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:135 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:64 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 -#: client/src/users/users.form.js:133 -msgid "Organizations" -msgstr "机构" - -#: client/features/templates/templates.strings.js:31 -msgid "Other Prompts" -msgstr "其他提示" - -#: client/src/credentials/credentials.form.js:79 -msgid "Others (Cloud Providers)" -msgstr "其他(云提供商)" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:316 -msgid "Override variables found in azure_rm.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "覆盖 azure_rm.ini 中由清单更新脚本使用的变量。有关这些变量的详细描述" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:282 -msgid "" -"Override variables found in cloudforms.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view cloudforms.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "覆盖 cloudforms.ini 中由清单更新脚本使用的变量。一个变量配置示例包括在\n" -" \n" -" Ansible github repo 的 cloudforms.ini 中。 使用 JSON 或 YAML 格式输入清单变量。通过单选按钮可以切换这两个格式。详情请参阅 Ansible Tower 的相关文档。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:217 -msgid "Override variables found in ec2.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "覆写 ec2.ini 中由清单更新脚本使用的变量。有关这些变量的详细描述" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:299 -msgid "" -"Override variables found in foreman.ini and used by the inventory update script. For an example variable configuration\n" -" \n" -" view foreman.ini in the Ansible Collections github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "覆盖 foreman.ini 中由清单脚本使用的变量。一个变量配置示例包括在\n" -" \n" -" Ansible github repo 的 foreman.ini 中。 使用 JSON 或 YAML 格式输入清单变量。通过单选按旧可以切换这两个格式。详情请参阅 Ansible Tower 的相关文档。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:265 -msgid "" -"Override variables found in openstack.yml and used by the inventory update script. For an example variable configuration\n" -" \n" -" view openstack.yml in the Openstack github repo. Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two. Refer to the Ansible Tower documentation for example syntax." -msgstr "覆盖 openstack.yml 中由清单脚本使用的变量。一个变量配置示例包括在 \n" -" Openstack github repo 的 openstack.yml 中。 使用 JSON 或 YAML 格式输入清单变量。通过单选按旧可以切换这两个格式。详情请参阅 Ansible Tower 的相关文档。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:241 -msgid "Override variables found in vmware.ini and used by the inventory update script. For a detailed description of these variables" -msgstr "覆写 vmware.ini 中由清单更新脚本使用的变量。有关这些变量的详细描述" - -#: client/features/output/output.strings.js:83 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:350 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:355 -msgid "Overwrite" -msgstr "覆盖" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:361 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:366 -msgid "Overwrite Variables" -msgstr "覆盖变量" - -#: client/features/output/output.strings.js:84 -msgid "Overwrite Vars" -msgstr "覆盖变量" - -#: client/src/credentials/credentials.list.js:40 -msgid "Owners" -msgstr "所有者" - -#: client/src/license/license.partial.html:136 -#: client/src/login/loginModal/loginModal.partial.html:80 -msgid "PASSWORD" -msgstr "密码" - -#: client/features/credentials/legacy.credentials.js:117 -msgid "PERMISSIONS" -msgstr "权限" - -#: client/features/output/output.strings.js:130 -msgid "PLAY" -msgstr "PLAY" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:146 -msgid "PLAYBOOK" -msgstr "PLAYBOOK" - -#: client/src/partials/survey-maker-modal.html:42 -msgid "PLEASE ADD A SURVEY PROMPT." -msgstr "请添加问卷调查提示。" - -#: client/src/organizations/list/organizations-list.partial.html:38 -#: client/src/shared/form-generator.js:1839 -#: client/src/shared/list-generator/list-generator.factory.js:248 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:27 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:94 -msgid "PLEASE ADD ITEMS TO THIS LIST" -msgstr "请将项添加到此列表中" - -#: client/src/notifications/add/add.controller.js:106 -#: client/src/notifications/edit/edit.controller.js:160 -msgid "POST" -msgstr "POST" - -#: client/src/partials/survey-maker-modal.html:40 -msgid "PREVIEW" -msgstr "预览" - -#: client/src/workflow-results/workflow-results.service.js:105 -msgid "PROCEED" -msgstr "继续" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.controller.js:142 -msgid "PROJECT" -msgstr "项目" - -#: client/features/projects/projects.strings.js:8 -#: client/features/projects/routes/projectsList.route.js:13 -#: client/src/activity-stream/get-target-title.factory.js:8 -#: client/src/organizations/linkout/organizations-linkout.route.js:182 -#: client/src/organizations/list/organizations-list.controller.js:76 -#: client/src/projects/projects.list.js:14 -#: client/src/projects/projects.list.js:15 -msgid "PROJECTS" -msgstr "项目" - -#: client/features/templates/templates.strings.js:30 -msgid "PROMPT" -msgstr "提示" - -#: client/src/notifications/add/add.controller.js:107 -#: client/src/notifications/edit/edit.controller.js:161 -msgid "PUT" -msgstr "PUT" - -#: client/src/shared/paginate/paginate.partial.html:33 -msgid "Page" -msgstr "页面" - -#: client/src/notifications/notificationTemplates.form.js:252 -msgid "Pagerduty subdomain" -msgstr "Pagerduty 子域" - -#: client/src/templates/job_templates/job-template.form.js:486 -msgid "Pass extra command line variables to the playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "向 playbook 传递额外的命令行变量。使用 YAML 或 JSON 提供键/值对。示例语法请参阅 Ansible Tower 文档。" - -#: client/src/templates/workflows.form.js:142 -msgid "Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON. Refer to the Ansible Tower documentation for example syntax." -msgstr "向 playbook 传递额外的命令行变量。这是 ansible-playbook 的 -e 或 --extra-vars 命令行参数。使用 YAML 或 JSON 提供键/值对。示例语法请参阅 Ansible Tower 文档。" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:139 -msgid "Pass extra command line variables. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." -msgstr "传递额外的命令行变量。这是 %s 或 %s 的 %s 命令行参数。使用 YAML 或 JSON 提供键/值对。" - -#: client/src/credentials/credentials.form.js:226 -#: client/src/credentials/factories/become-method-change.factory.js:21 -#: client/src/credentials/factories/become-method-change.factory.js:40 -#: client/src/credentials/factories/become-method-change.factory.js:48 -#: client/src/credentials/factories/become-method-change.factory.js:68 -#: client/src/credentials/factories/become-method-change.factory.js:78 -#: client/src/credentials/factories/become-method-change.factory.js:88 -#: client/src/credentials/factories/kind-change.factory.js:104 -#: client/src/credentials/factories/kind-change.factory.js:124 -#: client/src/credentials/factories/kind-change.factory.js:134 -#: client/src/credentials/factories/kind-change.factory.js:144 -#: client/src/credentials/factories/kind-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:77 -#: client/src/credentials/factories/kind-change.factory.js:96 -#: client/src/notifications/shared/type-change.service.js:31 -#: client/src/templates/survey-maker/surveys/init.factory.js:15 -#: client/src/users/users.form.js:69 -msgid "Password" -msgstr "密码" - -#: client/src/credentials/factories/kind-change.factory.js:57 -msgid "Password (API Key)" -msgstr "密码(API 密钥)" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:23 -msgid "Past 24 Hours" -msgstr "过去 24 小时" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:16 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:29 -msgid "Past Month" -msgstr "过去一个月" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:26 -msgid "Past Week" -msgstr "过去一周" - -#: client/src/credentials/factories/become-method-change.factory.js:29 -#: client/src/credentials/factories/kind-change.factory.js:85 -msgid "Paste the contents of the PEM file associated with the service account email." -msgstr "粘贴与服务账户电子邮件关联的 PEM 文件的内容。" - -#: client/src/credentials/factories/kind-change.factory.js:50 -msgid "Paste the contents of the SSH private key file." -msgstr "粘贴 SSH 私钥文件的内容。" - -#: client/src/credentials/factories/kind-change.factory.js:25 -msgid "Paste the contents of the SSH private key file.%s or click to close%s" -msgstr "粘贴 SSH 私钥文件的内容。%s 或者点击以关闭 %s" - -#: client/src/inventories-hosts/inventories/inventory.list.js:133 -#: client/src/shared/list-generator/list-generator.factory.js:415 -msgid "Pending Delete" -msgstr "等待删除" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.directive.js:60 -msgid "Perform a search above to define a host filter" -msgstr "执行上述搜索以定义主机过滤器" - -#: client/lib/components/components.strings.js:49 -msgid "Perform lookup" -msgstr "执行查询" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:8 -msgid "Period" -msgstr "时期" - -#: client/src/projects/add/projects-add.controller.js:35 -#: client/src/templates/main.js:128 -#: client/src/templates/main.js:367 -#: client/src/users/add/users-add.controller.js:45 -msgid "Permission Error" -msgstr "权限错误" - -#: client/features/credentials/credentials.strings.js:14 -#: client/features/credentials/legacy.credentials.js:63 -#: client/src/credentials/credentials.form.js:438 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:104 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:101 -#: client/src/organizations/organizations.form.js:143 -#: client/src/projects/projects.form.js:278 -#: client/src/teams/teams.form.js:128 -#: client/src/templates/job_templates/job-template.form.js:532 -#: client/src/templates/workflows.form.js:287 -#: client/src/users/users.form.js:192 -msgid "Permissions" -msgstr "权限" - -#: client/features/users/tokens/tokens.strings.js:41 -msgid "Personal Access Token" -msgstr "个人访问令牌" - -#: client/features/output/output.strings.js:85 -#: client/src/shared/form-generator.js:1044 -#: client/src/templates/job_templates/job-template.form.js:123 -#: client/src/templates/job_templates/job-template.form.js:134 -msgid "Playbook" -msgstr "Playbook" - -#: client/src/projects/projects.form.js:91 -msgid "Playbook Directory" -msgstr "Playbook 目录" - -#: client/features/templates/templates.strings.js:70 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:58 -msgid "Playbook Run" -msgstr "Playbook 运行" - -#: client/features/output/output.strings.js:117 -msgid "Plays" -msgstr "Play" - -#: client/lib/components/components.strings.js:116 -msgid "Please add items to this list." -msgstr "请将项添加到此列表中。" - -#: client/src/users/users.form.js:127 -msgid "Please add user to an Organization." -msgstr "请将用户添加到机构中。" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:99 -msgid "Please assign roles to the selected resources" -msgstr "请为所选资源分配角色" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:60 -msgid "Please assign roles to the selected users/teams" -msgstr "请为所选用户/团队分配角色" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "Please check the server and make sure the directory exists and file permissions are set correctly." -msgstr "请检查服务器并确保目录存在,并正确设置文件权限。" - -#: client/features/templates/templates.strings.js:144 -msgid "Please click on an available node to form a new link." -msgstr "请点击可用节点以形成新链接。" - -#: client/src/license/license.partial.html:91 -msgid "Please click the button below to visit Ansible's website to get a Tower license key." -msgstr "请点击下面的按钮访问 Ansible 的网站以获取 Tower 许可证密钥。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:40 -msgid "Please click the icon to edit the host filter." -msgstr "请点击图标编辑主机过滤器。" - -#: client/features/templates/templates.strings.js:126 -msgid "Please click the start button to build your workflow." -msgstr "请点击启动按钮来构建您的工作流。" - -#: client/lib/services/base-string.service.js:98 -msgid "Please confirm that you would like to remove {{ role }} access from the team {{ name }}. This will affect all members of the team. If you would like to only remove access for this particular user, please remove them from the team." -msgstr "请确认您想要从团队 {{ name }} 中删除 {{ role }} 访问。这将影响团队所有成员。如果您只想删除这个特定用户的访问,请将其从团队中删除。" - -#: client/lib/services/base-string.service.js:104 -msgid "Please confirm that you would like to remove {{ role }} access from {{ name }}." -msgstr "请确认您要从 {{ name }} 中删除 {{ role }} 访问。" - -#: client/src/shared/form-generator.js:833 -#: client/src/shared/form-generator.js:925 -msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." -msgstr "请输入以 ssh、http 或 https 开头的 URL。URL 可能不包含 '@' 字符。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:183 -msgid "Please enter a larger float." -msgstr "请输入更大的浮点值。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:163 -msgid "Please enter a larger integer." -msgstr "请输入更大的整数。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:246 -msgid "Please enter a maximum default of {{float_max}}." -msgstr "请输入最大默认值 {{float_max}}。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:232 -msgid "Please enter a maximum default of {{int_max}}." -msgstr "请输入最大默认值 {{int_max}}。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:245 -msgid "Please enter a minimum default of {{float_min}}." -msgstr "请输入最小默认值 {{float_min}}。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:231 -msgid "Please enter a minimum default of {{int_min}}." -msgstr "请输入最小默认值 {{int_min}}。" - -#: client/src/shared/form-generator.js:1134 -msgid "Please enter a number greater than %d and less than %d." -msgstr "请输入大于 %d 且小于 %d 的数字。" - -#: client/src/shared/form-generator.js:1136 -msgid "Please enter a number greater than %d." -msgstr "请输入大于 %d 的数字。" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:151 -msgid "Please enter a number greater than or equal to 0." -msgstr "请输入大于或等于 0 的数字。" - -#: client/src/shared/form-generator.js:1128 -msgid "Please enter a number." -msgstr "请输入数字。" - -#: client/features/templates/templates.strings.js:43 -#: client/src/login/loginModal/loginModal.partial.html:90 -msgid "Please enter a password." -msgstr "请输入密码。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:178 -msgid "Please enter a smaller float." -msgstr "请输入更小的浮点值。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:158 -msgid "Please enter a smaller integer." -msgstr "请输入更小的整数。" - -#: client/src/login/loginModal/loginModal.partial.html:70 -msgid "Please enter a username." -msgstr "请输入用户名。" - -#: client/src/shared/form-generator.js:823 -#: client/src/shared/form-generator.js:915 -msgid "Please enter a valid email address." -msgstr "请输入有效电子邮件地址。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:177 -#: client/src/templates/survey-maker/shared/question-definition.form.js:182 -#: client/src/templates/survey-maker/shared/question-definition.form.js:244 -msgid "Please enter a valid float." -msgstr "请输入有效的浮点值。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:157 -#: client/src/templates/survey-maker/shared/question-definition.form.js:162 -#: client/src/templates/survey-maker/shared/question-definition.form.js:230 -msgid "Please enter a valid integer." -msgstr "请输入有效的整数。" - -#: client/lib/components/components.strings.js:15 -#: client/src/shared/form-generator.js:818 -#: client/src/shared/form-generator.js:910 -#: client/src/shared/form-generator.js:982 -msgid "Please enter a value." -msgstr "请输入一个值。" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:36 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "Please enter an answer between" -msgstr "输入的回答应介于" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:199 -msgid "Please enter an answer from the choices listed." -msgstr "请从列出的选择中输入回答。" - -#: client/features/templates/templates.strings.js:69 -msgid "Please enter an answer that is a decimal number." -msgstr "请输入一个十进制数字的回答。" - -#: client/features/templates/templates.strings.js:68 -msgid "Please enter an answer that is a valid integer." -msgstr "请输入一个有效整数的回答。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:47 -msgid "Please enter an answer variable name." -msgstr "请输入回答变量名称。" - -#: client/features/templates/templates.strings.js:66 -msgid "Please enter an answer." -msgstr "请输入回答。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:216 -msgid "Please enter an answer/answers from the choices listed." -msgstr "请从列出的选择中输入回答。" - -#: client/index.template.ejs:149 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Please enter an integer that is not negative that is lower than 9999." - -#: client/index.template.ejs:132 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Please enter an integer that is not negative that is lower than 9999." - -#: client/index.template.ejs:105 -msgid "Please enter an integer that is not negative that is lower than 9999." -msgstr "Please enter an integer that is not negative that is lower than 9999." - -#: client/src/inventories-hosts/inventory-hosts.strings.js:47 -msgid "Please enter at least one search term to create a new Smart Inventory." -msgstr "请至少输入一个搜索词来创建新智能清单。" - -#: client/features/templates/templates.strings.js:127 -msgid "Please hover over a template for additional options." -msgstr "请将鼠标悬停于模板上获取其他选项。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:175 -msgid "Please input a number greater than 1." -msgstr "请输入大于 1 的数字。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:538 -#: client/src/scheduler/scheduler.strings.js:47 -msgid "Please provide a valid date." -msgstr "请提供有效日期。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:208 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:521 -#: client/src/scheduler/scheduler.strings.js:30 -msgid "Please provide a value between 1 and 999." -msgstr "请提供 1 到 999 之间的值。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:48 -msgid "Please remove the illegal character from the survey question variable name." -msgstr "请从问卷调查问题变量名称中删除非法字符。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:169 -msgid "Please save before adding a survey to this job template." -msgstr "请在向此作业模板添加问卷调查前保存。" - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:53 -msgid "Please save before adding a survey to this workflow." -msgstr "请在向此工作流添加问卷调查前保存。" - -#: client/src/notifications/notifications.list.js:15 -msgid "Please save before adding notifications." -msgstr "请在添加通知前保存。" - -#: client/src/organizations/organizations.form.js:95 -#: client/src/teams/teams.form.js:72 -msgid "Please save before adding users." -msgstr "请在添加用户前保存。" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:100 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:97 -#: client/src/organizations/organizations.form.js:135 -#: client/src/projects/projects.form.js:270 -#: client/src/teams/teams.form.js:124 -#: client/src/templates/job_templates/job-template.form.js:525 -#: client/src/templates/workflows.form.js:280 -msgid "Please save before assigning permissions." -msgstr "请在分配权限前保存。" - -#: client/src/users/users.form.js:125 -#: client/src/users/users.form.js:188 -msgid "Please save before assigning to organizations." -msgstr "请在分配到机构前保存。" - -#: client/src/users/users.form.js:155 -msgid "Please save before assigning to teams." -msgstr "请在分配到团队前保存。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:142 -msgid "Please save before creating groups." -msgstr "请在创建组前保存。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:152 -msgid "Please save before creating hosts." -msgstr "请在创建主机前保存。" - -#: client/src/inventories-hosts/hosts/host.form.js:108 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:86 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:110 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:119 -msgid "Please save before defining groups." -msgstr "请在定义组前保存。" - -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:94 -msgid "Please save before defining hosts." -msgstr "请在定义主机前保存。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:161 -msgid "Please save before defining inventory sources." -msgstr "请在定义清单源前保存。" - -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:52 -msgid "Please save before defining the workflow graph." -msgstr "请在定义工作流图形前保存。" - -#: client/lib/components/components.strings.js:111 -msgid "Please save before launching this template." -msgstr "请在启动此模板前保存。" - -#: client/src/inventories-hosts/hosts/host.form.js:117 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:127 -msgid "Please save before viewing Insights." -msgstr "请在查看 Insights 前保存。" - -#: client/src/inventories-hosts/hosts/host.form.js:101 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:103 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:112 -msgid "Please save before viewing facts." -msgstr "请在查看事实前保存。" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:146 -msgid "Please save before viewing hosts." -msgstr "请在查看主机前保存。" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 -msgid "Please select Users / Teams from the lists below." -msgstr "请从下面的列表中选择“用户/团队”。" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 -msgid "Please select Users from the list below." -msgstr "请从下面的列表中选择“用户”。" - -#: client/src/shared/form-generator.js:1169 -msgid "Please select a number between" -msgstr "选择的数字应介于" - -#: client/src/shared/form-generator.js:1165 -msgid "Please select a number." -msgstr "请选择一个数字。" - -#: client/features/templates/templates.strings.js:67 -msgid "Please select a value" -msgstr "请选择一个值" - -#: client/src/shared/form-generator.js:1056 -#: client/src/shared/form-generator.js:1125 -#: client/src/shared/form-generator.js:1298 -msgid "Please select a value." -msgstr "请选择一个值。" - -#: client/src/templates/job_templates/job-template.form.js:77 -msgid "Please select an Inventory or check the Prompt on launch option." -msgstr "请选择一个清单或者选中“启动时提示”选项。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:39 -msgid "Please select an organization before editing the host filter." -msgstr "请在编辑主机过滤器前选择机构。" - -#: client/src/shared/form-generator.js:1162 -msgid "Please select at least one value." -msgstr "请至少选择一个值。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:476 -#: client/src/scheduler/scheduler.strings.js:43 -msgid "Please select one or more days." -msgstr "请选择一天或多天。" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:30 -msgid "Please select resources from the lists below." -msgstr "请从下面的列表中选择资源。" - -#: client/src/instance-groups/instance-groups.strings.js:77 -msgid "Pod Spec Override" -msgstr "Pod 规格覆写" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Populate the hosts for this inventory by using a search filter." -msgstr "使用搜索过滤器填充该清单的主机。" - -#: client/src/notifications/shared/type-change.service.js:30 -msgid "Port" -msgstr "端口" - -#: client/features/templates/templates.strings.js:33 -msgid "Preview" -msgstr "预览" - -#: client/src/credentials/credentials.form.js:257 -#: client/src/credentials/factories/kind-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:44 -msgid "Private Key" -msgstr "私钥" - -#: client/features/templates/templates.strings.js:46 -#: client/src/credentials/credentials.form.js:264 -msgid "Private Key Passphrase" -msgstr "私钥密码" - -#: client/src/credentials/credentials.form.js:279 -#: client/src/credentials/credentials.form.js:283 -msgid "Privilege Escalation" -msgstr "权限升级" - -#: client/features/templates/templates.strings.js:47 -#: client/src/credentials/credentials.form.js:304 -msgid "Privilege Escalation Password" -msgstr "权限升级密码" - -#: client/src/credentials/credentials.form.js:294 -msgid "Privilege Escalation Username" -msgstr "权限升级用户名" - -#: client/features/jobs/jobs.strings.js:15 -#: client/features/output/output.strings.js:86 -#: client/features/templates/templates.strings.js:20 -#: client/src/credentials/factories/become-method-change.factory.js:30 -#: client/src/credentials/factories/kind-change.factory.js:86 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:92 -#: client/src/templates/job_templates/job-template.form.js:100 -#: client/src/templates/job_templates/job-template.form.js:113 -#: client/src/templates/job_templates/job-template.form.js:91 -msgid "Project" -msgstr "项目" - -#: client/lib/services/base-string.service.js:150 -msgid "Project (Ascending)" -msgstr "项目(升序)" - -#: client/lib/services/base-string.service.js:151 -msgid "Project (Descending)" -msgstr "项目(降序)" - -#: client/src/credentials/factories/become-method-change.factory.js:53 -#: client/src/credentials/factories/kind-change.factory.js:109 -msgid "Project (Tenant Name)" -msgstr "项目(租户名称)" - -#: client/src/projects/projects.form.js:77 -#: client/src/projects/projects.form.js:85 -msgid "Project Base Path" -msgstr "项目基本路径" - -#: client/src/credentials/credentials.form.js:364 -msgid "Project Name" -msgstr "项目名称" - -#: client/src/projects/projects.form.js:102 -msgid "Project Path" -msgstr "项目路径" - -#: client/features/templates/templates.strings.js:117 -#: client/src/workflow-results/workflow-results.controller.js:98 -msgid "Project Sync" -msgstr "项目同步" - -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:66 -msgid "Project Sync Failures" -msgstr "项目同步失败" - -#: client/lib/components/components.strings.js:74 -#: client/lib/models/models.strings.js:40 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:114 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:47 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 -#: client/src/home/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/organizations/linkout/organizations-linkout.route.js:190 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "Projects" -msgstr "项目" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:18 -msgid "Promote group" -msgid_plural "Promote groups" -msgstr[0] "提升组" -msgstr[1] "提升组" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:20 -msgid "Promote host" -msgid_plural "Promote hosts" -msgstr[0] "提升主机" -msgstr[1] "提升主机" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:10 -msgid "Promote {{ group }} and {{ host }}" -msgstr "提升 {{ group }} 和 {{ host }}" - -#: client/src/scheduler/scheduler.strings.js:54 -#: client/src/templates/survey-maker/shared/question-definition.form.js:27 -msgid "Prompt" -msgstr "提示" - -#: client/lib/components/components.strings.js:35 -#: client/src/templates/job_templates/job-template.form.js:116 -#: client/src/templates/job_templates/job-template.form.js:157 -#: client/src/templates/job_templates/job-template.form.js:184 -#: client/src/templates/job_templates/job-template.form.js:201 -#: client/src/templates/job_templates/job-template.form.js:218 -#: client/src/templates/job_templates/job-template.form.js:235 -#: client/src/templates/job_templates/job-template.form.js:312 -#: client/src/templates/job_templates/job-template.form.js:493 -#: client/src/templates/job_templates/job-template.form.js:60 -#: client/src/templates/job_templates/job-template.form.js:86 -#: client/src/templates/workflows.form.js:102 -#: client/src/templates/workflows.form.js:116 -#: client/src/templates/workflows.form.js:148 -#: client/src/templates/workflows.form.js:88 -msgid "Prompt on launch" -msgstr "启动时提示" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:253 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:266 -msgid "Provide a comma-separated list of filter expressions." -msgstr "提供以逗号分隔的过滤器表达式列表。" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:269 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:284 -msgid "Provide a comma-separated list of filter expressions. Hosts are imported when all of the filters match. Refer to Ansible Tower documentation for more detail." -msgstr "提供以逗号分隔的过滤器表达式列表。所有过滤器匹配时,会导入主机。请参阅 Ansible Tower 文档了解更多详情。" - -#: client/src/inventories-hosts/hosts/host.form.js:49 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:48 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:50 -msgid "Provide a host name, ip address, or ip address:port. Examples include:" -msgstr "提供主机名、IP 地址或 IP 地址:端口。示例包括:" - -#: client/features/templates/templates.strings.js:57 -#: client/src/templates/job_templates/job-template.form.js:178 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns are allowed. Refer to Ansible documentation for more information and examples on patterns." -msgstr "提供主机模式以进一步限制受 playbook 管理或影响的主机列表。允许使用多种模式。请参阅 Ansible 文档,以了解更多有关模式的信息和示例。" - -#: client/src/templates/workflows.form.js:96 -msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the workflow. This limit is applied to all job template nodes that prompt for a limit. Refer to Ansible documentation for more information and examples on patterns." -msgstr "提供主机模式以进一步限制受工作流管理或影响的主机列表。该限制适用于提示限制的所有作业模板节点。请参阅 Ansible 文档,以了解更多有关模式的信息和示例。" - -#: client/features/credentials/credentials.strings.js:22 -msgid "Provide account information using Google Compute Engine JSON credentials file." -msgstr "使用 Google Compute Engine JSON 凭证文件提供帐户信息。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:195 -msgid "Provide environment variables to pass to the custom inventory script." -msgstr "提供要传递给自定义清单脚本的环境变量。" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:272 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:287 -msgid "Provide the named URL encoded name or id of the remote Tower inventory to be imported." -msgstr "提供要导入的远程 Tower 清单的命名 URL 编码名称或 ID。" - -#: client/src/license/license.partial.html:128 -msgid "Provide your Red Hat customer credentials and you can choose from a list of your available licenses. The credentials you use will be stored for future use in retrieving renewal or expanded licenses. You can update or remove them in SETTINGS > SYSTEM." -msgstr "提供您的红帽客户凭证,您可以从可用许可证列表中进行选择。您使用的凭证将存储以供将来用于检索续订或扩展许可证。您可以在“设置”>“系统”中更新或删除它们。" - -#: client/src/templates/job_templates/job-template.form.js:374 -#: client/src/templates/job_templates/job-template.form.js:382 -msgid "Provisioning Callback URL" -msgstr "部署回调 URL" - -#: client/src/notifications/add/add.controller.js:86 -#: client/src/notifications/edit/edit.controller.js:149 -msgid "Purple" -msgstr "紫色" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:95 -msgid "RADIUS" -msgstr "RADIUS" - -#: client/src/instance-groups/instance-groups.strings.js:55 -msgid "RAM" -msgstr "RAM" - -#: client/lib/components/code-mirror/code-mirror.strings.js:15 -msgid "READ ONLY" -msgstr "只读" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:4 -msgid "RECENT JOB RUNS" -msgstr "最近的作业运行" - -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:47 -msgid "RECENTLY RUN JOBS" -msgstr "最近运行的作业" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:50 -msgid "RECENTLY USED JOB TEMPLATES" -msgstr "最近使用的作业模板" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:4 -msgid "RECENTLY USED TEMPLATES" -msgstr "最近使用的模板" - -#: client/src/activity-stream/streams.list.js:54 -#: client/src/inventories-hosts/hosts/host.list.js:108 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:51 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:37 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:36 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:52 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:58 -#: client/src/projects/projects.list.js:76 -#: client/src/scheduler/schedules.list.js:76 -msgid "REFRESH" -msgstr "刷新" - -#: client/features/users/tokens/tokens.strings.js:23 -msgid "REFRESH TOKEN" -msgstr "刷新令牌" - -#: client/src/shared/smart-search/smart-search.partial.html:45 -msgid "RELATED FIELDS:" -msgstr "相关字段:" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:91 -msgid "REMEDIATE INVENTORY" -msgstr "修复清单" - -#: client/lib/services/base-string.service.js:79 -#: client/src/access/permissions-list.controller.js:57 -#: client/src/access/permissions-list.controller.js:90 -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:84 -#: client/src/shared/directives.js:94 -#: client/src/templates/labels/labelsList.directive.js:96 -msgid "REMOVE" -msgstr "删除" - -#: client/lib/services/base-string.service.js:103 -msgid "REMOVE ACCESS" -msgstr "删除访问" - -#: client/lib/services/base-string.service.js:97 -msgid "REMOVE TEAM ACCESS" -msgstr "删除团队访问" - -#: client/features/output/output.strings.js:8 -msgid "RESULTS" -msgstr "结果" - -#: client/features/templates/templates.strings.js:39 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:50 -msgid "REVERT" -msgstr "恢复" - -#: client/features/projects/projects.strings.js:10 -msgid "REVISION" -msgstr "修订" - -#: client/src/inventories-hosts/inventories/main.js:301 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:49 -msgid "ROOT GROUPS" -msgstr "根组" - -#: client/src/credentials/factories/become-method-change.factory.js:25 -#: client/src/credentials/factories/kind-change.factory.js:81 -msgid "RSA Private Key" -msgstr "RSA 私钥" - -#: client/features/templates/templates.strings.js:130 -#: client/lib/services/base-string.service.js:66 -msgid "RUN" -msgstr "运行" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.route.js:45 -msgid "RUN COMMAND" -msgstr "运行命令" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:62 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:45 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:118 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:130 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:61 -msgid "RUN COMMANDS" -msgstr "运行命令" - -#: client/src/notifications/add/add.controller.js:89 -#: client/src/notifications/edit/edit.controller.js:152 -msgid "Random" -msgstr "随机" - -#: client/features/users/tokens/tokens.strings.js:30 -msgid "Read" -msgstr "读取" - -#: client/src/workflow-results/workflow-results.controller.js:179 -msgid "Read only view of extra variables added to the workflow." -msgstr "添加到工作流中的额外变量的只读视图。" - -#: client/features/output/output.strings.js:17 -msgid "Read-only view of artifacts added to the job template" -msgstr "添加到作业模板的工件的只读视图" - -#: client/features/output/output.strings.js:24 -msgid "Read-only view of extra variables added to the job template" -msgstr "添加到作业模板的额外变量的只读视图" - -#: client/lib/components/code-mirror/code-mirror.strings.js:51 -msgid "Read-only view of extra variables added to the job template." -msgstr "添加到作业模板的额外变量的只读视图。" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Failed Jobs" -msgstr "最近失败的作业" - -#: client/src/notifications/notificationTemplates.list.js:28 -msgid "Recent Notifications" -msgstr "最近通知" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:48 -msgid "Recent Successful Jobs" -msgstr "最近成功的作业" - -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:98 -msgid "Recipient List" -msgstr "接收者列表" - -#: client/src/notifications/add/add.controller.js:87 -#: client/src/notifications/edit/edit.controller.js:150 -msgid "Red" -msgstr "红色" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:47 -msgid "Refer to the Ansible Tower documentation for further syntax and examples." -msgstr "更多的语法和示例请参阅 Ansible Tower 文档。" - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "Refer to the Ansible documentation for details about the configuration file." -msgstr "有关配置文件的详情请参阅 Ansible 文档。" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Refresh" -msgstr "刷新" - -#: client/src/inventories-hosts/inventories/insights/insights.strings.js:8 -msgid "Refresh Insights" -msgstr "刷新 Insights" - -#: client/src/configuration/settings.service.js:44 -msgid "Refresh Token Expiration" -msgstr "刷新令牌过期" - -#: client/src/activity-stream/streams.list.js:51 -#: client/src/bread-crumb/bread-crumb.partial.html:6 -#: client/src/inventories-hosts/hosts/host.list.js:104 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.list.js:47 -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:33 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:32 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:126 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:48 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:54 -#: client/src/projects/projects.list.js:72 -#: client/src/scheduler/schedules.list.js:72 -msgid "Refresh the page" -msgstr "刷新页面" - -#: client/features/output/output.strings.js:88 -msgid "Refspec" -msgstr "Refspec" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:246 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:258 -msgid "Region:" -msgstr "区域:" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:130 -msgid "Regions" -msgstr "区域" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:81 -msgid "Related Groups" -msgstr "相关组" - -#: client/lib/components/components.strings.js:104 -msgid "Relaunch On" -msgstr "重新启动日期" - -#: client/src/workflow-results/workflow-results.partial.html:26 -msgid "Relaunch job" -msgstr "重新启动作业" - -#: client/lib/components/components.strings.js:103 -msgid "Relaunch using host parameters" -msgstr "使用主机参数重新启动" - -#: client/lib/components/components.strings.js:102 -#: client/src/workflow-results/workflow-results.controller.js:55 -msgid "Relaunch using the same parameters" -msgstr "使用相同的参数重新启动" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:176 -msgid "Remediate Inventory" -msgstr "修复清单" - -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:106 -#: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:107 -#: client/src/teams/teams.form.js:157 -#: client/src/users/users.form.js:231 -msgid "Remove" -msgstr "删除" - -#: client/src/templates/labels/labelsList.directive.js:93 -msgid "Remove Label from" -msgstr "从中删除标签" - -#: client/src/projects/projects.form.js:178 -msgid "Remove any local modifications prior to performing an update." -msgstr "在进行更新前删除任何本地修改。" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:81 -msgid "Remove host from" -msgstr "从中删除主机" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:152 -#: client/src/scheduler/scheduler.strings.js:27 -msgid "Repeat frequency" -msgstr "重复频率" - -#: client/lib/components/components.strings.js:7 -msgid "Replace" -msgstr "替换" - -#: client/src/license/license.strings.js:7 -msgid "Replace password" -msgstr "替换密码" - -#: client/lib/components/components.strings.js:139 -msgid "Replace secret" -msgstr "替换 secret" - -#: client/src/license/license.partial.html:96 -msgid "Request License" -msgstr "请求许可证" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:291 -msgid "Required" -msgstr "必需" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:154 -msgid "Reset" -msgstr "重置" - -#: client/lib/components/components.strings.js:92 -msgid "Resources" -msgstr "资源" - -#: client/features/templates/templates.strings.js:97 -#: client/src/scheduler/schedules.list.js:25 -msgid "Resources are missing from this template." -msgstr "此模板中缺少资源。" - -#: client/lib/services/base-string.service.js:111 -msgid "Return" -msgstr "返回" - -#: client/features/users/tokens/tokens.strings.js:26 -msgid "Returned status:" -msgstr "返回的状态:" - -#: client/lib/components/components.strings.js:8 -#: client/src/shared/form-generator.js:658 -msgid "Revert" -msgstr "恢复" - -#: client/src/configuration/forms/auth-form/sub-forms/auth-azure.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-org.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github-team.form.js:51 -#: client/src/configuration/forms/auth-form/sub-forms/auth-github.form.js:47 -#: client/src/configuration/forms/auth-form/sub-forms/auth-google-oauth2.form.js:59 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap1.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap2.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap3.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap4.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-ldap5.form.js:102 -#: client/src/configuration/forms/auth-form/sub-forms/auth-radius.form.js:34 -#: client/src/configuration/forms/auth-form/sub-forms/auth-saml.form.js:121 -#: client/src/configuration/forms/auth-form/sub-forms/auth-tacacs.form.js:47 -#: client/src/configuration/forms/jobs-form/configuration-jobs.form.js:129 -#: client/src/configuration/forms/system-form/sub-forms/system-activity-stream.form.js:26 -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:74 -#: client/src/configuration/forms/system-form/sub-forms/system-misc.form.js:95 -#: client/src/configuration/forms/ui-form/configuration-ui.form.js:36 -msgid "Revert all to default" -msgstr "全部恢复为默认值" - -#: client/features/output/output.strings.js:90 -#: client/src/projects/projects.list.js:56 -msgid "Revision" -msgstr "修订" - -#: client/src/projects/add/projects-add.controller.js:159 -#: client/src/projects/edit/projects-edit.controller.js:280 -msgid "Revision #" -msgstr "修订编号" - -#: client/features/credentials/legacy.credentials.js:85 -#: client/src/credentials/credentials.form.js:461 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:130 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:127 -#: client/src/organizations/organizations.form.js:165 -#: client/src/projects/projects.form.js:301 -#: client/src/teams/teams.form.js:109 -#: client/src/teams/teams.form.js:148 -#: client/src/templates/workflows.form.js:311 -#: client/src/users/users.form.js:212 -msgid "Role" -msgstr "角色" - -#: client/lib/services/base-string.service.js:102 -msgid "Role access removal" -msgstr "用户访问删除" - -#: client/src/templates/job_templates/job-template.form.js:440 -#: client/src/templates/job_templates/job-template.form.js:444 -#: client/src/templates/workflows.form.js:213 -#: client/src/templates/workflows.form.js:217 -msgid "Rotate Webhook Key" -msgstr "轮转 Webhook 密钥" - -#: client/src/instance-groups/instance-groups.list.js:26 -#: client/src/instance-groups/instance-groups.strings.js:22 -#: client/src/instance-groups/instance-groups.strings.js:61 -msgid "Running Jobs" -msgstr "运行作业" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:96 -msgid "SAML" -msgstr "SAML" - -#: client/lib/services/base-string.service.js:63 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory-host-filter/host-filter-modal/host-filter-modal.partial.html:17 -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:17 -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:17 -#: client/src/partials/survey-maker-modal.html:84 -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:18 -msgid "SAVE" -msgstr "保存" - -#: client/features/templates/templates.strings.js:152 -msgid "SAVE & EXIT" -msgstr "保存并退出" - -#: client/src/scheduler/scheduled-jobs.list.js:13 -#: client/src/scheduler/scheduled-jobs.list.js:14 -msgid "SCHEDULED JOBS" -msgstr "调度的作业" - -#: client/src/activity-stream/get-target-title.factory.js:38 -#: client/src/inventories-hosts/inventories/related/sources/list/schedule/sources-schedule.route.js:9 -#: client/src/management-jobs/scheduler/main.js:28 -#: client/src/management-jobs/scheduler/main.js:34 -#: client/src/scheduler/schedules.route.js:102 -#: client/src/scheduler/schedules.route.js:14 -#: client/src/scheduler/schedules.route.js:189 -#: client/src/scheduler/schedules.route.js:283 -msgid "SCHEDULES" -msgstr "计划" - -#: client/features/templates/templates.strings.js:71 -#: client/src/projects/add/projects-add.controller.js:130 -#: client/src/projects/edit/projects-edit.controller.js:252 -#: client/src/projects/projects.form.js:130 -#: client/src/templates/job_templates/job-template.form.js:107 -#: client/src/templates/workflows.form.js:107 -#: client/src/templates/workflows.form.js:111 -#: client/src/workflow-results/workflow-results.controller.js:80 -msgid "SCM Branch" -msgstr "SCM 分支" - -#: client/src/projects/add/projects-add.controller.js:150 -#: client/src/projects/edit/projects-edit.controller.js:271 -msgid "SCM Branch/Tag/Commit" -msgstr "SCM 分支/标签/提交" - -#: client/src/projects/add/projects-add.controller.js:171 -#: client/src/projects/edit/projects-edit.controller.js:292 -msgid "SCM Branch/Tag/Revision" -msgstr "SCM 分支/标签/修订" - -#: client/src/projects/projects.form.js:179 -msgid "SCM Clean" -msgstr "SCM 清理" - -#: client/src/projects/projects.form.js:190 -msgid "SCM Delete" -msgstr "SCM 删除" - -#: client/src/credentials/factories/become-method-change.factory.js:20 -#: client/src/credentials/factories/kind-change.factory.js:76 -msgid "SCM Private Key" -msgstr "SCM 私钥" - -#: client/src/projects/add/projects-add.controller.js:131 -#: client/src/projects/edit/projects-edit.controller.js:253 -#: client/src/projects/projects.form.js:146 -msgid "SCM Refspec" -msgstr "SCM Refspec" - -#: client/src/projects/projects.form.js:57 -msgid "SCM Type" -msgstr "SCM 类型" - -#: client/src/projects/projects.form.js:108 -#: client/src/projects/projects.form.js:119 -msgid "SCM URL" -msgstr "SCM URL" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:55 -#: client/src/projects/projects.form.js:200 -msgid "SCM Update" -msgstr "SCM 更新" - -#: client/features/projects/projects.strings.js:30 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "SCM Update Cancel" -msgstr "SCM 更新取消" - -#: client/src/projects/projects.form.js:170 -msgid "SCM Update Options" -msgstr "SCM 更新选项" - -#: client/features/projects/projects.strings.js:19 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:126 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:36 -#: client/src/projects/edit/projects-edit.controller.js:122 -msgid "SCM update currently running" -msgstr "SCM 更新当前正在运行" - -#: client/features/users/tokens/tokens.strings.js:39 -msgid "SCOPE" -msgstr "范围" - -#: client/features/output/output.strings.js:108 -msgid "SEARCH" -msgstr "搜索" - -#: client/features/templates/templates.strings.js:132 -#: client/lib/services/base-string.service.js:64 -#: client/src/license/license.partial.html:260 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:137 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:186 -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:74 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:155 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:194 -msgid "SELECT" -msgstr "选择" - -#: client/src/instance-groups/instance-groups.strings.js:76 -msgid "SELECT A CREDENTIAL" -msgstr "选择凭证" - -#: client/features/credentials/credentials.strings.js:20 -msgid "SELECT A CREDENTIAL TYPE" -msgstr "选择凭证类型" - -#: client/features/users/tokens/tokens.strings.js:19 -msgid "SELECT AN APPLICATION" -msgstr "选择应用" - -#: client/features/applications/applications.strings.js:36 -#: client/features/credentials/credentials.strings.js:19 -msgid "SELECT AN ORGANIZATION" -msgstr "选择机构" - -#: client/src/inventories-hosts/shared/associate-groups/associate-groups.partial.html:6 -msgid "SELECT GROUPS" -msgstr "选择组" - -#: client/src/inventories-hosts/shared/associate-hosts/associate-hosts.partial.html:6 -msgid "SELECT HOSTS" -msgstr "选择主机" - -#: client/src/instance-groups/instance-groups.strings.js:42 -msgid "SELECT INSTANCE" -msgstr "选择实例" - -#: client/features/templates/templates.strings.js:36 -msgid "SELECTED" -msgstr "已选择" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html:18 -msgid "SELECTED:" -msgstr "已选择:" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:22 -msgid "SETTING CATEGORY" -msgstr "设置类别" - -#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:26 -msgid "SETTING NAME" -msgstr "设置名称" - -#: client/src/configuration/settings.route.js:10 -msgid "SETTINGS" -msgstr "设置" - -#: client/lib/services/base-string.service.js:68 -#: client/src/templates/survey-maker/surveys/init.factory.js:502 -msgid "SHOW" -msgstr "显示" - -#: client/src/login/loginModal/loginModal.partial.html:109 -msgid "SIGN IN" -msgstr "登录" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html:2 -msgid "SIGN IN WITH" -msgstr "登录凭证" - -#: client/src/inventories-hosts/hosts/host.list.js:116 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:14 -msgid "SMART INVENTORY" -msgstr "智能清单" - -#: client/lib/components/components.strings.js:122 -msgid "SORT BY" -msgstr "排序方式" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.route.js:27 -msgid "SOURCES" -msgstr "源" - -#: client/src/scheduler/scheduler.strings.js:63 -msgid "SS" -msgstr "SS" - -#: client/src/credentials/factories/become-method-change.factory.js:89 -#: client/src/credentials/factories/kind-change.factory.js:145 -msgid "SSH Key" -msgstr "SSH 密钥" - -#: client/features/templates/templates.strings.js:45 -msgid "SSH Password" -msgstr "SSH 密码" - -#: client/src/credentials/credentials.form.js:255 -msgid "SSH key description" -msgstr "SSH 密钥描述" - -#: client/src/notifications/notificationTemplates.form.js:551 -msgid "SSL Connection" -msgstr "SSL 连接" - -#: client/features/templates/templates.strings.js:134 -msgid "START" -msgstr "开始" - -#: client/src/smart-status/smart-status.controller.js:65 -msgid "STATUS" -msgstr "状态" - -#: client/src/credentials/credentials.form.js:119 -#: client/src/credentials/credentials.form.js:127 -msgid "STS Token" -msgstr "STS 令牌" - -#: client/features/output/output.strings.js:140 -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:56 -msgid "SUCCESSFUL" -msgstr "成功" - -#: client/src/partials/survey-maker-modal.html:24 -msgid "SURVEY" -msgstr "问卷调查" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:66 -msgid "SYNC ALL" -msgstr "全部同步" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:464 -#: client/src/scheduler/scheduler.strings.js:42 -msgid "Sat" -msgstr "周六" - -#: client/src/credentials/factories/become-method-change.factory.js:70 -#: client/src/credentials/factories/kind-change.factory.js:126 -msgid "Satellite 6 URL" -msgstr "卫星 6 URL" - -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:113 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:192 -#: client/src/credentials/credentials.form.js:416 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:158 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:630 -#: client/src/scheduler/scheduler.strings.js:57 -#: client/src/shared/form-generator.js:1644 -msgid "Save" -msgstr "保存" - -#: client/src/configuration/forms/settings-form.controller.js:416 -msgid "Save Complete" -msgstr "保存完成" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:199 -msgid "Save and enable log aggregation before testing the log aggregator." -msgstr "在测试日志聚合器前保存并启用日志聚合。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:66 -#: client/src/configuration/forms/settings-form.controller.js:454 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:63 -msgid "Save changes" -msgstr "保存更改" - -#: client/src/license/license.partial.html:200 -msgid "Save successful!" -msgstr "保存成功!" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:558 -#: client/src/scheduler/scheduler.strings.js:50 -msgid "Schedule Description" -msgstr "计划描述" - -#: client/src/management-jobs/card/card.partial.html:28 -#: client/src/management-jobs/card/card.partial.html:30 -msgid "Schedule Management Job" -msgstr "计划管理作业" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:7 -msgid "Schedule inventory syncs" -msgstr "计划清单同步" - -#: client/src/scheduler/scheduler.strings.js:14 -msgid "Schedule is active." -msgstr "计划处于活跃状态。" - -#: client/src/scheduler/scheduler.strings.js:15 -msgid "Schedule is active. Click to stop." -msgstr "计划处于活跃状态。点击即可停止。" - -#: client/src/scheduler/scheduler.strings.js:16 -msgid "Schedule is stopped." -msgstr "计划已停止。" - -#: client/src/scheduler/scheduler.strings.js:17 -msgid "Schedule is stopped. Click to activate." -msgstr "计划已停止。点击即可激活。" - -#: client/src/scheduler/scheduler.strings.js:60 -msgid "Schedule name" -msgstr "计划名称" - -#: client/lib/components/components.strings.js:72 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:434 -#: client/src/projects/projects.form.js:321 -#: client/src/templates/job_templates/job-template.form.js:578 -#: client/src/templates/workflows.form.js:333 -msgid "Schedules" -msgstr "计划" - -#: client/features/users/tokens/users-tokens-add.controller.js:38 -msgid "Scope" -msgstr "范围" - -#: client/src/shared/smart-search/smart-search.controller.js:127 -#: client/src/shared/smart-search/smart-search.controller.js:169 -msgid "Search" -msgstr "搜索" - -#: client/src/credentials/credentials.form.js:104 -msgid "Secret Key" -msgstr "机密密钥" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:247 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:259 -msgid "Security Group:" -msgstr "安全组:" - -#: client/src/credentials/credentials.form.js:124 -msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." -msgstr "安全令牌服务 (STS) 是一个 Web 服务,让您可以为 AWS 身份和访问管理 (IAM) 用户请求临时的有限权限凭证。" - -#: client/src/shared/form-generator.js:1648 -#: client/src/shared/lookup/lookup-modal.directive.js:59 -#: client/src/shared/lookup/lookup-modal.partial.html:20 -msgid "Select" -msgstr "选择" - -#: client/src/shared/instance-groups-multiselect/instance-groups-modal/instance-groups-modal.partial.html:5 -msgid "Select Instance Groups" -msgstr "选择实例组" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:58 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:100 -#: client/src/templates/workflows/add-workflow/workflow-add.controller.js:84 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:108 -msgid "Select Webhook Credential" -msgstr "选择 Webhook 凭证" - -#: client/src/templates/workflows.form.js:110 -msgid "Select a branch for the workflow. This branch is applied to all job template nodes that prompt for a branch." -msgstr "为工作流选择分支。此分支应用于提示分支的所有作业模板节点。" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:73 -msgid "Select a credential" -msgstr "选择凭证" - -#: client/index.template.ejs:139 -msgid "Select a frequency for snapshot retention" -msgstr "选择快照保留频率" - -#: client/src/license/license.partial.html:214 -msgid "Select a license" -msgstr "选择许可证" - -#: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:70 -msgid "Select a role" -msgstr "选择角色" - -#: client/features/users/tokens/tokens.strings.js:29 -msgid "Select a scope" -msgstr "选择范围" - -#: client/index.template.ejs:122 -msgid "Select a time period after which to remove old facts" -msgstr "选择删除旧事实前经过的时间间隔" - -#: client/src/templates/job_templates/job-template.form.js:413 -#: client/src/templates/workflows.form.js:186 -msgid "Select a webhook service." -msgstr "选择 Webhook 服务。" - -#: client/src/templates/workflows.form.js:81 -msgid "Select an inventory for the workflow. This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "为工作流选择清单。此清单应用于提示清单的所有作业模板节点。" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:59 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or a selection of multiple groups." -msgstr "点击清单源旁边的复选框来选择它。该清单源可以是单个组,也可以是特定的多个组。" - -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:42 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:115 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:58 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single group or host, a selection of multiple hosts, or a selection of multiple groups." -msgstr "点击清单源旁边的复选框来选择它。该清单源可以是单个组或主机,也可以是特定的多个主机或特定的多个组。" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:127 -msgid "Select an inventory source by clicking the check box beside it. The inventory source can be a single host or a selection of multiple hosts." -msgstr "点击清单源旁边的复选框来选择它。该清单源可以是单个主机,也可以是特定的多个主机。" - -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:107 -#: client/src/configuration/forms/jobs-form/configuration-jobs.controller.js:132 -#: client/src/configuration/forms/ui-form/configuration-ui.controller.js:94 -msgid "Select commands" -msgstr "选择命令" - -#: client/src/templates/job_templates/job-template.form.js:151 -msgid "Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking \"Prompt on launch\" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check \"Prompt on launch\", the selected credential(s) become the defaults that can be updated at run time." -msgstr "选择允许 Tower 访问将运行此作业的节点的凭证。每种类型您只能选择一个凭证。对于机器凭证 (SSH),如果选中了“启动时提示”但未选择凭证,您需要在运行时选择机器凭证。如果选择了凭证并选中了“启动时提示”,则所选凭证将变为默认设置,可以在运行时更新。" - -#: client/src/scheduler/schedulerDatePicker.partial.html:2 -msgid "Select date" -msgstr "选择日期" - -#: client/lib/components/components.strings.js:21 -msgid "Select file" -msgstr "选择文件" - -#: client/src/projects/projects.form.js:100 -msgid "Select from the list of directories found in the Project Base Path. Together the base path and the playbook directory provide the full path used to locate playbooks." -msgstr "从位于项目基本路径的目录列表中进行选择。基本路径和 playbook 目录一起提供了用于定位 playbook 的完整路径。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:317 -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:336 -msgid "Select group types" -msgstr "选择组类型" - -#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:24 -msgid "Select roles" -msgstr "选择角色" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:56 -msgid "Select the Instance Groups for this Inventory to run on." -msgstr "选择要运行此清单的实例组。" - -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:63 -msgid "Select the Instance Groups for this Inventory to run on. Refer to the Ansible Tower documentation for more detail." -msgstr "选择要运行此清单的实例组。更多详情请参阅 Ansible Tower 文档。" - -#: client/src/templates/job_templates/job-template.form.js:270 -msgid "Select the Instance Groups for this Job Template to run on." -msgstr "选择要运行此作业模板的实例组。" - -#: client/src/organizations/organizations.form.js:40 -msgid "Select the Instance Groups for this Organization to run on." -msgstr "选择要运行此机构的实例组。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:65 -msgid "Select the custom Python virtual environment for this inventory source sync to run on." -msgstr "选择要运行此清单源同步的自定义 Python 虚拟环境。" - -#: client/src/templates/job_templates/job-template.form.js:260 -msgid "Select the custom Python virtual environment for this job template to run on." -msgstr "选择要运行此作业模板的自定义 Python 虚拟环境。" - -#: client/src/organizations/organizations.form.js:51 -msgid "Select the custom Python virtual environment for this organization to run on." -msgstr "选择要运行此机构的自定义 Python 虚拟环境。" - -#: client/src/projects/projects.form.js:242 -msgid "Select the custom Python virtual environment for this project to run on." -msgstr "选择要运行此项目的自定义 Python 虚拟环境。" - -#: client/src/templates/job_templates/job-template.form.js:79 -msgid "Select the inventory containing the hosts you want this job to manage." -msgstr "选择包含此作业要管理的主机的清单。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:121 -msgid "Select the inventory file to be synced by this source. You can select from the dropdown or enter a file within the input." -msgstr "选择要由此源同步的清单文件。您可以从下拉列表中选择,或者在输入中输入一个文件。" - -#: client/src/templates/job_templates/job-template.form.js:132 -msgid "Select the playbook to be executed by this job.You can select from the dropdown or enter a file within the input." -msgstr "选择要由此作业执行的 playbook。您可以从下拉列表中选择,或者在输入中输入文件。" - -#: client/src/templates/job_templates/job-template.form.js:99 -msgid "Select the project containing the playbook you want this job to execute." -msgstr "选择包含此作业要执行的 playbook 的项目。" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:188 -msgid "Select types" -msgstr "选择类型" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:239 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:251 -msgid "Select which groups to create automatically." -msgstr "选择要自动创建的组。" - -#: client/src/license/license.partial.html:153 -msgid "Selected" -msgstr "已选择" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:202 -msgid "Send a test log message to the configured log aggregator." -msgstr "将测试日志消息发送到配置的日志聚合器。" - -#: client/src/notifications/notificationTemplates.form.js:110 -msgid "Sender Email" -msgstr "发件人电子邮件" - -#: client/src/credentials/factories/become-method-change.factory.js:24 -#: client/src/credentials/factories/kind-change.factory.js:80 -msgid "Service Account Email Address" -msgstr "服务账户电子邮件地址" - -#: client/features/credentials/credentials.strings.js:21 -msgid "Service Account JSON File" -msgstr "服务账户 JSON 文件" - -#: client/features/credentials/credentials.strings.js:30 -msgid "Set Input Source" -msgstr "设置输入源" - -#: client/index.template.ejs:102 -msgid "Set how many days of data should be retained." -msgstr "设置数据应保留的天数。" - -#: client/src/configuration/settings.partial.html:12 -msgid "Set preferences for data collection, logos, and logins" -msgstr "为数据收集、日志和登录设置偏好" - -#: client/lib/components/components.strings.js:88 -msgid "Settings" -msgstr "设置" - -#: client/lib/components/components.strings.js:11 -#: client/src/shared/form-generator.js:845 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:24 -msgid "Show" -msgstr "显示" - -#: client/features/templates/templates.strings.js:50 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:115 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:118 -#: client/src/templates/job_templates/job-template.form.js:303 -#: client/src/templates/job_templates/job-template.form.js:306 -msgid "Show Changes" -msgstr "显示更改" - -#: client/features/output/output.strings.js:50 -#: client/src/workflow-results/workflow-results.controller.js:86 -msgid "Show Less" -msgstr "显示更少" - -#: client/features/output/output.strings.js:51 -#: client/src/workflow-results/workflow-results.controller.js:87 -msgid "Show More" -msgstr "显示更多" - -#: client/src/configuration/forms/system-form/configuration-system.partial.html:34 -#: client/src/inventories-hosts/hosts/related/groups/hosts-related-groups.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups-disassociate.partial.html:8 -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.partial.html:8 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:104 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:125 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:136 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:28 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:44 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:6 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:61 -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:83 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:138 -msgid "Show help text" -msgstr "显示帮助信息" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.partial.html:1 -msgid "Show host summary" -msgstr "显示主机概述" - -#: client/src/shared/paginate/paginate.partial.html:51 -msgid "Show page size options" -msgstr "显示页面大小选项" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.partial.html:1 -msgid "Show source summary" -msgstr "显示源概述" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:33 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:44 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:55 -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:76 -msgid "Sign in with %s" -msgstr "使用 %s 登陆" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:63 -msgid "Sign in with %s Organizations" -msgstr "使用 %s 机构登陆" - -#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:61 -msgid "Sign in with %s Teams" -msgstr "使用 %s 团队登陆" - -#: client/features/output/output.strings.js:91 -#: client/features/templates/templates.strings.js:52 -#: client/src/templates/job_templates/job-template.form.js:223 -#: client/src/templates/job_templates/job-template.form.js:230 -msgid "Skip Tags" -msgstr "跳过标签" - -#: client/features/templates/templates.strings.js:53 -#: client/src/templates/job_templates/job-template.form.js:229 -msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "如果有大型一个 playbook,而您想要跳过某个 play 或任务的特定部分,则跳过标签很有用。使用逗号分隔多个标签。请参阅 Ansible Tower 文档了解使用标签的详情。" - -#: client/features/jobs/jobs.strings.js:21 -#: client/features/output/output.strings.js:74 -msgid "Slice Job" -msgstr "分片作业" - -#: client/src/templates/job_templates/job-template.form.js:283 -msgid "Slice Job Count" -msgstr "分片作业计数" - -#: client/src/workflow-results/workflow-results.controller.js:75 -msgid "Slice Job Template" -msgstr "分片作业模板" - -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:44 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:48 -msgid "Smart Host Filter" -msgstr "智能主机过滤器" - -#: client/src/inventories-hosts/inventories/inventory.list.js:90 -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:75 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:70 -#: client/src/shared/form-generator.js:1406 -msgid "Smart Inventory" -msgstr "智能清单" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:44 -msgid "Solvable With Playbook" -msgstr "可使用 Playbook 解答" - -#: client/features/output/output.strings.js:92 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:57 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:50 -msgid "Source" -msgstr "源" - -#: client/src/credentials/credentials.form.js:75 -msgid "Source Control" -msgstr "源控制" - -#: client/features/output/output.strings.js:93 -msgid "Source Credential" -msgstr "源凭证" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:33 -#: client/src/projects/projects.form.js:26 -msgid "Source Details" -msgstr "源详情" - -#: client/src/notifications/notificationTemplates.form.js:212 -#: client/src/notifications/notificationTemplates.form.js:213 -msgid "Source Phone Number" -msgstr "源电话号码" - -#: client/features/output/output.strings.js:70 -msgid "Source Project" -msgstr "源项目" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:135 -msgid "Source Regions" -msgstr "源区域" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:208 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:215 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:232 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:239 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:256 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:263 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:273 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:280 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:290 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:297 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:307 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:314 -msgid "Source Variables" -msgstr "源变量" - -#: client/src/partials/logviewer.html:9 -msgid "Source Vars" -msgstr "源变量" - -#: client/features/output/output.strings.js:94 -#: client/src/workflow-results/workflow-results.controller.js:77 -msgid "Source Workflow" -msgstr "源工作流" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:39 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:163 -msgid "Sources" -msgstr "源" - -#: client/src/notifications/notificationTemplates.form.js:420 -msgid "Specify HTTP Headers in JSON format. Refer to the Ansible Tower documentation for example syntax." -msgstr "以 JSON 格式指定 HTTP 标头。示例语法请参阅 Ansible Tower 文档。" - -#: client/src/credentials/credentials.form.js:284 -msgid "Specify a method for %s operations. This is equivalent to specifying the %s parameter, where %s could be %s" -msgstr "指定 %s 操作的方法。这等同于指定 %s 参数,其中 %s 可能为 %s" - -#: client/src/notifications/notificationTemplates.form.js:574 -msgid "Specify a notification color. Acceptable colors are hex color code (example: #3af or #789abc) ." -msgstr "指定通知颜色。可接受的颜色为十六进制颜色代码(示例:#3af 或者 #789abc)。" - -#: client/src/notifications/notificationTemplates.form.js:375 -msgid "Specify a notification color. Acceptable colors are: yellow, green, red purple, gray or random." -msgstr "指定通知颜色。可接受的颜色为:黄色、绿色、红色、紫色、灰色或随机色。" - -#: client/features/users/tokens/tokens.strings.js:20 -msgid "Specify a scope for the token's access" -msgstr "指定令牌访问的范围" - -#: client/src/notifications/notificationTemplates.form.js:432 -msgid "Specify an HTTP method for the webhook. Acceptable choices are: POST or PUT" -msgstr "为 Webhook 指定 HTTP 方法。可接受的选择为:POST 或 PUT。" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:268 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:283 -msgid "Specify which groups to create automatically. Group names will be created similar to the options selected. If blank, all groups above are created. Refer to Ansible Tower documentation for more detail." -msgstr "指定要自动创建的组。组名称将以类似于所选选项的方式创建。如果为空,会创建以上所有组。请参阅 Ansible Tower 文档了解更多详情。" - -#: client/features/output/output.strings.js:135 -msgid "Standard Error" -msgstr "标准错误" - -#: client/features/output/output.strings.js:134 -#: client/src/partials/logviewer.html:5 -msgid "Standard Out" -msgstr "标准输出" - -#: client/src/notifications/notifications.list.js:53 -msgid "Start" -msgstr "开始" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:42 -#: client/src/scheduler/scheduler.strings.js:23 -msgid "Start Date" -msgstr "开始日期" - -#: client/src/notifications/notificationTemplates.form.js:597 -msgid "Start Message" -msgstr "开始消息" - -#: client/src/notifications/notificationTemplates.form.js:608 -msgid "Start Message Body" -msgstr "开始消息正文" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 -#: client/src/scheduler/scheduler.strings.js:24 -msgid "Start Time" -msgstr "开始时间" - -#: client/lib/services/base-string.service.js:140 -msgid "Start Time (Ascending)" -msgstr "开始时间(升序)" - -#: client/lib/services/base-string.service.js:141 -msgid "Start Time (Descending)" -msgstr "开始时间(降序)" - -#: client/lib/components/components.strings.js:110 -msgid "Start a job using this template" -msgstr "使用此模板启动作业" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:6 -msgid "Start sync process" -msgstr "启动同步进程" - -#: client/features/jobs/jobs.strings.js:9 -#: client/features/output/output.strings.js:95 -#: client/src/workflow-results/workflow-results.controller.js:71 -msgid "Started" -msgstr "已开始" - -#: client/features/output/output.strings.js:96 -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:55 -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:55 -#: client/src/inventories-hosts/shared/factories/set-status.factory.js:43 -#: client/src/notifications/notification-templates-list/list.controller.js:71 -#: client/src/partials/logviewer.html:4 -#: client/src/workflow-results/workflow-results.controller.js:74 -msgid "Status" -msgstr "状态" - -#: client/src/license/license.partial.html:203 -msgid "Submit" -msgstr "提交" - -#: client/features/output/output.strings.js:112 -msgid "Submit search" -msgstr "提交搜索" - -#: client/src/license/license.partial.html:27 -msgid "Subscription" -msgstr "订阅" - -#: client/src/credentials/credentials.form.js:151 -#: client/src/credentials/credentials.form.js:162 -msgid "Subscription ID" -msgstr "订阅 ID" - -#: client/src/credentials/credentials.form.js:161 -msgid "Subscription ID is an Azure construct, which is mapped to a username." -msgstr "订阅 ID 是一个 Azure 构造函数,它映射到一个用户名。" - -#: client/src/notifications/notifications.list.js:65 -msgid "Success" -msgstr "成功" - -#: client/src/notifications/notificationTemplates.form.js:620 -msgid "Success Message" -msgstr "成功信息" - -#: client/src/notifications/notificationTemplates.form.js:631 -msgid "Success Message Body" -msgstr "成功消息正文" - -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:83 -msgid "Successful" -msgstr "成功" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:404 -#: client/src/scheduler/scheduler.strings.js:36 -msgid "Sun" -msgstr "周日" - -#: client/features/templates/templates.strings.js:32 -msgid "Survey" -msgstr "问卷调查" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:73 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:478 -msgid "Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch." -msgstr "问卷调查允许系统在作业启动时通过与该作业相关的一系列问题提示用户。这样可以定义变量来影响启动时运行的 playbook。" - -#: client/src/inventories-hosts/inventories/list/source-summary-popover/source-summary-popover.directive.js:79 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:186 -msgid "Sync Status" -msgstr "同步状态" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:62 -msgid "Sync all inventory sources" -msgstr "同步所有清单源" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:29 -msgid "Sync canceled. Click to view log." -msgstr "同步已取消。点击以查看日志。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:35 -msgid "Sync completed. Click to view log." -msgstr "同步已完成。点击以查看日志。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:32 -msgid "Sync failed. Click to view log." -msgstr "同步失败。点击以查看日志。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "Sync not performed. Click" -msgstr "未执行同步。点击" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:38 -msgid "Sync pending." -msgstr "等待同步。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:45 -msgid "Sync running" -msgstr "同步正在运行" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:46 -msgid "Sync running. Click to view log." -msgstr "同步正在运行。点击以查看日志。" - -#: client/lib/components/components.strings.js:96 -#: client/src/configuration/settings.partial.html:8 -msgid "System" -msgstr "系统" - -#: client/src/users/add/users-add.controller.js:12 -#: client/src/users/edit/users-edit.controller.js:12 -#: client/src/users/list/users-list.controller.js:12 -msgid "System Administrator" -msgstr "系统管理员" - -#: client/src/shared/form-generator.js:1846 -msgid "System Administrators have access to all s" -msgstr "系统管理员可以访问所有" - -#: client/src/users/add/users-add.controller.js:11 -#: client/src/users/edit/users-edit.controller.js:11 -#: client/src/users/list/users-list.controller.js:11 -msgid "System Auditor" -msgstr "系统审核员" - -#: client/src/configuration/forms/settings-form.partial.html:3 -msgid "System auditors have read-only permissions in this section." -msgstr "系统审核员在本节中具有只读权限。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:97 -msgid "TACACS+" -msgstr "TACACS+" - -#: client/features/output/output.strings.js:131 -msgid "TASK" -msgstr "任务" - -#: client/src/activity-stream/get-target-title.factory.js:23 -#: client/src/organizations/linkout/organizations-linkout.route.js:95 -#: client/src/organizations/list/organizations-list.controller.js:62 -#: client/src/teams/main.js:65 -#: client/src/teams/teams.list.js:14 -#: client/src/teams/teams.list.js:15 -msgid "TEAMS" -msgstr "团队" - -#: client/features/templates/routes/templatesList.route.js:12 -#: client/features/templates/templates.strings.js:12 -#: client/features/templates/templates.strings.js:8 -#: client/src/activity-stream/get-target-title.factory.js:44 -#: client/src/templates/templates.list.js:15 -#: client/src/templates/templates.list.js:16 -msgid "TEMPLATES" -msgstr "模板" - -#: client/lib/services/base-string.service.js:78 -msgid "TEST" -msgstr "测试" - -#: client/src/instance-groups/instance-groups.list.js:8 -msgid "THERE ARE CURRENTLY NO INSTANCE GROUPS DEFINED" -msgstr "目前没有定义实例组" - -#: client/src/home/dashboard/graphs/job-status/job-status-graph.directive.js:103 -msgid "TIME" -msgstr "时间" - -#: client/features/users/tokens/tokens.strings.js:22 -msgid "TOKEN" -msgstr "令牌" - -#: client/features/users/tokens/tokens.strings.js:21 -msgid "TOKEN INFORMATION" -msgstr "令牌信息" - -#: client/features/applications/applications.strings.js:11 -#: client/features/users/tokens/tokens.strings.js:10 -#: client/features/users/tokens/tokens.strings.js:8 -#: client/features/users/tokens/users-tokens-list.route.js:24 -#: client/src/activity-stream/get-target-title.factory.js:50 -msgid "TOKENS" -msgstr "令牌" - -#: client/features/templates/templates.strings.js:122 -msgid "TOTAL NODES" -msgstr "节点总数" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:250 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:262 -msgid "Tag None:" -msgstr "标签 None:" - -#: client/features/templates/templates.strings.js:55 -#: client/src/templates/job_templates/job-template.form.js:212 -msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task. Use commas to separate multiple tags. Refer to Ansible Tower documentation for details on the usage of tags." -msgstr "如果有大型一个 playbook,而您想要运行某个 play 或任务的特定部分,则标签很有用。使用逗号分隔多个标签。请参阅 Ansible Tower 文档了解使用标签的详情。" - -#: client/src/notifications/notificationTemplates.form.js:330 -msgid "Tags for the Annotation" -msgstr "注解的标签" - -#: client/src/notifications/notificationTemplates.form.js:329 -msgid "Tags for the Annotation (optional)" -msgstr "注解的标签(可选)" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:248 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:260 -msgid "Tags:" -msgstr "标签:" - -#: client/src/notifications/notificationTemplates.form.js:392 -#: client/src/notifications/notificationTemplates.form.js:442 -#: client/src/notifications/notificationTemplates.form.js:481 -msgid "Target URL" -msgstr "目标 URL" - -#: client/features/output/output.strings.js:118 -msgid "Tasks" -msgstr "任务" - -#: client/features/credentials/legacy.credentials.js:91 -#: client/src/credentials/credentials.form.js:467 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:136 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:133 -#: client/src/organizations/organizations.form.js:171 -#: client/src/projects/projects.form.js:307 -#: client/src/templates/workflows.form.js:317 -msgid "Team Roles" -msgstr "团队角色" - -#: client/lib/services/base-string.service.js:96 -msgid "Team access removal" -msgstr "团队访问删除" - -#: client/lib/components/components.strings.js:81 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:36 -#: client/src/organizations/linkout/organizations-linkout.route.js:103 -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/shared/stateDefinitions.factory.js:426 -#: client/src/users/users.form.js:162 -msgid "Teams" -msgstr "团队" - -#: client/features/templates/templates.strings.js:120 -#: client/src/templates/templates.list.js:14 -#: client/src/workflow-results/workflow-results.controller.js:69 -msgid "Template" -msgstr "模板" - -#: client/features/templates/templates.strings.js:79 -msgid "Template parameter is missing." -msgstr "缺少模板参数。" - -#: client/lib/components/components.strings.js:78 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:37 -msgid "Templates" -msgstr "模板" - -#: client/src/credentials/credentials.form.js:336 -msgid "Tenant ID" -msgstr "租户 ID" - -#: client/src/configuration/forms/system-form/sub-forms/system-logging.form.js:80 -msgid "Test" -msgstr "测试" - -#: client/features/credentials/credentials.strings.js:26 -msgid "Test External Credential" -msgstr "测试外部凭证" - -#: client/features/credentials/credentials.strings.js:45 -msgid "Test failed." -msgstr "测试失败。" - -#: client/src/notifications/notificationTemplates.list.js:82 -msgid "Test notification" -msgstr "测试通知" - -#: client/features/credentials/credentials.strings.js:44 -msgid "Test passed." -msgstr "测试通过。" - -#: client/src/templates/survey-maker/surveys/init.factory.js:13 -msgid "Text" -msgstr "文本" - -#: client/src/templates/survey-maker/surveys/init.factory.js:14 -msgid "Textarea" -msgstr "文本区域" - -#: client/src/shared/form-generator.js:1306 -#: client/src/shared/form-generator.js:1312 -msgid "That value was not found. Please enter or select a valid value." -msgstr "未找到该值。请输入或选择一个有效值。" - -#: client/lib/components/components.strings.js:48 -msgid "That value was not found. Please enter or select a valid value." -msgstr "未找到该值。请输入或选择一个有效值。" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:66 -msgid "The Insights Credential for {{inventory.name}} was not found." -msgstr "未找到 {{inventory.name}} 的 Insights 凭证。" - -#: client/src/credentials/factories/become-method-change.factory.js:32 -#: client/src/credentials/factories/kind-change.factory.js:88 -msgid "The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:" -msgstr "项目 ID 是 GCE 分配的标识。它由两个单词构成,后跟三位数字。例如:" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "The Project selected has a status of" -msgstr "所选项目的状态为" - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "The SCM update process is running." -msgstr "SCM 更新进程正在运行。" - -#: client/src/notifications/notificationTemplates.form.js:150 -msgid "The amount of time (in seconds) before the email notification stops trying to reach the host and times out. Ranges from 1 to 120 seconds." -msgstr "电子邮件通知停止尝试到达主机并超时之前所经过的时间(以秒为单位)。范围为 1 秒到 120 秒。" - -#: client/src/templates/job_templates/job-template.form.js:299 -msgid "The amount of time (in seconds) to run before the task is canceled. Defaults to 0 for no job timeout." -msgstr "取消任务前运行的时间(以秒为单位)。默认为 0,即没有作业超时。" - -#: client/features/templates/templates.strings.js:154 -msgid "The amount of time to wait before this approval step is automatically denied. Defaults to 0 for no timeout." -msgstr "自动拒绝此批准步骤前等待的时间。默认为 0,即没有超时。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:201 -#: client/src/templates/survey-maker/shared/question-definition.form.js:260 -#: client/src/templates/survey-maker/shared/question-definition.form.js:281 -msgid "The answer is longer than the maximum length. Please make the answer shorter." -msgstr "回答超过最大长度。请缩短回答。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:200 -#: client/src/templates/survey-maker/shared/question-definition.form.js:259 -#: client/src/templates/survey-maker/shared/question-definition.form.js:280 -msgid "The answer is shorter than the minimium length. Please make the answer longer." -msgstr "回答不足最小长度。请增长回答。" - -#: client/src/notifications/notificationTemplates.form.js:287 -msgid "The base URL of the Grafana server - the /api/annotations endpoint will be added automatically to the base Grafana URL." -msgstr "Grafana 服务器的基本 URL - /api/annotations 端点将自动添加到基本 Grafana URL。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:241 -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:328 -#: client/src/scheduler/scheduler.strings.js:32 -msgid "The day must be between 1 and 31." -msgstr "日期必须在 1 到 31 之间。" - -#: client/src/configuration/settings.service.js:39 -msgid "The duration (in seconds) access tokens remain valid since their creation." -msgstr "访问令牌自创建后保持有效的持续时间(以秒为单位)。" - -#: client/src/configuration/settings.service.js:47 -msgid "The duration (in seconds) authorization codes remain valid since their creation." -msgstr "授权代码自创建后保持有效的持续时间(以秒为单位)。" - -#: client/src/configuration/settings.service.js:43 -msgid "The duration (in seconds) refresh tokens remain valid after the expiration of their associated access token." -msgstr "刷新令牌在其关联访问令牌过期后保持有效的持续时间(以秒为单位)。" - -#: client/src/credentials/credentials.form.js:190 -msgid "The email address assigned to the Google Compute Engine %sservice account." -msgstr "分配给 Google Compute Engine 的 %s 服务账户的电子邮件地址。" - -#: client/src/projects/projects.form.js:143 -msgid "The first fetches all references. The second fetches the Github pull request number 62, in this example the branch needs to be `pull/62/head`." -msgstr "第一个获取所有引用。第二个获取 Github 拉取请求号 62,在本示例中,分支需要为 `pull/62/head`。" - -#: client/features/templates/templates.strings.js:146 -msgid "The following promptable values were provided when this node was created:" -msgstr "创建此节点时会提供以下可提示值:" - -#: client/features/output/output.strings.js:12 -msgid "The host status bar will update when the job is complete." -msgstr "作业完成后,主机状态栏会更新。" - -#: client/src/credentials/factories/become-method-change.factory.js:62 -#: client/src/credentials/factories/kind-change.factory.js:118 -msgid "The host to authenticate with." -msgstr "要进行验证的主机。" - -#: client/src/credentials/factories/kind-change.factory.js:59 -msgid "The host value" -msgstr "主机值" - -#: client/features/templates/templates.strings.js:137 -msgid "The inventory of this node will be overridden by the parent workflow inventory." -msgstr "此节点的清单将被父工作流清单覆盖。" - -#: client/features/templates/templates.strings.js:139 -msgid "The inventory of this node will be overridden if a parent workflow inventory is provided at launch." -msgstr "如果在启动时提供了父工作流清单,则此节点的清单将被覆盖。" - -#: client/features/templates/templates.strings.js:138 -msgid "The inventory of this node will not be overridden by the parent workflow inventory." -msgstr "此节点的清单不会被父工作流清单覆盖。" - -#: client/features/templates/templates.strings.js:140 -msgid "The inventory of this node will not be overridden if a parent workflow inventory is provided at launch." -msgstr "如果在启动时提供了父工作流清单,则此节点的清单不会被覆盖。" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:153 -msgid "The inventory will be in a pending status until the final delete is processed." -msgstr "在处理最终删除前,清单将处于待处理状态。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:100 -#: client/src/templates/survey-maker/shared/question-definition.form.js:121 -#: client/src/templates/survey-maker/shared/question-definition.form.js:142 -msgid "The maximum length is too low. Please enter a number larger than the minimum length you set." -msgstr "最大长度太小。请输入一个大于您设置的最小长度的数字。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:120 -#: client/src/templates/survey-maker/shared/question-definition.form.js:141 -#: client/src/templates/survey-maker/shared/question-definition.form.js:99 -msgid "The maximum length you entered is not a valid number. Please enter a whole number." -msgstr "您输入的最大长度不是有效数字。请输入一个整数。" - -#: client/src/organizations/organizations.form.js:69 -msgid "The maximum number of hosts allowed to be managed by this organization. Value defaults to 0 which means no limit. Refer to the Ansible documentation for more details." -msgstr "允许由此机构管理的最大主机数。默认值为 0,表示无限制。请参阅 Ansible 文档以了解更多详情。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:115 -#: client/src/templates/survey-maker/shared/question-definition.form.js:136 -#: client/src/templates/survey-maker/shared/question-definition.form.js:94 -msgid "The minimium length is too high. Please enter a lower number." -msgstr "最小长度太大。请输入一个更小的数字。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:116 -#: client/src/templates/survey-maker/shared/question-definition.form.js:137 -#: client/src/templates/survey-maker/shared/question-definition.form.js:95 -msgid "The minimum length is too low. Please enter a positive number." -msgstr "最小长度太小。请输入一个正数。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:114 -#: client/src/templates/survey-maker/shared/question-definition.form.js:135 -#: client/src/templates/survey-maker/shared/question-definition.form.js:93 -msgid "The minimum length you entered is not a valid number. Please enter a whole number." -msgstr "您输入的最小长度不是有效数字。请输入一个整数。" - -#: client/src/templates/job_templates/job-template.form.js:171 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. An empty value, or a value less than 1 will use the Ansible default which is usually 5. The default number of forks can be overwritten with a change to" -msgstr "执行 playbook 时使用的并行或同步进程数量。空值或小于 1 的值将使用 Ansible 默认值,通常为 5。要覆盖默认分叉数,可更改" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:105 -msgid "The number of parallel or simultaneous processes to use while executing the playbook. Inputting no value will use the default value from the %sansible configuration file%s." -msgstr "执行 playbook 时使用的并行或同步进程数量。如果不输入值,则将使用 %s 配置文件 %s 中的默认值。" - -#: client/src/credentials/factories/kind-change.factory.js:58 -msgid "The project value" -msgstr "项目值" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:552 -msgid "The scheduler options are invalid or incomplete." -msgstr "调度程序选项无效或者不完整。" - -#: client/src/scheduler/scheduler.strings.js:49 -msgid "The scheduler options are invalid, incomplete, or a date is in the past." -msgstr "调度程序选项是无效、不完整,或者日期位于过去。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "The selected project has a status of" -msgstr "所选项目的状态为" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:206 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings and then run an update." -msgstr "没有为 SCM 配置所选项目。要为 SCM 配置,请编辑项目并提供 SCM 设置,然后运行更新。" - -#: client/features/projects/projects.strings.js:23 -msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." -msgstr "没有为 SCM 配置所选项目。要为 SCM 配置,请编辑项目并提供 SCM 设置,然后运行更新。" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:52 -msgid "The suggested format for variable names is lowercase and underscore-separated (for example, foo_bar, user_id, host_name, etc.). Variable names with spaces are not allowed." -msgstr "变量名称的建议格式为小写字母并用下划线分隔(例如:foo_bar、user_id、host_name 等等)。不允许使用带空格的变量名称。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:126 -#: client/src/scheduler/scheduler.strings.js:25 -msgid "The time must be in HH24:MM:SS format." -msgstr "时间必须采用 HH24:MM:SS 格式。" - -#: client/lib/services/base-string.service.js:90 -msgid "The {{ resourceType }} is currently being used by other resources." -msgstr "其他资源目前正在使用 {{ resourceType }}。" - -#: client/src/activity-stream/streams.list.js:17 -msgid "There are no events to display at this time" -msgstr "此时没有要显示的事件" - -#: client/lib/components/components.strings.js:127 -msgid "There are no jobs awaiting approval" -msgstr "没有作业等待批准" - -#: client/features/jobs/jobs.strings.js:18 -msgid "There are no running jobs." -msgstr "没有正在运行的作业。" - -#: client/features/projects/projects.strings.js:22 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "此项目没有可用的 SCM 更新信息。更新还没有完成。如果您还没有完成此操作,请为此项目启动更新。" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:198 -msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." -msgstr "此项目没有可用的 SCM 更新信息。更新还没有完成。如果您还没有完成,请为此项目启动更新。" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:127 -msgid "There was an error deleting inventory source groups. Returned status:" -msgstr "删除清单源组时出错。返回的状态:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:117 -msgid "There was an error deleting inventory source hosts. Returned status:" -msgstr "删除清单源主机时出错。返回的状态:" - -#: client/src/inventories-hosts/inventories/related/sources/list/sources-list.controller.js:154 -msgid "There was an error deleting inventory source. Returned status:" -msgstr "删除清单源时出错。返回的状态:" - -#: client/src/configuration/forms/settings-form.controller.js:286 -msgid "There was an error resetting value. Returned status:" -msgstr "重置值时出错。返回的状态:" - -#: client/src/configuration/forms/settings-form.controller.js:615 -msgid "There was an error resetting values. Returned status:" -msgstr "重置值时出错。返回的状态:" - -#: client/src/configuration/forms/system-form/configuration-system.controller.js:235 -msgid "There was an error testing the log aggregator. Returned status:" -msgstr "测试日志聚合器时出错。返回的状态:" - -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:29 -msgid "These are the modules that {{BRAND_NAME}} supports running commands against." -msgstr "这些是 {{BRAND_NAME}} 支持运行命令的模块。" - -#: client/features/templates/templates.strings.js:106 -msgid "This Job Template has a credential that requires a password. Credentials requiring passwords on launch are not permitted on workflow nodes." -msgstr "此作业模板具有需要密码的凭证。工作流节点上不允许使用启动时需要密码的凭证。" - -#: client/src/scheduler/scheduler.strings.js:59 -msgid "This Job Template has a default credential that requires a password before launch. Adding or editing schedules is prohibited while this credential is selected. To add or edit a schedule, credentials that require a password must be removed from the Job Template." -msgstr "此作业模板具有启动前需要密码的默认凭证。选择此凭证时禁止添加或编辑计划。若要添加或编辑计划,必须从作业模板中删除需要密码的凭证。" - -#: client/features/templates/templates.strings.js:105 -msgid "This Job Template is missing a default inventory or project. This must be addressed in the Job Template form before this node can be saved." -msgstr "此作业模板缺少默认清单或项目。必须先在作业模板表单中处理这个问题,然后才能保存该节点。" - -#: client/src/credential-types/credential-types.strings.js:8 -msgid "This credential type is currently being used by one or more credentials. Credentials that use this credential type must be deleted before the credential type can be deleted." -msgstr "一个或多个凭证目前正在使用此凭证类型。必须先删除使用此凭证类型的凭证,然后才能删除此凭证类型。" - -#: client/src/instance-groups/instance-groups.strings.js:14 -msgid "This feature is currently in tech preview and is subject to change in a future release. Click here for documentation." -msgstr "这个功能当前为技术预览功能,并可能会在以后的版本中有所变化。点击这里查看文档。" - -#: client/src/inventories-hosts/inventories/related/groups/list/groups-list.partial.html:25 -msgid "This group contains at least one group or host" -msgstr "这个组包含至少一个组或主机" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:50 -#: client/src/templates/workflows.form.js:74 -msgid "This inventory is applied to all job template nodes that prompt for an inventory." -msgstr "此清单应用于提示清单的所有作业模板节点。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:174 -msgid "This is not a valid number." -msgstr "这不是有效的数字。" - -#: client/src/credentials/factories/become-method-change.factory.js:59 -#: client/src/credentials/factories/kind-change.factory.js:115 -msgid "This is the tenant name. This value is usually the same as the username." -msgstr "这是租户名称。此值通常与用户名相同。" - -#: client/features/templates/templates.strings.js:75 -msgid "This job template has a default {{typeLabel}} credential which must be included or replaced before proceeding." -msgstr "此作业模板具有默认的 {{typeLabel}} 凭证,在继续之前必须包含或替换此凭证。" - -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -msgid "This list is populated by inventories added from the" -msgstr "用于填充此列表的清单添加自" - -#: client/src/notifications/notifications.list.js:21 -msgid "This list is populated by notification templates added from the %sNotifications%s section" -msgstr "此列表由 %sNotifications%s 一节中添加的通知模板填充" - -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "This list is populated by projects added from the" -msgstr "用于填充此列表的项目添加自" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -msgid "This list is populated by teams added from the" -msgstr "用于填充此列表的团队添加自" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:4 -msgid "This machine has not checked in with Insights in {{last_check_in}} hours" -msgstr "此机器没有在 {{last_check_in}} 小时内通过 Insights 签入" - -#: client/src/templates/survey-maker/shared/question-definition.form.js:49 -msgid "This question variable is already in use. Please enter a different variable name." -msgstr "此问题变量已在使用中。请输入不同的变量名称。" - -#: client/src/shared/form-generator.js:707 -msgid "This setting has been set manually in a settings file and is now disabled." -msgstr "此设置已在设置文件中手动设置,现在被禁用。" - -#: client/src/users/users.form.js:167 -msgid "This user is not a member of any teams" -msgstr "此用户不是任何团队的成员" - -#: client/src/shared/form-generator.js:828 -#: client/src/shared/form-generator.js:920 -msgid "This value does not match the password you entered previously. Please confirm that password." -msgstr "此值与之前输入的密码不匹配。请确认该密码。" - -#: client/src/configuration/forms/settings-form.controller.js:488 -msgid "This will reset all configuration values to their factory defaults. Are you sure you want to proceed?" -msgstr "这会将所有配置值重置为其工厂默认值。确定要继续?" - -#: client/src/templates/prompt/steps/inventory/prompt-inventory.directive.js:51 -msgid "This workflow job template has a default inventory which must be included or replaced before proceeding." -msgstr "此工作流作业模板具有默认的清单,在继续之前必须包含或替换此凭证。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:444 -#: client/src/scheduler/scheduler.strings.js:40 -msgid "Thu" -msgstr "周四" - -#: client/src/activity-stream/streams.list.js:25 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:18 -#: client/src/notifications/notification-templates-list/list.controller.js:72 -msgid "Time" -msgstr "时间" - -#: client/src/license/license.partial.html:45 -msgid "Time Remaining" -msgstr "剩余时间" - -#: client/src/projects/projects.form.js:228 -msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." -msgstr "将项目视为最新的时间(以秒为单位)。在作业运行和回调期间,任务系统将评估最新项目更新的时间戳。如果它比缓存超时旧,则不被视为最新,并且会执行新的项目更新。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:405 -msgid "Time in seconds to consider an inventory sync to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest sync. If it is older than Cache Timeout, it is not considered current, and a new inventory sync will be performed." -msgstr "将清单同步视为最新的时间(以秒为单位)。在作业运行和回调期间,任务系统将评估最新同步的时间戳。如果它比缓存超时旧,则不被视为最新,并且会执行新的清单同步。" - -#: client/features/templates/templates.strings.js:156 -#: client/src/notifications/notificationTemplates.form.js:136 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/templates/job_templates/job-template.form.js:290 -#: client/src/templates/job_templates/job-template.form.js:296 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:137 -msgid "Timeout" -msgstr "超时" - -#: client/src/credentials/credentials.form.js:125 -msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." -msgstr "要了解更多关于 IAM STS 令牌的信息,请参阅 %sAmazon 文档%s。" - -#: client/features/output/output.strings.js:120 -msgid "Toggle expanded output" -msgstr "切换扩展的输出" - -#: client/src/shared/form-generator.js:850 -msgid "Toggle the display of plaintext." -msgstr "切换明文的显示。" - -#: client/src/notifications/shared/type-change.service.js:37 -#: client/src/notifications/shared/type-change.service.js:46 -msgid "Token" -msgstr "令牌" - -#: client/features/applications/applications.strings.js:16 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 -#: client/src/users/users.form.js:242 -msgid "Tokens" -msgstr "令牌" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:10 -msgid "Total Issues" -msgstr "问题总数" - -#: client/src/instance-groups/instance-groups.strings.js:23 -msgid "Total Jobs" -msgstr "作业总数" - -#: client/src/workflow-results/workflow-results.controller.js:91 -msgid "Total Nodes" -msgstr "节点总数" - -#: client/src/partials/logviewer.html:6 -msgid "Traceback" -msgstr "追溯" - -#: client/src/license/license.partial.html:176 -msgid "Tracking and Analytics" -msgstr "跟踪和分析" - -#: client/src/license/license.partial.html:233 -msgid "Trial" -msgstr "试用" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:424 -#: client/src/scheduler/scheduler.strings.js:38 -msgid "Tue" -msgstr "周二" - -#: client/src/credentials/credentials.form.js:60 -#: client/src/credentials/credentials.form.js:84 -#: client/src/inventories-hosts/inventories/inventory.list.js:60 -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:45 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:44 -#: client/src/notifications/notifications.list.js:33 -#: client/src/projects/projects.list.js:50 -#: client/src/scheduler/scheduled-jobs.list.js:47 -#: client/src/teams/teams.form.js:142 -#: client/src/templates/templates.list.js:31 -#: client/src/users/users.form.js:206 -msgid "Type" -msgstr "类型" - -#: client/features/credentials/credentials.strings.js:18 -#: client/src/credentials/credentials.form.js:23 -#: client/src/notifications/notificationTemplates.form.js:26 -msgid "Type Details" -msgstr "类型详情" - -#: client/features/templates/templates.strings.js:145 -msgid "UNLINK" -msgstr "取消链接" - -#: client/src/projects/add/projects-add.controller.js:182 -#: client/src/projects/edit/projects-edit.controller.js:303 -msgid "URL popover text" -msgstr "URL 弹出文本" - -#: client/src/license/license.partial.html:132 -#: client/src/login/loginModal/loginModal.partial.html:61 -msgid "USERNAME" -msgstr "用户名" - -#: client/src/activity-stream/get-target-title.factory.js:20 -#: client/src/organizations/linkout/organizations-linkout.route.js:43 -#: client/src/organizations/list/organizations-list.controller.js:55 -#: client/src/users/users.list.js:18 -#: client/src/users/users.list.js:19 -#: client/src/users/users.route.js:8 -msgid "USERS" -msgstr "用户" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:597 -msgid "UTC" -msgstr "UTC" - -#: client/lib/services/base-string.service.js:144 -msgid "UUID (Ascending)" -msgstr "UUID(升序)" - -#: client/lib/services/base-string.service.js:145 -msgid "UUID (Descending)" -msgstr "UUID(降序)" - -#: client/lib/components/components.strings.js:25 -msgid "Unable to Submit" -msgstr "无法提交" - -#: client/features/templates/templates.strings.js:96 -msgid "Unable to copy template." -msgstr "无法复制模板。" - -#: client/src/instance-groups/instance-groups.strings.js:67 -msgid "Unable to delete instance group." -msgstr "无法删除实例组。" - -#: client/features/templates/templates.strings.js:92 -msgid "Unable to delete template." -msgstr "无法删除模板。" - -#: client/features/templates/templates.strings.js:94 -msgid "Unable to determine template type." -msgstr "无法确定模板类型。" - -#: client/features/templates/templates.strings.js:81 -msgid "Unable to determine this template's type while copying." -msgstr "在复制时无法确定此模板的类型。" - -#: client/features/templates/templates.strings.js:82 -msgid "Unable to determine this template's type while deleting." -msgstr "在删除时无法确定此模板的类型。" - -#: client/features/templates/templates.strings.js:83 -msgid "Unable to determine this template's type while editing." -msgstr "在编辑时无法确定此模板的类型。" - -#: client/features/templates/templates.strings.js:84 -msgid "Unable to determine this template's type while launching." -msgstr "在启动时无法确定此模板的类型。" - -#: client/features/templates/templates.strings.js:85 -msgid "Unable to determine this template's type while scheduling." -msgstr "在调度时无法确定此模板的类型。" - -#: client/features/templates/templates.strings.js:91 -msgid "Unable to edit template." -msgstr "无法编辑模板。" - -#: client/src/shared/stateDefinitions.factory.js:231 -msgid "Unable to get resource:" -msgstr "无法获取资源:" - -#: client/features/templates/templates.strings.js:93 -msgid "Unable to launch template." -msgstr "无法启动模板。" - -#: client/features/templates/templates.strings.js:95 -msgid "Unable to schedule job." -msgstr "无法调度作业。" - -#: client/src/instance-groups/instance-groups.strings.js:49 -msgid "Unavailable" -msgstr "不可用" - -#: client/src/instance-groups/instance-groups.strings.js:48 -msgid "Unavailable to run jobs." -msgstr "不可用于运行作业。" - -#: client/lib/components/components.strings.js:27 -msgid "Unexpected Error" -msgstr "意外错误" - -#: client/lib/components/components.strings.js:26 -msgid "Unexpected server error. View the console for more information" -msgstr "意外服务器错误。查看控制台以了解更多信息" - -#: client/src/license/license.partial.html:59 -msgid "Unlimited" -msgstr "无限" - -#: client/lib/components/components.strings.js:39 -msgid "Unsupported display model type" -msgstr "不支持的显示模型类型" - -#: client/lib/components/components.strings.js:31 -msgid "Unsupported input type" -msgstr "不支持的输入类型" - -#: client/features/projects/projects.strings.js:33 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "Update Not Found" -msgstr "未找到更新" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:344 -msgid "Update Options" -msgstr "更新选项" - -#: client/src/projects/projects.form.js:197 -msgid "Update Revision on Launch" -msgstr "启动时更新修订" - -#: client/features/projects/projects.strings.js:44 -#: client/src/projects/factories/get-project-tool-tip.factory.js:30 -msgid "Update canceled. Click for details" -msgstr "更新已取消。点击了解详情" - -#: client/features/projects/projects.strings.js:42 -#: client/src/projects/factories/get-project-tool-tip.factory.js:24 -msgid "Update failed. Click for details" -msgstr "更新失败。点击了解详情" - -#: client/src/projects/edit/projects-edit.controller.js:331 -msgid "Update in Progress" -msgstr "更新正在进行" - -#: client/features/projects/projects.strings.js:43 -#: client/src/projects/factories/get-project-tool-tip.factory.js:27 -msgid "Update missing. Click for details" -msgstr "更新缺失。点击了解详情" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:372 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:377 -msgid "Update on Launch" -msgstr "启动时更新" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:383 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:389 -msgid "Update on Project Update" -msgstr "更新项目更新" - -#: client/features/projects/projects.strings.js:39 -#: client/src/projects/factories/get-project-tool-tip.factory.js:14 -msgid "Update queued. Click for details" -msgstr "更新已加入队列。点击了解详情" - -#: client/features/projects/projects.strings.js:40 -#: client/src/projects/factories/get-project-tool-tip.factory.js:18 -msgid "Update running. Click for details" -msgstr "更新正在运行。点击了解详情" - -#: client/src/configuration/settings.partial.html:6 -msgid "Update settings pertaining to Jobs within Tower" -msgstr "更新 Tower 中与作业相关的设置" - -#: client/features/projects/projects.strings.js:41 -#: client/src/projects/factories/get-project-tool-tip.factory.js:21 -msgid "Update succeeded. Click for details" -msgstr "更新成功。点击了解详情" - -#: client/src/license/license.partial.html:75 -msgid "Upgrade" -msgstr "升级" - -#: client/src/license/license.partial.html:111 -msgid "Upload a license file" -msgstr "上传许可证文件" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:62 -#: client/src/organizations/organizations.form.js:48 -#: client/src/projects/projects.form.js:240 -#: client/src/templates/job_templates/job-template.form.js:257 -msgid "Use Default Environment" -msgstr "使用默认环境" - -#: client/src/notifications/add/add.controller.js:98 -#: client/src/notifications/edit/edit.controller.js:139 -msgid "Use SSL" -msgstr "使用 SSL" - -#: client/src/notifications/add/add.controller.js:97 -#: client/src/notifications/edit/edit.controller.js:138 -msgid "Use TLS" -msgstr "使用 TLS" - -#: client/src/notifications/notificationTemplates.form.js:586 -msgid "Use custom messages to change the content of notifications sent when a job starts, succeeds, or fails. Use curly braces to access information about the job: {{ job_friendly_name }}, {{ url }}, or attributes of the job such as {{ job.status }}. You may apply a number of possible variables in the message. Refer to the Ansible Tower documentation for more details." -msgstr "使用自定义信息来更改作业启动、成功或失败时发送的通知内容。使用大括号可以访问有关作业的信息: {{ job_friendly_name }}, {{ url }}, 或作业属性如 {{ job.status }}。您可以在信息中使用变量。详情请参阅 Ansible Tower 文档。" - -#: client/src/instance-groups/instance-groups.strings.js:24 -#: client/src/instance-groups/instance-groups.strings.js:50 -msgid "Used Capacity" -msgstr "已使用容量" - -#: client/src/credentials/credentials.form.js:76 -msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." -msgstr "用于从远程源控制管理系统(如 Git、Subversion (svn) 或 Mercurial (hg))签出和同步 playbook 存储库。这些凭证由项目使用。" - -#: client/features/credentials/legacy.credentials.js:80 -#: client/src/credentials/credentials.form.js:456 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:125 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:122 -#: client/src/organizations/organizations.form.js:119 -#: client/src/organizations/organizations.form.js:160 -#: client/src/projects/projects.form.js:296 -#: client/src/teams/teams.form.js:96 -#: client/src/templates/workflows.form.js:306 -msgid "User" -msgstr "用户" - -#: client/lib/components/components.strings.js:97 -#: client/src/configuration/settings.partial.html:11 -msgid "User Interface" -msgstr "用户界面" - -#: client/src/users/users.form.js:96 -msgid "User Type" -msgstr "用户类型" - -#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 -#: client/src/credentials/factories/become-method-change.factory.js:17 -#: client/src/credentials/factories/become-method-change.factory.js:38 -#: client/src/credentials/factories/kind-change.factory.js:16 -#: client/src/credentials/factories/kind-change.factory.js:40 -#: client/src/credentials/factories/kind-change.factory.js:73 -#: client/src/credentials/factories/kind-change.factory.js:94 -#: client/src/notifications/notificationTemplates.form.js:453 -#: client/src/notifications/notificationTemplates.form.js:492 -#: client/src/notifications/notificationTemplates.form.js:64 -#: client/src/users/users.form.js:59 -#: client/src/users/users.list.js:29 -msgid "Username" -msgstr "用户名" - -#: client/lib/services/base-string.service.js:138 -msgid "Username (Ascending)" -msgstr "用户名(升序)" - -#: client/lib/services/base-string.service.js:139 -msgid "Username (Descending)" -msgstr "用户名(降序)" - -#: client/src/credentials/credentials.form.js:80 -msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for smart inventory sources and for cloud provisioning and deployment in playbook runs." -msgstr "用于向指定云或基础架构提供商进行身份验证的用户名、密码和访问密钥。这些凭证用于智能清单源以及 playbook 运行中的云部署。" - -#: client/lib/components/components.strings.js:80 -#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 -#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:38 -#: client/src/organizations/organizations.form.js:101 -#: client/src/teams/teams.form.js:78 -msgid "Users" -msgstr "用户" - -#: client/src/scheduler/schedulerList.controller.js:46 -msgid "Using a credential that requires a password on launch is prohibited when creating a Job Template schedule" -msgstr "在创建作业模板计划时,禁止使用启动时需要密码的凭证" - -#: client/lib/components/code-mirror/code-mirror.strings.js:11 -msgid "VARIABLES" -msgstr "变量" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:7 -#: client/src/home/dashboard/lists/jobs/jobs-list.partial.html:7 -msgid "VIEW ALL" -msgstr "查看全部" - -#: client/src/inventories-hosts/inventories/insights/insights.partial.html:90 -msgid "VIEW DATA IN INSIGHTS" -msgstr "在 INSIGHTS 中查看数据" - -#: client/lib/components/components.strings.js:59 -msgid "VIEW LESS" -msgstr "查看更少" - -#: client/features/templates/templates.strings.js:143 -msgid "VIEW LINK" -msgstr "查看链接" - -#: client/lib/components/components.strings.js:58 -msgid "VIEW MORE" -msgstr "查看更多" - -#: client/src/shared/paginate/paginate.partial.html:48 -msgid "VIEW PER PAGE" -msgstr "按页面查看" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:249 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:261 -msgid "VPC ID:" -msgstr "VPC ID:" - -#: client/src/license/license.partial.html:10 -msgid "Valid License" -msgstr "有效许可证" - -#: client/src/inventories-hosts/hosts/host.form.js:67 -#: client/src/inventories-hosts/inventories/related/groups/groups.form.js:46 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.form.js:47 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:66 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:68 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:63 -#: client/src/inventories-hosts/inventories/standard-inventory/inventory.form.js:70 -msgid "Variables" -msgstr "变量" - -#: client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js:25 -#: client/src/templates/prompt/steps/credential/prompt-credential.directive.js:37 -msgid "Vault ID" -msgstr "Vault ID" - -#: client/features/templates/templates.strings.js:48 -#: client/src/credentials/credentials.form.js:390 -msgid "Vault Password" -msgstr "Vault 密码" - -#: client/features/output/output.strings.js:97 -#: client/features/templates/templates.strings.js:60 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:82 -#: client/src/inventories-hosts/inventories/adhoc/adhoc.form.js:91 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:330 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:337 -#: client/src/templates/job_templates/job-template.form.js:189 -#: client/src/templates/job_templates/job-template.form.js:196 -msgid "Verbosity" -msgstr "详细程度" - -#: client/src/license/license.partial.html:15 -msgid "Version" -msgstr "版本" - -#: client/src/activity-stream/streams.list.js:63 -#: client/src/credential-types/credential-types.list.js:64 -#: client/src/credentials/credentials.list.js:82 -#: client/src/home/dashboard/graphs/dashboard-graphs.partial.html:64 -#: client/src/inventories-hosts/inventories/inventory.list.js:118 -#: client/src/inventory-scripts/inventory-scripts.list.js:70 -#: client/src/notifications/notificationTemplates.list.js:96 -#: client/src/scheduler/schedules.list.js:101 -#: client/src/teams/teams.list.js:64 -#: client/src/templates/templates.list.js:101 -#: client/src/users/users.list.js:70 -msgid "View" -msgstr "查看" - -#: client/src/bread-crumb/bread-crumb.directive.js:33 -msgid "View Activity Stream" -msgstr "查看活动流" - -#: client/lib/components/components.strings.js:68 -msgid "View Documentation" -msgstr "查看文档" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:52 -msgid "View Insights" -msgstr "查看 Insights" - -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:102 -#: client/src/inventories-hosts/inventory-hosts.strings.js:27 -msgid "View Insights Data" -msgstr "查看 Insights 数据" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:201 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:225 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:249 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:324 -msgid "View JSON examples at" -msgstr "要查看 JSON 示例,请访问" - -#: client/src/inventories-hosts/hosts/host.form.js:77 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:76 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:84 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:73 -msgid "View JSON examples at %s" -msgstr "在 %s 查看 JSON 示例" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:13 -msgid "View Less" -msgstr "查看更少" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.partial.html:11 -msgid "View More" -msgstr "查看更多" - -#: client/src/organizations/list/organizations-list.partial.html:64 -msgid "View Organization" -msgstr "查看机构" - -#: client/features/output/output.strings.js:28 -#: client/features/output/output.strings.js:32 -msgid "View Project checkout results" -msgstr "查看项目签出结果" - -#: client/src/shared/form-generator.js:1672 -#: client/src/templates/job_templates/job-template.form.js:588 -#: client/src/templates/workflows.form.js:343 -msgid "View Survey" -msgstr "查看问卷调查" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:202 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:226 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:250 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:325 -msgid "View YAML examples at" -msgstr "要查看 YAML 示例,请访问" - -#: client/src/inventories-hosts/hosts/host.form.js:78 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.form.js:77 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.form.js:88 -#: client/src/inventories-hosts/inventories/smart-inventory/smart-inventory.form.js:74 -msgid "View YAML examples at %s" -msgstr "在 %s 查看 YAML 示例" - -#: client/src/configuration/settings.partial.html:15 -msgid "View and edit your license information" -msgstr "查看并编辑您的许可证信息" - -#: client/src/credentials/credentials.list.js:84 -msgid "View credential" -msgstr "查看凭证" - -#: client/src/credential-types/credential-types.list.js:66 -msgid "View credential type" -msgstr "查看凭证类型" - -#: client/lib/components/layout/layout.partial.html:29 -msgid "View documentation" -msgstr "查看文档" - -#: client/src/activity-stream/streams.list.js:67 -msgid "View event details" -msgstr "查看事件详情" - -#: client/src/inventories-hosts/inventories/related/groups/groups.list.js:99 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-groups/group-nested-groups.list.js:92 -#: client/src/inventories-hosts/inventories/related/hosts/related/nested-groups/host-nested-groups.list.js:96 -msgid "View group" -msgstr "查看组" - -#: client/src/inventories-hosts/hosts/host.list.js:95 -#: client/src/inventories-hosts/inventories/related/groups/related/nested-hosts/group-nested-hosts.list.js:96 -#: client/src/inventories-hosts/inventories/related/hosts/related-host.list.js:109 -#: client/src/inventories-hosts/inventory-hosts.strings.js:26 -msgid "View host" -msgstr "查看主机" - -#: client/src/inventories-hosts/inventories/inventory.list.js:120 -msgid "View inventory" -msgstr "查看清单" - -#: client/src/inventory-scripts/inventory-scripts.list.js:72 -msgid "View inventory script" -msgstr "查看清单脚本" - -#: client/src/inventories-hosts/inventories/list/host-summary-popover/host-summary-popover.directive.js:83 -msgid "View job" -msgstr "查看作业" - -#: client/src/notifications/notificationTemplates.list.js:98 -msgid "View notification" -msgstr "查看通知" - -#: client/src/scheduler/schedules.list.js:103 -msgid "View schedule" -msgstr "查看调度" - -#: client/src/inventories-hosts/inventories/related/sources/sources.list.js:114 -msgid "View source" -msgstr "查看源" - -#: client/src/teams/teams.list.js:67 -msgid "View team" -msgstr "查看团队" - -#: client/src/templates/templates.list.js:103 -msgid "View template" -msgstr "查看模板" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:261 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:274 -msgid "View the" -msgstr "查看" - -#: client/features/output/output.strings.js:22 -#: client/lib/components/components.strings.js:63 -msgid "View the Credential" -msgstr "查看凭证" - -#: client/features/output/output.strings.js:26 -msgid "View the Inventory" -msgstr "查看清单" - -#: client/features/output/output.strings.js:29 -msgid "View the Job Template" -msgstr "查看作业模板" - -#: client/features/output/output.strings.js:27 -#: client/features/output/output.strings.js:31 -msgid "View the Project" -msgstr "查看项目" - -#: client/features/output/output.strings.js:33 -msgid "View the Schedule" -msgstr "查看计划" - -#: client/features/output/output.strings.js:35 -msgid "View the User" -msgstr "查看用户" - -#: client/src/projects/projects.list.js:115 -msgid "View the project" -msgstr "查看项目" - -#: client/src/scheduler/scheduled-jobs.list.js:79 -msgid "View the schedule" -msgstr "查看计划" - -#: client/features/output/output.strings.js:34 -#: client/src/workflow-results/workflow-results.controller.js:63 -msgid "View the source Workflow Job" -msgstr "查看源工作流作业" - -#: client/features/output/output.strings.js:41 -msgid "View the webhook configuration on the job template." -msgstr "查看作业模板上的 Webhook 配置。" - -#: client/features/output/output.strings.js:42 -#: client/src/workflow-results/workflow-results.controller.js:65 -msgid "View the webhook configuration on the workflow job template." -msgstr "查看工作流作业模板上的 Webhook 配置。" - -#: client/src/users/users.list.js:73 -msgid "View user" -msgstr "查看用户" - -#: client/lib/components/components.strings.js:91 -msgid "Views" -msgstr "视图" - -#: client/features/templates/templates.strings.js:148 -msgid "WARNING: UNSAVED CHANGES" -msgstr "警告:未保存的更改" - -#: client/src/templates/workflows.form.js:20 -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.service.js:47 -msgid "WORKFLOW" -msgstr "工作流" - -#: client/features/templates/templates.strings.js:136 -msgid "WORKFLOW VISUALIZER" -msgstr "工作流可视化工具" - -#: client/features/templates/templates.strings.js:115 -msgid "Wait For Approval" -msgstr "等待批准" - -#: client/features/templates/templates.strings.js:121 -#: client/src/scheduler/scheduler.strings.js:58 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:369 -msgid "Warning" -msgstr "警告" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:52 -#: client/src/configuration/forms/settings-form.controller.js:444 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:50 -msgid "Warning: Unsaved Changes" -msgstr "警告:未保存的更改" - -#: client/src/license/license.controller.js:159 -msgid "We were unable to locate licenses associated with this account" -msgstr "我们无法找到与这个帐户关联的许可证" - -#: client/features/jobs/jobs.strings.js:17 -#: client/features/output/output.strings.js:53 -#: client/src/workflow-results/workflow-results.controller.js:88 -msgid "Webhook" -msgstr "Webhook" - -#: client/src/templates/job_templates/job-template.form.js:462 -#: client/src/templates/job_templates/job-template.form.js:473 -#: client/src/templates/workflows.form.js:235 -#: client/src/templates/workflows.form.js:246 -msgid "Webhook Credential" -msgstr "Webhook 凭证" - -#: client/src/templates/job_templates/job-template.form.js:430 -#: client/src/templates/job_templates/job-template.form.js:456 -#: client/src/templates/workflows.form.js:203 -#: client/src/templates/workflows.form.js:229 -msgid "Webhook Key" -msgstr "Webhook 密钥" - -#: client/src/templates/job_templates/job-template.form.js:405 -#: client/src/templates/job_templates/job-template.form.js:414 -#: client/src/templates/workflows.form.js:178 -#: client/src/templates/workflows.form.js:187 -msgid "Webhook Service" -msgstr "Webhook 服务" - -#: client/src/templates/job_templates/job-template.form.js:419 -#: client/src/templates/job_templates/job-template.form.js:425 -#: client/src/templates/workflows.form.js:192 -#: client/src/templates/workflows.form.js:198 -msgid "Webhook URL" -msgstr "Webhook URL" - -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:78 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:69 -msgid "Webhook services can launch jobs with this job template by making a POST request to this URL." -msgstr "Webhook 服务可通过向此 URL 发出 POST 请求来使用此作业模板启动作业。" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:47 -#: client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js:79 -#: client/src/templates/workflows/edit-workflow/workflow-edit.controller.js:70 -msgid "Webhook services can use this as a shared secret." -msgstr "Webhook 服务可以将此用作共享机密。" - -#: client/src/management-jobs/scheduler/schedulerForm.partial.html:434 -#: client/src/scheduler/scheduler.strings.js:39 -msgid "Wed" -msgstr "周三" - -#: client/src/license/license.partial.html:82 -msgid "Welcome to Ansible Tower! Please complete the steps below to acquire a license." -msgstr "欢迎使用 Ansible Tower!请完成以下步骤以获取许可证。" - -#: client/src/login/loginModal/loginModal.partial.html:23 -msgid "Welcome to Ansible {{BRAND_NAME}}!  Please sign in." -msgstr "欢迎使用 {{BRAND_NAME}}!  请登陆。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:365 -msgid "When not checked, a merge will be performed, combining local variables with those found on the external source." -msgstr "如果没有选中,就会执行合并,将本地变量与外部源上的变量合并。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:354 -msgid "When not checked, local child hosts and groups not found on the external source will remain untouched by the inventory update process." -msgstr "如果没有选中,外部源上没有的本地子主机和组将在清单更新过程中保持不变。" - -#: client/features/output/output.strings.js:25 -msgid "When this field is true, the job's inventory belongs to an organization that has exceeded it's limit of hosts as defined by the system administrator." -msgstr "当此字段为 true 时,作业的清单所属的机构已超过系统管理员定义的主机数限制。" - -#: client/src/projects/projects.form.js:50 -msgid "When this project is used by a Job Template, Organization cannot be changed." -msgstr "当作业模板使用此项目时,不能更改机构。" - -#: client/features/templates/templates.strings.js:119 -#: client/src/workflow-results/workflow-results.controller.js:100 -msgid "Workflow" -msgstr "工作流" - -#: client/src/notifications/notificationTemplates.form.js:666 -msgid "Workflow Approved Message" -msgstr "工作流已批准消息" - -#: client/src/notifications/notificationTemplates.form.js:677 -msgid "Workflow Approved Message Body" -msgstr "工作流已批准消息正文" - -#: client/src/notifications/notificationTemplates.form.js:689 -msgid "Workflow Denied Message" -msgstr "工作流已拒绝消息" - -#: client/src/notifications/notificationTemplates.form.js:700 -msgid "Workflow Denied Message Body" -msgstr "工作流已拒绝消息正文" - -#: client/features/jobs/jobs.strings.js:11 -msgid "Workflow Job" -msgstr "工作流作业" - -#: client/lib/models/models.strings.js:49 -msgid "Workflow Job Template Nodes" -msgstr "工作流作业模板节点" - -#: client/lib/models/models.strings.js:45 -msgid "Workflow Job Templates" -msgstr "工作流作业模板" - -#: client/src/notifications/notificationTemplates.form.js:712 -msgid "Workflow Pending Approval Message" -msgstr "工作流待处理批准消息" - -#: client/src/notifications/notificationTemplates.form.js:723 -msgid "Workflow Pending Approval Message Body" -msgstr "工作流待处理批准信息的内容" - -#: client/features/templates/templates.strings.js:14 -#: client/lib/components/components.strings.js:132 -#: client/src/templates/templates.list.js:66 -msgid "Workflow Template" -msgstr "工作流模板" - -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:108 -#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:41 -msgid "Workflow Templates" -msgstr "工作流模板" - -#: client/src/notifications/notificationTemplates.form.js:735 -msgid "Workflow Timed Out Message" -msgstr "工作流超时消息" - -#: client/src/notifications/notificationTemplates.form.js:746 -msgid "Workflow Timed Out Message Body" -msgstr "工作流超时消息正文" - -#: client/src/shared/form-generator.js:1676 -#: client/src/templates/workflows.form.js:367 -msgid "Workflow Visualizer" -msgstr "工作流可视化工具" - -#: client/features/users/tokens/tokens.strings.js:31 -msgid "Write" -msgstr "写入" - -#: client/lib/components/code-mirror/code-mirror.strings.js:13 -#: client/lib/services/base-string.service.js:72 -msgid "YAML" -msgstr "YAML" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:199 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:223 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:247 -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:322 -msgid "YAML:" -msgstr "YAML:" - -#: client/lib/services/base-string.service.js:76 -msgid "YES" -msgstr "是" - -#: client/src/notifications/add/add.controller.js:88 -#: client/src/notifications/edit/edit.controller.js:151 -msgid "Yellow" -msgstr "黄色" - -#: client/src/home/dashboard/lists/job-templates/job-templates-list.partial.html:57 -msgid "You can create a job template here." -msgstr "您可以创建一个作业模板 here。" - -#: client/features/templates/templates.strings.js:101 -msgid "You do not have access to all resources used by this workflow. Resources that you don't have access to will not be copied and will result in an incomplete workflow." -msgstr "您无法访问此工作流使用的所有资源。您没有访问权限的资源将无法复制,并会导致工作流不完整。" - -#: client/src/projects/factories/get-project-path.factory.js:56 -msgid "You do not have access to view this property" -msgstr "您没有查看此属性的权限" - -#: client/src/templates/main.js:128 -msgid "You do not have permission to add a job template, or there are no projects available." -msgstr "您没有添加作业模板的权限,或者没有项目可用。" - -#: client/src/projects/add/projects-add.controller.js:35 -msgid "You do not have permission to add a project." -msgstr "您没有添加项目的权限。" - -#: client/src/users/add/users-add.controller.js:45 -msgid "You do not have permission to add a user." -msgstr "您没有添加用户的权限。" - -#: client/src/templates/main.js:367 -msgid "You do not have permission to add a workflow job template." -msgstr "您没有添加工作流作业模板的权限。" - -#: client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js:190 -msgid "You do not have permission to manage this user" -msgstr "您没有管理此用户的权限" - -#: client/features/templates/templates.strings.js:80 -msgid "You do not have permission to perform this action." -msgstr "您没有执行此操作的权限。" - -#: client/src/workflow-results/workflow-results.route.js:34 -msgid "You do not have permission to view this job." -msgstr "您没有查看此作业的权限。" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:41 -msgid "You do not have sufficient permissions to edit the host filter." -msgstr "您没有足够的权限来编辑主机过滤器。" - -#: client/src/login/loginModal/loginModal.partial.html:34 -msgid "You have been logged out. Please sign in." -msgstr "您已经退出。请登录。" - -#: client/src/configuration/forms/auth-form/configuration-auth.controller.js:51 -#: client/src/configuration/forms/settings-form.controller.js:443 -#: client/src/configuration/forms/system-form/configuration-system.controller.js:49 -msgid "You have unsaved changes. Would you like to proceed without saving?" -msgstr "您有未保存的更改。是否要在没有保存的情况下继续?" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "You must run a successful update before you can select a playbook. You will not be able to save this Job Template without a valid playbook." -msgstr "您必须先运行一个成功更新,然后才能选择一个 playbook。您将无法在没有有效 playbook 的情况下保存此作业模板。" - -#: client/features/projects/projects.strings.js:21 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:231 -msgid "Your request to cancel the update was submitted to the task manager." -msgstr "您的取消更新的请求已提交至任务管理器。" - -#: client/src/login/loginModal/loginModal.partial.html:28 -msgid "Your session timed out due to inactivity. Please sign in." -msgstr "您的会话因为不活跃而超时。请登录。" - -#: client/index.template.ejs:32 -msgid "Your session will expire in 60 seconds, would you like to continue?" -msgstr "会话将于 60 秒后过期,您希望继续吗?" - -#: client/src/shared/form-generator.js:1169 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:42 -msgid "and" -msgstr "和" - -#: client/src/activity-stream/factories/build-description.factory.js:133 -msgid "approved" -msgstr "已批准" - -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:252 -#: client/src/organizations/linkout/controllers/organizations-projects.controller.js:277 -msgid "button to view the latest status." -msgstr "按钮以查看最新状态。" - -#: client/features/users/tokens/tokens.strings.js:27 -msgid "by" -msgstr "按" - -#: client/features/jobs/jobs.strings.js:29 -msgid "canceled" -msgstr "已取消" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "characters long." -msgstr "字符长。" - -#: client/src/activity-stream/factories/build-description.factory.js:138 -msgid "denied" -msgstr "已拒绝" - -#: client/features/output/output.strings.js:104 -#: client/src/shared/smart-search/smart-search.partial.html:50 -msgid "documentation" -msgstr "文档" - -#: client/features/jobs/jobs.strings.js:28 -msgid "error" -msgstr "错误" - -#: client/features/jobs/jobs.strings.js:27 -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:359 -msgid "failed" -msgstr "失败" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:262 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:275 -msgid "for a complete list of supported filters." -msgstr "获取受支持过滤器的完整列表。" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -msgid "from the" -msgstr "从" - -#: client/src/inventories-hosts/inventories/related/hosts/related-groups-labels/relatedGroupsLabelsList.directive.js:82 -#: client/src/inventories-hosts/inventory-hosts.strings.js:8 -msgid "group" -msgid_plural "groups" -msgstr[0] "组" -msgstr[1] "组" - -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:49 -msgid "groups with sync failures. Click for details" -msgstr "同步失败的组。点击了解详情" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:9 -msgid "host" -msgid_plural "hosts" -msgstr[0] "主机" -msgstr[1] "主机" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:64 -#: client/src/organizations/linkout/controllers/organizations-inventories.controller.js:61 -msgid "hosts with failures. Click for details." -msgstr "失败的主机。点击了解详情。" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:146 -msgid "min" -msgstr "分钟" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:365 -msgid "missing" -msgstr "缺少" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:21 -msgid "name" -msgstr "名称" - -#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:362 -msgid "never updated" -msgstr "永不更新" - -#: client/features/jobs/jobs.strings.js:22 -msgid "new" -msgstr "新" - -#: client/src/shared/paginate/paginate.partial.html:34 -#: client/src/shared/paginate/paginate.partial.html:45 -msgid "of" -msgstr "的" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "of the filters match." -msgstr "过滤器匹配。" - -#: client/src/scheduler/scheduler.strings.js:34 -msgid "on" -msgstr "日期" - -#: client/src/scheduler/scheduler.strings.js:31 -msgid "on day" -msgstr "日期" - -#: client/src/scheduler/scheduler.strings.js:35 -msgid "on days" -msgstr "日期" - -#: client/src/scheduler/scheduler.strings.js:33 -msgid "on the" -msgstr "日期" - -#: client/src/access/rbac-multiselect/permissionsTeams.list.js:24 -msgid "organization" -msgstr "机构" - -#: client/features/jobs/jobs.strings.js:23 -msgid "pending" -msgstr "待处理" - -#: client/src/shared/form-generator.js:1044 -msgid "playbook" -msgstr "playbook" - -#: client/features/jobs/jobs.strings.js:25 -msgid "running" -msgstr "运行中" - -#: client/src/templates/workflows/workflow-maker/forms/workflow-node-form.partial.html:150 -msgid "sec" -msgstr "秒" - -#: client/src/organizations/linkout/organizations-linkout.route.js:105 -#: client/src/organizations/linkout/organizations-linkout.route.js:149 -#: client/src/organizations/linkout/organizations-linkout.route.js:192 -msgid "section" -msgstr "节" - -#: client/features/credentials/credentials.strings.js:35 -msgid "selected" -msgstr "已选择" - -#: client/src/credentials/credentials.form.js:138 -#: client/src/credentials/credentials.form.js:363 -msgid "set in helpers/credentials" -msgstr "设置于 helpers/credentials" - -#: client/src/inventories-hosts/inventories/list/inventory-list.controller.js:47 -msgid "sources with sync failures. Click for details" -msgstr "同步失败的源。点击了解详情" - -#: client/features/jobs/jobs.strings.js:26 -msgid "successful" -msgstr "成功" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:259 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:272 -msgid "test" -msgstr "测试" - -#: client/src/activity-stream/factories/build-description.factory.js:136 -msgid "timed out" -msgstr "超时" - -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:14 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:19 -#: client/src/templates/prompt/steps/survey/prompt-survey.partial.html:30 -msgid "to" -msgstr "至" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:138 -msgid "to include all regions. Only Hosts associated with the selected regions will be updated." -msgstr "以包括所有区域。只有与所选区域关联的主机才会更新。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:17 -msgid "to start it now." -msgstr "以立即启动它。" - -#: client/src/inventories-hosts/inventories/related/sources/factories/get-sync-status-msg.factory.js:25 -msgid "to update." -msgstr "以更新。" - -#: client/src/activity-stream/factories/build-description.factory.js:141 -msgid "updated" -msgstr "已更新" - -#: client/src/credentials/credentials.form.js:380 -msgid "v2 URLs%s - leave blank" -msgstr "v2 URL %s - 留空" - -#: client/src/credentials/credentials.form.js:381 -msgid "v3 default%s - set to 'default'" -msgstr "v3 默认 %s - 设为 'default'" - -#: client/src/credentials/credentials.form.js:382 -msgid "v3 multi-domain%s - your domain name" -msgstr "v3 多域 %s - 您的域名" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:318 -msgid "view azure_rm.ini in the Ansible community.general github repo." -msgstr "查看 Ansible community.general github repo 中的 azure_rm.ini。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:219 -msgid "view ec2.ini in the community.aws repo." -msgstr "查看 community.aws repo 中的 ec2.ini。" - -#: client/src/inventories-hosts/inventories/related/sources/sources.form.js:243 -msgid "view vmware_inventory.ini in the vmware community repo." -msgstr "查看 vmware 社区 repo 中的 vmware_inventory.ini。" - -#: client/features/jobs/jobs.strings.js:24 -msgid "waiting" -msgstr "等待" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:254 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:267 -msgid "when" -msgstr "何时" - -#: client/src/inventories-hosts/inventories/related/sources/add/sources-add.controller.js:240 -#: client/src/inventories-hosts/inventories/related/sources/edit/sources-edit.controller.js:252 -msgid "will create group names similar to the following examples based on the options selected:" -msgstr "将根据选择的选项创建类似以下示例的组名称:" - -#: client/index.template.ejs:158 -msgid "working..." -msgstr "工作..." - -#: client/features/users/tokens/tokens.strings.js:42 -msgid "{{ appName }} Token" -msgstr "{{ appName }} Token" - -#: client/lib/services/base-string.service.js:158 -msgid "{{ header }} {{ body }}" -msgstr "{{ header }} {{ body }}" - -#: client/lib/services/base-string.service.js:80 -msgid "{{ resource }} successfully created" -msgstr "{{ resource }} 成功创建" - -#: client/src/inventories-hosts/inventory-hosts.strings.js:31 -msgid "{{ str1 }}

{{ str2 }}

" -msgstr "{{ str1 }}

{{ str2 }}

" - -#: client/lib/components/cards/card.partial.html:2 -msgid "{{ title }}" -msgstr "{{ title }}" - -#: client/src/instance-groups/container-groups/add-container-group.view.html:24 -msgid "{{ vm.form.extraVars.toggleLabel }}" -msgstr "{{ vm.form.extraVars.toggleLabel }}" - -#: client/src/configuration/forms/settings-form.partial.html:10 -#: client/src/configuration/forms/settings-form.route.js:15 -msgid "{{ vm.getCurrentFormTitle() }}" -msgstr "{{ vm.getCurrentFormTitle() }}" - -#: client/src/templates/prompt/steps/other-prompts/prompt-other-prompts.partial.html:5 -msgid "{{:: vm.strings.get('prompt.JOB_TYPE') }}" -msgstr "{{:: vm.strings.get('prompt.JOB_TYPE') }}" - -#: client/lib/components/input/label.partial.html:5 -msgid "{{::state._hint}}" -msgstr "{{::state._hint}}" - -#: client/src/configuration/forms/auth-form/configuration-auth.partial.html:6 -#: client/src/configuration/forms/system-form/configuration-system.partial.html:5 -msgid "{{opt.label}}" -msgstr "{{opt.label}}" - -#: client/src/shared/paginate/paginate.partial.html:56 -msgid "{{pageSize}}" -msgstr "{{pageSize}}" - diff --git a/awx/ui/test/e2e/.babelrc b/awx/ui/test/e2e/.babelrc deleted file mode 100644 index 05758ba5a8..0000000000 --- a/awx/ui/test/e2e/.babelrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - ["env", { - "targets": { - "node": 6 - } - }] - ] -} diff --git a/awx/ui/test/e2e/.eslintrc.js b/awx/ui/test/e2e/.eslintrc.js deleted file mode 100644 index 02959f42e3..0000000000 --- a/awx/ui/test/e2e/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - rules: { - 'no-unused-expressions': 'off', - 'no-unused-vars': 'off', - } -}; diff --git a/awx/ui/test/e2e/README.md b/awx/ui/test/e2e/README.md deleted file mode 100644 index c22c280487..0000000000 --- a/awx/ui/test/e2e/README.md +++ /dev/null @@ -1,82 +0,0 @@ -## AWX E2E -#### Introduction -This is an automated functional test suite for the front end. - -#### Technology -The tests are written in Node.js and use the [Nightwatch](https://github.com/nightwatchjs/nightwatch) test runner. - -#### Requirements -- node.js 8.x LTS -- npm 5.x LTS - -#### Installation -A successful invocation of `make ui-devel` will prepare your environment with the software -dependencies required to run these tests. - -#### Configuration -Three inputs are required: - -*AWX_E2E_URL* - -> A valid url for a running AWX instance that is reachable by your machine. This can be your local -development instance or other awx instance. Defaults to *https://localhost:8043*. - -*AWX_E2E_USERNAME* - -> A valid admin username for the target awx instance. Defaults to *awx-e2e*. - -*AWX_E2E_PASSWORD* - -> A valid password for the admin. Defaults to *password*. - -These inputs can be provided as environment variables or defined as default values in [settings](settings.js). -The settings file also contains all other configurable input values to this test suite. - -#### Usage -```shell -# run all of the tests with a live browser -npm --prefix awx/ui run e2e - -# run a subset of the tests -npm --prefix awx/ui run e2e -- --filter="test-credentials*" -``` -**Note:** -- Use `npm --prefix awx/ui run e2e -- --help` to see additional usage information for the test runner. -- All example commands in this document assume that you are working from the root directory of the awx project. - -#### File Overview -All nightwatch.js tests are present in the `tests` directory. When writing -these tests, you may import needed functions from [fixtures.js](fixtures.js), which provides a convenient way to create resources needed for tests -via API, which might include organizations, users, and job templates. - -The `commands` directory provides extra functions for the client object in -nightwatch.js tests. These functions are automatically made available for use by the -client object. For more information on these functions and how to -create your own, refer to the [nightwatch.js documentation on custom commands] -(http://nightwatchjs.org/guide/#writing-custom-commands). - -#### CI Container Debugging -To reproduce test runs in the ci container locally, you'll want to use the provided `docker-compose.yml` file as well as some override files -to link the containers to your development environment. - -```shell -# docker-compose.yml - the default configuration for ci -# docker-compose.devel-override.yml - link ci container to development containers -# docker-compose.debug-override.hml - make chrome and firefox nodes accessible over vnc -docker-compose \ - -f awx/ui/test/e2e/cluster/docker-compose.yml \ - -f awx/ui/test/e2e/cluster/docker-compose.devel-override.yml \ - -f awx/ui/test/e2e/cluster/docker-compose.debug-override.yml \ - run -e AWX_E2E_URL=https://awx:8043 -e AWX_E2E_USERNAME=awx -e AWX_E2E_PASSWORD=password e2e '--filter=*smoke*' -``` - -Once running, you can connect to nodes over vnc at `vnc://localhost:5900` and `vnc://localhost:5901`. - -**Note:** -- On macOS, safari has a built-in vnc client and you should be able to use these urls directly. -- On linux, you'll need to have your favorite vnc client ready (like `tigervnc`). Depending on the vnc client you use, you may need to visit `localhost:5900` and input the password `secret` separately. -- For the chrome and firefox nodes, the development container instance of awx is mapped to hostname `awx` (https://awx:8043) - -#### Known Issues -- ```2019-07-30 13:35:47.883 chromedriver[66032:1305791] pid(66032)/euid(501) is calling TIS/TSM in non-main thread environment, ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!!``` - Specific to MacOS High Sierra. More here: https://github.com/processing/processing/issues/5462 diff --git a/awx/ui/test/e2e/api.js b/awx/ui/test/e2e/api.js deleted file mode 100644 index f411e8ed56..0000000000 --- a/awx/ui/test/e2e/api.js +++ /dev/null @@ -1,61 +0,0 @@ -import https from 'https'; - -import axios from 'axios'; - -import { - AWX_E2E_URL, - AWX_E2E_USERNAME, - AWX_E2E_PASSWORD -} from './settings'; - -const session = axios.create({ - baseURL: AWX_E2E_URL, - xsrfHeaderName: 'X-CSRFToken', - xsrfCookieName: 'csrftoken', - httpsAgent: new https.Agent({ - rejectUnauthorized: false - }), - auth: { - username: AWX_E2E_USERNAME, - password: AWX_E2E_PASSWORD - } -}); - -const getEndpoint = location => { - if (location.indexOf('/api/v') === 0 || location.indexOf('://') > 0) { - return location; - } - - return `${AWX_E2E_URL}/api/v2${location}`; -}; - -const request = (method, location, data) => { - const uri = getEndpoint(location); - const action = session[method.toLowerCase()]; - - return action(uri, data) - .then(res => { - console.log([ // eslint-disable-line no-console - res.config.method.toUpperCase(), - res.config.url, - res.status, - res.statusText - ].join(' ')); - - return res; - }); -}; - -const get = (endpoint, data) => request('GET', endpoint, data); -const options = endpoint => request('OPTIONS', endpoint); -const post = (endpoint, data) => request('POST', endpoint, data); -const patch = (endpoint, data) => request('PATCH', endpoint, data); -const put = (endpoint, data) => request('PUT', endpoint, data); - -module.exports = { - get, - options, - post, - patch, - put, -}; diff --git a/awx/ui/test/e2e/cluster/Dockerfile b/awx/ui/test/e2e/cluster/Dockerfile deleted file mode 100644 index 73cbe3906e..0000000000 --- a/awx/ui/test/e2e/cluster/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM centos:7 - -ARG NPMRC_FILE=awx/ui/.npmrc -ENV NPMRC_FILE=${NPMRC_FILE} - -RUN yum -y update && yum -y install epel-release && yum -y install https://centos7.iuscommunity.org/ius-release.rpm - -RUN yum install -y \ - bzip2 \ - gcc-c++ \ - git2u \ - git2u-core \ - make \ - nodejs \ - npm - -WORKDIR /awx - -COPY awx/ui/package.json awx/ui/package.json - -COPY ${NPMRC_FILE} awx/ui/.npmrc - -RUN npm --prefix=awx/ui config list && npm --prefix=awx/ui install - -COPY awx/ui/test/e2e awx/ui/test/e2e - -ENTRYPOINT ["npm", "--prefix=awx/ui", "run", "e2e", "--", "--env=cluster"] diff --git a/awx/ui/test/e2e/cluster/docker-compose.debug-override.yml b/awx/ui/test/e2e/cluster/docker-compose.debug-override.yml deleted file mode 100644 index 0d0a0ca3f3..0000000000 --- a/awx/ui/test/e2e/cluster/docker-compose.debug-override.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -version: '2' -services: - chrome: - # tests are observable at vnc://localhost:secret@localhost:5900 - image: selenium/node-chrome-debug:${SELENIUM_DOCKER_TAG} - ports: ['5900:5900'] - firefox: - # tests are observable at vnc://localhost:secret@localhost:5901 - image: selenium/node-firefox-debug:${SELENIUM_DOCKER_TAG} - ports: ['5901:5900'] diff --git a/awx/ui/test/e2e/cluster/docker-compose.devel-override.yml b/awx/ui/test/e2e/cluster/docker-compose.devel-override.yml deleted file mode 100644 index eed4e15a94..0000000000 --- a/awx/ui/test/e2e/cluster/docker-compose.devel-override.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -version: '2' -networks: - default: - external: - name: tools_default -services: - chrome: - external_links: - - tools_awx_1:awx - firefox: - external_links: - - tools_awx_1:awx - e2e: - external_links: - - tools_awx_1:awx - environment: - AWX_E2E_URL: https://awx:8043 diff --git a/awx/ui/test/e2e/cluster/docker-compose.yml b/awx/ui/test/e2e/cluster/docker-compose.yml deleted file mode 100644 index 2b53751465..0000000000 --- a/awx/ui/test/e2e/cluster/docker-compose.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -version: '2' -services: - hub: - image: selenium/hub:${SELENIUM_DOCKER_TAG} - ports: - - 4444:4444 - environment: - DBUS_SESSION_BUS_ADDRESS: /dev/null - chrome: - image: selenium/node-chrome:${SELENIUM_DOCKER_TAG} - links: - - hub - volumes: - - /dev/shm:/dev/shm - environment: - HUB_PORT_4444_TCP_ADDR: hub - HUB_PORT_4444_TCP_PORT: 4444 - DBUS_SESSION_BUS_ADDRESS: /dev/null - firefox: - image: selenium/node-firefox:${SELENIUM_DOCKER_TAG} - links: - - hub - environment: - HUB_PORT_4444_TCP_ADDR: hub - HUB_PORT_4444_TCP_PORT: 4444 - e2e: - image: awx_e2e - build: - context: ../../../../../ - dockerfile: awx/ui/test/e2e/cluster/Dockerfile - args: - NPMRC_FILE: ${NPMRC_FILE} - depends_on: - - chrome - links: - - hub - volumes: - - ..:/awx/awx/ui/test/e2e - environment: - AWX_E2E_CLUSTER_HOST: hub - AWX_E2E_CLUSTER_PORT: 4444 - DBUS_SESSION_BUS_ADDRESS: /dev/null diff --git a/awx/ui/test/e2e/commands/findThenClick.js b/awx/ui/test/e2e/commands/findThenClick.js deleted file mode 100644 index d7a0fb331e..0000000000 --- a/awx/ui/test/e2e/commands/findThenClick.js +++ /dev/null @@ -1,20 +0,0 @@ -/* Utility function for clicking elements; attempts to scroll to - * the element if necessary, and waits for the page to finish loading. - * - * @param selector - xpath or css selector of the element to click. - * @param [locatoryStrategy='xpath'] - locator strategy used. */ - -exports.command = function findThenClick (selector, locatorStrategy = 'xpath') { - this.waitForElementPresent(selector, () => { - this.moveToElement(selector, 0, 0, () => { - this.click(selector, () => { - if (locatorStrategy === 'css') { - this.waitForElementNotVisible('.spinny'); - } else { - this.waitForElementNotVisible('//*[contains(@class, "spinny")]'); - } - }); - }); - }); - return this; -}; diff --git a/awx/ui/test/e2e/commands/inject.js b/awx/ui/test/e2e/commands/inject.js deleted file mode 100644 index 3ecbbcd61c..0000000000 --- a/awx/ui/test/e2e/commands/inject.js +++ /dev/null @@ -1,25 +0,0 @@ -exports.command = function inject (deps, script, callback) { - this.executeAsync( - `let args = Array.prototype.slice.call(arguments,0); - - return function(deps, done) { - let injector = angular.element('body').injector(); - let loaded = deps.map(d => { - if (typeof(d) === "string") { - return injector.get(d); - } else { - return d; - } - }); - (${script.toString()}).apply(this, loaded).then(done); - }.apply(this, args);`, - [deps], - function handleResult (result) { - if (typeof callback === 'function') { - callback.call(this, result.value); - } - } - ); - - return this; -}; diff --git a/awx/ui/test/e2e/commands/login.js b/awx/ui/test/e2e/commands/login.js deleted file mode 100644 index 5be191570d..0000000000 --- a/awx/ui/test/e2e/commands/login.js +++ /dev/null @@ -1,52 +0,0 @@ -import { EventEmitter } from 'events'; -import { inherits } from 'util'; - -import { - AWX_E2E_USERNAME, - AWX_E2E_PASSWORD, - AWX_E2E_TIMEOUT_LONG -} from '../settings'; - -function Login () { - EventEmitter.call(this); -} - -inherits(Login, EventEmitter); - -Login.prototype.command = function command (username, password) { - username = username || AWX_E2E_USERNAME; - password = password || AWX_E2E_PASSWORD; - - const loginPage = this.api.page.login(); - - loginPage - .navigate() - .waitForElementVisible('@submit', AWX_E2E_TIMEOUT_LONG) - .waitForElementNotVisible('div.spinny', AWX_E2E_TIMEOUT_LONG) - .setValue('@username', username) - .setValue('@password', password) - .click('@submit') - .waitForElementVisible('div.spinny', AWX_E2E_TIMEOUT_LONG) - .waitForElementNotVisible('div.spinny', AWX_E2E_TIMEOUT_LONG); - - // temporary hack while login issue is resolved - this.api.elements('css selector', '.LoginModal-alert', result => { - let alertVisible = false; - result.value.map(i => i.ELEMENT).forEach(id => { - this.api.elementIdDisplayed(id, ({ value }) => { - if (!alertVisible && value) { - alertVisible = true; - loginPage.setValue('@username', username); - loginPage.setValue('@password', password); - loginPage.click('@submit'); - loginPage.waitForElementVisible('div.spinny', AWX_E2E_TIMEOUT_LONG); - loginPage.waitForElementNotVisible('div.spinny', AWX_E2E_TIMEOUT_LONG); - } - }); - }); - - this.emit('complete'); - }); -}; - -module.exports = Login; diff --git a/awx/ui/test/e2e/commands/logout.js b/awx/ui/test/e2e/commands/logout.js deleted file mode 100644 index 5320c6db14..0000000000 --- a/awx/ui/test/e2e/commands/logout.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Logout from the current session by clicking on the power off button on the - * navigation menu. - */ -exports.command = function logout () { - const logoutButton = '.at-Layout-topNav i.fa-power-off'; - this - // protective wait for immediate login/logout - .waitForElementNotPresent('.LoginModal-backDrop') - .waitForElementNotVisible('.spinny') - .findThenClick(logoutButton, 'css') - .waitForElementPresent('#login-button'); -}; diff --git a/awx/ui/test/e2e/commands/navigateTo.js b/awx/ui/test/e2e/commands/navigateTo.js deleted file mode 100644 index d896f1e282..0000000000 --- a/awx/ui/test/e2e/commands/navigateTo.js +++ /dev/null @@ -1,15 +0,0 @@ -const spinny = 'div.spinny'; - -exports.command = function navigateTo (url, expectSpinny = true) { - this.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - this.url(url); - - if (expectSpinny) { - this.waitForElementVisible(spinny, () => { - // If a process is running, give spinny a little more time before timing out. - this.waitForElementNotVisible(spinny, 30000); - }); - } - - return this; -}; diff --git a/awx/ui/test/e2e/commands/pushFileToWorker.js b/awx/ui/test/e2e/commands/pushFileToWorker.js deleted file mode 100644 index 191164f778..0000000000 --- a/awx/ui/test/e2e/commands/pushFileToWorker.js +++ /dev/null @@ -1,57 +0,0 @@ -import { basename } from 'path'; -import { EventEmitter } from 'events'; -import { inherits } from 'util'; - -import archiver from 'archiver'; - -function pushFileToWorker (localFilePath, callback) { - const name = basename(localFilePath); - - const push = handler => { - const archive = archiver('zip'); - - const buffers = []; - - archive - .on('data', data => buffers.push(data)) - .on('error', err => { throw err; }) - .on('finish', () => { - const file = Buffer.concat(buffers).toString('base64'); - - this.api.session(session => { - const params = { - path: `/session/${session.sessionId}/file`, - method: 'POST', - data: { file }, - }; - - this.client.runProtocolAction(params, handler).send(); - }); - }); - - archive.file(localFilePath, { name }); - archive.finalize(); - }; - - push(({ status, value }) => { - if (status !== 0) { - throw new Error(value.message); - } - - if (typeof callback === 'function') { - callback.call(this, value); - } - - this.emit('complete'); - }); - - return this; -} - -function PushFileToWorker () { EventEmitter.call(this); } - -inherits(PushFileToWorker, EventEmitter); - -PushFileToWorker.prototype.command = pushFileToWorker; - -module.exports = PushFileToWorker; diff --git a/awx/ui/test/e2e/commands/waitForAngular.js b/awx/ui/test/e2e/commands/waitForAngular.js deleted file mode 100644 index 4daf737dea..0000000000 --- a/awx/ui/test/e2e/commands/waitForAngular.js +++ /dev/null @@ -1,20 +0,0 @@ -import { AWX_E2E_TIMEOUT_ASYNC } from '../settings'; - -/* Post-login utility function that waits for the application to fully load. */ -exports.command = function waitForAngular (callback) { - this.timeoutsAsyncScript(AWX_E2E_TIMEOUT_ASYNC, () => { - this.executeAsync(done => { - if (angular && angular.getTestability) { - angular.getTestability(document.body).whenStable(done); - } else { - done(); - } - }, [], result => { - if (typeof callback === 'function') { - callback.call(this, result); - } - }); - }); - - return this; -}; diff --git a/awx/ui/test/e2e/commands/waitForSpinny.js b/awx/ui/test/e2e/commands/waitForSpinny.js deleted file mode 100644 index b4a55a0cac..0000000000 --- a/awx/ui/test/e2e/commands/waitForSpinny.js +++ /dev/null @@ -1,13 +0,0 @@ -/* Utility function to wait for the working spinner to disappear. */ -exports.command = function waitForSpinny (useXpath = false) { - let selector = 'div.spinny'; - if (useXpath) { - selector = '//*[contains(@class, "spinny")]'; - } - this.waitForElementVisible(selector); - // if a process is running for an extended period, - // spinny might last longer than five seconds. - // this gives it a max of 30 secs before failing. - this.waitForElementNotVisible(selector, 30000); - return this; -}; diff --git a/awx/ui/test/e2e/e2e-pipeline.groovy b/awx/ui/test/e2e/e2e-pipeline.groovy deleted file mode 100644 index efd27124e5..0000000000 --- a/awx/ui/test/e2e/e2e-pipeline.groovy +++ /dev/null @@ -1 +0,0 @@ -e2ePipeline() diff --git a/awx/ui/test/e2e/fixtures.js b/awx/ui/test/e2e/fixtures.js deleted file mode 100644 index 5e8c662d58..0000000000 --- a/awx/ui/test/e2e/fixtures.js +++ /dev/null @@ -1,565 +0,0 @@ -import uuid from 'uuid'; - -import { AWX_E2E_PASSWORD } from './settings'; - -import { - get, - post, -} from './api'; - -const session = `e2e-${uuid().substr(0, 8)}`; -const store = {}; - -/* Utility function for accessing awx resources. This includes resources like - * users, organizations, and job templates. Retrieves the end point, and creates - * it if it does not exist. - * - * @param endpoint - The REST API url suffix. - * @param data - Attributes used to create a new endpoint. - * @param [unique] - An array of keys used to uniquely identify previously - * created resources from the endpoint. - * - */ -const getOrCreate = (endpoint, data, unique = ['name']) => { - const identifiers = Object.keys(data).filter(key => unique.indexOf(key) > -1); - - if (identifiers.length < 1) { - throw new Error('A unique key value must be provided.'); - } - - const lookup = `${endpoint}/${identifiers.map(key => data[key]).join('-')}`; - const params = Object.assign(...identifiers.map(key => ({ [key]: data[key] }))); - - store[lookup] = store[lookup] || get(endpoint, { params }) - .then(res => { - if (res.data.results.length > 1) { - return Promise.reject(new Error('More than one matching result.')); - } - - if (res.data.results.length === 1) { - return get(res.data.results[0].url); - } - - if (res.data.results.length === 0) { - return post(endpoint, data); - } - - return Promise.reject(new Error(`unexpected response: ${res}`)); - }); - - return store[lookup].then(created => created.data); -}; - -/* Retrieves an organization, and creates it if it does not exist. - * - * @param [namespace] - A unique name prefix for the organization. - * - */ -const getOrganization = (namespace = session) => getOrCreate('/organizations/', { - name: `${namespace}-organization`, - description: namespace -}); - -/* Retrieves an inventory, and creates it if it does not exist. - * Also creates an organization with the same name prefix if needed. - * - * @param [namespace] - A unique name prefix for the inventory. - * - */ -const getInventory = (namespace = session) => getOrganization(namespace) - .then(organization => getOrCreate('/inventories/', { - name: `${namespace}-inventory`, - description: namespace, - organization: organization.id - }).then(inventory => getOrCreate('/hosts/', { - name: `${namespace}-host`, - description: namespace, - inventory: inventory.id, - variables: JSON.stringify({ ansible_connection: 'local' }), - }, ['name', 'inventory']).then(() => inventory))); - -/* Identical to getInventory except it provides a unique suffix, - * "*-inventory-nosource". - * - * @param[namespace] - A unique name prefix for the inventory. -*/ -const getInventoryNoSource = (namespace = session) => getOrganization(namespace) - .then(organization => getOrCreate('/inventories/', { - name: `${namespace}-inventory-nosource`, - description: namespace, - organization: organization.id - }).then(inventory => getOrCreate('/hosts/', { - name: `${namespace}-host`, - description: namespace, - inventory: inventory.id, - variables: JSON.stringify({ ansible_connection: 'local' }), - }, ['name', 'inventory']).then(() => inventory))); - -/* Retrieves a host with the given name prefix, and creates it if it does not exist. - * If an inventory does not exist with the same prefix, it is created as well. - * - * @param[namespace] - A unique name prefix for the host. - */ -const getHost = (namespace = session) => getInventory(namespace) - .then(inventory => getOrCreate('/hosts/', { - name: `${namespace}-host`, - description: namespace, - inventory: inventory.id, - variables: JSON.stringify({ ansible_connection: 'local' }), - }, ['name', 'inventory'])); - -/* Retrieves an inventory script with the given name prefix, and creates it if it - * does not exist. If an organization does not exist with the same prefix, it is - * created as well. - * - * @param[namespace] - A unique name prefix for the host. - */ -const getInventoryScript = (namespace = session) => getOrganization(namespace) - .then(organization => getOrCreate('/inventory_scripts/', { - name: `${namespace}-inventory-script`, - description: namespace, - organization: organization.id, - script: '#!/usr/bin/env python' - })); - -/* Retrieves an inventory source, and creates it if it does not exist. If the - * required dependent inventory and inventory script do not exist, they are also - * created. - * - * @param[namespace] - A unique name prefix for the inventory source. - */ -const getInventorySource = (namespace = session) => { - const promises = [ - getInventory(namespace), - getInventoryScript(namespace) - ]; - - return Promise.all(promises) - .then(([inventory, inventoryScript]) => getOrCreate('/inventory_sources/', { - name: `${namespace}-inventory-source-custom`, - description: namespace, - source: 'custom', - inventory: inventory.id, - source_script: inventoryScript.id - })); -}; - -/* Retrieves an AWS credential, and creates it if it does not exist. - * - * @param[namespace] - A unique name prefix for the AWS credential. - */ -const getAdminAWSCredential = (namespace = session) => { - const promises = [ - get('/me/'), - getOrCreate('/credential_types/', { - name: 'Amazon Web Services' - }) - ]; - - return Promise.all(promises) - .then(([me, credentialType]) => { - const [admin] = me.data.results; - - return getOrCreate('/credentials/', { - name: `${namespace}-credential-aws`, - description: namespace, - credential_type: credentialType.id, - user: admin.id, - inputs: { - username: 'admin', - password: 'password', - security_token: 'AAAAAAAAAAAAAAAA' - } - }); - }); -}; - -/* Retrieves a machine credential, and creates it if it does not exist. - * - * @param[namespace] - A unique name prefix for the machine credential. - */ -const getAdminMachineCredential = (namespace = session) => { - const promises = [ - get('/me/'), - getOrCreate('/credential_types/', { name: 'Machine' }) - ]; - - return Promise.all(promises) - .then(([me, credentialType]) => { - const [admin] = me.data.results; - return getOrCreate('/credentials/', { - name: `${namespace}-credential-machine-admin`, - description: namespace, - credential_type: credentialType.id, - user: admin.id - }); - }); -}; - -/* Retrieves a team, and creates it if it does not exist. - * If an organization does not exist with the same prefix, it is - * created as well. - * - * @param[namespace] - A unique name prefix for the team. - */ -const getTeam = (namespace = session) => getOrganization(namespace) - .then(organization => getOrCreate(`/organizations/${organization.id}/teams/`, { - name: `${namespace}-team`, - description: namespace, - organization: organization.id, - })); - -/* Retrieves a smart inventory, and creates it if it does not exist. - * name prefix. If an organization does not exist with the same prefix, it is - * created as well. - * - * @param[namespace] - A unique name prefix for the smart inventory. - */ -const getSmartInventory = (namespace = session) => getOrganization(namespace) - .then(organization => getOrCreate('/inventories/', { - name: `${namespace}-smart-inventory`, - description: namespace, - organization: organization.id, - host_filter: 'search=localhost', - kind: 'smart' - })); - -/* Retrieves a notification template, and creates it if it does not exist. - * name prefix. If an organization does not exist with the same prefix, it is - * created as well. - * - * @param[namespace] - A unique name prefix for the notification template. - */ -const getNotificationTemplate = (namespace = session) => getOrganization(namespace) - .then(organization => getOrCreate(`/organizations/${organization.id}/notification_templates/`, { - name: `${namespace}-notification-template`, - description: namespace, - organization: organization.id, - notification_type: 'slack', - notification_configuration: { - token: '54321GFEDCBAABCDEFG12345', - channels: ['awx-e2e'] - } - })); - -const waitForJob = endpoint => { - const interval = 2000; - const statuses = ['successful', 'failed', 'error', 'canceled']; - - let attempts = 30; - - return new Promise((resolve, reject) => { - (function pollStatus () { - get(endpoint).then(update => { - const completed = statuses.indexOf(update.data.status) > -1; - - if (completed) { - return resolve(update.data); - } - - if (--attempts <= 0) { - return reject(new Error('Retry limit exceeded.')); - } - - return setTimeout(pollStatus, interval); - }); - }()); - }); -}; - -/* Retrieves a project, and creates it if it does not exist. - * name prefix. If an organization does not exist with the same prefix, it is - * created as well. - * - * @param[namespace] - A unique name prefix for the host. - * @param[scmUrl] - The url of the repository. - * @param[scmType] - The type of scm (git, etc.) - */ -const getProject = ( - namespace = session, - scmUrl = 'https://github.com/ansible/ansible-tower-samples', - scmType = 'git' -) => getOrganization(namespace) - .then(organization => getOrCreate(`/organizations/${organization.id}/projects/`, { - name: `${namespace}-project`, - description: namespace, - organization: organization.id, - scm_url: `${scmUrl}`, - scm_type: `${scmType}` - })); - -const getUpdatedProject = (namespace = session) => { - const promises = [ - getProject(namespace), - ]; - return Promise.all(promises) - .then(([project]) => - post(`/api/v2/projects/${project.id}/update/`, {}) - .then(update => waitForJob(update.data.url)) - .then(() => getProject(namespace))); -}; - -/* Retrieves a job template, and creates it if it does not exist. - * name prefix. This function also runs getOrCreate for an inventory, - * credential, and project with the same prefix. - * - * @param [namespace] - Name prefix for associated dependencies. - * @param [playbook] - Playbook for the job template. - * @param [name] - Unique name prefix for the job template. - * @param [updateProject] - Choose whether to sync the project with its repository. - * */ -const getJobTemplate = ( - namespace = session, - playbook = 'hello_world.yml', - name = `${namespace}-job-template`, - updateProject = true, - jobSliceCount = 1 -) => { - const promises = [ - getInventory(namespace), - getAdminMachineCredential(namespace), - ]; - if (updateProject) { - promises.push(getUpdatedProject(namespace)); - } else { - promises.push(getProject(namespace)); - } - - return Promise.all(promises) - .then(([inventory, credential, project]) => getOrCreate('/job_templates/', { - name: `${name}`, - description: namespace, - inventory: inventory.id, - credential: credential.id, - project: project.id, - playbook: `${playbook}`, - job_slice_count: `${jobSliceCount}`, - })); -}; - -/* Similar to getJobTemplate, except that it also launches the job. - * - * @param[namespace] - A unique name prefix for the job and its dependencies. - * @param[playbook] - The playbook file to be run by the job template. - * @param[name] - A unique name for the job template. - * @param[wait] - Choose whether to return the result of the completed job. - */ -const getJob = ( - namespace = session, - playbook = 'hello_world.yml', - name = `${namespace}-job-template`, - wait = true -) => getJobTemplate(namespace, playbook, name) - .then(template => { - const launchURL = template.related.launch; - return post(launchURL, {}).then(response => { - const jobURL = response.data.url; - if (wait) { - return waitForJob(jobURL).then(() => response.data); - } - return response.data; - }); - }); - -/* Retrieves a workflow template, and creates it if it does not exist. - * name prefix. If an organization does not exist with the same prefix, it is - * created as well. A basic workflow node setup is also created. - * - * @param[namespace] - A unique name prefix for the workflow template. - */ -const getWorkflowTemplate = (namespace = session) => { - const workflowTemplatePromise = getOrganization(namespace) - .then(organization => getOrCreate(`/organizations/${organization.id}/workflow_job_templates/`, { - name: `${namespace}-workflow-template`, - organization: organization.id, - variables: '---', - extra_vars: '', - })); - - const resources = [ - workflowTemplatePromise, - getInventorySource(namespace), - getUpdatedProject(namespace), - getJobTemplate(namespace), - ]; - - const workflowNodePromise = Promise.all(resources) - .then(([workflowTemplate, source, project, jobTemplate]) => { - const workflowNodes = workflowTemplate.related.workflow_nodes; - const unique = 'unified_job_template'; - - const nodes = [ - getOrCreate(workflowNodes, { [unique]: project.id }, [unique]), - getOrCreate(workflowNodes, { [unique]: jobTemplate.id }, [unique]), - getOrCreate(workflowNodes, { [unique]: source.id }, [unique]), - ]; - - const createSuccessNodes = ([projectNode, jobNode, sourceNode]) => Promise.all([ - getOrCreate(projectNode.related.success_nodes, { id: jobNode.id }, ['id']), - getOrCreate(jobNode.related.success_nodes, { id: sourceNode.id }, ['id']), - ]); - - return Promise.all(nodes) - .then(createSuccessNodes); - }); - - return Promise.all([workflowTemplatePromise, workflowNodePromise]) - .then(([workflowTemplate, nodes]) => workflowTemplate); -}; - -/* Retrieves a auditor user, and creates it if it does not exist. - * name prefix. If an organization does not exist with the same prefix, - * it is also created. - * - * @param[namespace] - A unique name prefix for the auditor. - */ -const getAuditor = (namespace = session) => getOrganization(namespace) - .then(organization => getOrCreate(`/organizations/${organization.id}/users/`, { - username: `auditor-${uuid().substr(0, 8)}`, - organization: organization.id, - first_name: 'auditor', - last_name: 'last', - email: 'null@ansible.com', - is_superuser: false, - is_system_auditor: true, - password: AWX_E2E_PASSWORD - }, ['username'])); - -/* Retrieves a user, and creates it if it does not exist. - * name prefix. If an organization does not exist with the same prefix, - * it is also created. - * - * @param[namespace] - A unique name prefix for the user's organization. - * @param[username] - A unique name for the user. - */ -const getUser = ( - namespace = session, - // unique substrings are needed to avoid the edge case - // where a user and org both exist, but the user is not in the organization. - // this ensures a new user is always created. - username = `user-${uuid().substr(0, 8)}`, - password = AWX_E2E_PASSWORD, - isSuperuser = false, - isSystemAuditor = false, - email = `email-${uuid().substr(0, 8)}@example.com`, - firstName = `first-name-${uuid().substr(0, 8)}`, - lastName = `last-name-${uuid().substr(0, 8)}` -) => getOrganization(namespace) - .then(organization => getOrCreate(`/organizations/${organization.id}/users/`, { - email, - first_name: firstName, - is_superuser: isSuperuser, - is_system_auditor: isSystemAuditor, - last_name: lastName, - organization: organization.id, - password, - username, - }, ['username'])); - -/* Retrieves a job template admin, and creates it if it does not exist. - * If a job template or organization does not exist with the same - * prefix, they are also created. - * - * @param[namespace] - A unique name prefix for the template admin. - */ -const getJobTemplateAdmin = (namespace = session) => { - const rolePromise = getJobTemplate(namespace) - .then(obj => obj.summary_fields.object_roles.admin_role); - - const userPromise = getOrganization(namespace) - .then(obj => getOrCreate(`/organizations/${obj.id}/users/`, { - username: `job-template-admin-${uuid().substr(0, 8)}`, - organization: obj.id, - first_name: 'firstname', - last_name: 'lastname', - email: 'null@ansible.com', - is_superuser: false, - is_system_auditor: false, - password: AWX_E2E_PASSWORD - }, ['username'])); - - const assignRolePromise = Promise.all([userPromise, rolePromise]) - .then(([user, role]) => post(`/api/v2/roles/${role.id}/users/`, { id: user.id })); - - return Promise.all([userPromise, assignRolePromise]) - .then(([user, assignment]) => user); -}; - -/* Retrieves a project admin, and creates it if it does not exist. - * If a job template or organization does not exist with the same - * prefix, they are also created. - * - * @param[namespace] - A unique name prefix for the project admin. - */ -const getProjectAdmin = (namespace = session) => { - const rolePromise = getUpdatedProject(namespace) - .then(obj => obj.summary_fields.object_roles.admin_role); - - const userPromise = getOrganization(namespace) - .then(obj => getOrCreate(`/organizations/${obj.id}/users/`, { - username: `project-admin-${uuid().substr(0, 8)}`, - organization: obj.id, - first_name: 'firstname', - last_name: 'lastname', - email: 'null@ansible.com', - is_superuser: false, - is_system_auditor: false, - password: AWX_E2E_PASSWORD - }, ['username'])); - - const assignRolePromise = Promise.all([userPromise, rolePromise]) - .then(([user, role]) => post(`/api/v2/roles/${role.id}/users/`, { id: user.id })); - - return Promise.all([userPromise, assignRolePromise]) - .then(([user, assignment]) => user); -}; - -/* Retrieves a inventory source schedule, and creates it if it does not exist. - * If an inventory source does not exist with the same prefix, it is also created. - * - * @param[namespace] - A unique name prefix for the schedule. - */ -const getInventorySourceSchedule = (namespace = session) => getInventorySource(namespace) - .then(source => getOrCreate(source.related.schedules, { - name: `${source.name}-schedule`, - description: namespace, - rrule: 'DTSTART:20171104T040000Z RRULE:FREQ=DAILY;INTERVAL=1;COUNT=1' - })); - -/* Retrieves a job template schedule, and creates it if it does not exist. - * If an job template does not exist with the same prefix, it is also created. - * - * @param[namespace] - A unique name prefix for the schedule. - */ -const getJobTemplateSchedule = (namespace = session) => getJobTemplate(namespace) - .then(template => getOrCreate(template.related.schedules, { - name: `${template.name}-schedule`, - description: namespace, - rrule: 'DTSTART:20351104T040000Z RRULE:FREQ=DAILY;INTERVAL=1;COUNT=1' - })); - -module.exports = { - getAdminAWSCredential, - getAdminMachineCredential, - getAuditor, - getHost, - getInventory, - getInventoryNoSource, - getInventoryScript, - getInventorySource, - getInventorySourceSchedule, - getJob, - getJobTemplate, - getJobTemplateAdmin, - getJobTemplateSchedule, - getNotificationTemplate, - getOrganization, - getOrCreate, - getProject, - getProjectAdmin, - getSmartInventory, - getTeam, - getUpdatedProject, - getUser, - getWorkflowTemplate, -}; diff --git a/awx/ui/test/e2e/nightwatch.conf.js b/awx/ui/test/e2e/nightwatch.conf.js deleted file mode 100644 index 1d9e27a96a..0000000000 --- a/awx/ui/test/e2e/nightwatch.conf.js +++ /dev/null @@ -1,89 +0,0 @@ -import path from 'path'; - -import chromedriver from 'chromedriver'; - -import { - AWX_E2E_CLUSTER_HOST, - AWX_E2E_CLUSTER_PORT, - AWX_E2E_CLUSTER_WORKERS, - AWX_E2E_LAUNCH_URL, - AWX_E2E_TIMEOUT_ASYNC, - AWX_E2E_TIMEOUT_MEDIUM, - AWX_E2E_SCREENSHOTS_ENABLED, - AWX_E2E_SCREENSHOTS_ON_ERROR, - AWX_E2E_SCREENSHOTS_ON_FAILURE, - AWX_E2E_SCREENSHOTS_PATH, -} from './settings'; - -const resolve = location => path.resolve(__dirname, location); - -module.exports = { - src_folders: [resolve('tests')], - output_folder: resolve('reports'), - custom_commands_path: resolve('commands'), - page_objects_path: resolve('objects'), - test_settings: { - default: { - selenium_host: 'localhost', - selenium_port: 9515, - default_path_prefix: '', - desiredCapabilities: { - browserName: 'chrome', - chromeOptions: { - w3c: false, - args: [ - 'window-size=1024,768' - ] - } - }, - test_workers: { enabled: false }, - globals: { - launch_url: AWX_E2E_LAUNCH_URL, - retryAssertionTimeout: AWX_E2E_TIMEOUT_MEDIUM, - waitForConditionTimeout: AWX_E2E_TIMEOUT_MEDIUM, - asyncHookTimeout: AWX_E2E_TIMEOUT_ASYNC, - before (done) { - chromedriver.start(['--port=9515']); - done(); - }, - after (done) { - chromedriver.stop(); - done(); - } - }, - screenshots: { - enabled: AWX_E2E_SCREENSHOTS_ENABLED, - on_error: AWX_E2E_SCREENSHOTS_ON_ERROR, - on_failure: AWX_E2E_SCREENSHOTS_ON_FAILURE, - path: AWX_E2E_SCREENSHOTS_PATH, - } - }, - headless: { - desiredCapabilities: { - browserName: 'chrome', - chromeOptions: { - w3c: false, - args: [ - 'headless', - 'disable-web-security', - 'ignore-certificate-errors', - 'no-sandbox', - 'disable-gpu' - ] - } - }, - }, - // Note: These are environment-specific overrides to the default - // test settings defined above. - cluster: { - selenium_host: AWX_E2E_CLUSTER_HOST, - selenium_port: AWX_E2E_CLUSTER_PORT, - default_path_prefix: '/wd/hub', - test_workers: { - enabled: (AWX_E2E_CLUSTER_WORKERS > 0), - workers: AWX_E2E_CLUSTER_WORKERS - }, - globals: { before: {}, after: {} } - } - } -}; diff --git a/awx/ui/test/e2e/nightwatchxsl.xsl b/awx/ui/test/e2e/nightwatchxsl.xsl deleted file mode 100644 index 229dd26103..0000000000 --- a/awx/ui/test/e2e/nightwatchxsl.xsl +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/awx/ui/test/e2e/objects/activityStream.js b/awx/ui/test/e2e/objects/activityStream.js deleted file mode 100644 index 961ef6056e..0000000000 --- a/awx/ui/test/e2e/objects/activityStream.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/activity_stream`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - elements: { - title: '.List-titleText', - subtitle: '.List-titleLockup', - category: '#stream-dropdown-nav' - } -}; diff --git a/awx/ui/test/e2e/objects/applications.js b/awx/ui/test/e2e/objects/applications.js deleted file mode 100644 index e34d762ecd..0000000000 --- a/awx/ui/test/e2e/objects/applications.js +++ /dev/null @@ -1,153 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const row = '.at-List-container .at-Row'; - -const addEditElements = { - name: '#application_name_group input', - description: '#application_description_group input', - organization: '#application_organization_group input', - authorizationGrantType: '#application_authorization_grant_type_group select', - redirectUris: '#application_redirect_uris_group input', - clientType: '#application_client_type_group select', - save: 'button[type=save]', - tokensTab: 'div.card button.at-Tab:nth-of-type(2)', -}; - -const authorizationGrantTypeOptions = { - authorizationCode: 'Authorization code', - resourceOwnerPasswordBased: 'Resource owner password-based', -}; - -const clientTypeOptions = { - confidential: 'Confidential', - public: 'Public', -}; - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/applications`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - create (application, organization) { - this.section.list - .waitForElementVisible('@add') - .click('@add'); - this.section.add - .waitForElementVisible('@name') - .setValue('@name', application.name) - .setValue('@organization', organization.name) - .setValue('@authorizationGrantType', application.authorizationGrantType) - .setValue('@clientType', application.clientType); - if (application.description) { - this.section.add.setValue('@description', application.description); - } - if (application.redirectUris) { - this.section.add.setValue('@redirectUris', application.redirectUris); - } - this.section.add.click('@save'); // flake avoidance. triple click ensures it works. - this.section.add.click('@save'); - this.section.add.click('@save'); - this - .waitForElementVisible('#alert-modal-msg') - .expect.element('#alert-modal-msg').text.contain(application.name); - this.findThenClick('#alert_ok_btn', 'css'); - this.waitForElementNotVisible('#alert-modal-msg'); - }, - delete (name) { - this.search(name); - const deleteButton = `${row} i[class*="fa-trash"]`; - const modalAction = '.modal-dialog #prompt_action_btn'; - this - .waitForElementVisible(deleteButton) - .click(deleteButton) - .waitForElementVisible(modalAction) - .click(modalAction) - .waitForSpinny(); - const searchResults = '.at-List--empty'; - this - .waitForElementVisible(searchResults) - .expect.element(searchResults).text.equal('PLEASE ADD ITEMS TO THIS LIST.'); - }, - search (name) { - const searchSection = this.section.list.section.search; - searchSection.setValue('@input', name); - searchSection.expect.element('@searchButton').to.be.enabled.before(200); - searchSection.click('@searchButton'); - this.waitForSpinny(); - this.waitForElementNotPresent(`${row}:nth-of-type(2)`); - this.expect.element('.at-Panel-headingTitleBadge').text.to.equal('1'); - this.expect.element(`${row} .at-RowItem-header`).text.equal(name); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="add"]', - sections: { - // details - }, - elements: addEditElements, - }, - edit: { - selector: 'div[ui-view="edit"]', - sections: { - // details, - permissions - }, - elements: addEditElements, - }, - list: { - selector: 'div[ui-view="list"]', - elements: { - badge: 'span[class~="badge"]', - title: 'h3[class~="Panel-headingTitle"]', - add: '#button-add' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - username: 'td[class~="username-column"]', - first_name: 'td[class~="first_name-column"]', - last_name: 'td[class~="last_name-column"]' - }, - sections: { - actions - } - }) - } - }, - tokens: { - selector: 'div.card', - elements: { - list: '.at-List-container', - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - }, - props () { - return { - authorizationGrantTypeOptions, - clientTypeOptions, - }; - } -}; diff --git a/awx/ui/test/e2e/objects/configuration.js b/awx/ui/test/e2e/objects/configuration.js deleted file mode 100644 index d6e8c0d4f5..0000000000 --- a/awx/ui/test/e2e/objects/configuration.js +++ /dev/null @@ -1,51 +0,0 @@ -import breadcrumb from './sections/breadcrumb'; -import header from './sections/header'; -import navigation from './sections/navigation'; - -const sections = { - header, - navigation, - breadcrumb, -}; - -const commands = [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - selectSubcategory (name) { - const spinny = 'div.spinny'; - const categoryName = `//*[text() = '${name}']`; - - this.api.useXpath(); - this.api.waitForElementVisible(categoryName); - this.api.click(categoryName); - this.api.useCss(); - - return this; - }, - selectDropDownContainer (name) { - const spinny = 'div.spinny'; - const select = '#configure-dropdown-nav'; - const arrow = `${select} + span span[class$="arrow"]`; - const option = `//li[contains(text(), "${name}")]`; - - this.api.waitForElementVisible(arrow); - this.api.click(arrow); - - this.api.useXpath(); - this.api.waitForElementVisible(option); - this.api.click(option); - this.api.useCss(); - - return this; - }, -}]; - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/configuration`; - }, - sections, - commands, -}; diff --git a/awx/ui/test/e2e/objects/credentialTypes.js b/awx/ui/test/e2e/objects/credentialTypes.js deleted file mode 100644 index 7ea9ec298d..0000000000 --- a/awx/ui/test/e2e/objects/credentialTypes.js +++ /dev/null @@ -1,68 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import search from './sections/search'; -import pagination from './sections/pagination'; - -const addEditPanel = { - selector: 'div[ui-view="form"]', - elements: { - title: 'div[class="Form-title"]', - }, - sections: { - details: createFormSection({ - selector: '#credential_type_form', - labels: { - name: 'Name', - description: 'Description', - inputConfiguration: 'Input Configuration', - injectorConfiguration: 'Injector Configuration' - }, - strategy: 'legacy' - }) - } -}; - -const listPanel = { - selector: 'div[ui-view="list"]', - elements: { - add: '#button-add', - badge: 'div[class="List-titleBadge]', - titleText: 'div[class="List-titleText"]', - noitems: 'div[class="List-noItems"]' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - name: 'td[class~="name-column"]', - kind: 'td[class~="kind-column"]', - }, - sections: { - actions - } - }) - } -}; - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/credential_types`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - sections: { - header, - breadcrumb, - add: addEditPanel, - edit: addEditPanel, - list: listPanel - } -}; diff --git a/awx/ui/test/e2e/objects/credentials.js b/awx/ui/test/e2e/objects/credentials.js deleted file mode 100644 index 391ac7da21..0000000000 --- a/awx/ui/test/e2e/objects/credentials.js +++ /dev/null @@ -1,271 +0,0 @@ -import _ from 'lodash'; - -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import dynamicSection from './sections/dynamicSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const common = createFormSection({ - selector: 'form', - labels: { - name: 'Name', - description: 'Description', - organization: 'Organization', - type: 'Credential Type' - } -}); - -const machine = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - username: 'Username', - password: 'Password', - sshKeyData: 'SSH Private Key', - sshKeyUnlock: 'Private Key Passphrase', - becomeMethod: 'Privilege Escalation Method', - becomeUsername: 'Privilege Escalation Username', - becomePassword: 'Privilege Escalation Password' - } -}); - -const vault = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - vaultPassword: 'Vault Password', - vaultIdentifier: 'Vault Identifier' - } -}); - -const scm = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - username: 'Username', - password: 'Password', - sshKeyData: 'SCM Private Key', - sshKeyUnlock: 'Private Key Passphrase', - } -}); - -const aws = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - accessKey: 'Access Key', - secretKey: 'Secret Key', - securityToken: 'STS Token', - } -}); - -const gce = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - email: 'Service Account Email Address', - project: 'Project', - sshKeyData: 'RSA Private Key', - serviceAccountFile: 'Service Account JSON File' - } -}); - -const vmware = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - host: 'VCenter Host', - username: 'Username', - password: 'Password', - } -}); - -const azureClassic = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - subscription: 'Subscription ID', - sshKeyData: 'Management Certificate', - } -}); - -const azure = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - subscription: 'Subscription ID', - username: 'Username', - password: 'Password', - client: 'Client ID', - secret: 'Client Secret', - tenant: 'Tenant ID', - } -}); - -const openStack = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - username: 'Username', - password: 'Password (API Key)', - host: 'Host (Authentication URL)', - project: 'Project (Tenant Name)', - domain: 'Domain Name', - } -}); - -const rackspace = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - username: 'Username', - password: 'Password', - } -}); - -const cloudForms = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - host: 'Cloudforms URL', - username: 'Username', - password: 'Password', - } -}); - -const network = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - sshKeyData: 'SSH Private Key', - sshKeyUnlock: 'Private Key Passphrase', - username: 'Username', - password: 'Password', - authorizePassword: 'Authorize Password', - } -}); - -network.elements.authorize = { - locateStrategy: 'xpath', - selector: '//input[../p/text() = "Authorize"]' -}; - -const sat6 = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - host: 'Satellite 6 URL', - username: 'Username', - password: 'Password', - } -}); - -const insights = createFormSection({ - selector: '.at-InputGroup-inset', - labels: { - username: 'Username', - password: 'Password', - }, -}); - -const details = _.merge({}, common, { - elements: { - cancel: '.btn[type="cancel"]', - save: '.btn[type="save"]', - }, - sections: { - aws, - azure, - azureClassic, - cloudForms, - dynamicSection, - gce, - insights, - machine, - network, - rackspace, - sat6, - scm, - openStack, - vault, - vmware - }, - commands: [{ - custom ({ name, inputs }) { - const labels = {}; - inputs.fields.forEach(f => { labels[f.id] = f.label; }); - - const selector = '.at-InputGroup-inset'; - const generated = createFormSection({ selector, labels }); - - const params = _.merge({ name }, generated); - return this.section.dynamicSection.create(params); - }, - clear () { - this.clearValue('@name'); - this.clearValue('@organization'); - this.clearValue('@description'); - this.clearValue('@type'); - this.waitForElementNotVisible('.at-InputGroup-inset'); - return this; - }, - clearAndSelectType (type) { - this.clear(); - this.setValue('@type', type); - this.waitForElementVisible('.at-InputGroup-inset'); - return this; - } - }] -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/credentials`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="add"]', - sections: { - details - }, - elements: { - title: 'h3[class*="at-Panel-headingTitle"]' - } - }, - edit: { - selector: 'div[ui-view="edit"]', - sections: { - details, - permissions - }, - elements: { - title: 'h3[class*="at-Panel-headingTitle"]' - } - }, - list: { - selector: 'div[ui-view="list"]', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: '#button-add' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - name: 'td[class~="name-column"]', - kind: 'td[class~="kind-column"]' - }, - sections: { - actions - } - }) - } - }, - } -}; diff --git a/awx/ui/test/e2e/objects/dashboard.js b/awx/ui/test/e2e/objects/dashboard.js deleted file mode 100644 index ca6695ca5c..0000000000 --- a/awx/ui/test/e2e/objects/dashboard.js +++ /dev/null @@ -1,24 +0,0 @@ -import breadcrumb from './sections/breadcrumb'; -import header from './sections/header'; -import navigation from './sections/navigation'; - -const sections = { - header, - navigation, - breadcrumb, -}; - -const commands = [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - } -}]; - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/home`; - }, - sections, - commands, -}; diff --git a/awx/ui/test/e2e/objects/inventories.js b/awx/ui/test/e2e/objects/inventories.js deleted file mode 100644 index 059b6a8692..0000000000 --- a/awx/ui/test/e2e/objects/inventories.js +++ /dev/null @@ -1,136 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const standardInvDetails = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#inventory_form .Form-textInput', - '#inventory_form select.Form-dropDown', - '#inventory_form .Form-textArea', - '#inventory_form input[type="checkbox"]', - '#inventory_form .ui-spinner-input', - '#inventory_form .atSwitch-inner' - ] - }, - labels: { - name: 'Name', - description: 'Description', - organization: 'Organization' - } -}); - -const smartInvDetails = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#smartinventory_form input.Form-textInput', - '#smartinventory_form textarea.Form-textArea', - '#smartinventory_form .Form-lookupButton', - '#smartinventory_form #InstanceGroups' - ] - } -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/inventories`; - }, - sections: { - header, - navigation, - breadcrumb, - lookupModal, - addStandardInventory: { - selector: 'div[ui-view="form"]', - sections: { - standardInvDetails - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - editStandardInventory: { - selector: 'div[ui-view="form"]', - sections: { - standardInvDetails, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - addSmartInventory: { - selector: 'div[ui-view="form"]', - sections: { - smartInvDetails - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - editSmartInventory: { - selector: 'div[ui-view="form"]', - sections: { - smartInvDetails, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - list: { - selector: '.at-Panel', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: 'button[class~="List-dropdownButton"]' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - status: 'td[class~="status-column"]', - name: 'td[class~="name-column"]', - kind: 'td[class~="kind-column"]', - organization: 'td[class~="organization-column"]' - }, - sections: { - actions - } - }) - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - selectAdd (name) { - this.api.waitForElementVisible('#button-add'); - this.expect.element('#button-add').enabled; - this.api.click('#button-add'); - - this.api.useXpath(); - this.api.waitForElementVisible(`.//a[normalize-space(text())="${name}"]`); - this.api.click(`//a[normalize-space(text())="${name}"]`); - this.api.useCss(); - - return this; - } - }] -}; diff --git a/awx/ui/test/e2e/objects/inventoryScripts.js b/awx/ui/test/e2e/objects/inventoryScripts.js deleted file mode 100644 index e2f49fe1cc..0000000000 --- a/awx/ui/test/e2e/objects/inventoryScripts.js +++ /dev/null @@ -1,83 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const details = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#inventory_script_form .Form-textInput', - '#inventory_script_form .Form-textArea', - '#inventory_script_form .Form-lookupButton' - ] - } -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/inventory_scripts`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="form"]', - sections: { - details - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - edit: { - selector: 'div[ui-view="form"]', - sections: { - details, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - list: { - selector: 'div[ui-view="list"]', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: '#button-add' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - name: 'td[class~="name-column"]', - organization: 'td[class~="organization-column"]', - }, - sections: { - actions - } - }) - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - } -}; diff --git a/awx/ui/test/e2e/objects/jobs.js b/awx/ui/test/e2e/objects/jobs.js deleted file mode 100644 index 8e1b3fe82e..0000000000 --- a/awx/ui/test/e2e/objects/jobs.js +++ /dev/null @@ -1,15 +0,0 @@ -import _ from 'lodash'; - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/jobs`; - }, - sections: {}, // TODO: Fill this out - elements: {}, // TODO: Fill this out - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], -}; diff --git a/awx/ui/test/e2e/objects/login.js b/awx/ui/test/e2e/objects/login.js deleted file mode 100644 index 75623f1300..0000000000 --- a/awx/ui/test/e2e/objects/login.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/login`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - elements: { - username: '#login-username', - password: '#login-password', - submit: '#login-button', - logo: '#main_menu_logo' - } -}; diff --git a/awx/ui/test/e2e/objects/notificationTemplates.js b/awx/ui/test/e2e/objects/notificationTemplates.js deleted file mode 100644 index 8af6689359..0000000000 --- a/awx/ui/test/e2e/objects/notificationTemplates.js +++ /dev/null @@ -1,88 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const details = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#notification_template_form .Form-textInput', - '#notification_template_form select.Form-dropDown', - '#notification_template_form input[type="checkbox"]', - '#notification_template_form input[type="radio"]', - '#notification_template_form .ui-spinner-input', - '#notification_template_form .Form-textArea', - '#notification_template_form .atSwitch-outer', - '#notification_template_form .Form-lookupButton' - ] - } -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/notification_templates`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="form"]', - sections: { - details - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - edit: { - selector: 'div[ui-view="form"]', - sections: { - details, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - list: { - selector: 'div[ui-view="list"]', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: '#button-add' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - name: 'td[class~="name-column"]', - organization: 'td[class~="organization-column"]', - }, - sections: { - actions - } - }) - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - } -}; diff --git a/awx/ui/test/e2e/objects/organizations.js b/awx/ui/test/e2e/objects/organizations.js deleted file mode 100644 index 40fef9a256..0000000000 --- a/awx/ui/test/e2e/objects/organizations.js +++ /dev/null @@ -1,76 +0,0 @@ -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const details = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#organization_form input.Form-textInput', - '#organization_form .Form-lookupButton', - '#organization_form #InstanceGroups' - ] - }, - labels: { - name: 'Name', - description: 'Description' - } -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/organizations`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="form"]', - sections: { - details - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - edit: { - selector: 'div[ui-view="form"]', - sections: { - details, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - list: { - selector: '#organizations', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: '#button-add' - }, - sections: { - search, - pagination - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - } -}; diff --git a/awx/ui/test/e2e/objects/portal.js b/awx/ui/test/e2e/objects/portal.js deleted file mode 100644 index 0ec48e8942..0000000000 --- a/awx/ui/test/e2e/objects/portal.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/portal/myjobs`; - }, - sections: {}, - elements: {}, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], -}; diff --git a/awx/ui/test/e2e/objects/projects.js b/awx/ui/test/e2e/objects/projects.js deleted file mode 100644 index 345bf1664a..0000000000 --- a/awx/ui/test/e2e/objects/projects.js +++ /dev/null @@ -1,86 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const details = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#project_form .Form-textInput', - '#project_form select.Form-dropDown', - '#project_form input[type="checkbox"]', - '#project_form .ui-spinner-input', - ] - } -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/projects`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="form"]', - sections: { - details - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - edit: { - selector: 'div[ui-view="form"]', - sections: { - details, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - list: { - selector: '.at-Panel', - elements: { - badge: '.at-Panel-headingTitleBadge', - title: '.at-Panel-headingTitle', - add: '#button-add' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - status: 'td[class~="status-column"]', - name: 'td[class~="name-column"]', - scm_type: 'td[class~="scm_type-column"]', - last_updated: 'td[class~="last_updated-column"]' - }, - sections: { - actions - } - }) - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - } -}; diff --git a/awx/ui/test/e2e/objects/sections/actions.js b/awx/ui/test/e2e/objects/sections/actions.js deleted file mode 100644 index 805c2f4ee7..0000000000 --- a/awx/ui/test/e2e/objects/sections/actions.js +++ /dev/null @@ -1,15 +0,0 @@ -const actions = { - selector: 'td[class="List-actionsContainer"]', - elements: { - launch: 'i[class="fa icon-launch"]', - schedule: 'i[class="fa icon-schedule"]', - copy: 'i[class="fa icon-copy"]', - edit: 'i[class="fa icon-pencil"]', - delete: 'i[class="fa icon-trash-o"]', - view: 'i[class="fa fa-search-plus"]', - sync: 'i[class="fa fa-refresh"]', - test: 'i[class="fa fa-bell-o' - } -}; - -module.exports = actions; diff --git a/awx/ui/test/e2e/objects/sections/breadcrumb.js b/awx/ui/test/e2e/objects/sections/breadcrumb.js deleted file mode 100644 index 62231b95c2..0000000000 --- a/awx/ui/test/e2e/objects/sections/breadcrumb.js +++ /dev/null @@ -1,8 +0,0 @@ -const breadcrumb = { - selector: 'bread-crumb > div', - elements: { - activity: 'i[class$="icon-activity-stream"]' - } -}; - -module.exports = breadcrumb; diff --git a/awx/ui/test/e2e/objects/sections/createFormSection.js b/awx/ui/test/e2e/objects/sections/createFormSection.js deleted file mode 100644 index 8d823b9237..0000000000 --- a/awx/ui/test/e2e/objects/sections/createFormSection.js +++ /dev/null @@ -1,136 +0,0 @@ -import { merge } from 'lodash'; - -const translated = "translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"; -const normalized = `normalize-space(${translated})`; - -const inputContainerElements = { - lookup: 'button > i[class="fa fa-search"]', - error: '.at-InputMessage--rejected', - help: 'i[class$="fa-question-circle"]', - hint: '.at-InputLabel-hint', - label: 'label', - popover: '.at-Popover-container', - yaml: 'input[type="radio", value="yaml"]', - json: 'input[type="radio", value="json"]', - reset: 'a[class~="reset"]', - down: 'span[class^="fa-angle-down"]', - up: 'span[class^="fa-angle-up"]', - prompt: { - locateStrategy: 'xpath', - selector: `.//p[${normalized}='prompt on launch']/preceding-sibling::input` - }, - show: { - locateStrategy: 'xpath', - selector: './/i[contains(@class, "fa fa-eye")]' - }, - hide: { - locateStrategy: 'xpath', - selector: './/i[contains(@class, "fa fa-eye-slash")]' - }, - on: { - locateStrategy: 'xpath', - selector: `.//button[${normalized}='on']` - }, - off: { - locateStrategy: 'xpath', - selector: `.//button[${normalized}='off']` - }, - replace: { - locateStrategy: 'xpath', - selector: './/i[contains(@class, "fa fa-undo")]' - }, - revert: { - locateStrategy: 'xpath', - selector: './/i[contains(@class, "fa fa-undo fa-flip-horizontal")]' - } -}; - -const legacyContainerElements = merge({}, inputContainerElements, { - prompt: { - locateStrategy: 'xpath', - selector: `.//label[${normalized}='prompt on launch']/input` - }, - error: 'div[class~="error"]', - popover: ':root div[id^="popover"]', -}); - -const generateInputSelectors = (label, containerElements) => { - // descend until span with matching text attribute is encountered - const span = `.//span[text()="${label}"]`; - // recurse upward until div with form-group in class attribute is encountered - const container = `${span}/ancestor::div[contains(@class, 'form-group')]`; - // descend until element with form-control in class attribute is encountered - const input = `${container}//*[contains(@class, 'form-control')]`; - - const inputContainer = { - locateStrategy: 'xpath', - selector: container, - elements: containerElements - }; - - const inputElement = { - locateStrategy: 'xpath', - selector: input - }; - - return { inputElement, inputContainer }; -}; - -function checkAllFieldsDisabled () { - const client = this.client.api; - - const selectors = this.props.formElementSelectors ? this.props.formElementSelectors : [ - '.at-Input' - ]; - - selectors.forEach(selector => { - client.elements('css selector', selector, inputs => { - inputs.value.map(o => o.ELEMENT).forEach(id => { - if (selector.includes('atSwitch')) { - client.elementIdAttribute(id, 'class', ({ value }) => { - const isDisabled = value && value.includes('atSwitch-disabled'); - client.assert.equal(isDisabled, true); - }); - } else { - client.elementIdAttribute(id, 'disabled', ({ value }) => { - client.assert.equal(value, 'true'); - }); - } - }); - }); - }); -} - -const generatorOptions = { - default: inputContainerElements, - legacy: legacyContainerElements -}; - -const createFormSection = ({ selector, labels, strategy, props }) => { - const options = generatorOptions[strategy || 'default']; - - const formSection = { - props, - selector, - sections: {}, - elements: {}, - commands: [{ checkAllFieldsDisabled }] - }; - - if (!labels) { - return formSection; - } - - Object.keys(labels) - .forEach(key => { - const label = labels[key]; - const { inputElement, inputContainer } = generateInputSelectors(label, options); - - formSection.elements[key] = inputElement; - formSection.sections[key] = inputContainer; - }); - - return formSection; -}; - -module.exports = createFormSection; diff --git a/awx/ui/test/e2e/objects/sections/createTableSection.js b/awx/ui/test/e2e/objects/sections/createTableSection.js deleted file mode 100644 index 96607940e5..0000000000 --- a/awx/ui/test/e2e/objects/sections/createTableSection.js +++ /dev/null @@ -1,76 +0,0 @@ -import dynamicSection from './dynamicSection'; - -const header = { - selector: 'thead', - sections: { - dynamicSection - }, - commands: [{ - findColumnByText (text) { - return this.section.dynamicSection.create({ - name: `column[${text}]`, - locateStrategy: 'xpath', - selector: `.//*[normalize-space(text())='${text}']/ancestor-or-self::th`, - elements: { - sortable: { - locateStrategy: 'xpath', - selector: './/*[contains(@class, "fa-sort")]' - }, - sorted: { - locateStrategy: 'xpath', - selector: './/*[contains(@class, "fa-sort-")]' - }, - } - }); - } - }] -}; - -const createTableSection = ({ elements, sections, commands }) => { - const tableSection = { - selector: 'table', - sections: { - header, - dynamicSection - }, - commands: [{ - findRowByText (text) { - return this.section.dynamicSection.create({ - elements, - sections, - commands, - name: `row[${text}]`, - locateStrategy: 'xpath', - selector: `.//tbody/tr/td//*[normalize-space(text())='${text}']/ancestor::tr` - }); - }, - findRowByIndex (index) { - return this.section.dynamicSection.create({ - elements, - sections, - commands, - name: `row[${index}]`, - locateStrategy: 'xpath', - selector: `.//tbody/tr[${index}]` - }); - }, - clickRowByIndex (index) { - this.findRowByIndex(index).click('@self'); - return this; - }, - waitForRowCount (count) { - const countReached = this.findRowByIndex(count); - countReached.waitForElementVisible('@self', 10000); - - const countExceeded = this.findRowByIndex(count + 1); - countExceeded.waitForElementNotPresent('@self', 10000); - - return this; - } - }] - }; - - return tableSection; -}; - -module.exports = createTableSection; diff --git a/awx/ui/test/e2e/objects/sections/dynamicSection.js b/awx/ui/test/e2e/objects/sections/dynamicSection.js deleted file mode 100644 index 3478066318..0000000000 --- a/awx/ui/test/e2e/objects/sections/dynamicSection.js +++ /dev/null @@ -1,26 +0,0 @@ -const dynamicSection = { - selector: '.', - commands: [{ - create ({ name, locateStrategy, selector, elements, sections, commands }) { - const Section = this.constructor; - - const options = Object.assign(Object.create(this), { - name, - locateStrategy, - elements, - selector, - sections, - commands - }); - - options.elements.self = { - locateStrategy: 'xpath', - selector: '.' - }; - - return new Section(options); - } - }] -}; - -module.exports = dynamicSection; diff --git a/awx/ui/test/e2e/objects/sections/header.js b/awx/ui/test/e2e/objects/sections/header.js deleted file mode 100644 index ceea0f004b..0000000000 --- a/awx/ui/test/e2e/objects/sections/header.js +++ /dev/null @@ -1,11 +0,0 @@ -const header = { - selector: 'div[class="at-Layout-topNav"]', - elements: { - logo: 'div[class$="logo"] img', - user: 'i[class="fa fa-user"] + span', - documentation: 'i[class="fa fa-book"]', - logout: 'i[class="fa fa-power-off"]', - } -}; - -module.exports = header; diff --git a/awx/ui/test/e2e/objects/sections/lookupModal.js b/awx/ui/test/e2e/objects/sections/lookupModal.js deleted file mode 100644 index 4f34511323..0000000000 --- a/awx/ui/test/e2e/objects/sections/lookupModal.js +++ /dev/null @@ -1,27 +0,0 @@ -import createTableSection from './createTableSection'; -import pagination from './pagination'; -import search from './search'; - -const lookupModal = { - selector: '#form-modal', - elements: { - close: 'i[class="fa fa-times-circle"]', - title: 'div[class^="Form-title"]', - select: 'button[class*="save"]', - cancel: 'button[class*="cancel"]', - save: 'button[class*="save"]' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - name: 'td[class~="name-column"]', - selected: 'input[type="radio", value="1"]', - } - - }) - } -}; - -module.exports = lookupModal; diff --git a/awx/ui/test/e2e/objects/sections/navigation.js b/awx/ui/test/e2e/objects/sections/navigation.js deleted file mode 100644 index 2f5c9b3a31..0000000000 --- a/awx/ui/test/e2e/objects/sections/navigation.js +++ /dev/null @@ -1,28 +0,0 @@ -const navigation = { - selector: 'div[class^="at-Layout-side"]', - elements: { - expand: 'i[class*="fa-bars"]', - dashboard: 'i[class*="fa-tachometer"]', - jobs: 'i[class*="fa-spinner"]', - schedules: 'i[class*="fa-calendar"]', - portal: 'i[class*="fa-columns"]', - projects: 'i[class*="fa-folder-open"]', - credentials: 'i[class*="fa-key"]', - credentialTypes: 'i[class*="fa-list-alt"]', - inventories: 'i[class*="fa-sitemap"]', - templates: 'i[class*="fa-pencil-square-o"]', - organizations: 'i[class*="fa-building"]', - users: 'i[class*="fa-user"]', - teams: 'i[class*="fa-users"]', - inventoryScripts: 'i[class*="fa-code"]', - notifications: 'i[class*="fa-bell"]', - managementJobs: 'i[class*="fa-wrench"]', - instanceGroups: 'i[class*="fa-server"]', - settings: 'i[class*="fa-cog"]', - settingsSubPane: '.at-SettingsSubPane', - settingsSubPaneSystem: 'a[href="#/settings/system"]', - settingsSubPaneAuth: 'a[href="#/settings/auth"]' - } -}; - -module.exports = navigation; diff --git a/awx/ui/test/e2e/objects/sections/pagination.js b/awx/ui/test/e2e/objects/sections/pagination.js deleted file mode 100644 index 5973ff2dd4..0000000000 --- a/awx/ui/test/e2e/objects/sections/pagination.js +++ /dev/null @@ -1,13 +0,0 @@ -const pagination = { - selector: 'paginate div', - elements: { - first: 'i[class="fa fa-angle-double-left"]', - previous: 'i[class="fa fa-angle-left"]', - next: 'i[class="fa fa-angle-right"]', - last: 'i[class="fa fa-angle-double-right"]', - pageCount: 'span[class~="pageof"]', - itemCount: 'span[class~="itemsOf"]', - } -}; - -module.exports = pagination; diff --git a/awx/ui/test/e2e/objects/sections/permissions.js b/awx/ui/test/e2e/objects/sections/permissions.js deleted file mode 100644 index d74dbf4bbe..0000000000 --- a/awx/ui/test/e2e/objects/sections/permissions.js +++ /dev/null @@ -1,28 +0,0 @@ -import actions from './actions'; -import createTableSection from './createTableSection'; -import pagination from './pagination'; -import search from './search'; - -const permissions = { - selector: 'div[ui-view="related"]', - elements: { - add: '#button-add--permission', - badge: 'div[class="List-titleBadge]', - titleText: 'div[class="List-titleText"]', - noitems: 'div[class="List-noItems"]' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - username: 'td[class~="username"]', - roles: 'td role-list:nth-of-type(1)', - teamRoles: 'td role-list:nth-of-type(2)' - }, - sections: { actions } - }) - } -}; - -module.exports = permissions; diff --git a/awx/ui/test/e2e/objects/sections/search.js b/awx/ui/test/e2e/objects/sections/search.js deleted file mode 100644 index 64fd557da5..0000000000 --- a/awx/ui/test/e2e/objects/sections/search.js +++ /dev/null @@ -1,12 +0,0 @@ -const search = { - selector: 'smart-search', - locateStrategy: 'css selector', - elements: { - clearAll: 'a[class*="clearAll"]', - searchButton: 'i[class*="fa-search"]', - input: 'input', - tags: '.SmartSearch-tagContainer' - } -}; - -module.exports = search; diff --git a/awx/ui/test/e2e/objects/teams.js b/awx/ui/test/e2e/objects/teams.js deleted file mode 100644 index 485206b00c..0000000000 --- a/awx/ui/test/e2e/objects/teams.js +++ /dev/null @@ -1,82 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const details = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#team_form input.Form-textInput', - '#team_form .Form-lookupButton' - ] - } -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/teams`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="form"]', - sections: { - details - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - edit: { - selector: 'div[ui-view="form"]', - sections: { - details, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - list: { - selector: 'div[ui-view="list"]', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: '#button-add' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - name: 'td[class~="name-column"]', - organization: 'td[class~="organization-column"]' - }, - sections: { - actions - } - }) - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - } -}; diff --git a/awx/ui/test/e2e/objects/templates.js b/awx/ui/test/e2e/objects/templates.js deleted file mode 100644 index 47fd844305..0000000000 --- a/awx/ui/test/e2e/objects/templates.js +++ /dev/null @@ -1,279 +0,0 @@ -import _ from 'lodash'; - -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const jtDetails = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#job_template_form .Form-textInput', - '#job_template_form select.Form-dropDown', - '#job_template_form .Form-textArea', - '#job_template_form input[type="checkbox"]', - '#job_template_form .ui-spinner-input', - '#job_template_form .atSwitch-inner' - ] - }, - labels: { - name: 'Name', - description: 'Description', - playbook: 'Playbook' - - } -}); - -const wfjtDetails = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#workflow_job_template_form .Form-textInput', - '#workflow_job_template_form select.Form-dropDown', - '#workflow_job_template_form .Form-textArea', - '#workflow_job_template_form input[type="checkbox"]', - '#workflow_job_template_form .ui-spinner-input', - '#workflow_job_template_form .atSwitch-inner' - ] - }, - labels: { - name: 'Name', - description: 'Description' - - } -}); - -const lookupInventory = _.merge({}, lookupModal, { - locateStrategy: 'xpath', - selector: './/div[text()="Select inventory"]/ancestor::div[contains(@class, "modal-content")]' -}); - -const lookupProject = _.merge({}, lookupModal, { - locateStrategy: 'xpath', - selector: './/div[text()="Select project"]/ancestor::div[contains(@class, "modal-content")]' -}); - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/templates`; - }, - sections: { - header, - navigation, - breadcrumb, - lookupInventory, - lookupProject, - addJobTemplate: { - selector: 'div[ui-view="form"]', - sections: { - jtDetails - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - editJobTemplate: { - selector: 'div[ui-view="form"]', - sections: { - jtDetails, - permissions - }, - elements: { - title: 'div[class^="Form-title"]' - } - }, - addWorkflowJobTemplate: { - selector: 'div[ui-view="form"]', - sections: { - wfjtDetails - }, - elements: { - title: 'div[class^="Form-title"]', - visualizerButton: '#workflow_job_template_workflow_visualizer_btn', - } - }, - editWorkflowJobTemplate: { - selector: 'div[ui-view="form"]', - sections: { - wfjtDetails, - permissions - }, - elements: { - title: 'div[class^="Form-title"]', - visualizerButton: '#workflow_job_template_workflow_visualizer_btn', - } - }, - list: { - selector: '.at-Panel', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: '#button-add' - }, - sections: { - search, - pagination - } - } - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - clickWhenEnabled (selector) { - this.api.waitForElementVisible(selector); - this.expect.element(selector).enabled; - this.click(selector); - return this; - }, - selectAdd (name) { - this.clickWhenEnabled('#button-add'); - - this.api - .useXpath() - .waitForElementVisible(`.//a[normalize-space(text())="${name}"]`) - .click(`//a[normalize-space(text())="${name}"]`) - .useCss(); - - return this; - }, - selectPlaybook (name) { - this.clickWhenEnabled('label[for="playbook"] + div span[class$="arrow"]'); - - this.api - .useXpath() - .waitForElementVisible(`//li[contains(text(), "${name}")]`) - .click(`//li[contains(text(), "${name}")]`) - .useCss(); - - return this; - }, - selectInventory (name) { - this.clickWhenEnabled('label[for="inventory"] + div i[class$="search"]'); - - this.api - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - this.section.lookupInventory.section.search - .waitForElementVisible('@input') - .waitForElementVisible('@searchButton') - .sendKeys('@input', name) - .click('@searchButton') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - this.api - .waitForElementNotPresent('#inventories_table .List-tableRow:nth-child(2)') - .waitForElementVisible('#inventories_table .List-tableRow:nth-child(1) input[type="radio"]') - .click('#inventories_table .List-tableRow:nth-child(1) input[type="radio"]'); - - this.section.lookupInventory.expect.element('@save').enabled; - - this.section.lookupInventory - .click('@save'); - - return this; - }, - selectProject (name) { - this.clickWhenEnabled('label[for="project"] + div i[class$="search"]'); - - this.api - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - this.section.lookupProject.section.search - .waitForElementVisible('@input') - .waitForElementVisible('@searchButton') - .sendKeys('@input', name) - .click('@searchButton') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - this.api - .waitForElementNotPresent('#projects_table .List-tableRow:nth-child(2)') - .waitForElementVisible('#projects_table .List-tableRow:nth-child(1) input[type="radio"]') - .click('#projects_table .List-tableRow:nth-child(1) input[type="radio"]'); - - this.section.lookupProject.expect.element('@save').enabled; - - this.section.lookupProject - .click('@save') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - return this; - }, - selectVaultCredential (name) { - this.clickWhenEnabled('label[for="credential"] + div i[class$="search"]'); - - this.api - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForElementVisible('#multi-credential-kind-select + span span[class$="arrow"]') - .click('#multi-credential-kind-select + span span[class$="arrow"]') - .useXpath() - .waitForElementVisible('//li[contains(text(), "Vault")]') - .click('//li[contains(text(), "Vault")]') - .useCss() - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForElementVisible('multi-credential-modal smart-search input') - .waitForElementVisible('multi-credential-modal smart-search i[class$="search"]') - .sendKeys('multi-credential-modal smart-search input', name) - .click('multi-credential-modal smart-search i[class$="search"]') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .click('multi-credential-modal smart-search a[class*="clear"]') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .sendKeys('multi-credential-modal smart-search input', name) - .click('multi-credential-modal smart-search i[class$="search"]') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForElementNotPresent('multi-credential-modal .List-tableRow:nth-child(2)') - .waitForElementVisible('multi-credential-modal .List-tableRow:nth-child(1) input[type="checkbox"]') - .click('multi-credential-modal .List-tableRow:nth-child(1) input[type="checkbox"]') - .click('multi-credential-modal button[class*="save"]') - .pause(1000); - - return this; - }, - selectMachineCredential (name) { - this.clickWhenEnabled('label[for="credential"] + div i[class$="search"]'); - - this.api - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForElementVisible('#multi-credential-kind-select + span span[class$="arrow"]') - .click('#multi-credential-kind-select + span span[class$="arrow"]') - .useXpath() - .waitForElementVisible('//li[contains(text(), "Machine")]') - .click('//li[contains(text(), "Machine")]') - .useCss() - .waitForElementVisible('multi-credential-modal smart-search input') - .waitForElementVisible('multi-credential-modal smart-search i[class$="search"]') - .sendKeys('multi-credential-modal smart-search input', name) - .click('multi-credential-modal smart-search i[class$="search"]') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForElementNotPresent('multi-credential-modal .List-tableRow:nth-child(2)') - .waitForElementVisible('multi-credential-modal .List-tableRow:nth-child(1) input[type="radio"]') - .click('multi-credential-modal .List-tableRow:nth-child(1) input[type="radio"]') - .click('multi-credential-modal button[class*="save"]') - .pause(1000); - - return this; - } - }] -}; diff --git a/awx/ui/test/e2e/objects/users.js b/awx/ui/test/e2e/objects/users.js deleted file mode 100644 index 9662fef019..0000000000 --- a/awx/ui/test/e2e/objects/users.js +++ /dev/null @@ -1,217 +0,0 @@ -import actions from './sections/actions'; -import breadcrumb from './sections/breadcrumb'; -import createFormSection from './sections/createFormSection'; -import createTableSection from './sections/createTableSection'; -import header from './sections/header'; -import lookupModal from './sections/lookupModal'; -import navigation from './sections/navigation'; -import pagination from './sections/pagination'; -import permissions from './sections/permissions'; -import search from './sections/search'; - -const row = '#users_table .List-tableRow'; - -const details = createFormSection({ - selector: 'form', - props: { - formElementSelectors: [ - '#user_form .Form-textInput', - '#user_form select.Form-dropDown' - ] - } -}); - -const addEditElements = { - title: 'div[class^="Form-title"]', - confirmPassword: '#user_password_confirm_input', - email: '#user_email', - firstName: '#user_first_name', - lastName: '#user_last_name', - organization: 'input[name="organization_name"]', - password: '#user_password_input', - save: '#user_save_btn', - username: '#user_username', - type: '#select2-user_user_type-container', -}; - -module.exports = { - url () { - return `${this.api.globals.launch_url}/#/users`; - }, - commands: [{ - load () { - this.api.url('data:,'); // https://github.com/nightwatchjs/nightwatch/issues/1724 - return this.navigate(); - }, - create (user, organization) { - this.section.list - .waitForElementVisible('@add') - .click('@add'); - this.section.add - .waitForElementVisible('@title') - .setValue('@organization', organization.name) - .setValue('@email', user.email) - .setValue('@username', user.username) - .setValue('@password', user.password) - .setValue('@confirmPassword', user.password); - if (user.firstName) { - this.section.add.setValue('@firstName', user.firstName); - } - if (user.lastName) { - this.section.add.setValue('@lastName', user.lastName); - } - if (user.type) { - this.section.add - .click('@type') - .click(`li[id$=${user.type}]`); - } - this.section.add.click('@save'); - this.waitForSpinny(); - }, - delete (username) { - this.search(username); - const deleteButton = `${row} i[class*="fa-trash-o"]`; - const modalAction = '.modal-dialog #prompt_action_btn'; - this - .waitForElementVisible(deleteButton) - .click(deleteButton) - .waitForElementVisible(modalAction) - .click(modalAction) - .waitForSpinny(); - const searchResults = '.List-searchNoResults'; - this - .waitForElementVisible(searchResults) - .expect.element(searchResults).text.contain('No records matched your search.'); - }, - search (username) { - this.section.list.section.search - .setValue('@input', username) - .click('@searchButton'); - this.waitForSpinny(); - this.waitForElementNotPresent(`${row}:nth-of-type(2)`); - this.expect.element('.List-titleBadge').text.to.contain('1'); - this.expect.element(row).text.contain(username); - }, - createToken (username, token, callback) { - this.search(username); - const editButton = `${row} i[class*="fa-pencil"]`; - this - .waitForElementVisible(editButton) - .click(editButton); - this.section.tokens - .waitForElementVisible('@tokensTab') - .click('@tokensTab') - .waitForSpinny() - .click('@add'); - const { createToken } = this.section; - createToken.waitForElementVisible('@application'); - this.expect.element(this.section.breadcrumb.selector).text.to.contain(`USERS ${username} TOKENS CREATE TOKEN`); - if (token.application) { - createToken.setValue('@application', token.application); - } - if (token.description) { - createToken.setValue('@description', token.description); - } - if (token.scope) { - createToken - .click('@scope') - .click(`option[label=${token.scope}]`); - } - createToken.click('@saveButton'); - this.waitForSpinny() - .waitForElementVisible('#alert-modal-msg'); - - const tokenInfo = { - token: null, - refreshToken: null, - expires: null, - }; - - this.getText( - '#alert-modal-msg .PopupModal:nth-of-type(1) .PopupModal-value', - (result) => { tokenInfo.token = result.value; } - ); - this.getText( - '#alert-modal-msg .PopupModal:nth-of-type(2) .PopupModal-value', - (result) => { tokenInfo.refreshToken = result.value; } - ); - this.getText( - '#alert-modal-msg .PopupModal:nth-of-type(3) .PopupModal-value', - (result) => { tokenInfo.expires = result.value; } - ); - - this.findThenClick('#alert_ok_btn', 'css') - .waitForElementNotVisible('#alert-modal-msg'); - - this.api.perform(() => { - if (typeof callback === 'function') { - callback.call(this.api, tokenInfo); - } - }); - }, - }], - sections: { - header, - navigation, - breadcrumb, - lookupModal, - add: { - selector: 'div[ui-view="form"]', - sections: { - details - }, - elements: addEditElements, - }, - edit: { - selector: 'div[ui-view="form"]', - sections: { - details, - permissions - }, - elements: addEditElements, - }, - list: { - selector: 'div[ui-view="list"]', - elements: { - badge: 'span[class~="badge"]', - title: 'div[class="List-titleText"]', - add: '#button-add' - }, - sections: { - search, - pagination, - table: createTableSection({ - elements: { - username: 'td[class~="username-column"]', - first_name: 'td[class~="first_name-column"]', - last_name: 'td[class~="last_name-column"]' - }, - sections: { - actions - } - }) - } - }, - tokens: { - selector: 'div[ui-view="form"]', - elements: { - add: '#button-add', - tokensTab: '#tokens_tab', - }, - }, - createToken: { - selector: 'div[ui-view="preFormView"]', - elements: { - application: 'input[tabindex="1"]', - description: 'input[tabindex="2"]', - scope: 'select[tabindex="3"]', - cancelButton: 'button[type="cancel"]', - saveButton: 'button[type="save"]', - } - }, - }, - elements: { - cancel: 'button[class*="Form-cancelButton"]', - save: 'button[class*="Form-saveButton"]' - } -}; diff --git a/awx/ui/test/e2e/runner.js b/awx/ui/test/e2e/runner.js deleted file mode 100755 index 494d059abf..0000000000 --- a/awx/ui/test/e2e/runner.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -require('babel-core/register'); -require('nightwatch/bin/runner.js'); diff --git a/awx/ui/test/e2e/settings.js b/awx/ui/test/e2e/settings.js deleted file mode 100644 index 6fd9f54a65..0000000000 --- a/awx/ui/test/e2e/settings.js +++ /dev/null @@ -1,39 +0,0 @@ -const normalizeURL = s => s - .replace(/([^:]\/)\/+/g, '$1') // remove duplicate slashes - .replace(/\/+$/, ''); // remove trailing slash if there is one - -const AWX_E2E_CLUSTER_HOST = process.env.AWX_E2E_CLUSTER_HOST || 'localhost'; -const AWX_E2E_CLUSTER_PORT = process.env.AWX_E2E_CLUSTER_PORT || 4444; -const AWX_E2E_CLUSTER_WORKERS = process.env.AWX_E2E_CLUSTER_WORKERS || 0; -const AWX_E2E_PASSWORD = process.env.AWX_E2E_PASSWORD || 'password'; -const AWX_E2E_URL = normalizeURL(process.env.AWX_E2E_URL || 'https://localhost:8043'); -const AWX_E2E_USERNAME = process.env.AWX_E2E_USERNAME || 'awx-e2e'; -const AWX_E2E_TIMEOUT_ASYNC = process.env.AWX_E2E_TIMEOUT_ASYNC || 120000; -const AWX_E2E_TIMEOUT_LONG = process.env.AWX_E2E_TIMEOUT_LONG || 10000; -const AWX_E2E_TIMEOUT_MEDIUM = process.env.AWX_E2E_TIMEOUT_MEDIUM || 5000; -const AWX_E2E_TIMEOUT_SHORT = process.env.AWX_E2E_TIMEOUT_SHORT || 1000; -const AWX_E2E_LAUNCH_URL = normalizeURL(process.env.AWX_E2E_LAUNCH_URL || AWX_E2E_URL); - -// Screenshot capture settings -const AWX_E2E_SCREENSHOTS_ENABLED = process.env.AWX_E2E_SCREENSHOTS_ENABLED || false; -const AWX_E2E_SCREENSHOTS_ON_ERROR = process.env.AWX_E2E_SCREENSHOTS_ON_ERROR || true; -const AWX_E2E_SCREENSHOTS_ON_FAILURE = process.env.AWX_E2E_SCREENSHOTS_ON_FAILURE || true; -const AWX_E2E_SCREENSHOTS_PATH = process.env.AWX_E2E_SCREENSHOTS_PATH || ''; - -module.exports = { - AWX_E2E_CLUSTER_HOST, - AWX_E2E_CLUSTER_PORT, - AWX_E2E_CLUSTER_WORKERS, - AWX_E2E_LAUNCH_URL, - AWX_E2E_PASSWORD, - AWX_E2E_URL, - AWX_E2E_USERNAME, - AWX_E2E_TIMEOUT_ASYNC, - AWX_E2E_TIMEOUT_LONG, - AWX_E2E_TIMEOUT_MEDIUM, - AWX_E2E_TIMEOUT_SHORT, - AWX_E2E_SCREENSHOTS_ENABLED, - AWX_E2E_SCREENSHOTS_ON_ERROR, - AWX_E2E_SCREENSHOTS_ON_FAILURE, - AWX_E2E_SCREENSHOTS_PATH, -}; diff --git a/awx/ui/test/e2e/tests/gce.alt.json b/awx/ui/test/e2e/tests/gce.alt.json deleted file mode 100644 index 1080223f07..0000000000 --- a/awx/ui/test/e2e/tests/gce.alt.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "test321", - "private_key_id": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "private_key": "-----BEGIN PRIVATE KEY-----\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\nBBBBBBBBBBBBBBBBBBBBBBBB\n-----END PRIVATE KEY-----\n", - "client_email": "test321.iam.gserviceaccount.com", - "client_id": "321987654321987654321", - "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/test321%40test.iam.gserviceaccount.com" -} diff --git a/awx/ui/test/e2e/tests/gce.invalid.json b/awx/ui/test/e2e/tests/gce.invalid.json deleted file mode 100644 index 9977a2836c..0000000000 --- a/awx/ui/test/e2e/tests/gce.invalid.json +++ /dev/null @@ -1 +0,0 @@ -invalid diff --git a/awx/ui/test/e2e/tests/gce.json b/awx/ui/test/e2e/tests/gce.json deleted file mode 100644 index dd3055f059..0000000000 --- a/awx/ui/test/e2e/tests/gce.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "test123", - "private_key_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "private_key": "-----BEGIN PRIVATE KEY-----\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAA\n-----END PRIVATE KEY-----\n", - "client_email": "test123.iam.gserviceaccount.com", - "client_id": "123456789123456789123", - "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/test123%40test.iam.gserviceaccount.com" -} diff --git a/awx/ui/test/e2e/tests/gce.missing.json b/awx/ui/test/e2e/tests/gce.missing.json deleted file mode 100644 index 5d0d1e2968..0000000000 --- a/awx/ui/test/e2e/tests/gce.missing.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "service_account", - "project_id": "test654", - "private_key_id": "cccccccccccccccccccccccccccccccccccccccc", - "private_key": "-----BEGIN PRIVATE KEY-----\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\nCCCCCCCCCCCCCCCCCCCCCCCC\n-----END PRIVATE KEY-----\n", - "client_id": "654321987654321987654", - "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/test654%40test.iam.gserviceaccount.com" -} diff --git a/awx/ui/test/e2e/tests/smoke-vars.yml b/awx/ui/test/e2e/tests/smoke-vars.yml deleted file mode 100644 index 7834c3944f..0000000000 --- a/awx/ui/test/e2e/tests/smoke-vars.yml +++ /dev/null @@ -1,7 +0,0 @@ -$ANSIBLE_VAULT;1.1;AES256 -36663862313439656164323336396466323737666532643061323738646337623166653338663939 -6365663839623936363566393461643961363963613333650a333463653831386463646564376265 -39376362376231303064326464303738343136643931336432396638333933356337383866326539 -3830316634306466310a366234333566613733633232623434363434376534663466393833666435 -36373961636564353865653162393266383135363362336139613435323464356136393034636539 -6166663537623261336262363732346238343066393861643134 diff --git a/awx/ui/test/e2e/tests/smoke.js b/awx/ui/test/e2e/tests/smoke.js deleted file mode 100644 index 7b1d7ddb34..0000000000 --- a/awx/ui/test/e2e/tests/smoke.js +++ /dev/null @@ -1,288 +0,0 @@ -import uuid from 'uuid'; - -const data = {}; - -const initializeData = () => { - const id = uuid().substr(0, 8); - - data.INVENTORY_NAME = `inventory-${id}`; - data.MACHINE_CREDENTIAL_NAME = `credential-machine-${id}`; - data.ORGANIZATION_NAME = `organization-${id}`; - data.PROJECT_NAME = `project-${id}`; - data.PROJECT_URL = 'https://github.com/ansible/test-playbooks'; - data.PROJECT_BRANCH = 'devel'; - data.PLAYBOOK_NAME = 'multivault.yml'; - data.TEMPLATE_NAME = `template-${id}`; - data.VAULT_CREDENTIAL_NAME_1 = `credential-vault-${id}-1`; - data.VAULT_CREDENTIAL_NAME_2 = `credential-vault-${id}-2`; -}; - -module.exports = { - 'login to awx': client => { - initializeData(); - - client.login(); - client.waitForAngular(); - }, - 'create organization': client => { - const organizations = client.page.organizations(); - const { details } = organizations.section.add.section; - - organizations.section.navigation.waitForElementVisible('@organizations'); - organizations.section.navigation.expect.element('@organizations').enabled; - organizations.section.navigation.click('@organizations'); - - organizations.waitForElementVisible('div.spinny'); - organizations.waitForElementNotVisible('div.spinny'); - - organizations.section.list.expect.element('@add').visible; - organizations.section.list.expect.element('@add').enabled; - organizations.section.list.click('@add'); - - details.waitForElementVisible('@name'); - details.expect.element('@name').enabled; - - details.setValue('@name', data.ORGANIZATION_NAME); - - organizations.waitForElementVisible('@save'); - organizations.expect.element('@save').enabled; - organizations.click('@save'); - - organizations.waitForElementVisible('div.spinny'); - organizations.waitForElementNotVisible('div.spinny'); - }, - 'create project': client => { - const projects = client.page.projects(); - - projects.section.navigation.waitForElementVisible('@projects'); - projects.section.navigation.expect.element('@projects').enabled; - projects.section.navigation.click('@projects'); - - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - projects.section.list.waitForElementVisible('@add'); - projects.section.list.expect.element('@add').enabled; - - client.pause(1000); projects.section.list.click('@add'); - - projects.waitForElementVisible('label[for="name"] + div input'); - projects.waitForElementVisible('label[for="organization"] + div input'); - projects.waitForElementPresent('label[for="scm_type"] + div > div select option[value="git"]'); - - projects.setValue('label[for="name"] + div input', data.PROJECT_NAME); - projects.clearValue('label[for="organization"] + div input'); - projects.setValue('label[for="organization"] + div input', data.ORGANIZATION_NAME); - projects.click('label[for="scm_type"] + div > div select option[value="git"]'); - - projects.waitForElementVisible('.sourceSubForm'); - projects.waitForElementVisible('label[for="scm_url"] + div input'); - projects.waitForElementVisible('label[for="scm_branch"] + div input'); - - projects.setValue('label[for="scm_url"] + div input', data.PROJECT_URL); - projects.setValue('label[for="scm_branch"] + div input', data.PROJECT_BRANCH); - - projects.expect.element('#project_save_btn').enabled; - projects.click('#project_save_btn'); - - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - projects.expect.element('smart-search input').enabled; - projects.sendKeys('smart-search input', `${data.PROJECT_NAME}${client.Keys.ENTER}`); - - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - projects.waitForElementVisible('div.spinny', 120000); - projects.waitForElementNotVisible('div.spinny'); - projects.expect.element('i[class$="success"]').visible; - - projects.expect.element('#project_cancel_btn').visible; - projects.click('#project_cancel_btn'); - client.refresh(); - client.waitForElementVisible('div.spinny'); - client.waitForElementNotVisible('div.spinny'); - }, - 'create inventory': client => { - const inventories = client.page.inventories(); - const details = inventories.section.addStandardInventory.section.standardInvDetails; - - inventories.section.navigation.waitForElementVisible('@inventories'); - inventories.section.navigation.expect.element('@inventories').enabled; - inventories.section.navigation.click('@inventories'); - - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - inventories.selectAdd('Inventory'); - - details.waitForElementVisible('@name'); - details.waitForElementVisible('@organization'); - - details.expect.element('@name').enabled; - details.expect.element('@organization').enabled; - - details.setValue('@name', data.INVENTORY_NAME); - details.setValue('@organization', data.ORGANIZATION_NAME); - - inventories.waitForElementVisible('@save'); - inventories.expect.element('@save').enabled; - - inventories.click('@save'); - - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - }, - 'create host': client => { - const addHost = '.hostsList #button-add'; - - client.expect.element('#hosts_tab').enabled; - client.expect.element('#hosts_tab').css('opacity').equal('1'); - client.expect.element('#hosts_tab').css('background-color').contain('255, 255, 255'); - client.click('#hosts_tab'); - - client.waitForElementVisible('div.spinny'); - client.waitForElementNotVisible('div.spinny'); - - client.expect.element('#hosts_tab').css('background-color').contain('100, 105, 114'); - - client.useCss(); - client.waitForElementVisible(addHost); - client.expect.element(addHost).enabled; - client.click(addHost); - - client.waitForElementVisible('#host_name'); - client.sendKeys('#host_name', 'localhost'); - - client.click('div[class="CodeMirror-scroll"]'); - client.sendKeys('.CodeMirror textarea', client.Keys.ENTER); - client.sendKeys('.CodeMirror textarea', 'ansible_connection: local'); - client.click('#host_variables_parse_type label[class$="hollow"]'); - client.click('#host_variables_parse_type label[class$="hollow"]'); - - client.expect.element('#host_save_btn').enabled; - client.click('#host_save_btn'); - - client.waitForElementVisible('div.spinny'); - client.waitForElementNotVisible('div.spinny'); - }, - 'create vault credentials': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.navigateTo(`${credentials.url()}/add`); - - details.waitForElementVisible('@save'); - details.clearAndSelectType('Vault'); - details.setValue('@organization', data.ORGANIZATION_NAME); - details.setValue('@name', data.VAULT_CREDENTIAL_NAME_1); - - details.section.vault.setValue('@vaultPassword', 'secret1'); - details.section.vault.setValue('@vaultIdentifier', 'first'); - - details.expect.element('@save').enabled; - details.click('@save'); - - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - client.navigateTo(`${credentials.url()}/add`); - - details.waitForElementVisible('@save'); - details.clearAndSelectType('Vault'); - details.setValue('@organization', data.ORGANIZATION_NAME); - details.setValue('@name', data.VAULT_CREDENTIAL_NAME_2); - - details.section.vault.setValue('@vaultPassword', 'secret2'); - details.section.vault.setValue('@vaultIdentifier', 'second'); - - details.expect.element('@save').enabled; - details.click('@save'); - - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - }, - 'create machine credential': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.navigateTo(`${credentials.url()}/add`); - - details.waitForElementVisible('@save'); - details.clearAndSelectType('Machine'); - details.setValue('@organization', data.ORGANIZATION_NAME); - details.setValue('@name', data.MACHINE_CREDENTIAL_NAME); - - details.expect.element('@save').enabled; - details.click('@save'); - - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - }, - 'create job template': client => { - const templates = client.page.templates(); - - client.navigateTo(templates.url()); - - templates.selectAdd('Job Template'); - templates.selectInventory(data.INVENTORY_NAME); - templates.selectProject(data.PROJECT_NAME); - templates.selectVaultCredential(data.VAULT_CREDENTIAL_NAME_1); - templates.selectVaultCredential(data.VAULT_CREDENTIAL_NAME_2); - templates.selectMachineCredential(data.MACHINE_CREDENTIAL_NAME); - templates.selectPlaybook(data.PLAYBOOK_NAME); - templates.sendKeys('label[for="name"] + div input', data.TEMPLATE_NAME); - - templates.expect.element('#job_template_save_btn').enabled; - templates.click('#job_template_save_btn'); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('#job_template_save_btn').enabled; - }, - 'launch job': client => { - const templates = client.page.templates(); - - templates.waitForElementVisible('smart-search input'); - templates.expect.element('smart-search input').enabled; - - client.pause(1000).waitForElementNotVisible('div.spinny'); - templates.sendKeys('smart-search input', `${data.TEMPLATE_NAME}${client.Keys.ENTER}`); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.sendKeys('smart-search input', `${data.TEMPLATE_NAME}${client.Keys.ENTER}`); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.waitForElementPresent('i[class$="launch"]'); - templates.waitForElementNotPresent('i[class$="launch"]:nth-of-type(2)'); - - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - - templates.waitForElementVisible('i[class$="launch"]'); - templates.click('i[class$="launch"]'); - }, - 'verify expected job results': client => { - const output1 = './/span[normalize-space(text())=\'"first": "First!"\']'; - const output2 = './/span[normalize-space(text())=\'"second": "Second!"\']'; - const running = 'i[class$="icon-job-running"]'; - const success = 'i[class$="icon-job-successful"]'; - - client.waitForElementVisible('div.spinny'); - client.waitForElementNotVisible('div.spinny'); - - client.waitForElementVisible('at-job-details'); - client.waitForElementNotPresent(running, 60000); - client.waitForElementVisible(success, 60000); - - client.useXpath(); - client.waitForElementVisible(output1, 60000); - client.waitForElementVisible(output2, 60000); - client.useCss(); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/smoke.yml b/awx/ui/test/e2e/tests/smoke.yml deleted file mode 100644 index 10edd0ab0f..0000000000 --- a/awx/ui/test/e2e/tests/smoke.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# ansible-playbook multivault.yml --vault-id var1@prompt --vault-id var2@prompt -# Vault password (var1): secret1 -# Vault password (var2): secret2 - -- hosts: all - gather_facts: false - vars: - first: !vault | - $ANSIBLE_VAULT;1.2;AES256;first - 30326539376633656433636231653132623266336338316462356132366361653566303364353335 - 6665626463633737666336643334353262373836613332650a353531666262636531383430363935 - 33633465306165393538323336323135393730383563653738666163633835383262396135353765 - 6238333837306332630a336538623333313636353363326666613564353666623635373432386162 - 3562 - second: !vault | - $ANSIBLE_VAULT;1.2;AES256;second - 34653738643565633930336534363230343562343362643432616165373034376565353833366361 - 6264346330376564643262643166623164323433336631360a396336353866323663613935383534 - 33643034373439326435373539323433313832366437303764353562653834623966663533613464 - 3961663934613264360a613763346638636566386461333235366335336564353935356232316265 - 3164 - tasks: - - debug: var=first - - debug: var=second diff --git a/awx/ui/test/e2e/tests/test-404-behavior.js b/awx/ui/test/e2e/tests/test-404-behavior.js deleted file mode 100644 index d12181a4ad..0000000000 --- a/awx/ui/test/e2e/tests/test-404-behavior.js +++ /dev/null @@ -1,44 +0,0 @@ -import { - AWX_E2E_URL, - AWX_E2E_TIMEOUT_MEDIUM -} from '../settings'; - -module.exports = { - before: (client) => { - client - .login() - .waitForAngular(); - }, - 'Test that default the 404 behavior redirects to the dashboard': client => { - client.navigateTo(`${AWX_E2E_URL}#/brokenurl`, false); - client.useXpath().waitForElementVisible('//job-status-graph'); - client.assert.urlContains('#/home'); - }, - 'Test 404 modal for job templates': client => { - client.navigateTo(`${AWX_E2E_URL}#/templates/job_template/99999`, false); - client.expect.element('//*[@id="alert-modal"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - client.findThenClick('//*[@id="alert_ok_btn"]'); - }, - 'Test 404 modal for workflow job templates': client => { - client.navigateTo(`${AWX_E2E_URL}#/templates/workflow_job_template/99999`, false); - client.expect.element('//*[@id="alert-modal"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - client.findThenClick('//*[@id="alert_ok_btn"]'); - }, - 'Test 404 modal for credentials': client => { - client.navigateTo(`${AWX_E2E_URL}#/credentials/99999`, false); - client.expect.element('//*[@id="alert-modal"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - client.findThenClick('//*[@id="alert_ok_btn"]'); - }, - 'Test 404 modal for projects': client => { - client.navigateTo(`${AWX_E2E_URL}#/projects/99999`, false); - client.expect.element('//*[@id="alert-modal"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - client.findThenClick('//*[@id="alert_ok_btn"]'); - }, - after: client => { - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-applications.js b/awx/ui/test/e2e/tests/test-applications.js deleted file mode 100644 index 8d0b191d3f..0000000000 --- a/awx/ui/test/e2e/tests/test-applications.js +++ /dev/null @@ -1,158 +0,0 @@ -/* Tests for applications. */ -import uuid from 'uuid'; -import { - getOrganization, - getUser -} from '../fixtures'; - -const row = '.at-List-container .at-Row'; -const editLink = `${row} a.ng-binding`; -const testID = uuid().substr(0, 8); -const namespace = 'test-applications'; - -const store = { - organization: { - name: `${namespace}-organization` - }, - application: { - name: `name-${testID}`, - description: `description-${testID}`, - // authorizationGrantType: `authorization-grand-type-${testID}`, - redirectUris: `https://example.com/${testID}/`, - // clientType: `client-type-${testID}`, - }, - adminUser: { - username: `admin-${testID}`, - password: `admin-${testID}`, - isSuperuser: true, - }, -}; - -let data; - -module.exports = { - before: (client, done) => { - const resources = [ - getOrganization(store.organization.name), - getUser( - namespace, - store.adminUser.username, - store.adminUser.password, - store.adminUser.isSuperuser - ), - ]; - Promise.all(resources) - .then(([org]) => { - data = { org }; - done(); - }); - - client.login(); - client.waitForAngular(); - }, - 'create an application': client => { - const applications = client.page.applications(); - applications.load(); - client.waitForSpinny(); - const newApplication = { - name: store.application.name, - redirectUris: store.application.redirectUris, - authorizationGrantType: - applications.props.authorizationGrantTypeOptions.authorizationCode, - clientType: applications.props.clientTypeOptions.confidential, - }; - applications.create(newApplication, store.organization); - applications.search(store.application.name); - }, - 'edit an application': client => { - // Given the application created on the previous test - const applications = client.page.applications(); - applications.load(); - client.waitForSpinny(); - applications.search(store.application.name); - client - .waitForElementVisible(editLink) - .expect.element(editLink).text.to.equal(store.application.name); - client.click(editLink); - applications.section.edit - .waitForElementVisible('@description') - .setValue('@description', store.application.description) - .click('@save'); - client.waitForSpinny(); - applications.load(); - client.waitForSpinny(); - applications.search(store.application.name); - client - .waitForElementVisible(editLink) - .expect.element(editLink).text.to.equal(store.application.name); - client.click(editLink); - applications.section.edit - .waitForElementVisible('@description') - .expect.element('@description').value.to.equal(store.application.description); - }, - 'add a read scoped application token': client => { - client.logout(); - client.login(store.adminUser.username, store.adminUser.password); - - // Given the application created on the previous test - const token = { - application: store.application.name, - description: `Read scoped token for ${store.application.name}`, - scope: 'Read', - }; - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.createToken(store.adminUser.username, token, (tokenInfo) => { - const applications = client.page.applications(); - applications.load(); - client.waitForSpinny(); - applications.search(store.application.name); - client.findThenClick(editLink, 'css'); - applications.section.edit - .waitForElementVisible('@tokensTab') - .click('@tokensTab') - .waitForSpinny(); - // FIXME: Search is not properly working, update this when it is working. - applications.section.tokens.expect.element('@list').text.to.contain(`${store.adminUser.username}\n${token.description}\nEXPIRATION ${tokenInfo.expires}`); - }); - }, - 'add a write scoped application token': client => { - // Given the application created on the previous test - const token = { - application: store.application.name, - description: `Write scoped token for ${store.application.name}`, - scope: 'Write', - }; - - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.createToken(store.adminUser.username, token, (tokenInfo) => { - const applications = client.page.applications(); - applications.load(); - client.waitForSpinny(); - applications.search(store.application.name); - client.findThenClick(editLink, 'css'); - applications.section.edit - .waitForElementVisible('@tokensTab') - .click('@tokensTab') - .waitForSpinny(); - // FIXME: Search is not properly working, update this when it is working. - applications.section.tokens.expect.element('@list').text.to.contain(`${store.adminUser.username}\n${token.description}\nEXPIRATION ${tokenInfo.expires}`); - }); - - client.logout(); - client.login(); - }, - 'delete an application': client => { - // Given the application created on the create application test - const applications = client.page.applications(); - applications.load(); - client.waitForSpinny(); - applications.delete(store.application.name); - }, - after: client => { - client.end(); - }, -}; diff --git a/awx/ui/test/e2e/tests/test-auditor-read-only-forms.js b/awx/ui/test/e2e/tests/test-auditor-read-only-forms.js deleted file mode 100644 index ede45a1a8e..0000000000 --- a/awx/ui/test/e2e/tests/test-auditor-read-only-forms.js +++ /dev/null @@ -1,196 +0,0 @@ -import { - getAdminAWSCredential, - getAdminMachineCredential, - getAuditor, - getInventory, - getInventoryScript, - getNotificationTemplate, - getOrganization, - getSmartInventory, - getTeam, - getUpdatedProject, - getUser -} from '../fixtures'; - -const data = {}; - -let credentials; -let inventoryScripts; -let notificationTemplates; -let organizations; -let projects; -// let templates; -let users; -let inventories; -let teams; - -module.exports = { - before: (client, done) => { - const promises = [ - getAuditor().then(obj => { data.auditor = obj; }), - getOrganization().then(obj => { data.organization = obj; }), - getInventory().then(obj => { data.inventory = obj; }), - getInventoryScript().then(obj => { data.inventoryScript = obj; }), - getAdminAWSCredential().then(obj => { data.adminAWSCredential = obj; }), - getAdminMachineCredential().then(obj => { data.adminMachineCredential = obj; }), - getSmartInventory().then(obj => { data.smartInventory = obj; }), - getTeam().then(obj => { data.team = obj; }), - getUser().then(obj => { data.user = obj; }), - getNotificationTemplate().then(obj => { data.notificationTemplate = obj; }), - getUpdatedProject().then(obj => { data.project = obj; }) - ]; - - Promise.all(promises) - .then(() => { - client.useCss(); - - credentials = client.page.credentials(); - inventoryScripts = client.page.inventoryScripts(); - // templates = client.page.templates(); - notificationTemplates = client.page.notificationTemplates(); - organizations = client.page.organizations(); - projects = client.page.projects(); - users = client.page.users(); - inventories = client.page.inventories(); - teams = client.page.teams(); - - client.login(data.auditor.username); - client.waitForAngular(); - - done(); - }); - }, - 'verify an auditor\'s credentials inputs are read-only': client => { - const url = `${credentials.url()}/${data.adminAWSCredential.id}/`; - - client.navigateTo(url); - - credentials.section.edit - .expect.element('@title').text.contain(data.adminAWSCredential.name); - - credentials.section.edit.section.details.checkAllFieldsDisabled(); - }, - 'verify an auditor\'s inventory scripts inputs are read-only': client => { - const url = `${inventoryScripts.url()}/${data.inventoryScript.id}/`; - - client.navigateTo(url); - - inventoryScripts.section.edit - .expect.element('@title').text.contain(data.inventoryScript.name); - - inventoryScripts.section.edit.section.details.checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on inventory scripts form': () => { - inventoryScripts.expect.element('@save').to.not.be.visible; - }, - // TODO: re-enable these tests when JT edit has been re-factored to reliably show/remove the - // loading spinner only one time. Without this, we can't tell when all the requisite data is - // available. - // - // 'verify an auditor\'s job template inputs are read-only': function (client) { - // const url = `${templates.url()}/job_template/${data.jobTemplate.id}/`; - // client.navigateTo(url)'' - // - // templates.section.editJobTemplate - // .expect.element('@title').text.contain(data.jobTemplate.name); - // - // templates.section.edit.section.details.checkAllFieldsDisabled(); - // }, - // 'verify save button hidden from auditor on job templates form': function () { - // templates.expect.element('@save').to.not.be.visible; - // }, - 'verify an auditor\'s notification templates inputs are read-only': client => { - const url = `${notificationTemplates.url()}/${data.notificationTemplate.id}/`; - - client.navigateTo(url); - - notificationTemplates.section.edit - .expect.element('@title').text.contain(data.notificationTemplate.name); - - notificationTemplates.section.edit.section.details.checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on notification templates page': () => { - notificationTemplates.expect.element('@save').to.not.be.visible; - }, - 'verify an auditor\'s organizations inputs are read-only': client => { - const url = `${organizations.url()}/${data.organization.id}/`; - - client.navigateTo(url); - - organizations.section.edit - .expect.element('@title').text.contain(data.organization.name); - - organizations.section.edit.section.details.checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on organizations form': () => { - organizations.expect.element('@save').to.not.be.visible; - }, - 'verify an auditor\'s smart inventory inputs are read-only': client => { - const url = `${inventories.url()}/smart/${data.smartInventory.id}/`; - - client.navigateTo(url); - - inventories.section.editSmartInventory - .expect.element('@title').text.contain(data.smartInventory.name); - - inventories.section.editSmartInventory.section.smartInvDetails.checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on smart inventories form': () => { - inventories.expect.element('@save').to.not.be.visible; - }, - 'verify an auditor\'s project inputs are read-only': client => { - const url = `${projects.url()}/${data.project.id}/`; - - client.navigateTo(url); - - projects.section.edit - .expect.element('@title').text.contain(data.project.name); - - projects.section.edit.section.details.checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on projects form': () => { - projects.expect.element('@save').to.not.be.visible; - }, - 'verify an auditor\'s standard inventory inputs are read-only': client => { - const url = `${inventories.url()}/inventory/${data.inventory.id}/`; - - client.navigateTo(url); - - inventories.section.editStandardInventory - .expect.element('@title').text.contain(data.inventory.name); - - inventories.section.editStandardInventory.section.standardInvDetails - .checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on standard inventory form': () => { - inventories.expect.element('@save').to.not.be.visible; - }, - 'verify an auditor\'s teams inputs are read-only': client => { - const url = `${teams.url()}/${data.team.id}/`; - - client.navigateTo(url); - - teams.section.edit - .expect.element('@title').text.contain(data.team.name); - - teams.section.edit.section.details.checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on teams form': () => { - teams.expect.element('@save').to.not.be.visible; - }, - 'verify an auditor\'s user inputs are read-only': client => { - const url = `${users.url()}/${data.user.id}/`; - - client.navigateTo(url); - - users.section.edit - .expect.element('@title').text.contain(data.user.username); - - users.section.edit.section.details.checkAllFieldsDisabled(); - }, - 'verify save button hidden from auditor on users form': client => { - users.expect.element('@save').to.not.be.visible; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-configuration-ldap-fields.js b/awx/ui/test/e2e/tests/test-configuration-ldap-fields.js deleted file mode 100644 index 159b5fcc58..0000000000 --- a/awx/ui/test/e2e/tests/test-configuration-ldap-fields.js +++ /dev/null @@ -1,60 +0,0 @@ -module.exports = { - 'expected LDAP codemirror fields are rendered when returning from another tab': client => { - const authView = 'div[ui-view="auth"]'; - const ldapForm = '#configuration_ldap_template_form'; - const systemView = 'div[ui-view="system"]'; - - const { navigation } = client.page.dashboard().section; - const configuration = client.page.configuration(); - - client.login(); - client.waitForAngular(); - - navigation - .waitForElementVisible('@settings') - .moveToElement('@settings', 0, 0) - .waitForElementVisible('@settingsSubPaneSystem') - .click('@settingsSubPaneSystem'); - - configuration.waitForElementVisible(systemView); - - navigation - .waitForElementVisible('@settings') - .moveToElement('@settings', 0, 0) - .waitForElementVisible('@settingsSubPane') - .waitForElementVisible('@settingsSubPaneAuth') - .click('@settingsSubPaneAuth'); - - configuration.waitForElementVisible(authView); - - // works as xpath const categoryName = - // `//*[@id="configuration_edit"]/div[1]/div/div/div[4]`; - configuration.selectSubcategory('LDAP'); - configuration.waitForElementVisible(ldapForm); - - const expectedCodemirrorFields = [ - 'AUTH_LDAP_USER_SEARCH', - 'AUTH_LDAP_GROUP_SEARCH', - 'AUTH_LDAP_USER_ATTR_MAP', - 'AUTH_LDAP_GROUP_TYPE_PARAMS', - 'AUTH_LDAP_USER_FLAGS_BY_GROUP', - 'AUTH_LDAP_ORGANIZATION_MAP', - 'AUTH_LDAP_TEAM_MAP', - ]; - - const ldapCodeMirrors = `${ldapForm} div[class^="CodeMirror"] textarea`; - - client.elements('css selector', ldapCodeMirrors, ({ value }) => { - client.assert.equal(value.length, expectedCodemirrorFields.length); - }); - - expectedCodemirrorFields.forEach(fieldName => { - const codemirror = `#cm-${fieldName}-container div[class^="CodeMirror"]`; - - configuration.expect.element(codemirror).visible; - configuration.expect.element(codemirror).enabled; - }); - - client.end(); - }, -}; diff --git a/awx/ui/test/e2e/tests/test-credential-types-add-edit.js b/awx/ui/test/e2e/tests/test-credential-types-add-edit.js deleted file mode 100644 index 6108db871c..0000000000 --- a/awx/ui/test/e2e/tests/test-credential-types-add-edit.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - before: (client, done) => { - const credentialTypes = client.page.credentialTypes(); - - client.login(); - client.waitForAngular(); - - credentialTypes.navigateTo(`${credentialTypes.url()}/add/`); - - credentialTypes.section.add - .waitForElementVisible('@title', done); - }, - 'expected fields are present and enabled': client => { - const credentialTypes = client.page.credentialTypes(); - const { details } = credentialTypes.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.section.inputConfiguration.expect.element('.CodeMirror').visible; - details.section.injectorConfiguration.expect.element('.CodeMirror').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@inputConfiguration').enabled; - details.expect.element('@injectorConfiguration').enabled; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-aws.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-aws.js deleted file mode 100644 index 5e1bf4df68..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-aws.js +++ /dev/null @@ -1,135 +0,0 @@ -import uuid from 'uuid'; - -const testID = uuid().substr(0, 8); - -const store = { - organization: { - name: `org-${testID}` - }, - credential: { - name: `cred-${testID}` - }, -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - - client.login(); - client.waitForAngular(); - - client.inject( - [store, 'OrganizationModel'], - (_store_, Model) => new Model().http.post({ data: _store_.organization }), - ({ data }) => { store.organization = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - credentials.section.add.section.details - .waitForElementVisible('@save') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name) - .setValue('@type', 'Amazon Web Services', done); - }, - 'expected fields are visible and enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - details.section.aws.expect.element('@accessKey').visible; - details.section.aws.expect.element('@secretKey').visible; - details.section.aws.expect.element('@securityToken').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - details.section.aws.expect.element('@accessKey').enabled; - details.section.aws.expect.element('@secretKey').enabled; - details.section.aws.expect.element('@securityToken').enabled; - }, - 'required fields display \'*\'': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const required = [ - details.section.name, - details.section.type, - details.section.aws.section.accessKey, - details.section.aws.section.secretKey - ]; - - required.forEach(s => { - s.expect.element('@label').text.to.contain('*'); - }); - }, - 'save button becomes enabled after providing required fields': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details - .clearAndSelectType('Amazon Web Services') - .setValue('@name', store.credential.name); - - details.expect.element('@save').not.enabled; - details.section.aws.setValue('@accessKey', 'AAAAAAAAAAAAA'); - details.section.aws.setValue('@secretKey', 'AAAAAAAAAAAAA'); - details.expect.element('@save').enabled; - }, - 'create aws credential': client => { - const credentials = client.page.credentials(); - const { add } = credentials.section; - const { edit } = credentials.section; - - add.section.details - .clearAndSelectType('Amazon Web Services') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name); - - add.section.details.section.aws - .setValue('@accessKey', 'ABCD123456789') - .setValue('@secretKey', '987654321DCBA'); - - add.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.expect.element('@title').text.equal(store.credential.name); - }, - 'edit details panel remains open after saving': client => { - const credentials = client.page.credentials(); - - credentials.section.edit.expect.section('@details').visible; - }, - 'credential is searchable after saving': client => { - const credentials = client.page.credentials(); - const row = '#credentials_table .List-tableRow'; - - const { search } = credentials.section.list.section; - - search - .waitForElementVisible('@input') - .setValue('@input', `name:${store.credential.name}`) - .click('@searchButton'); - - credentials.waitForElementNotPresent(`${row}:nth-of-type(2)`); - credentials.expect.element(row).text.contain(store.credential.name); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-custom.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-custom.js deleted file mode 100644 index 8aac716e4e..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-custom.js +++ /dev/null @@ -1,175 +0,0 @@ -import uuid from 'uuid'; - -const store = { - credentialType: { - name: `credentialType-${uuid().substr(0, 8)}`, - description: 'custom cloud credential', - kind: 'cloud', - inputs: { - fields: [ - { - id: 'project', - label: 'Project', - type: 'string', - help_text: 'Name of your project' - }, - { - id: 'token', - label: 'Token', - secret: true, - type: 'string', - help_text: 'help' - }, - { - id: 'secret_key_data', - label: 'Secret Key', - type: 'string', - secret: true, - multiline: true, - help_text: 'help', - }, - { - id: 'public_key_data', - label: 'Public Key', - type: 'string', - secret: true, - multiline: true, - help_text: 'help', - }, - { - id: 'secret_key_unlock', - label: 'Private Key Passphrase', - type: 'string', - secret: true, - // help_text: 'help' - }, - { - id: 'color', - label: 'Favorite Color', - choices: [ - '', - 'red', - 'orange', - 'yellow', - 'green', - 'blue', - 'indigo', - 'violet' - ], - help_text: 'help', - }, - ], - required: ['project', 'token'] - }, - injectors: { - env: { - CUSTOM_CREDENTIAL_TOKEN: '{{ token }}' - } - } - } -}; - -const { inputs } = store.credentialType; -const { fields } = inputs; -const help = fields.filter(f => f.help_text); -const required = fields.filter(f => inputs.required.indexOf(f.id) > -1); -const strings = fields.filter(f => f.type === undefined || f.type === 'string'); - -const getObjects = client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const type = details.custom(store.credentialType); - - return { credentials, details, type }; -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - - client.login(); - client.waitForAngular(); - - client.inject( - [store.credentialType, 'CredentialTypeModel'], - (data, Model) => new Model().http.post({ data }), - ({ data }) => { store.credentialType.response = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - credentials.section.add.section.details - .waitForElementVisible('@save') - .setValue('@name', `cred-${uuid()}`) - .setValue('@type', store.credentialType.name, done); - }, - 'all fields are visible': client => { - const { type } = getObjects(client); - fields.forEach(f => { - type.expect.element(`@${f.id}`).visible; - }); - }, - 'helplinks open popovers showing expected content': client => { - const { type } = getObjects(client); - - help.forEach(f => { - const group = type.section[f.id]; - - group.expect.element('@popover').not.visible; - group.click('@help'); - group.expect.element('@popover').visible; - group.expect.element('@popover').text.to.contain(f.help_text); - group.click('@help'); - }); - - help.forEach(f => { - const group = type.section[f.id]; - group.expect.element('@popover').not.visible; - }); - }, - 'secret field buttons hide and unhide input': client => { - const { type } = getObjects(client); - const secrets = strings.filter(f => f.secret && !f.multiline); - - secrets.forEach(f => { - const group = type.section[f.id]; - const input = `@${f.id}`; - - group.expect.element('@show').visible; - group.expect.element('@hide').not.visible; - - type.setValue(input, 'SECRET'); - type.expect.element(input).text.equal(''); - - group.click('@show'); - group.expect.element('@show').not.visible; - group.expect.element('@hide').visible; - type.expect.element(input).value.contain('SECRET'); - - group.click('@hide'); - group.expect.element('@show').visible; - group.expect.element('@hide').not.visible; - type.expect.element(input).text.equal(''); - }); - }, - 'required fields show * symbol': client => { - const { type } = getObjects(client); - - required.forEach(f => { - const group = type.section[f.id]; - group.expect.element('@label').text.to.contain('*'); - }); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-gce-file.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-gce-file.js deleted file mode 100644 index 725fcfdcde..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-gce-file.js +++ /dev/null @@ -1,288 +0,0 @@ -import path from 'path'; -import uuid from 'uuid'; - -const GCE_SERVICE_ACCOUNT_FILE = path.resolve(__dirname, 'gce.json'); -const GCE_SERVICE_ACCOUNT_FILE_ALT = path.resolve(__dirname, 'gce.alt.json'); -const GCE_SERVICE_ACCOUNT_FILE_INVALID = path.resolve(__dirname, 'gce.invalid.json'); -const GCE_SERVICE_ACCOUNT_FILE_MISSING = path.resolve(__dirname, 'gce.missing.json'); - -let credentials; - -module.exports = { - before: (client, done) => { - credentials = client.page.credentials(); - - client.login(); - client.waitForAngular(); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - credentials.section.add.section.details - .waitForElementVisible('@save') - .setValue('@name', `credential-${uuid().substr(0, 8)}`) - .setValue('@type', 'Google Compute Engine', done); - }, - 'expected fields are initially visible and enabled': client => { - const { details } = credentials.section.add.section; - const { gce } = details.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - - gce.expect.element('@email').visible; - gce.expect.element('@sshKeyData').visible; - gce.expect.element('@project').visible; - gce.expect.element('@serviceAccountFile').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - - gce.expect.element('@email').enabled; - gce.expect.element('@sshKeyData').enabled; - gce.expect.element('@project').enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').visible; - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').enabled; - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').not.present; - }, - 'select valid credential file': client => { - const { details } = credentials.section.add.section; - const { gce } = details.section; - - client.pushFileToWorker(GCE_SERVICE_ACCOUNT_FILE, file => { - gce.section.serviceAccountFile.setValue('form input[type="file"]', file); - }); - - gce.expect.element('@email').not.enabled; - gce.expect.element('@sshKeyData').not.enabled; - gce.expect.element('@project').not.enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').visible; - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').enabled; - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').not.present; - }, - 'deselect valid credential file': client => { - const { details } = credentials.section.add.section; - const { gce } = details.section; - - gce.section.serviceAccountFile.click('form i[class*="trash"]'); - - gce.expect.element('@email').enabled; - gce.expect.element('@sshKeyData').enabled; - gce.expect.element('@project').enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').visible; - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').enabled; - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').not.present; - - gce.section.email.expect.element('@error').visible; - gce.section.sshKeyData.expect.element('@error').visible; - - gce.section.project.expect.element('@error').not.present; - gce.section.serviceAccountFile.expect.element('@error').not.present; - }, - 'select credential file with missing field': client => { - const { details } = credentials.section.add.section; - const { gce } = details.section; - - client.pushFileToWorker(GCE_SERVICE_ACCOUNT_FILE_MISSING, file => { - gce.section.serviceAccountFile.setValue('form input[type="file"]', file); - }); - - gce.expect.element('@email').not.enabled; - gce.expect.element('@sshKeyData').not.enabled; - gce.expect.element('@project').not.enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').visible; - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').enabled; - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').not.present; - - gce.section.email.expect.element('@error').visible; - - gce.section.project.expect.element('@error').not.present; - gce.section.serviceAccountFile.expect.element('@error').not.present; - gce.section.sshKeyData.expect.element('@error').not.present; - }, - 'deselect credential file with missing field': client => { - const { details } = credentials.section.add.section; - const { gce } = details.section; - - gce.section.serviceAccountFile.click('form i[class*="trash"]'); - - gce.expect.element('@email').enabled; - gce.expect.element('@sshKeyData').enabled; - gce.expect.element('@project').enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').visible; - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').enabled; - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').not.present; - - gce.section.email.expect.element('@error').visible; - gce.section.sshKeyData.expect.element('@error').visible; - - gce.section.project.expect.element('@error').not.present; - gce.section.serviceAccountFile.expect.element('@error').not.present; - }, - 'select invalid credential file': client => { - const { details } = credentials.section.add.section; - const { gce } = details.section; - - client.pushFileToWorker(GCE_SERVICE_ACCOUNT_FILE_INVALID, file => { - gce.section.serviceAccountFile.setValue('form input[type="file"]', file); - }); - - gce.expect.element('@email').not.enabled; - gce.expect.element('@sshKeyData').not.enabled; - gce.expect.element('@project').not.enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').visible; - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').enabled; - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').not.present; - - gce.section.email.expect.element('@error').visible; - gce.section.serviceAccountFile.expect.element('@error').visible; - gce.section.sshKeyData.expect.element('@error').visible; - - gce.section.project.expect.element('@error').not.present; - }, - 'deselect invalid credential file': client => { - const { details } = credentials.section.add.section; - const { gce } = details.section; - - gce.section.serviceAccountFile.click('form i[class*="trash"]'); - - gce.expect.element('@email').enabled; - gce.expect.element('@sshKeyData').enabled; - gce.expect.element('@project').enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').visible; - gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').enabled; - gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').not.present; - - gce.section.email.expect.element('@error').visible; - gce.section.sshKeyData.expect.element('@error').visible; - - gce.section.project.expect.element('@error').not.present; - gce.section.serviceAccountFile.expect.element('@error').not.present; - }, - 'save valid credential file': client => { - const add = credentials.section.add.section.details; - const edit = credentials.section.edit.section.details; - - client.pushFileToWorker(GCE_SERVICE_ACCOUNT_FILE, file => { - add.section.gce.section.serviceAccountFile.setValue('form input[type="file"]', file); - }); - - add.section.gce.expect.element('@email').not.enabled; - add.section.gce.expect.element('@sshKeyData').not.enabled; - add.section.gce.expect.element('@project').not.enabled; - add.section.gce.expect.element('@serviceAccountFile').enabled; - - add.section.gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').visible; - add.section.gce.section.serviceAccountFile.expect.element('form i[class*="trash"]').enabled; - add.section.gce.section.serviceAccountFile.expect.element('form i[class*="folder"]').not.present; - - add.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.section.gce.expect.element('@email').enabled; - edit.section.gce.expect.element('@project').enabled; - - edit.section.gce.expect.element('@serviceAccountFile').not.enabled; - edit.section.gce.expect.element('@sshKeyData').not.enabled; - }, - 'select and deselect credential file when replacing private key': client => { - const taggedTextArea = '.at-InputTaggedTextarea'; - const textArea = '.at-InputTextarea'; - const replace = 'button i[class="fa fa-undo"]'; - const revert = 'button i[class="fa fa-undo fa-flip-horizontal"]'; - const { gce } = credentials.section.edit.section.details.section; - - gce.waitForElementVisible(replace); - // eslint-disable-next-line prefer-arrow-callback - client.execute(function clickReplace (selector) { - document.querySelector(selector).click(); - }, [replace]); - - gce.expect.element('@email').enabled; - gce.expect.element('@project').enabled; - gce.expect.element(textArea).enabled; - gce.expect.element(taggedTextArea).not.present; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.sshKeyData.expect.element('@error').visible; - - gce.section.email.expect.element('@error').not.present; - gce.section.project.expect.element('@error').not.present; - gce.section.serviceAccountFile.expect.element('@error').not.present; - - client.pushFileToWorker(GCE_SERVICE_ACCOUNT_FILE_ALT, file => { - gce.section.serviceAccountFile.setValue('form input[type="file"]', file); - }); - - gce.expect.element('@serviceAccountFile').enabled; - - gce.expect.element('@email').not.enabled; - gce.expect.element('@sshKeyData').not.enabled; - gce.expect.element('@project').not.enabled; - - gce.section.email.expect.element('@error').not.present; - gce.section.project.expect.element('@error').not.present; - gce.section.sshKeyData.expect.element('@error').not.present; - gce.section.serviceAccountFile.expect.element('@error').not.present; - - gce.expect.element(replace).not.present; - gce.expect.element(revert).present; - gce.expect.element('.input-group-append button').not.enabled; - gce.section.serviceAccountFile.click('form i[class*="trash"]'); - - gce.expect.element('@email').enabled; - gce.expect.element('@sshKeyData').enabled; - gce.expect.element('@project').enabled; - gce.expect.element('@serviceAccountFile').enabled; - - gce.section.sshKeyData.expect.element('@error').visible; - - gce.section.email.expect.element('@error').not.present; - gce.section.project.expect.element('@error').not.present; - gce.section.serviceAccountFile.expect.element('@error').not.present; - - gce.expect.element('.input-group-append button').enabled; - // eslint-disable-next-line prefer-arrow-callback - client.execute(function clickRevert (selector) { - document.querySelector(selector).click(); - }, [revert]); - - gce.expect.element('@email').enabled; - gce.expect.element('@project').enabled; - - gce.expect.element('@serviceAccountFile').not.enabled; - gce.expect.element('@sshKeyData').not.enabled; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-gce.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-gce.js deleted file mode 100644 index f1733f78f5..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-gce.js +++ /dev/null @@ -1,175 +0,0 @@ -import uuid from 'uuid'; - -import { AWX_E2E_TIMEOUT_LONG } from '../settings'; - -const testID = uuid().substr(0, 8); - -const store = { - organization: { - name: `org-${testID}` - }, - credential: { - name: `cred-${testID}` - }, -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - client.inject( - [store, 'OrganizationModel'], - (_store_, Model) => new Model().http.post({ data: _store_.organization }), - ({ data }) => { store.organization = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - details - .waitForElementVisible('@save') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name) - .setValue('@type', 'Google Compute Engine', done); - }, - 'expected fields are visible and enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - details.section.gce.expect.element('@email').visible; - details.section.gce.expect.element('@sshKeyData').visible; - details.section.gce.expect.element('@project').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - details.section.gce.expect.element('@email').enabled; - details.section.gce.expect.element('@sshKeyData').enabled; - details.section.gce.expect.element('@project').enabled; - - details.section.organization.expect.element('@lookup').visible; - }, - 'required fields display \'*\'': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const required = [ - details.section.name, - details.section.type, - details.section.gce.section.email, - details.section.gce.section.sshKeyData - ]; - - required.forEach(s => { - s.expect.element('@label').text.to.contain('*'); - }); - }, - 'save button becomes enabled after providing required fields': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details - .clearAndSelectType('Google Compute Engine') - .setValue('@name', store.credential.name); - - details.expect.element('@save').not.enabled; - - details.section.gce - .setValue('@email', 'abc@123.com') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - details.expect.element('@save').enabled; - }, - 'error displayed for invalid ssh key data': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { sshKeyData } = details.section.gce.section; - - details - .clearAndSelectType('Google Compute Engine') - .setValue('@name', store.credential.name); - - details.section.gce - .setValue('@email', 'abc@123.com') - .setValue('@sshKeyData', 'invalid'); - - details.click('@save'); - - sshKeyData.expect.element('@error').visible; - sshKeyData.expect.element('@error').text.to.contain('Invalid certificate or key'); - - details.section.gce.clearValue('@sshKeyData'); - - sshKeyData.expect.element('@error').visible; - sshKeyData.expect.element('@error').text.to.contain('Please enter a value'); - - details.section.gce.setValue('@sshKeyData', 'AAAA'); - sshKeyData.expect.element('@error').not.present; - }, - 'create gce credential': client => { - const credentials = client.page.credentials(); - const { add } = credentials.section; - const { edit } = credentials.section; - - add.section.details - .clearAndSelectType('Google Compute Engine') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name); - - add.section.details.section.gce - .setValue('@email', 'abc@123.com') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - add.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.expect.element('@title').text.equal(store.credential.name); - }, - 'edit details panel remains open after saving': client => { - const credentials = client.page.credentials(); - - credentials.section.edit.expect.section('@details').visible; - }, - 'credential is searchable after saving': client => { - const credentials = client.page.credentials(); - const row = '#credentials_table .List-tableRow'; - - credentials.section.list.section.search - .waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG) - .setValue('@input', `name:${store.credential.name}`) - .click('@searchButton'); - - credentials.waitForElementNotPresent(`${row}:nth-of-type(2)`); - credentials.expect.element(row).text.contain(store.credential.name); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-insights.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-insights.js deleted file mode 100644 index 85e62312c9..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-insights.js +++ /dev/null @@ -1,137 +0,0 @@ -import uuid from 'uuid'; - -import { AWX_E2E_TIMEOUT_LONG } from '../settings'; - -const testID = uuid().substr(0, 8); - -const store = { - organization: { - name: `org-${testID}` - }, - credential: { - name: `cred-${testID}` - }, -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - client.inject( - [store, 'OrganizationModel'], - (_store_, Model) => new Model().http.post({ data: _store_.organization }), - ({ data }) => { store.organization = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - details - .waitForElementVisible('@save') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name) - .setValue('@type', 'Insights', done); - }, - 'expected fields are visible and enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - details.section.insights.expect.element('@username').visible; - details.section.insights.expect.element('@password').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - details.section.insights.expect.element('@username').enabled; - details.section.insights.expect.element('@password').enabled; - }, - 'required fields display \'*\'': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const required = [ - details.section.name, - details.section.type, - details.section.insights.section.username, - details.section.insights.section.password - ]; - - required.forEach(s => { - s.expect.element('@label').text.to.contain('*'); - }); - }, - 'save button becomes enabled after providing required fields': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details - .clearAndSelectType('Insights') - .setValue('@name', store.credential.name); - - details.expect.element('@save').not.enabled; - - details.section.insights - .setValue('@username', 'wrosellini') - .setValue('@password', 'quintus'); - - details.expect.element('@save').enabled; - }, - 'create insights credential': client => { - const credentials = client.page.credentials(); - const { add } = credentials.section; - const { edit } = credentials.section; - - add.section.details - .clearAndSelectType('Insights') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name); - - add.section.details.section.insights - .setValue('@username', 'wrosellini') - .setValue('@password', 'quintus'); - - add.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.expect.element('@title').text.equal(store.credential.name); - }, - 'edit details panel remains open after saving': client => { - const credentials = client.page.credentials(); - - credentials.section.edit.expect.section('@details').visible; - }, - 'credential is searchable after saving': client => { - const credentials = client.page.credentials(); - const row = '#credentials_table .List-tableRow'; - - credentials.section.list.section.search - .waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG) - .setValue('@input', `name:${store.credential.name}`) - .click('@searchButton'); - - credentials.waitForElementNotPresent(`${row}:nth-of-type(2)`); - credentials.expect.element(row).text.contain(store.credential.name); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-machine.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-machine.js deleted file mode 100644 index 34279e8217..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-machine.js +++ /dev/null @@ -1,210 +0,0 @@ -import uuid from 'uuid'; - -import { AWX_E2E_TIMEOUT_LONG } from '../settings'; - -const testID = uuid().substr(0, 8); - -const store = { - organization: { - name: `org-${testID}` - }, - credential: { - name: `cred-${testID}` - }, -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - client.inject( - [store, 'OrganizationModel'], - (_store_, Model) => new Model().http.post({ data: _store_.organization }), - ({ data }) => { store.organization = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - details.waitForElementVisible('@save', done); - }, - 'common fields are visible and enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - }, - 'required common fields display \'*\'': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.section.name.expect.element('@label').text.to.contain('*'); - details.section.type.expect.element('@label').text.to.contain('*'); - }, - 'save button becomes enabled after providing required fields': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@save').not.enabled; - - details - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name) - .setValue('@type', 'Machine'); - - details.expect.element('@save').enabled; - }, - 'machine credential fields are visible after choosing type': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { machine } = details.section; - - machine.expect.element('@username').visible; - machine.expect.element('@password').visible; - machine.expect.element('@becomeUsername').visible; - machine.expect.element('@becomePassword').visible; - machine.expect.element('@sshKeyData').visible; - machine.expect.element('@sshKeyUnlock').visible; - }, - 'error displayed for invalid ssh key data': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { sshKeyData } = details.section.machine.section; - - details - .clearAndSelectType('Machine') - .setValue('@name', store.credential.name); - - details.section.machine.setValue('@sshKeyData', 'invalid'); - - details.click('@save'); - - sshKeyData.expect.element('@error').visible; - sshKeyData.expect.element('@error').text.to.contain('Invalid certificate or key'); - - details.section.machine.clearValue('@sshKeyData'); - sshKeyData.expect.element('@error').not.present; - }, - 'error displayed for unencrypted ssh key with passphrase': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { sshKeyUnlock } = details.section.machine.section; - - details - .clearAndSelectType('Machine') - .setValue('@name', store.credential.name); - - details.section.machine - .setValue('@sshKeyUnlock', 'password') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - details.click('@save'); - - sshKeyUnlock.expect.element('@error').visible; - sshKeyUnlock.expect.element('@error').text.to.contain('not encrypted'); - - details.section.machine.clearValue('@sshKeyUnlock'); - sshKeyUnlock.expect.element('@error').not.present; - }, - 'create machine credential': client => { - const credentials = client.page.credentials(); - const { add } = credentials.section; - const { edit } = credentials.section; - - add.section.details - .clearAndSelectType('Machine') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name); - - add.section.details.section.machine - .setValue('@username', 'dsarif') - .setValue('@password', 'freneticpny') - .setValue('@becomeMethod', 'sudo') - .setValue('@becomeUsername', 'dsarif') - .setValue('@becomePassword', 'freneticpny') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - add.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.expect.element('@title').text.equal(store.credential.name); - }, - 'edit details panel remains open after saving': client => { - const credentials = client.page.credentials(); - - credentials.section.edit.expect.section('@details').visible; - }, - 'change the password after saving': client => { - const credentials = client.page.credentials(); - const { edit } = credentials.section; - const { machine } = edit.section.details.section; - - machine.section.password.expect.element('@replace').visible; - machine.section.password.expect.element('@replace').enabled; - machine.section.password.expect.element('@revert').not.visible; - - machine.expect.element('@password').not.enabled; - - machine.section.password.click('@replace'); - - machine.section.password.expect.element('@replace').not.visible; - machine.section.password.expect.element('@revert').visible; - - machine.expect.element('@password').enabled; - machine.setValue('@password', 'newpassword'); - - edit.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - }, - 'credential is searchable after saving': client => { - const credentials = client.page.credentials(); - const row = '#credentials_table .List-tableRow'; - - const { search } = credentials.section.list.section; - - search - .waitForElementVisible('@input') - .setValue('@input', `name:${store.credential.name}`) - .click('@searchButton'); - - credentials.waitForElementNotPresent(`${row}:nth-of-type(2)`); - credentials.expect.element(row).text.contain(store.credential.name); - - client.end(); - }, -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-network.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-network.js deleted file mode 100644 index 2afd82ab1a..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-network.js +++ /dev/null @@ -1,208 +0,0 @@ -import uuid from 'uuid'; - -import { AWX_E2E_TIMEOUT_LONG } from '../settings'; - -const testID = uuid().substr(0, 8); - -const store = { - organization: { - name: `org-${testID}` - }, - credential: { - name: `cred-${testID}` - }, -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - client.inject( - [store, 'OrganizationModel'], - (_store_, Model) => new Model().http.post({ data: _store_.organization }), - ({ data }) => { store.organization = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - details.waitForElementVisible('@save', done); - }, - 'common fields are visible and enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - }, - 'required common fields display \'*\'': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.section.name.expect.element('@label').text.to.contain('*'); - details.section.type.expect.element('@label').text.to.contain('*'); - }, - 'save button becomes enabled after providing required fields': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@save').not.enabled; - - details - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name) - .setValue('@type', 'Network'); - - details.section.network - .waitForElementVisible('@username') - .setValue('@username', 'sgrimes'); - - details.expect.element('@save').enabled; - }, - 'network credential fields are visible after choosing type': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { network } = details.section; - - network.expect.element('@username').visible; - network.expect.element('@password').visible; - network.expect.element('@authorizePassword').visible; - network.expect.element('@sshKeyData').visible; - network.expect.element('@sshKeyUnlock').visible; - }, - 'error displayed for invalid ssh key data': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { sshKeyData } = details.section.network.section; - - details - .clearAndSelectType('Network') - .setValue('@name', store.credential.name); - - details.section.network - .setValue('@username', 'sgrimes') - .setValue('@sshKeyData', 'invalid'); - - details.click('@save'); - - sshKeyData.expect.element('@error').visible; - sshKeyData.expect.element('@error').text.to.contain('Invalid certificate or key'); - - details.section.network.clearValue('@sshKeyData'); - sshKeyData.expect.element('@error').not.present; - }, - 'error displayed for unencrypted ssh key with passphrase': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { sshKeyUnlock } = details.section.network.section; - - details - .clearAndSelectType('Network') - .setValue('@name', store.credential.name); - - details.section.network - .setValue('@username', 'sgrimes') - .setValue('@sshKeyUnlock', 'password') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - details.click('@save'); - - sshKeyUnlock.expect.element('@error').visible; - sshKeyUnlock.expect.element('@error').text.to.contain('not encrypted'); - - details.section.network.clearValue('@sshKeyUnlock'); - sshKeyUnlock.expect.element('@error').not.present; - }, - 'error displayed for authorize password without authorize enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { authorizePassword } = details.section.network.section; - - details - .clearAndSelectType('Network') - .setValue('@name', store.credential.name); - - details.section.network - .setValue('@username', 'sgrimes') - .setValue('@authorizePassword', 'ovid'); - - details.click('@save'); - - const expected = 'cannot be set unless "Authorize" is set'; - authorizePassword.expect.element('@error').visible; - authorizePassword.expect.element('@error').text.to.equal(expected); - - details.section.network.clearValue('@authorizePassword'); - authorizePassword.expect.element('@error').not.present; - }, - 'create network credential': client => { - const credentials = client.page.credentials(); - const { add } = credentials.section; - const { edit } = credentials.section; - - add.section.details - .clearAndSelectType('Network') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name); - - add.section.details.section.network - .setValue('@username', 'sgrimes') - .setValue('@password', 'ovid') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - add.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.expect.element('@title').text.equal(store.credential.name); - }, - 'edit details panel remains open after saving': client => { - const credentials = client.page.credentials(); - - credentials.section.edit.expect.section('@details').visible; - }, - 'credential is searchable after saving': client => { - const credentials = client.page.credentials(); - const row = '#credentials_table .List-tableRow'; - - credentials.section.list.section.search - .waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG) - .setValue('@input', `name:${store.credential.name}`) - .click('@searchButton'); - - credentials.waitForElementNotPresent(`${row}:nth-of-type(2)`); - credentials.expect.element(row).text.contain(store.credential.name); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-scm.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-scm.js deleted file mode 100644 index 863ab2473f..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-scm.js +++ /dev/null @@ -1,177 +0,0 @@ -import uuid from 'uuid'; - -import { AWX_E2E_TIMEOUT_LONG } from '../settings'; - -const testID = uuid().substr(0, 8); - -const store = { - organization: { - name: `org-${testID}` - }, - credential: { - name: `cred-${testID}` - }, -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - client.inject( - [store, 'OrganizationModel'], - (_store_, Model) => new Model().http.post({ data: _store_.organization }), - ({ data }) => { store.organization = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - details.waitForElementVisible('@save', done); - }, - 'common fields are visible and enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - }, - 'required common fields display \'*\'': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.section.name.expect.element('@label').text.to.contain('*'); - details.section.type.expect.element('@label').text.to.contain('*'); - }, - 'save button becomes enabled after providing required fields': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@save').not.enabled; - - details - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name) - .setValue('@type', 'Source Control'); - - details.expect.element('@save').enabled; - }, - 'scm credential fields are visible after choosing type': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.section.scm.expect.element('@username').visible; - details.section.scm.expect.element('@password').visible; - details.section.scm.expect.element('@sshKeyData').visible; - details.section.scm.expect.element('@sshKeyUnlock').visible; - }, - 'error displayed for invalid ssh key data': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { sshKeyData } = details.section.scm.section; - - details - .clearAndSelectType('Source Control') - .setValue('@name', store.credential.name); - - details.section.scm.setValue('@sshKeyData', 'invalid'); - - details.click('@save'); - - sshKeyData.expect.element('@error').visible; - sshKeyData.expect.element('@error').text.to.contain('Invalid certificate or key'); - - details.section.scm.clearValue('@sshKeyData'); - sshKeyData.expect.element('@error').not.present; - }, - 'error displayed for unencrypted ssh key with passphrase': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { sshKeyUnlock } = details.section.scm.section; - - details - .clearAndSelectType('Source Control') - .setValue('@name', store.credential.name); - - details.section.scm - .setValue('@sshKeyUnlock', 'password') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - details.click('@save'); - - sshKeyUnlock.expect.element('@error').visible; - sshKeyUnlock.expect.element('@error').text.to.contain('not encrypted'); - - details.section.scm.clearValue('@sshKeyUnlock'); - sshKeyUnlock.expect.element('@error').not.present; - }, - 'create SCM credential': client => { - const credentials = client.page.credentials(); - const { add } = credentials.section; - const { edit } = credentials.section; - - add.section.details - .clearAndSelectType('Source Control') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name); - - add.section.details.section.scm - .setValue('@username', 'gthorpe') - .setValue('@password', 'hydro') - .sendKeys('@sshKeyData', '-----BEGIN RSA PRIVATE KEY-----') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', 'AAAA') - .sendKeys('@sshKeyData', client.Keys.ENTER) - .sendKeys('@sshKeyData', '-----END RSA PRIVATE KEY-----'); - - add.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.expect.element('@title').text.equal(store.credential.name); - }, - 'edit details panel remains open after saving': client => { - const credentials = client.page.credentials(); - - credentials.section.edit.expect.section('@details').visible; - }, - 'credential is searchable after saving': client => { - const credentials = client.page.credentials(); - const row = '#credentials_table .List-tableRow'; - - credentials.section.list.section.search - .waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG) - .setValue('@input', `name:${store.credential.name}`) - .click('@searchButton'); - - credentials.waitForElementNotPresent(`${row}:nth-of-type(2)`); - credentials.expect.element(row).text.to.contain(store.credential.name); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-add-edit-vault.js b/awx/ui/test/e2e/tests/test-credentials-add-edit-vault.js deleted file mode 100644 index 207fe2b255..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-add-edit-vault.js +++ /dev/null @@ -1,138 +0,0 @@ -import uuid from 'uuid'; - -import { AWX_E2E_TIMEOUT_LONG } from '../settings'; - -const testID = uuid().substr(0, 8); - -const store = { - organization: { - name: `org-${testID}` - }, - credential: { - name: `cred-${testID}` - } -}; - -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - client.inject( - [store, 'OrganizationModel'], - (_store_, Model) => new Model().http.post({ data: _store_.organization }), - ({ data }) => { store.organization = data; } - ); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - details - .waitForElementVisible('@save') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name) - .setValue('@type', 'Vault', done); - }, - 'expected fields are visible and enabled': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details.expect.element('@name').visible; - details.expect.element('@description').visible; - details.expect.element('@organization').visible; - details.expect.element('@type').visible; - details.section.vault.expect.element('@vaultPassword').visible; - - details.expect.element('@name').enabled; - details.expect.element('@description').enabled; - details.expect.element('@organization').enabled; - details.expect.element('@type').enabled; - details.section.vault.expect.element('@vaultPassword').enabled; - }, - 'required fields display \'*\'': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const required = [ - details.section.name, - details.section.type, - details.section.vault.section.vaultPassword, - ]; - - required.map(s => s.expect.element('@label').text.to.contain('*')); - }, - 'save button becomes enabled after providing required fields': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details - .clearAndSelectType('Vault') - .setValue('@name', store.credential.name); - - details.expect.element('@save').not.enabled; - details.section.vault.setValue('@vaultPassword', 'ch@ng3m3'); - details.expect.element('@save').enabled; - }, - 'vault password field is disabled when prompt on launch is selected': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - details - .clearAndSelectType('Vault') - .setValue('@name', store.credential.name); - - details.section.vault.expect.element('@vaultPassword').enabled; - details.section.vault.section.vaultPassword.click('@prompt'); - details.section.vault.expect.element('@vaultPassword').not.enabled; - }, - 'create vault credential': client => { - const credentials = client.page.credentials(); - const { add } = credentials.section; - const { edit } = credentials.section; - - add.section.details - .clearAndSelectType('Vault') - .setValue('@name', store.credential.name) - .setValue('@organization', store.organization.name); - - add.section.details.section.vault.setValue('@vaultPassword', 'ch@ng3m3'); - - add.section.details.click('@save'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - edit.expect.element('@title').text.equal(store.credential.name); - }, - 'edit details panel remains open after saving': client => { - const credentials = client.page.credentials(); - - credentials.section.edit.expect.section('@details').visible; - }, - 'credential is searchable after saving': client => { - const credentials = client.page.credentials(); - const row = '#credentials_table .List-tableRow'; - - credentials.section.list.section.search - .waitForElementVisible('@input', AWX_E2E_TIMEOUT_LONG) - .setValue('@input', `name:${store.credential.name}`) - .click('@searchButton'); - - credentials.waitForElementNotPresent(`${row}:nth-of-type(2)`); - credentials.expect.element(row).text.contain(store.credential.name); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-list-actions.js b/awx/ui/test/e2e/tests/test-credentials-list-actions.js deleted file mode 100644 index 117a4a943b..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-list-actions.js +++ /dev/null @@ -1,67 +0,0 @@ -import { getAdminMachineCredential } from '../fixtures'; - -const data = {}; - -module.exports = { - before: (client, done) => { - getAdminMachineCredential('test-actions') - .then(obj => { data.credential = obj; }) - .then(done); - }, - 'copy credential': client => { - const credentials = client.page.credentials(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - credentials.load(); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - credentials.section.list.expect.element('smart-search').visible; - credentials.section.list.expect.element('smart-search input').enabled; - - credentials.section.list - .sendKeys('smart-search input', `id:>${data.credential.id - 1} id:<${data.credential.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - credentials.expect.element(`#credentials_table .List-tableRow[id="${data.credential.id}"]`).visible; - credentials.expect.element('i[class*="copy"]').visible; - credentials.expect.element('i[class*="copy"]').enabled; - - credentials.click('i[class*="copy"]'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; - const activityRow = '#activities_table .List-tableCell[class*="description-column"] a'; - const toast = 'div[class="Toast-icon"]'; - - credentials.waitForElementNotPresent(toast); - credentials.expect.element(activityStream).visible; - credentials.expect.element(activityStream).enabled; - credentials.click(activityStream); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - client - .waitForElementVisible(activityRow) - .click(activityRow); - - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - credentials.expect.element('div[ui-view="edit"] form').visible; - credentials.section.edit.expect.element('@title').visible; - credentials.section.edit.expect.element('@title').text.contain(data.credential.name); - credentials.section.edit.expect.element('@title').text.not.equal(data.credential.name); - credentials.section.edit.section.details.expect.element('@save').visible; - credentials.section.edit.section.details.expect.element('@save').enabled; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-lookup-credential-type.js b/awx/ui/test/e2e/tests/test-credentials-lookup-credential-type.js deleted file mode 100644 index 72b1c891a1..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-lookup-credential-type.js +++ /dev/null @@ -1,47 +0,0 @@ -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - credentials.section.navigation - .waitForElementVisible('@credentials') - .click('@credentials'); - - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.section.list - .waitForElementVisible('@add') - .click('@add'); - - details - .waitForElementVisible('@save', done); - }, - 'open the lookup modal': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - const modal = 'div[class="modal-body"]'; - const title = 'div[class^="Form-title"]'; - - details.expect.element('@type').visible; - details.expect.element('@type').enabled; - - details.section.type.expect.element('@lookup').visible; - details.section.type.expect.element('@lookup').enabled; - - details.section.type.click('@lookup'); - - client.expect.element(modal).present; - - const expected = 'SELECT CREDENTIAL TYPE'; - client.expect.element(title).visible; - client.expect.element(title).text.equal(expected); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-lookup-organization.js b/awx/ui/test/e2e/tests/test-credentials-lookup-organization.js deleted file mode 100644 index 264a098d58..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-lookup-organization.js +++ /dev/null @@ -1,152 +0,0 @@ -import { range } from 'lodash'; - -import { getOrganization } from '../fixtures'; - -module.exports = { - before: (client, done) => { - const resources = range(100).map(n => getOrganization(`test-lookup-${n}`)); - - Promise.all(resources) - .then(() => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - - client.login(); - client.waitForAngular(); - - credentials.section.navigation.waitForElementVisible('@credentials'); - credentials.section.navigation.click('@credentials'); - - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - credentials.section.list.waitForElementVisible('@add'); - credentials.section.list.click('@add'); - - details.waitForElementVisible('@save'); - - done(); - }); - }, - 'open the lookup modal': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { lookupModal } = credentials.section; - - details.expect.element('@organization').visible; - details.expect.element('@organization').enabled; - - details.section.organization.expect.element('@lookup').visible; - details.section.organization.expect.element('@lookup').enabled; - - details.section.organization.click('@lookup'); - - credentials.expect.section('@lookupModal').present; - - const expected = 'SELECT ORGANIZATION'; - lookupModal.expect.element('@title').visible; - lookupModal.expect.element('@title').text.equal(expected); - }, - 'select button is disabled until item is selected': client => { - const credentials = client.page.credentials(); - const { details } = credentials.section.add.section; - const { lookupModal } = credentials.section; - - details.section.organization.expect.element('@lookup').visible; - - credentials.expect.section('@lookupModal').present; - - lookupModal.expect.element('.List-tableRow:nth-child(1) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(3) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(4) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(5) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(6) input[type="radio"]').not.present; - - lookupModal.expect.element('@select').visible; - lookupModal.expect.element('@select').not.enabled; - - lookupModal.click('.List-tableRow:nth-child(2)'); - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').selected; - - lookupModal.expect.element('@select').visible; - lookupModal.expect.element('@select').enabled; - }, - 'sort and unsort the table by name with an item selected': client => { - const credentials = client.page.credentials(); - const { lookupModal } = credentials.section; - - lookupModal.expect.element('#organization-name-header').visible; - lookupModal.expect.element('#organization-name-header').visible; - - lookupModal.click('#organization-name-header'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - lookupModal.expect.element('.List-tableRow:nth-child(1) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(3) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(4) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(5) input[type="radio"]').not.selected; - - lookupModal.click('#organization-name-header'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - lookupModal.expect.element('.List-tableRow:nth-child(1) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').selected; - lookupModal.expect.element('.List-tableRow:nth-child(3) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(4) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(5) input[type="radio"]').not.selected; - }, - 'use the pagination controls with an item selected': client => { - const credentials = client.page.credentials(); - const { lookupModal } = credentials.section; - const { pagination } = lookupModal.section; - - pagination.click('@next'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - lookupModal.expect.element('.List-tableRow:nth-child(1) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(3) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(4) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(5) input[type="radio"]').not.selected; - pagination.click('@previous'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - lookupModal.expect.element('.List-tableRow:nth-child(1) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').selected; - lookupModal.expect.element('.List-tableRow:nth-child(3) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(4) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(5) input[type="radio"]').not.selected; - - pagination.click('@last'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - pagination.click('@previous'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - lookupModal.expect.element('.List-tableRow:nth-child(1) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(3) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(4) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(5) input[type="radio"]').not.selected; - - pagination.click('@first'); - credentials.waitForElementVisible('div.spinny'); - credentials.waitForElementNotVisible('div.spinny'); - - lookupModal.expect.element('.List-tableRow:nth-child(1) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(2) input[type="radio"]').selected; - lookupModal.expect.element('.List-tableRow:nth-child(3) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(4) input[type="radio"]').not.selected; - lookupModal.expect.element('.List-tableRow:nth-child(5) input[type="radio"]').not.selected; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-navigation-click-through.js b/awx/ui/test/e2e/tests/test-credentials-navigation-click-through.js deleted file mode 100644 index 9fe4a7c79b..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-navigation-click-through.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - beforeEach: (client, done) => { - const credentials = client.useCss().page.credentials(); - - client.login(); - client.waitForAngular(); - - credentials - .load() - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny', done); - }, - 'activity link is visible and takes user to activity stream': client => { - const credentials = client.page.credentials(); - const activityStream = client.page.activityStream(); - - credentials.expect.section('@breadcrumb').visible; - credentials.section.breadcrumb.expect.element('@activity').visible; - credentials.section.breadcrumb.click('@activity'); - - activityStream - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForElementVisible('@title') - .waitForElementVisible('@category'); - - activityStream.expect.element('@title').text.contain('CREDENTIALS'); - activityStream.expect.element('@category').value.contain('credential'); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-credentials-search-sort.js b/awx/ui/test/e2e/tests/test-credentials-search-sort.js deleted file mode 100644 index 7267961bb6..0000000000 --- a/awx/ui/test/e2e/tests/test-credentials-search-sort.js +++ /dev/null @@ -1,40 +0,0 @@ -module.exports = { - before: (client, done) => { - const credentials = client.page.credentials(); - - client.login(); - client.waitForAngular(); - - credentials - .load() - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - - credentials.waitForElementVisible('#credentials_table', done); - }, - 'expected table columns are visible': client => { - const credentials = client.page.credentials(); - - credentials.expect.element('#credential-name-header').visible; - credentials.expect.element('#credential-kind-header').visible; - credentials.expect.element('#credential-owners-header').visible; - credentials.expect.element('#credential-actions-header').visible; - }, - 'only fields expected to be sortable show sort icon': client => { - const credentials = client.page.credentials(); - - credentials.expect.element('#credential-name-header > i.columnSortIcon').visible; - }, - 'sort all columns expected to be sortable': client => { - const credentials = client.page.credentials(); - - credentials.expect.element('#credential-name-header > i.columnSortIcon.fa-sort-up').visible; - credentials.click('#credential-name-header'); - credentials - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny'); - credentials.expect.element('#credential-name-header > i.columnSortIcon.fa-sort-down').visible; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-form-error-handling.js b/awx/ui/test/e2e/tests/test-form-error-handling.js deleted file mode 100644 index d4709bdf0d..0000000000 --- a/awx/ui/test/e2e/tests/test-form-error-handling.js +++ /dev/null @@ -1,221 +0,0 @@ -/* Tests for validation checks during form creation and editing. */ - -import { - getJobTemplate -} from '../fixtures'; - -import { - AWX_E2E_TIMEOUT_MEDIUM, - AWX_E2E_TIMEOUT_SHORT -} from '../settings'; - -let data; - -const templatesNavTab = '//at-side-nav-item[contains(@name, "TEMPLATES")]'; -const orgsNavTab = '//at-side-nav-item[contains(@name, "ORGANIZATIONS")]'; - -module.exports = { - before: (client, done) => { - const resources = [ - getJobTemplate('test-form-error-handling'), - getJobTemplate('test-form-error-handling-2') - ]; - - Promise.all(resources) - .then(([jt, jt2]) => { - data = { jt, jt2 }; - // We login and load the test page *after* data setup is finished. - // This helps avoid flakiness due to unpredictable spinners, etc. - // caused by first-time project syncs when creating the job templates. - client - .login() - .waitForAngular() - .useXpath() - .findThenClick(templatesNavTab) - .findThenClick('//*[@id="button-add"]') - .findThenClick('//a[@ui-sref="templates.addJobTemplate"]'); - done(); - }); - }, - 'Test max character limit when creating a job template': client => { - client - .waitForElementVisible('//input[@id="job_template_name"]') - .setValue( - '//input[@id="job_template_name"]', - ['a'.repeat(513), client.Keys.ENTER] - ) - .setValue( - '//input[@name="inventory_name"]', - ['test-form-error-handling-inventory', client.Keys.ENTER] - ) - .setValue( - '//input[@name="project_name"]', - ['test-form-error-handling-project', client.Keys.ENTER] - ) - // After the test sets a value for the project, a few seconds are - // needed while the UI fetches the playbooks names with a network - // call. There's no obvious dom element here to poll, so we wait a - // reasonably safe amount of time for the form to settle down - // before proceeding. - .pause(AWX_E2E_TIMEOUT_MEDIUM) - .waitForElementNotVisible('//*[contains(@class, "spinny")]') - .findThenClick('//*[@id="select2-playbook-select-container"]') - .findThenClick('//li[text()="hello_world.yml"]') - .findThenClick('//*[@id="job_template_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]'); - - client.expect.element('//div[@id="job_template_name_group"]' + - '//div[@id="job_template-name-api-error"]').to.be.visible; - }, - 'Test duplicate template name handling when creating a job template': client => { - client - .waitForElementNotVisible('//*[@id="alert_ok_btn"]') - .waitForElementVisible('//div[contains(@class, "Form-title")]') - .clearValue('//input[@id="job_template_name"]') - .setValue( - '//input[@id="job_template_name"]', - ['test-form-error-handling-job-template', client.Keys.ENTER] - ) - .findThenClick('//*[@id="job_template_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]'); - }, - - 'Test incorrect format when creating a job template': client => { - client - .waitForElementNotVisible('//*[@id="alert_ok_btn"]') - .waitForElementVisible('//div[contains(@class, "Form-title")]') - .clearValue('//input[@name="inventory_name"]') - .setValue( - '//input[@name="inventory_name"]', - ['invalid inventory name', client.Keys.ENTER] - ) - .clearValue('//input[@name="project_name"]') - .setValue( - '//input[@name="project_name"]', - ['invalid project', client.Keys.ENTER] - ); - - client.expect.element('//*[@id="job_template-inventory-notfound-error"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_SHORT); - client.expect.element('//*[@id="job_template-project-notfound-error"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_SHORT); - }, - - 'Test max character limit when editing a job template': client => { - client - .waitForElementNotVisible('//*[@id="alert_ok_btn"]') - .setValue( - '//input[contains(@class, "SmartSearch-input")]', - ['name.iexact:test-form-error-handling-job-template', client.Keys.ENTER] - ) - // double click to make field active - .findThenClick('//a[text()="test-form-error-handling-job-template"]') - .findThenClick('//a[text()="test-form-error-handling-job-template"]') - .findThenClick('//div[contains(@class, "Form-title") and text()="test-form-error-handling-job-template"]') - .clearValue('//input[@id="job_template_name"]') - .setValue( - '//input[@id="job_template_name"]', - ['a'.repeat(513), client.Keys.ENTER] - ) - .findThenClick('//*[@id="job_template_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]'); - - client.expect.element('//div[@id="job_template_name_group"]' + - '//div[@id="job_template-name-api-error"]').to.be.visible.after(AWX_E2E_TIMEOUT_SHORT); - }, - - 'Test duplicate template name handling when editing a job template': client => { - client - .waitForElementNotVisible('//*[@id="alert_ok_btn"]') - .findThenClick('//div[contains(@class, "Form-title")]') - .clearValue('//input[@id="job_template_name"]') - .setValue( - '//input[@id="job_template_name"]', - ['test-form-error-handling-2-job-template', client.Keys.ENTER] - ) - .findThenClick('//*[@id="job_template_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]'); - }, - - 'Test incorrect format when editing a job template': client => { - client - .waitForElementNotVisible('//*[@id="alert_ok_btn"]') - .waitForElementVisible('//div[contains(@class, "Form-title")]') - .clearValue('//input[@name="inventory_name"]') - .setValue( - '//input[@name="inventory_name"]', - ['invalid inventory name', client.Keys.ENTER] - ) - .clearValue('//input[@name="project_name"]') - .setValue( - '//input[@name="project_name"]', - ['invalid project', client.Keys.ENTER] - ); - - client.expect.element('//*[@id="job_template-inventory-notfound-error"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_SHORT); - client.expect.element('//*[@id="job_template-project-notfound-error"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_SHORT); - }, - - 'Test max character limit when creating an organization': client => { - client - .findThenClick(orgsNavTab) - .findThenClick('//*[@id="button-add"]') - .waitForElementVisible('//div[contains(@class, "Form-title")]') - .setValue( - '//input[@id="organization_name"]', - ['a'.repeat(513), client.Keys.ENTER] - ) - .findThenClick('//*[@id="organization_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]') - .waitForElementNotVisible('//*[@id="alert_ok_btn"]'); - }, - - 'Test duplicate template name handling when creating an organization': client => { - client - .setValue( - '//input[@id="organization_name"]', - ['test-form-error-handling-2-organization)', client.Keys.ENTER] - ) - .findThenClick('//*[@id="organization_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]') - .waitForElementNotVisible('//*[@id="alert_ok_btn"]'); - }, - - 'Test max character limit when editing an organization': client => { - client - .setValue( - '//input[contains(@class, "SmartSearch-input")]', - ['name.iexact:test-form-error-handling-organization', client.Keys.ENTER] - ) - // double click to make field active - .findThenClick('//a[normalize-space(text())= "test-form-error-handling-organization"]') - .findThenClick('//a[normalize-space(text())= "test-form-error-handling-organization"]') - .findThenClick('//*[contains(@class, "Form-title") and text()="test-form-error-handling-organization"]') - .clearValue('//input[@id="organization_name"]') - .setValue( - '//input[@id="organization_name"]', - ['a'.repeat(513), client.Keys.ENTER] - ) - .findThenClick('//*[@id="organization_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]') - .waitForElementNotVisible('//*[@id="alert_ok_btn"]'); - }, - - 'Test duplicate template name handling when editing an organization': client => { - client - .clearValue('//input[@id="organization_name"]') - .setValue( - '//input[@id="organization_name"]', - ['test-form-error-handling-2-organization', client.Keys.ENTER] - ) - .findThenClick('//*[@id="organization_save_btn"]') - .findThenClick('//*[@id="alert_ok_btn"]') - .waitForElementNotVisible('//*[@id="alert_ok_btn"]'); - }, - - after: client => { - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-inventories-list-actions.js b/awx/ui/test/e2e/tests/test-inventories-list-actions.js deleted file mode 100644 index 9d5b29439a..0000000000 --- a/awx/ui/test/e2e/tests/test-inventories-list-actions.js +++ /dev/null @@ -1,106 +0,0 @@ -import { - getInventory, - getInventoryNoSource, - getInventorySource, -} from '../fixtures'; - -let data; - -module.exports = { - before: (client, done) => { - const resources = [ - getInventory('test-actions'), - getInventoryNoSource('test-actions'), - getInventorySource('test-actions'), - ]; - - Promise.all(resources) - .then(([inventory, inventoryNoSource]) => { - data = { inventory, inventoryNoSource }; - done(); - }); - }, - 'copy inventory': client => { - const inventories = client.page.inventories(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - inventories.load(); - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - inventories.section.list.expect.element('smart-search').visible; - inventories.section.list.section.search.expect.element('@input').enabled; - - inventories.section.list.section.search - .sendKeys('@input', `id:>${data.inventoryNoSource.id - 1} id:<${data.inventoryNoSource.id + 1}`) - .sendKeys('@input', client.Keys.ENTER); - - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - inventories.expect.element(`#inventories_table .List-tableRow[id="${data.inventoryNoSource.id}"]`).visible; - inventories.expect.element('i[class*="copy"]').visible; - inventories.expect.element('i[class*="copy"]').enabled; - - inventories.click('i[class*="copy"]'); - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; - const activityRow = '#activities_table .List-tableCell[class*="description-column"] a'; - const toast = 'div[class="Toast-icon"]'; - - inventories.waitForElementNotPresent(toast); - inventories.expect.element(activityStream).visible; - inventories.expect.element(activityStream).enabled; - inventories.click(activityStream); - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - client - .waitForElementVisible(activityRow) - .click(activityRow); - - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - inventories.expect.element('#inventory_form').visible; - inventories.section.editStandardInventory.expect.element('@title').visible; - inventories.section.editStandardInventory.expect.element('@title').text.contain(data.inventoryNoSource.name); - inventories.section.editStandardInventory.expect.element('@title').text.not.equal(data.inventoryNoSource.name); - inventories.expect.element('@save').visible; - inventories.expect.element('@save').enabled; - - client.end(); - }, - 'verify inventories with sources cannot be copied': client => { - const inventories = client.page.inventories(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - inventories.load(); - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - inventories.section.list.expect.element('smart-search').visible; - inventories.section.list.section.search.expect.element('@input').enabled; - - inventories.section.list.section.search - .sendKeys('@input', `id:>${data.inventory.id - 1} id:<${data.inventory.id + 1}`) - .sendKeys('@input', client.Keys.ENTER); - - inventories.waitForElementVisible('div.spinny'); - inventories.waitForElementNotVisible('div.spinny'); - - inventories.expect.element(`#inventories_table .List-tableRow[id="${data.inventory.id}"]`).visible; - inventories.expect.element(`#inventory-${data.inventory.id}-copy-action`).visible; - inventories.expect.element(`#inventory-${data.inventory.id}-copy-action[class*="btn-disabled"]`).present; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-inventory-scripts-list-actions.js b/awx/ui/test/e2e/tests/test-inventory-scripts-list-actions.js deleted file mode 100644 index 9d1827f8c1..0000000000 --- a/awx/ui/test/e2e/tests/test-inventory-scripts-list-actions.js +++ /dev/null @@ -1,67 +0,0 @@ -import { getInventoryScript } from '../fixtures'; - -const data = {}; - -module.exports = { - before: (client, done) => { - getInventoryScript('test-actions') - .then(obj => { data.inventoryScript = obj; }) - .then(done); - }, - 'copy inventory script': client => { - const inventoryScripts = client.page.inventoryScripts(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - inventoryScripts.load(); - inventoryScripts.waitForElementVisible('div.spinny'); - inventoryScripts.waitForElementNotVisible('div.spinny'); - - inventoryScripts.section.list.expect.element('smart-search').visible; - inventoryScripts.section.list.expect.element('smart-search input').enabled; - - inventoryScripts.section.list - .sendKeys('smart-search input', `id:>${data.inventoryScript.id - 1} id:<${data.inventoryScript.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - inventoryScripts.waitForElementVisible('div.spinny'); - inventoryScripts.waitForElementNotVisible('div.spinny'); - - inventoryScripts.expect.element(`#inventory_scripts_table .List-tableRow[id="${data.inventoryScript.id}"]`).visible; - inventoryScripts.expect.element('i[class*="copy"]').visible; - inventoryScripts.expect.element('i[class*="copy"]').enabled; - - inventoryScripts.click('i[class*="copy"]'); - inventoryScripts.waitForElementVisible('div.spinny'); - inventoryScripts.waitForElementNotVisible('div.spinny'); - - const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; - const activityRow = '#activities_table .List-tableCell[class*="description-column"] a'; - const toast = 'div[class="Toast-icon"]'; - - inventoryScripts.waitForElementNotPresent(toast); - inventoryScripts.expect.element(activityStream).visible; - inventoryScripts.expect.element(activityStream).enabled; - inventoryScripts.click(activityStream); - inventoryScripts.waitForElementVisible('div.spinny'); - inventoryScripts.waitForElementNotVisible('div.spinny'); - - client - .waitForElementVisible(activityRow) - .click(activityRow); - - inventoryScripts.waitForElementVisible('div.spinny'); - inventoryScripts.waitForElementNotVisible('div.spinny'); - - inventoryScripts.expect.element('#inventory_script_form').visible; - inventoryScripts.section.edit.expect.element('@title').visible; - inventoryScripts.section.edit.expect.element('@title').text.contain(data.inventoryScript.name); - inventoryScripts.section.edit.expect.element('@title').text.not.equal(data.inventoryScript.name); - inventoryScripts.expect.element('@save').visible; - inventoryScripts.expect.element('@save').enabled; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-jobs-portal-list-actions.js b/awx/ui/test/e2e/tests/test-jobs-portal-list-actions.js deleted file mode 100644 index 6cafdf6d27..0000000000 --- a/awx/ui/test/e2e/tests/test-jobs-portal-list-actions.js +++ /dev/null @@ -1,64 +0,0 @@ -import { - getJob, - getJobTemplateAdmin -} from '../fixtures'; - -let data; - -module.exports = { - before: (client, done) => { - client.login(); - client.waitForAngular(); - - const resources = [ - getJobTemplateAdmin('test-actions'), - getJob('test-actions'), - ]; - - Promise.all(resources) - .then(([admin, job]) => { - data = { admin, job }; - done(); - }); - }, - 'relaunch a job from the \'all jobs\' list': client => { - const portal = client.page.portal(); - - const allJobsButton = '#all-jobs-btn'; - const relaunch = `#job-${data.job.id} i[class*="launch"]`; - const search = '#portal-container-jobs smart-search input'; - - portal.load(); - - portal.waitForElementVisible(allJobsButton); - portal.expect.element(allJobsButton).enabled; - portal.click(allJobsButton); - portal.waitForSpinny(); - portal.assert.cssClassPresent(allJobsButton, 'btn-primary'); - - const query = `id:>${data.job.id - 1} id:<${data.job.id + 1}`; - - portal.waitForElementVisible(search); - portal.expect.element(search).enabled; - portal.sendKeys(search, query); - portal.sendKeys(search, client.Keys.ENTER); - - portal.waitForSpinny(); - - portal.waitForElementVisible(relaunch); - portal.expect.element(relaunch).enabled; - portal.click(relaunch); - - portal.waitForSpinny(); - - const jobDetails = 'at-job-details'; - const output = './/span[normalize-space(text())=\'"msg": "Hello World!"\']'; - - client.waitForElementVisible(jobDetails, 10000); - client.useXpath(); - client.waitForElementVisible(output, 60000); - client.useCss(); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-launch-jt.js b/awx/ui/test/e2e/tests/test-launch-jt.js deleted file mode 100644 index 0fbc14989c..0000000000 --- a/awx/ui/test/e2e/tests/test-launch-jt.js +++ /dev/null @@ -1,163 +0,0 @@ -import { post, patch } from '../api'; -import { - getOrCreate, - getUpdatedProject, - getInventory -} from '../fixtures'; - -let templateReferences = {}; - -module.exports = { - before: (client, done) => { - const resources = [ - getUpdatedProject('test-launch-jt'), - getInventory('test-launch-jt') - ]; - - Promise.all(resources) - .then(([project, inventory]) => { - const noPromptPromise = getOrCreate('/job_templates/', { - name: 'test-launch-jt-no-prompts', - inventory: inventory.id, - project: project.id, - playbook: 'hello_world.yml', - }); - - const promptNoPassPromise = getOrCreate('/job_templates/', { - name: 'test-launch-jt-prompts-no-pass', - inventory: inventory.id, - ask_inventory_on_launch: true, - project: project.id, - playbook: 'hello_world.yml', - ask_diff_mode_on_launch: true, - ask_variables_on_launch: true, - ask_limit_on_launch: true, - ask_tags_on_launch: true, - ask_skip_tags_on_launch: true, - ask_job_type_on_launch: true, - ask_verbosity_on_launch: true, - ask_credential_on_launch: true - }); - - Promise.all([noPromptPromise, promptNoPassPromise]) - .then(([noPrompt, promptNoPass]) => { - templateReferences = { noPrompt, promptNoPass }; - const surveyPost = post(promptNoPass.related.survey_spec, { - name: '', - description: '', - spec: [{ - question_name: 'Foo', - question_description: '', - required: true, - type: 'text', - variable: 'foo', - min: 0, - max: 1024, - default: 'bar', - choices: '', - new_question: true - }] - }); - - surveyPost - .then(() => patch(promptNoPass.url, { survey_enabled: true })) - .then(done); - }); - }); - }, - 'login to awx': client => { - client.login(); - client.waitForAngular(); - }, - 'expected jt launch with no prompts to navigate to job details': client => { - const templates = client.page.templates(); - templates.load(); - templates.waitForElementVisible('input[class*="SmartSearch-input"]'); - templates.section.list.section.search - .sendKeys('@input', `id:${templateReferences.noPrompt.id}`); - templates.section.list.section.search.getValue('@input', (result) => { - client.assert.equal(result.value, `id:${templateReferences.noPrompt.id}`); - }); - client.pause(1000).waitForElementNotVisible('div.spinny'); - templates.waitForElementVisible('i[class$="search"]'); - templates.section.list.section.search.click('i[class$="search"]'); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - templates.expect.element(`#templates_list .at-Row[id="row-${templateReferences.noPrompt.id}"]`).visible; - templates.expect.element('i[class*="icon-launch"]').visible; - templates.expect.element('i[class*="icon-launch"]').enabled; - templates.click('i[class*="icon-launch"]'); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - client.waitForElementVisible('at-job-details', 10000); - - client.useXpath(); - client.waitForElementVisible('.//span[normalize-space(text())=\'"msg": "Hello World!"\']', 60000); - client.useCss(); - }, - 'expected jt launch with prompts but no changes to navigate to job details': client => { - const templates = client.page.templates(); - templates.load(); - templates.waitForElementVisible('input[class*="SmartSearch-input"]'); - templates.section.list.section.search - .sendKeys('@input', `id:${templateReferences.promptNoPass.id}`); - templates.section.list.section.search.getValue('@input', (result) => { - client.assert.equal(result.value, `id:${templateReferences.promptNoPass.id}`); - }); - client.pause(1000).waitForElementNotVisible('div.spinny'); - templates.waitForElementVisible('i[class$="search"]'); - templates.section.list.section.search.click('i[class$="search"]'); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - templates.expect.element(`#templates_list .at-Row[id="row-${templateReferences.promptNoPass.id}"]`).visible; - templates.expect.element('i[class*="icon-launch"]').visible; - templates.expect.element('i[class*="icon-launch"]').enabled; - templates.click('i[class*="icon-launch"]'); - templates.waitForElementVisible('#prompt-inventory'); - templates.expect.element('#prompt_inventory_tab').visible; - templates.expect.element('#prompt_inventory_tab').to.have.attribute('class').which.contains('at-Tab--active'); - templates.expect.element('#prompt_inventory_next').visible; - templates.expect.element('#prompt_inventory_next').enabled; - templates.waitForElementNotVisible('div.spinny'); - templates.click('#prompt_inventory_next'); - templates.waitForElementVisible('#prompt_credential_step'); - templates.expect.element('#prompt_credential_tab').visible; - templates.expect.element('#prompt_credential_tab').to.have.attribute('class').which.contains('at-Tab--active'); - templates.expect.element('#prompt_credential_next').visible; - templates.expect.element('#prompt_credential_next').enabled; - templates.waitForElementNotVisible('div.spinny'); - templates.click('#prompt_credential_next'); - templates.waitForElementVisible('#prompt_other_prompts_step'); - templates.expect.element('#prompt_other_prompts_tab').visible; - templates.expect.element('#prompt_other_prompts_tab').to.have.attribute('class').which.contains('at-Tab--active'); - templates.expect.element('#prompt_other_prompts_next').visible; - templates.expect.element('#prompt_other_prompts_next').enabled; - templates.waitForElementNotVisible('div.spinny'); - templates.click('#prompt_other_prompts_next'); - templates.waitForElementVisible('#prompt_survey_step'); - templates.expect.element('#prompt_survey_tab').visible; - templates.expect.element('#prompt_survey_tab').to.have.attribute('class').which.contains('at-Tab--active'); - templates.expect.element('#prompt_survey_next').visible; - templates.expect.element('#prompt_survey_next').enabled; - templates.waitForElementNotVisible('div.spinny'); - templates.click('#prompt_survey_next'); - templates.waitForElementVisible('#prompt_preview_step'); - templates.expect.element('#prompt_preview_tab').visible; - templates.expect.element('#prompt_preview_tab').to.have.attribute('class').which.contains('at-Tab--active'); - templates.expect.element('#prompt_finish').visible; - templates.expect.element('#prompt_finish').enabled; - templates.waitForElementNotVisible('div.spinny'); - templates.click('#prompt_finish'); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - client.waitForElementVisible('at-job-details', 10000); - - client.useXpath(); - client.waitForElementVisible('.//span[normalize-space(text())=\'"msg": "Hello World!"\']', 60000); - client.useCss(); - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-notifications-list-actions.js b/awx/ui/test/e2e/tests/test-notifications-list-actions.js deleted file mode 100644 index 11e4114c84..0000000000 --- a/awx/ui/test/e2e/tests/test-notifications-list-actions.js +++ /dev/null @@ -1,67 +0,0 @@ -import { getNotificationTemplate } from '../fixtures'; - -const data = {}; - -module.exports = { - before: (client, done) => { - getNotificationTemplate('test-actions') - .then(obj => { data.notification = obj; }) - .then(done); - }, - 'copy notification template': client => { - const notifications = client.page.notificationTemplates(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - notifications.load(); - notifications.waitForElementVisible('div.spinny'); - notifications.waitForElementNotVisible('div.spinny'); - - notifications.section.list.expect.element('smart-search').visible; - notifications.section.list.expect.element('smart-search input').enabled; - - notifications.section.list - .sendKeys('smart-search input', `id:>${data.notification.id - 1} id:<${data.notification.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - notifications.waitForElementVisible('div.spinny'); - notifications.waitForElementNotVisible('div.spinny'); - - notifications.expect.element(`#notification_templates_table .List-tableRow[id="${data.notification.id}"]`).visible; - notifications.expect.element('i[class*="copy"]').visible; - notifications.expect.element('i[class*="copy"]').enabled; - - notifications.click('i[class*="copy"]'); - notifications.waitForElementVisible('div.spinny'); - notifications.waitForElementNotVisible('div.spinny'); - - const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; - const activityRow = '#activities_table .List-tableCell[class*="description-column"] a'; - const toast = 'div[class="Toast-icon"]'; - - notifications.waitForElementNotPresent(toast); - notifications.expect.element(activityStream).visible; - notifications.expect.element(activityStream).enabled; - notifications.click(activityStream); - notifications.waitForElementVisible('div.spinny'); - notifications.waitForElementNotVisible('div.spinny'); - - client - .waitForElementVisible(activityRow) - .click(activityRow); - - notifications.waitForElementVisible('div.spinny'); - notifications.waitForElementNotVisible('div.spinny'); - - notifications.expect.element('#notification_template_form').visible; - notifications.section.edit.expect.element('@title').visible; - notifications.section.edit.expect.element('@title').text.contain(data.notification.name); - notifications.section.edit.expect.element('@title').text.not.equal(data.notification.name); - notifications.expect.element('@save').visible; - notifications.expect.element('@save').enabled; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-org-permissions.js b/awx/ui/test/e2e/tests/test-org-permissions.js deleted file mode 100644 index 2a12fafe24..0000000000 --- a/awx/ui/test/e2e/tests/test-org-permissions.js +++ /dev/null @@ -1,137 +0,0 @@ -import { - getOrganization, - getUser, - getTeam, -} from '../fixtures'; - -import { - AWX_E2E_URL -} from '../settings'; - -const namespace = 'test-org-permissions'; - -let data; -const spinny = "//*[contains(@class, 'spinny')]"; -const checkbox = '//input[@type="checkbox"]'; - -const searchBar = "//input[contains(@class, 'SmartSearch-input')]"; -const modalSearchBar = '//*[@ui-view="modal"]//*[contains(@class, "SmartSearch-input")]'; -const teamSearchBar = '//*[@django-model="teams"]//input'; -const userRoleSearchBar = '//li//input[contains(@type, "search")]'; -const modalOrgsSearchBar = '//smart-search[@django-model="organizations"]//input'; - -const orgsNavTab = "//at-side-nav-item[contains(@name, 'ORGANIZATIONS')]"; -const teamsNavTab = "//at-side-nav-item[contains(@name, 'TEAMS')]"; - -const orgTab = '//div[not(@ng-show="showSection2Container()")]/div[@class="Form-tabHolder"]/div[@ng-click="selectTab(\'organizations\')"]'; -const teamsTab = '//*[@id="teams_tab"]'; -const permissionsTab = '//*[@id="permissions_tab"]'; -const usersTab = '//*[@id="users_tab"]'; - -const orgsText = `name.iexact:"${namespace}-organization"`; -const orgsCheckbox = '//select-list-item[@item="organization"]//input[@type="checkbox"]'; -const orgDetails = '//*[contains(@class, "OrgCards-label")]'; -const orgRoleSelector = '//*[contains(@aria-labelledby, "select2-organizations")]'; -const readRole = '//*[contains(@id, "organizations-role") and text()="Read"]'; - -const memberRoleText = 'member'; -const readRoleText = 'read'; - -const teamsSelector = `//a[contains(text(), '${namespace}-team')]`; -const teamsText = `name.iexact:"${namespace}-team"`; -const teamsSearchBadgeCount = '//span[contains(@class, "List-titleBadge") and contains(text(), "1")]'; -const teamCheckbox = '//*[@item="team"]//input[@type="checkbox"]'; -const addUserToTeam = '//*[@aw-tool-tip="Add User"]'; - -const saveButton = '//*[text()="Save"]'; - -const addPermission = '//*[@aw-tool-tip="Grant Permission"]'; -const addTeamPermission = '//*[@aw-tool-tip="Add a permission"]'; -const verifyTeamPermissions = '//*[contains(@class, "List-tableRow")]//*[text()="Read"]'; -const readOrgPermissionResults = `//*[@id="permissions_table"]//*[text()="${namespace}-organization"]/parent::*/parent::*//*[contains(text(), "Read")]`; - -module.exports = { - before: (client, done) => { - const resources = [ - getUser(namespace, `${namespace}-user`), - getOrganization(namespace), - getTeam(namespace), - ]; - - Promise.all(resources) - .then(([user, org, team]) => { - data = { user, org, team }; - done(); - }); - client - .login() - .waitForAngular() - .useXpath() - .findThenClick(teamsNavTab) - .clearValue(searchBar) - .setValue(searchBar, [teamsText, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .waitForElementVisible(teamsSearchBadgeCount) - .findThenClick(teamsSelector); - }, - 'test orgs permissions tab in teams view': client => { - client - .useXpath() - .findThenClick(permissionsTab) - .findThenClick(addPermission) - .findThenClick(orgTab) - .clearValue(modalOrgsSearchBar) - .setValue(modalOrgsSearchBar, [orgsText, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .findThenClick(orgsCheckbox) - .findThenClick(orgRoleSelector) - .findThenClick(readRole) - .findThenClick(saveButton) - .clearValue(searchBar) - .setValue(searchBar, [orgsText, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .waitForElementPresent(readOrgPermissionResults); - }, - 'test adding team permissions in orgs view': client => { - // add user to team, then add team-wide permissions to org - client - .useXpath() - .findThenClick(usersTab) - .findThenClick(addUserToTeam) - .waitForElementVisible(modalSearchBar) - .clearValue(modalSearchBar) - .setValue(modalSearchBar, [`username.iexact:${data.user.username}`, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .findThenClick(checkbox) - .findThenClick(userRoleSearchBar) - .setValue(userRoleSearchBar, [memberRoleText, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .findThenClick(saveButton) - // add team-wide permissions to an organization - .findThenClick(orgsNavTab) - .navigateTo(`${AWX_E2E_URL}/#/organizations`, false) - .waitForElementVisible(searchBar) - .clearValue(searchBar) - .setValue(searchBar, [orgsText, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .findThenClick(orgDetails) - .pause(3000) // overlay is in the way sometimes, not spinny - .findThenClick(permissionsTab) - .findThenClick(addTeamPermission) - .findThenClick(teamsTab) - .clearValue(teamSearchBar) - .setValue(teamSearchBar, [teamsText, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .findThenClick(teamCheckbox) - .findThenClick(userRoleSearchBar) - .setValue(userRoleSearchBar, [readRoleText, client.Keys.ENTER]) - .waitForElementNotVisible(spinny) - .findThenClick(saveButton) - .clearValue(searchBar) - .setValue(searchBar, [`username.iexact:${data.user.username}`, client.Keys.ENTER]) - .waitForElementVisible(verifyTeamPermissions); - }, - after: client => { - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-pagination.js b/awx/ui/test/e2e/tests/test-pagination.js deleted file mode 100644 index f9f5ec6191..0000000000 --- a/awx/ui/test/e2e/tests/test-pagination.js +++ /dev/null @@ -1,78 +0,0 @@ -import { - getJobTemplate, - getUpdatedProject, -} from '../fixtures'; - -import { - AWX_E2E_TIMEOUT_MEDIUM, -} from '../settings'; - -const namespace = 'test-pagination'; - -module.exports = { - - before: (client, done) => { - const resources = [getUpdatedProject(namespace)]; - - Promise.all(resources) - .then(() => { - for (let i = 0; i < 25; i++) { - // Create enough job templates to make at least 2 pages of data - resources.push(getJobTemplate(namespace, 'hello_world.yml', `${namespace}-job-template-${i}`, false)); - } - Promise.all(resources) - .then(() => done()); - }); - - client - .login() - .waitForAngular(); - }, - 'Test job template pagination': client => { - client - .useCss() - .findThenClick('[ui-sref="templates"]', 'css') - .waitForElementVisible('.SmartSearch-input') - .clearValue('.SmartSearch-input'); - const firstRow = client - .getText('#templates_list .at-RowItem-header > a:nth-of-type(1)'); - client.findThenClick('.Paginate-controls--next', 'css'); - client.expect.element('#templates_list .at-RowItem-header > a:nth-of-type(1)') - .to.have.value.not.equals(firstRow).before(AWX_E2E_TIMEOUT_MEDIUM); - client.findThenClick('.Paginate-controls--previous', 'css'); - }, - 'Test filtered job template pagination': client => { - client - .useCss() - .waitForElementVisible('.SmartSearch-input') - .clearValue('.SmartSearch-input') - .setValue( - '.SmartSearch-input', - [`name.istartswith:"${namespace}"`, client.Keys.ENTER] - ); - client.useXpath().expect.element('//a[text()="test-pagination-job-template-0"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - client.useCss().findThenClick('.Paginate-controls--next', 'css'); - - // Default search sort uses alphanumeric sorting, so template #9 is last - client.useXpath().expect.element('//a[text()="test-pagination-job-template-9"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - client.useXpath() - .expect.element('//*[contains(@class, "Paginate-controls--active") and text()="2"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - - client - .useCss() - .findThenClick('.Paginate-controls--previous', 'css'); - // Default search sort uses alphanumeric sorting, so template #9 is last - client.useXpath().expect.element('//a[text()="test-pagination-job-template-0"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - client.useXpath() - .expect.element('//*[contains(@class, "Paginate-controls--active") and text()="1"]') - .to.be.visible.after(AWX_E2E_TIMEOUT_MEDIUM); - }, - - after: client => { - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-projects-list-actions.js b/awx/ui/test/e2e/tests/test-projects-list-actions.js deleted file mode 100644 index 0c2acc3a73..0000000000 --- a/awx/ui/test/e2e/tests/test-projects-list-actions.js +++ /dev/null @@ -1,68 +0,0 @@ -import { getUpdatedProject } from '../fixtures'; - -const data = {}; - -module.exports = { - before: (client, done) => { - getUpdatedProject('test-actions') - .then(obj => { data.project = obj; }) - .then(done); - }, - 'copy project': client => { - const projects = client.page.projects(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - projects.load(); - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - projects.section.list.expect.element('smart-search').visible; - projects.section.list.section.search.expect.element('@input').enabled; - - projects.section.list.section.search - .sendKeys('@input', `id:>${data.project.id - 1} id:<${data.project.id + 1}`) - .sendKeys('@input', client.Keys.ENTER); - - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - projects.section.list.expect.element('@badge').text.equal('1'); - projects.expect.element(`#row-${data.project.id}`).visible; - projects.expect.element('i[class*="copy"]').visible; - projects.expect.element('i[class*="copy"]').enabled; - - projects.click('i[class*="copy"]'); - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; - const activityRow = '#activities_table .List-tableCell[class*="description-column"] a'; - const toast = 'div[class="Toast-icon"]'; - - projects.waitForElementNotPresent(toast); - projects.expect.element(activityStream).visible; - projects.expect.element(activityStream).enabled; - projects.click(activityStream); - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - client - .waitForElementVisible(activityRow) - .click(activityRow); - - projects.waitForElementVisible('div.spinny'); - projects.waitForElementNotVisible('div.spinny'); - - projects.expect.element('#project_form').visible; - projects.section.edit.expect.element('@title').visible; - projects.section.edit.expect.element('@title').text.contain(data.project.name); - projects.section.edit.expect.element('@title').text.not.equal(data.project.name); - projects.expect.element('@save').visible; - projects.expect.element('@save').enabled; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-search-tag-add-remove.js b/awx/ui/test/e2e/tests/test-search-tag-add-remove.js deleted file mode 100644 index 294f7aa582..0000000000 --- a/awx/ui/test/e2e/tests/test-search-tag-add-remove.js +++ /dev/null @@ -1,124 +0,0 @@ -import { range } from 'lodash'; - -import { getAdminMachineCredential } from '../fixtures'; - -const spinny = 'div.spinny'; -const searchInput = 'smart-search input'; -const searchSubmit = 'smart-search i[class*="search"]'; -const searchTags = 'smart-search .SmartSearch-tagContainer'; -const searchClearAll = 'smart-search .SmartSearch-clearAll'; -const searchTagDelete = 'i[class*="fa-times"]'; - -const createTagSelector = n => `${searchTags}:nth-of-type(${n})`; -const createTagDeleteSelector = n => `${searchTags}:nth-of-type(${n}) ${searchTagDelete}`; - -const checkTags = (client, tags) => { - const strategy = 'css selector'; - - const countReached = createTagSelector(tags.length); - const countExceeded = createTagSelector(tags.length + 1); - - if (tags.length > 0) { - client.waitForElementVisible(countReached); - client.waitForElementNotPresent(countExceeded); - } - - client.elements(strategy, searchTags, tagElements => { - client.assert.equal(tagElements.value.length, tags.length); - - let n = -1; - tagElements.value.map(o => o.ELEMENT).forEach(id => { - client.elementIdText(id, ({ value }) => { - client.assert.equal(value, tags[++n]); - }); - }); - }); -}; - -module.exports = { - before: (client, done) => { - const resources = range(25).map(n => getAdminMachineCredential(`test-search-${n}`)); - - Promise.all(resources).then(done); - }, - 'add and remove search tags': client => { - const credentials = client.page.credentials(); - - client.login(); - client.waitForAngular(); - - credentials.section.navigation.waitForElementVisible('@credentials'); - credentials.section.navigation.click('@credentials'); - - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - client.waitForElementVisible(searchInput); - client.waitForElementVisible(searchSubmit); - - client.expect.element(searchInput).enabled; - client.expect.element(searchSubmit).enabled; - - checkTags(client, []); - - client.setValue(searchInput, 'foo'); - client.click(searchSubmit); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, ['foo']); - - client.setValue(searchInput, 'bar e2e'); - client.click(searchSubmit); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, ['foo', 'bar', 'e2e']); - - client.click(searchClearAll); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, []); - - client.setValue(searchInput, 'fiz name:foo'); - client.click(searchSubmit); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, ['fiz', 'name:foo']); - - client.click(searchClearAll); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, []); - - client.setValue(searchInput, 'hello name:world fiz'); - client.click(searchSubmit); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, ['hello', 'fiz', 'name:world']); - - client.click(createTagDeleteSelector(2)); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, ['hello', 'name:world']); - - client.click(createTagDeleteSelector(1)); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, ['name:world']); - - client.click(createTagDeleteSelector(1)); - client.waitForElementVisible(spinny); - client.waitForElementNotVisible(spinny); - - checkTags(client, []); - - client.end(); - }, -}; diff --git a/awx/ui/test/e2e/tests/test-templates-copy-delete-warnings.js b/awx/ui/test/e2e/tests/test-templates-copy-delete-warnings.js deleted file mode 100644 index 094323a5e1..0000000000 --- a/awx/ui/test/e2e/tests/test-templates-copy-delete-warnings.js +++ /dev/null @@ -1,212 +0,0 @@ -import { post } from '../api'; -import { - getInventoryScript, - getInventorySource, - getJobTemplate, - getOrCreate, - getOrganization, - getProject, - getUser, - getWorkflowTemplate, -} from '../fixtures'; - -let data; - -const promptHeader = '#prompt-header'; -const promptWarning = '#prompt-body'; -const promptResource = 'span[class="Prompt-warningResourceTitle"]'; -const promptResourceCount = 'span[class="badge List-titleBadge"]'; -const promptCancelButton = '#prompt_cancel_btn'; -const promptActionButton = '#prompt_action_btn'; -const promptCloseButton = '#prompt-header + div i[class*="times-circle"]'; - -module.exports = { - before: (client, done) => { - const resources = [ - getUser('test-warnings'), - getOrganization('test-warnings'), - getWorkflowTemplate('test-warnings'), - getProject('test-warnings'), - getJobTemplate('test-warnings'), - getInventoryScript('external-org'), - getInventorySource('external-org'), - ]; - - Promise.all(resources) - .then(([user, org, workflow, project, template, script, source]) => { - const unique = 'unified_job_template'; - const nodes = workflow.related.workflow_nodes; - const nodePromise = getOrCreate(nodes, { [unique]: source.id }, [unique]); - - const permissions = [ - [org, 'admin_role'], - [workflow, 'admin_role'], - [project, 'admin_role'], - [template, 'admin_role'], - [script, 'read_role'], - ]; - - const assignments = permissions - .map(([resource, name]) => resource.summary_fields.object_roles[name]) - .map(role => `/api/v2/roles/${role.id}/users/`) - .map(url => post(url, { id: user.id })) - .concat([nodePromise]); - - Promise.all(assignments) - .then(() => { data = { user, project, source, template, workflow }; }) - .then(done); - }); - }, - 'verify job template delete warning': client => { - const templates = client.page.templates(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - templates.load(); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('smart-search').visible; - templates.expect.element('smart-search input').enabled; - - templates - .sendKeys('smart-search input', `id:>${data.template.id - 1} id:<${data.template.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - templates.expect.element(`#row-${data.template.id}`).visible; - templates.expect.element('i[class*="trash"]').visible; - templates.expect.element('i[class*="trash"]').enabled; - - templates.click('i[class*="trash"]'); - - templates.expect.element(promptHeader).visible; - templates.expect.element(promptWarning).visible; - templates.expect.element(promptResource).visible; - templates.expect.element(promptResourceCount).visible; - templates.expect.element(promptCancelButton).visible; - templates.expect.element(promptActionButton).visible; - templates.expect.element(promptCloseButton).visible; - - templates.expect.element(promptCancelButton).enabled; - templates.expect.element(promptActionButton).enabled; - templates.expect.element(promptCloseButton).enabled; - - templates.expect.element(promptHeader).text.contain('DELETE'); - templates.expect.element(promptHeader).text.contain(`${data.template.name.toUpperCase()}`); - - templates.expect.element(promptWarning).text.contain('job template'); - - templates.expect.element(promptResource).text.contain('Workflow Job Template Nodes'); - templates.expect.element(promptResourceCount).text.contain('1'); - - templates.click(promptCancelButton); - - templates.expect.element(promptHeader).not.visible; - - client.end(); - }, - 'verify workflow template delete warning': client => { - const templates = client.page.templates(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - templates.load(); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('smart-search').visible; - templates.expect.element('smart-search input').enabled; - - templates - .sendKeys('smart-search input', `id:>${data.workflow.id - 1} id:<${data.workflow.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - templates.expect.element(`#row-${data.workflow.id}`).visible; - templates.expect.element('i[class*="trash"]').visible; - templates.expect.element('i[class*="trash"]').enabled; - - templates.click('i[class*="trash"]'); - - templates.expect.element(promptHeader).visible; - templates.expect.element(promptWarning).visible; - templates.expect.element(promptCancelButton).visible; - templates.expect.element(promptActionButton).visible; - templates.expect.element(promptCloseButton).visible; - - templates.expect.element(promptCancelButton).enabled; - templates.expect.element(promptActionButton).enabled; - templates.expect.element(promptCloseButton).enabled; - - templates.expect.element(promptHeader).text.contain('DELETE'); - templates.expect.element(promptHeader).text.contain(`${data.workflow.name.toUpperCase()}`); - - templates.expect.element(promptWarning).text.contain('workflow template'); - - templates.click(promptCancelButton); - - templates.expect.element(promptHeader).not.visible; - - client.end(); - }, - 'verify workflow restricted copy warning': client => { - const templates = client.page.templates(); - - client.useCss(); - client.login(data.user.username); - client.waitForAngular(); - - templates.load(); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('smart-search').visible; - templates.expect.element('smart-search input').enabled; - - templates - .sendKeys('smart-search input', `id:>${data.workflow.id - 1} id:<${data.workflow.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - templates.expect.element(`#row-${data.workflow.id}`).visible; - templates.expect.element('i[class*="copy"]').visible; - templates.expect.element('i[class*="copy"]').enabled; - - templates.click('i[class*="copy"]'); - - templates.expect.element(promptHeader).visible; - templates.expect.element(promptWarning).visible; - templates.expect.element(promptCancelButton).visible; - templates.expect.element(promptActionButton).visible; - templates.expect.element(promptCloseButton).visible; - - templates.expect.element(promptCancelButton).enabled; - templates.expect.element(promptActionButton).enabled; - templates.expect.element(promptCloseButton).enabled; - - templates.expect.element(promptHeader).text.contain('COPY'); - templates.expect.element(promptHeader).text.contain(`${data.workflow.name.toUpperCase()}`); - templates.expect.element(promptWarning).text.contain('Unified Job Templates'); - templates.expect.element(promptWarning).text.contain(`${data.source.name}`); - - templates.click(promptCancelButton); - - templates.expect.element(promptHeader).not.visible; - - client.end(); - }, -}; diff --git a/awx/ui/test/e2e/tests/test-templates-list-actions.js b/awx/ui/test/e2e/tests/test-templates-list-actions.js deleted file mode 100644 index f08934a5ca..0000000000 --- a/awx/ui/test/e2e/tests/test-templates-list-actions.js +++ /dev/null @@ -1,190 +0,0 @@ -import { - getInventorySource, - getJobTemplate, - getProject, - getWorkflowTemplate -} from '../fixtures'; - -let data; - -module.exports = { - before: (client, done) => { - const resources = [ - getInventorySource('test-actions'), - getJobTemplate('test-actions'), - getProject('test-actions'), - getWorkflowTemplate('test-actions'), - ]; - - Promise.all(resources) - .then(([source, template, project, workflow]) => { - data = { source, template, project, workflow }; - done(); - }); - }, - 'copy job template': client => { - const templates = client.page.templates(); - - client.useCss(); - client.login(); - client.waitForAngular(); - - templates.load(); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('smart-search').visible; - templates.expect.element('smart-search input').enabled; - - templates - .sendKeys('smart-search input', `id:>${data.template.id - 1} id:<${data.template.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - templates.expect.element(`#row-${data.template.id}`).visible; - templates.expect.element('i[class*="copy"]').visible; - templates.expect.element('i[class*="copy"]').enabled; - - templates.click('i[class*="copy"]'); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; - const activityRow = '#activities_table .List-tableCell[class*="description-column"] a'; - const toast = 'div[class="Toast-icon"]'; - - templates.waitForElementNotPresent(toast); - templates.expect.element(activityStream).visible; - templates.expect.element(activityStream).enabled; - templates.click(activityStream); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - client - .waitForElementVisible(activityRow) - .click(activityRow); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('#job_template_form').visible; - templates.section.addJobTemplate.expect.element('@title').visible; - templates.section.addJobTemplate.expect.element('@title').text.contain(data.template.name); - templates.section.addJobTemplate.expect.element('@title').text.not.equal(data.template.name); - templates.expect.element('@save').visible; - templates.expect.element('@save').enabled; - - client.end(); - }, - 'copy workflow template': client => { - const templates = client.page.templates(); - - client - .useCss() - .resizeWindow(1200, 800) - .login() - .waitForAngular(); - - templates.load(); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('smart-search').visible; - templates.expect.element('smart-search input').enabled; - - templates - .sendKeys('smart-search input', `id:>${data.workflow.id - 1} id:<${data.workflow.id + 1}`) - .sendKeys('smart-search input', client.Keys.ENTER); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - templates.expect.element(`#row-${data.workflow.id}`).visible; - templates.expect.element('i[class*="copy"]').visible; - templates.expect.element('i[class*="copy"]').enabled; - - templates - .click('i[class*="copy"]') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForAngular(); - - const activityStream = 'bread-crumb > div i[class$="icon-activity-stream"]'; - const activityRow = '#activities_table .List-tableCell[class*="description-column"] a'; - const toast = 'div[class="Toast-icon"]'; - - templates.waitForElementNotPresent(toast); - templates.expect.element(activityStream).visible; - templates.expect.element(activityStream).enabled; - templates.click(activityStream); - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - client - .waitForElementVisible(activityRow) - .click(activityRow); - - templates.waitForElementVisible('div.spinny'); - templates.waitForElementNotVisible('div.spinny'); - - templates.expect.element('#workflow_job_template_form').visible; - templates.section.editWorkflowJobTemplate.expect.element('@title').visible; - templates.section.editWorkflowJobTemplate.expect.element('@title').text.contain(data.workflow.name); - templates.section.editWorkflowJobTemplate.expect.element('@title').text.not.equal(data.workflow.name); - - templates.expect.element('@save').visible; - templates.expect.element('@save').enabled; - client.pause(1000); - - templates.section.editWorkflowJobTemplate - .waitForElementVisible('@visualizerButton') - .click('@visualizerButton') - .waitForElementVisible('div.spinny') - .waitForElementNotVisible('div.spinny') - .waitForAngular(); - - client.expect.element('#workflow-modal-dialog').visible; - client.expect.element('#workflow-modal-dialog span[class^="badge"]').visible; - client.expect.element('#workflow-modal-dialog span[class^="badge"]').text.equal('3'); - client.expect.element('div[class="WorkflowMaker-title"]').visible; - client.expect.element('div[class="WorkflowMaker-title"]').text.contain(data.workflow.name); - client.expect.element('div[class="WorkflowMaker-title"]').text.not.equal(data.workflow.name); - - client.expect.element('#workflow-modal-dialog i[class*="fa-cog"]').visible; - client.expect.element('#workflow-modal-dialog i[class*="fa-cog"]').enabled; - - client.click('#workflow-modal-dialog i[class*="fa-cog"]'); - - client.waitForElementVisible('workflow-controls'); - client.waitForElementVisible('div[class*="-zoomPercentage"]'); - - client.click('i[class*="fa-home"]').expect.element('div[class*="-zoomPercentage"]').text.equal('100%'); - client.click('i[class*="fa-minus"]').expect.element('div[class*="-zoomPercentage"]').text.equal('90%'); - client.click('i[class*="fa-minus"]').expect.element('div[class*="-zoomPercentage"]').text.equal('80%'); - client.click('i[class*="fa-minus"]').expect.element('div[class*="-zoomPercentage"]').text.equal('70%'); - client.click('i[class*="fa-minus"]').expect.element('div[class*="-zoomPercentage"]').text.equal('60%'); - - client.expect.element('#node-1').visible; - client.expect.element('#node-2').visible; - client.expect.element('#node-3').visible; - client.expect.element('#node-4').visible; - - client.expect.element('#node-1 text').text.not.equal('').after(5000); - client.expect.element('#node-2 text').text.not.equal('').after(5000); - client.expect.element('#node-3 text').text.not.equal('').after(5000); - client.expect.element('#node-4 text').text.not.equal('').after(5000); - - client.useXpath().waitForElementVisible('//*[contains(@class, "WorkflowChart-nameText") and contains(text(), "test-actions-job")]/..'); - client.useXpath().waitForElementVisible('//*[contains(@class, "WorkflowChart-nameText") and contains(text(), "test-actions-project")]/..'); - client.useXpath().waitForElementVisible('//*[contains(@class, "WorkflowChart-nameText") and contains(text(), "test-actions-inventory")]/..'); - - templates.expect.element('@save').visible; - templates.expect.element('@save').enabled; - - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-users-crud.js b/awx/ui/test/e2e/tests/test-users-crud.js deleted file mode 100644 index 648a7f4b33..0000000000 --- a/awx/ui/test/e2e/tests/test-users-crud.js +++ /dev/null @@ -1,146 +0,0 @@ -/* Tests for the user CRUD operations. */ -import uuid from 'uuid'; -import { - getAuditor, - getOrganization, - getUser -} from '../fixtures'; - -const row = '#users_table .List-tableRow'; -const testID = uuid().substr(0, 8); - -let data; -const store = { - organization: { - name: `org-${testID}` - }, - admin: { - email: `email-admin-${testID}@example.com`, - firstName: `first-admin-${testID}`, - lastName: `last-admin-${testID}`, - password: `admin-${testID}`, - username: `admin-${testID}`, - usernameDefault: `admin-${testID}`, - type: 'administrator', - }, - auditor: { - email: `email-auditor-${testID}@example.com`, - firstName: `first-auditor-${testID}`, - lastName: `last-auditor-${testID}`, - password: `auditor-${testID}`, - username: `auditor-${testID}`, - usernameDefault: `auditor-${testID}`, - type: 'auditor', - }, - user: { - email: `email-${testID}@example.com`, - firstName: `first-${testID}`, - lastName: `last-${testID}`, - password: `${testID}`, - username: `user-${testID}`, - usernameDefault: `user-${testID}`, - type: 'normal', - }, -}; - -module.exports = { - before: (client, done) => { - // generate a unique username on each attempt. - const uniqueUser = uuid().substr(0, 8); - Object.keys(store).forEach(key => { - if ('username' in store[key]) { - store[key].username = `${store[key].usernameDefault}-${uniqueUser}`; - } - }); - const resources = [ - getOrganization(store.organization.name), - ]; - - Promise.all(resources) - .then(([organization, auditor, user, admin]) => { - store.organization.name = `${store.organization.name}-organization`; - data = { organization }; - done(); - }); - client.login(); - client.waitForAngular(); - }, - 'create a system administrator': (client) => { - client.login(); - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.create(store.admin, store.organization); - users.search(store.admin.username); - client.logout(); - }, - 'create a system auditor': (client) => { - client.login(store.admin.username, store.admin.password); - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.create(store.auditor, store.organization); - users.search(store.auditor.username); - client.logout(); - }, - 'check if the new system auditor can login': (client) => { - client.login(store.auditor.username, store.auditor.password); - client.logout(); - }, - 'create an user': client => { - client.login(store.admin.username, store.admin.password); - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - const newUser = { - email: store.user.email, - password: store.user.password, - username: store.user.username, - }; - users.create(newUser, store.organization); - users.search(newUser.username); - }, - 'edit an user': client => { - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.search(store.user.username); - const editButton = `${row} i[class*="fa-pencil"]`; - users.waitForElementVisible(editButton).click(editButton); - users.section.edit - .waitForElementVisible('@title') - .setValue('@firstName', store.user.firstName) - .setValue('@lastName', store.user.lastName) - .click('@save'); - client.waitForSpinny(); - users.search(store.user.username); - users.expect.element(row).text.contain(`${store.user.username}\n${store.user.firstName}\n${store.user.lastName}`); - client.logout(); - }, - 'check if the new user can login': (client) => { - client.login(store.user.username, store.user.password); - client.logout(); - }, - 'delete admin': (client) => { - client.login(); - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.delete(store.admin.username); - }, - 'delete auditor': (client) => { - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.delete(store.auditor.username); - }, - 'delete user': (client) => { - const users = client.page.users(); - users.load(); - client.waitForSpinny(); - users.delete(store.user.username); - }, - after: client => { - client.end(); - }, -}; diff --git a/awx/ui/test/e2e/tests/test-websockets.js b/awx/ui/test/e2e/tests/test-websockets.js deleted file mode 100644 index 101796e57a..0000000000 --- a/awx/ui/test/e2e/tests/test-websockets.js +++ /dev/null @@ -1,164 +0,0 @@ -/* Websocket tests. These tests verify that items like the sparkline (colored box rows which - * display job status) and other status icons update correctly as the jobs progress. - */ -import { - getInventorySource, - getOrganization, - getProject, - getJob, - getJobTemplate, - getUpdatedProject -} from '../fixtures'; - -import { - AWX_E2E_URL, - AWX_E2E_TIMEOUT_ASYNC, - AWX_E2E_TIMEOUT_LONG -} from '../settings'; - -let data; - -// Xpath selectors for recently run job templates on the dashboard. -const successfulJt = '//a[contains(text(), "test-websockets-successful")]/../..'; -const failedJt = '//a[contains(text(), "test-websockets-failed")]/../..'; -const splitJt = '//a[contains(text(), "test-ws-split-job-template")]/../..'; -const sparklineIcon = '//div[contains(@class, "SmartStatus-iconContainer")]'; - -// Xpath selectors for sparkline icon statuses. -const running = '//div[@ng-show="job.status === \'running\'"]'; -const success = '//div[contains(@class, "SmartStatus-iconIndicator--success")]'; -const fail = '//div[contains(@class, "SmartStatus-iconIndicator--failed")]'; - -module.exports = { - - before: (client, done) => { - const resources = [ - getInventorySource('test-websockets'), - getProject('test-websockets', 'https://github.com/ansible/test-playbooks'), - getOrganization('test-websockets'), - // launch job templates once before running tests so that they appear on the dashboard. - getJob('test-websockets', 'debug.yml', 'test-websockets-successful', true, done), - getJob('test-websockets', 'fail_unless.yml', 'test-websockets-failed', true, done), - getJobTemplate('test-websockets', 'debug.yml', 'test-ws-split-job-template', true, '2'), - getJob('test-websockets', 'debug.yml', 'test-ws-split-job-template', false, done) - ]; - - Promise.all(resources) - .then(([inventory, project, org, jt1, jt2, sjt, sj]) => { - data = { inventory, project, org, jt1, jt2, sjt, sj }; - done(); - }); - - client - .login() - .waitForAngular(); - }, - - 'Test job template status updates for a successful job on dashboard': client => { - client - .useCss() - .navigateTo(`${AWX_E2E_URL}/#/home`, false); - getJob('test-websockets', 'debug.yml', 'test-websockets-successful', false); - client.useXpath().expect.element(`${sparklineIcon}[1]${running}`) - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - client.useXpath().expect.element(`${successfulJt}${sparklineIcon}[1]${success}`) - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - }, - - 'Test job template status updates for a failed job on dashboard': client => { - client - .useCss() - .navigateTo(`${AWX_E2E_URL}/#/home`, false); - getJob('test-websockets', 'fail_unless.yml', 'test-websockets-failed', false); - client.useXpath().expect.element(`${sparklineIcon}[1]${running}`) - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - client.useXpath().expect.element(`${failedJt}${sparklineIcon}[1]${fail}`) - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - }, - - 'Test projects list blinking icon': client => { - client - .useCss() - .navigateTo(`${AWX_E2E_URL}/#/projects`) - .waitForElementVisible('.SmartSearch-input') - .clearValue('.SmartSearch-input') - .setValue( - '.SmartSearch-input', - ['name.iexact:"test-websockets-project"', client.Keys.ENTER] - ); - getUpdatedProject('test-websockets'); - getUpdatedProject('test-websockets'); // occasionally 1st update is too quick - - client.expect.element('i.icon-job-running') - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - client.expect.element('i.icon-job-success') - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - }, - - 'Test successful job within an organization view': client => { - client - .useCss() - .navigateTo(`${AWX_E2E_URL}/#/organizations/${data.org.id}/job_templates`, false) - .waitForElementVisible('[ui-view=templatesList] .SmartSearch-input') - .clearValue('[ui-view=templatesList] .SmartSearch-input') - .setValue( - '[ui-view=templatesList] .SmartSearch-input', - ['test-websockets-successful', client.Keys.ENTER] - ); - getJob('test-websockets', 'debug.yml', 'test-websockets-successful', false); - - client.useXpath().expect.element(`${sparklineIcon}[1]${running}`) - .to.be.visible.before(AWX_E2E_TIMEOUT_ASYNC); - client.useXpath().expect.element(`${sparklineIcon}[1]${success}`) - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - }, - 'Test failed job within an organization view': client => { - client - .useCss() - .navigateTo(`${AWX_E2E_URL}/#/organizations/${data.org.id}/job_templates`, false) - .waitForElementVisible('[ui-view=templatesList] .SmartSearch-input') - .clearValue('[ui-view=templatesList] .SmartSearch-input') - .setValue( - '[ui-view=templatesList] .SmartSearch-input', - ['test-websockets-failed', client.Keys.ENTER] - ); - getJob('test-websockets', 'debug.yml', 'test-websockets-failed', false); - - client.useXpath().expect.element(`${sparklineIcon}[1]${running}`) - .to.be.visible.before(AWX_E2E_TIMEOUT_ASYNC); - client.useXpath().expect.element(`${sparklineIcon}[1]${fail}`) - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - }, - 'Test project blinking icon within an organization view': client => { - client - .useCss() - .navigateTo(`${AWX_E2E_URL}/#/organizations/${data.org.id}/projects`) - .waitForElementVisible('.projectsList .SmartSearch-input') - .clearValue('.projectsList .SmartSearch-input') - .setValue( - '.projectsList .SmartSearch-input', - ['test-websockets-project', client.Keys.ENTER] - ); - client.useXpath().waitForElementVisible('//i[contains(@class, "icon-job")]'); - client.useCss(); - getUpdatedProject('test-websockets'); - getUpdatedProject('test-websockets'); // sometimes project update is too fast - - client.expect.element('i.icon-job-running') - .to.be.visible.before(AWX_E2E_TIMEOUT_ASYNC); - client.expect.element('i.icon-job-success') - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - }, - 'Test job slicing sparkline behavior': client => { - client.navigateTo(`${AWX_E2E_URL}/#/home`, false); - getJob('test-websockets', 'debug.yml', 'test-ws-split-job-template', false); - - client.useXpath().expect.element(`${sparklineIcon}[1]${running}`) - .to.be.visible.before(AWX_E2E_TIMEOUT_ASYNC); - client.useXpath().expect.element(`${splitJt}${sparklineIcon}[1]${success}`) - .to.be.present.before(AWX_E2E_TIMEOUT_ASYNC); - }, - after: client => { - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-workflow-visualizer.js b/awx/ui/test/e2e/tests/test-workflow-visualizer.js deleted file mode 100644 index 112b1b8942..0000000000 --- a/awx/ui/test/e2e/tests/test-workflow-visualizer.js +++ /dev/null @@ -1,196 +0,0 @@ -import uuid from 'uuid'; - -import { - getInventorySource, - getJobTemplate, - getProject, - getWorkflowTemplate -} from '../fixtures'; - -import { - AWX_E2E_URL, -} from '../settings'; - -let data; -const spinny = "//*[contains(@class, 'spinny')]"; -const workflowVisualizerBtn = "//button[contains(@id, 'workflow_job_template_workflow_visualizer_btn')]"; -const workflowSearchBar = "//input[contains(@class, 'SmartSearch-input')]"; - -const startNodeId = '1'; -let initialJobNodeId; -let initialProjectNodeId; -let initialInventoryNodeId; -let newChildNodeId; -let leafNodeId; -const nodeAdd = "//*[contains(@class, 'WorkflowChart-nodeAddIcon')]"; -const nodeRemove = "//*[contains(@class, 'WorkflowChart-nodeRemoveIcon')]"; - -// search bar for visualizer templates -const jobSearchBar = "//*[contains(@id, 'workflow-jobs-list')]//input[contains(@class, 'SmartSearch-input')]"; - -// dropdown bar which lets you select edge type -const edgeTypeDropdownBar = "//span[contains(@id, 'select2-workflow_node_edge-container')]"; -const alwaysDropdown = "//li[contains(@id, 'select2-workflow_node_edge') and text()='Always']"; -const successDropdown = "//li[contains(@id, 'select2-workflow_node_edge') and text()='On Success']"; -const failureDropdown = "//li[contains(@id, 'select2-workflow_node_edge') and text()='On Failure']"; -const linkEdgeTypeDropdownBar = "//span[contains(@id, 'select2-workflow_link_edge-container')]"; -const linkAlwaysDropdown = "//li[contains(@id, 'select2-workflow_link_edge') and text()='Always']"; -const linkSuccessDropdown = "//li[contains(@id, 'select2-workflow_link_edge') and text()='On Success']"; -const linkFailureDropdown = "//li[contains(@id, 'select2-workflow_link_edge') and text()='On Failure']"; -const nodeSelectButton = "//*[@id='workflow_maker_select_node_btn']"; -const linkSelectButton = "//*[@id='workflow_maker_select_link_btn']"; -const nodeCancelButton = "//*[@id='workflow_maker_cancel_node_btn']"; -const deleteConfirmation = "//button[@ng-click='confirmDeleteNode()']"; - -const xPathNodeById = (id) => `//*[@id='node-${id}']`; -const xPathLinkById = (sourceId, targetId) => `//*[@id='link-${sourceId}-${targetId}']//*[contains(@class, 'WorkflowChart-linkPath')]`; -const xPathNodeByName = (name) => `//*[contains(@class, "WorkflowChart-nameText") and contains(text(), "${name}")]/..`; - -module.exports = { - before: (client, done) => { - // Ensure deterministic state on retries - const testID = uuid().substr(0, 8); - const namespace = `test-actions-${testID}`; - const resources = [ - getInventorySource(namespace), - getJobTemplate(namespace), - getProject(namespace), - getWorkflowTemplate(namespace), - ]; - - Promise.all(resources) - .then(([inventory, template, project, workflow]) => { - data = { inventory, template, project, workflow }; - client - .login() - .waitForAngular() - .resizeWindow(1200, 1000) - .navigateTo(`${AWX_E2E_URL}/#/templates`, false) - .useXpath() - .waitForElementVisible(workflowSearchBar) - .setValue(workflowSearchBar, [`name.iexact:"${data.workflow.name}"`]) - .click('//*[contains(@class, "SmartSearch-searchButton")]') - .waitForSpinny(true) - .click(`//a[text()="${namespace}-workflow-template"]`) - .waitForElementVisible(workflowVisualizerBtn) - .click(workflowVisualizerBtn) - .waitForSpinny(true); - client.waitForElementVisible(xPathNodeByName(`${namespace}-job`)); - // Grab the ids of the nodes - client.getAttribute(xPathNodeByName(`${namespace}-job`), 'id', (res) => { - initialJobNodeId = res.value.split('-')[1]; - }); - client.getAttribute(xPathNodeByName(`${namespace}-pro`), 'id', (res) => { - initialProjectNodeId = res.value.split('-')[1]; - }); - client.getAttribute(xPathNodeByName(`${namespace}-inv`), 'id', (res) => { - initialInventoryNodeId = res.value.split('-')[1]; - }); - done(); - }); - }, - 'verify that workflow visualizer new root node can only be set to always': client => { - client - .useXpath() - .findThenClick(xPathNodeById(startNodeId)) - .waitForElementPresent(edgeTypeDropdownBar) - .findThenClick(edgeTypeDropdownBar) - .waitForElementNotPresent(successDropdown) - .waitForElementNotPresent(failureDropdown) - .waitForElementPresent(alwaysDropdown) - .click(nodeCancelButton) - // Make sure that the animation finishes before moving on to the next test - .pause(500); - }, - 'verify that a link can be changed': client => { - client - .useXpath() - .moveToElement(xPathLinkById(initialJobNodeId, initialInventoryNodeId), 20, 0, () => { - client.waitForElementNotVisible(spinny); - client.mouseButtonClick(0); - }) - .waitForElementPresent(linkEdgeTypeDropdownBar) - .findThenClick(linkEdgeTypeDropdownBar) - .waitForElementPresent(linkSuccessDropdown) - .waitForElementPresent(linkFailureDropdown) - .waitForElementPresent(linkAlwaysDropdown) - .findThenClick(linkSuccessDropdown) - .click(linkSelectButton); - }, - 'verify that a new sibling node can be any edge type': client => { - client - .useXpath() - .moveToElement(xPathNodeById(initialJobNodeId), 0, 0, () => { - client.pause(500); - client.waitForElementNotVisible(spinny); - // Concatenating the xpaths lets us click the proper node - client.click(xPathNodeById(initialJobNodeId) + nodeAdd); - }) - .pause(1000) - .waitForElementNotVisible(spinny); - - // Grab the id of the new child node for later - client.getAttribute('//*[contains(@class, "WorkflowChart-isNodeBeingAdded")]/..', 'id', (res) => { - newChildNodeId = res.value.split('-')[1]; - }); - - client - .waitForElementVisible(jobSearchBar) - .clearValue(jobSearchBar) - .setValue(jobSearchBar, [`name.iexact:"${data.template.name}"`, client.Keys.ENTER]) - .pause(1000) - .findThenClick(`//div[contains(@class, "List-tableCell") and contains(text(), "${data.template.name}")]`) - .pause(1000) - .waitForElementNotVisible(spinny) - .findThenClick(edgeTypeDropdownBar) - .waitForElementPresent(successDropdown) - .waitForElementPresent(failureDropdown) - .waitForElementPresent(alwaysDropdown) - .findThenClick(alwaysDropdown) - .click(nodeSelectButton); - }, - 'Verify node-shifting behavior upon deletion': client => { - client - .moveToElement(xPathNodeById(newChildNodeId), 0, 0, () => { - client.pause(500); - client.waitForElementNotVisible(spinny); - client.click(xPathNodeById(newChildNodeId) + nodeAdd); - }) - .pause(1000) - .waitForElementNotVisible(spinny); - - // Grab the id of the new child node for later - client.getAttribute('//*[contains(@class, "WorkflowChart-isNodeBeingAdded")]/..', 'id', (res) => { - // I had to nest this logic in order to ensure that leafNodeId was available later on. - // Separating this out resulted in leafNodeId being `undefined` when sent to - // xPathLinkById - leafNodeId = res.value.split('-')[1]; - client - .waitForElementVisible(jobSearchBar) - .clearValue(jobSearchBar) - .setValue(jobSearchBar, [`name.iexact:"${data.template.name}"`, client.Keys.ENTER]) - .pause(1000) - .findThenClick(`//div[contains(@class, "List-tableCell") and contains(text(), "${data.template.name}")]`) - .pause(1000) - .waitForElementNotVisible(spinny) - .findThenClick(edgeTypeDropdownBar) - .waitForElementPresent(successDropdown) - .waitForElementPresent(failureDropdown) - .waitForElementPresent(alwaysDropdown) - .findThenClick(alwaysDropdown) - .click(nodeSelectButton) - .moveToElement(xPathNodeById(newChildNodeId), 0, 0, () => { - client.pause(500); - client.waitForElementNotVisible(spinny); - client.click(xPathNodeById(newChildNodeId) + nodeRemove); - }) - .pause(1000) - .waitForElementNotVisible(spinny) - .findThenClick(deleteConfirmation) - .waitForElementVisible(xPathLinkById(initialJobNodeId, leafNodeId)); - }); - }, - after: client => { - client.end(); - } -}; diff --git a/awx/ui/test/e2e/tests/test-xss.js b/awx/ui/test/e2e/tests/test-xss.js deleted file mode 100644 index baebc72e79..0000000000 --- a/awx/ui/test/e2e/tests/test-xss.js +++ /dev/null @@ -1,760 +0,0 @@ -import { - getAdminMachineCredential, - getHost, - getInventory, - getInventoryScript, - getInventorySource, - getInventorySourceSchedule, - getJobTemplate, - getJobTemplateSchedule, - getNotificationTemplate, - getOrganization, - getProjectAdmin, - getSmartInventory, - getTeam, - getUpdatedProject, - getJob, -} from '../fixtures'; - -const data = {}; -const urls = {}; -const pages = {}; - -module.exports = { - before: (client, done) => { - const namespace = '
test
'; - const namespaceShort = '
t
'; - - const resources = [ - getOrganization(namespace).then(obj => { data.organization = obj; }), - getHost(namespaceShort).then(obj => { data.host = obj; }), - getInventory(namespace).then(obj => { data.inventory = obj; }), - getInventoryScript(namespace).then(obj => { data.inventoryScript = obj; }), - getSmartInventory(namespace).then(obj => { data.smartInventory = obj; }), - getInventorySource(namespace).then(obj => { data.inventorySource = obj; }), - getInventorySourceSchedule(namespace).then(obj => { data.sourceSchedule = obj; }), - getUpdatedProject(namespace).then(obj => { data.project = obj; }), - getAdminMachineCredential(namespace).then(obj => { data.credential = obj; }), - getJobTemplate(namespace).then(obj => { data.jobTemplate = obj; }), - getJobTemplateSchedule(namespace).then(obj => { data.jobTemplateSchedule = obj; }), - getTeam(namespace).then(obj => { data.team = obj; }), - getProjectAdmin(namespace).then(obj => { data.user = obj; }), - getNotificationTemplate(namespace).then(obj => { data.notification = obj; }), - getJob(namespace).then(obj => { data.job = obj; }), - ]; - - Promise.all(resources) - .then(() => { - pages.organizations = client.page.organizations(); - pages.inventories = client.page.inventories(); - pages.inventoryScripts = client.page.inventoryScripts(); - pages.projects = client.page.projects(); - pages.credentials = client.page.credentials(); - pages.templates = client.page.templates(); - pages.teams = client.page.teams(); - pages.users = client.page.users(); - pages.notificationTemplates = client.page.notificationTemplates(); - pages.jobs = client.page.jobs(); - - urls.organization = `${pages.organizations.url()}/${data.organization.id}`; - urls.inventory = `${pages.inventories.url()}/inventory/${data.inventory.id}`; - urls.inventoryScript = `${pages.inventoryScripts.url()}/${data.inventoryScript.id}`; - urls.inventorySource = `${urls.inventory}/inventory_sources/edit/${data.inventorySource.id}`; - urls.sourceSchedule = `${urls.inventorySource}/schedules/${data.sourceSchedule.id}`; - urls.smartInventory = `${pages.inventories.url()}/smart/${data.smartInventory.id}`; - urls.project = `${pages.projects.url()}/${data.project.id}`; - urls.credential = `${pages.credentials.url()}/${data.credential.id}`; - urls.jobTemplate = `${pages.templates.url()}/job_template/${data.jobTemplate.id}`; - urls.jobTemplateSchedule = `${urls.jobTemplate}/schedules/${data.jobTemplateSchedule.id}`; - urls.team = `${pages.teams.url()}/${data.team.id}`; - urls.user = `${pages.users.url()}/${data.user.id}`; - urls.notification = `${pages.notificationTemplates.url()}/${data.notification.id}`; - urls.jobs = `${pages.jobs.url()}`; - urls.jobsSchedules = `${pages.jobs.url()}/schedules`; - urls.inventoryHosts = `${pages.inventories.url()}/inventory/${data.host.summary_fields.inventory.id}/hosts`; - - client - .useCss() - .login() - .waitForAngular() - .resizeWindow(1200, 800); - - done(); - }); - }, - 'check template form for unsanitized content': client => { - const multiCredentialOpen = 'multi-credential button i[class*="search"]'; - - client.navigateTo(urls.jobTemplate, false); - - client.expect.element('#job_template_form').visible; - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.expect.element(multiCredentialOpen).visible; - client.expect.element(multiCredentialOpen).enabled; - - client.pause(2000).click(multiCredentialOpen); - - client.expect.element('#multi-credential-modal').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.pause(500); - - client.waitForElementVisible('#multi-credential-modal .Form-exit'); - client.waitForElementNotVisible('.overlay'); - - client.click('#multi-credential-modal .Form-exit'); - - client.waitForElementNotPresent('#multi-credential-modal'); - }, - 'check template list for unsanitized content': client => { - const itemRow = `#row-${data.jobTemplate.id}`; - const itemName = `${itemRow} .at-RowItem-header`; - - client.expect.element('.at-Panel smart-search').visible; - client.expect.element('.at-Panel smart-search input').enabled; - - client.sendKeys('.at-Panel smart-search input', `id:>${data.jobTemplate.id - 1} id:<${data.jobTemplate.id + 1}`); - client.sendKeys('.at-Panel smart-search input', client.Keys.ENTER); - - client.expect.element('div.spinny').not.visible; - - client.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - client.expect.element(itemName).visible; - - // TODO: uncomment when tooltips are added - // client.moveToElement(itemName, 0, 0, () => { - // client.expect.element(itemName).attribute('aria-describedby'); - // - // client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - // const tooltip = `#${value}`; - // - // client.expect.element(tooltip).present; - // client.expect.element(tooltip).visible; - // - // client.expect.element('#xss').not.present; - // client.expect.element('[class=xss]').not.present; - // client.expect.element(tooltip).attribute('innerHTML') - // .contains('<div id="xss" class="xss">test</div>'); - // }); - // }); - - client.click(`${itemRow} i[class*="trash"]`); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check user form for unsanitized content': client => { - client.navigateTo(urls.user); - - client.expect.element('#user_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - // This test is disabled, because we don't have access to the permission - // id to craft the correct ID selector - // 'check user roles list for unsanitized content': client => { - // const adminRole = data.project.summary_fields.object_roles.admin_role; - // const itemDelete = `#permissions_table .List-tableRow[id="${adminRole.id}"] - // #permission-${"TODO: NEED ROLE ID, don't have fixture to get it"}-delete-action`; - - // client.expect.element('#permissions_tab').visible; - // client.expect.element('#permissions_tab').enabled; - - // client.pause(2000); - // client.findThenClick('#permissions_tab', 'css'); - - // client.expect.element('#xss').not.present; - // client.expect.element('[class=xss]').not.present; - - // client.expect.element('div[ui-view="related"]').visible; - // client.expect.element('div[ui-view="related"] smart-search input').enabled; - - // client.sendKeys('div[ui-view="related"] smart-search input', - // `id:>${adminRole.id - 1} id:<${adminRole.id + 1}`); - // client.sendKeys('div[ui-view="related"] smart-search input', client.Keys.ENTER); - - // client.expect.element('div.spinny').not.visible; - - // client.expect.element(itemDelete).visible; - // client.expect.element(itemDelete).enabled; - - // client.click(itemDelete); - - // client.expect.element('#prompt-header').visible; - // client.expect.element('#prompt-header').text.equal('REMOVE ROLE'); - // client.expect.element('#prompt_cancel_btn').enabled; - - // client.expect.element('#xss').not.present; - // client.expect.element('[class=xss]').not.present; - - // client.click('#prompt_cancel_btn'); - - // client.expect.element('#prompt-header').not.visible; - // }, - 'check user permissions view for unsanitized content': client => { - client.expect.element('button[aw-tool-tip="Grant Permission"]').enabled; - - client.click('button[aw-tool-tip="Grant Permission"]'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - client.expect.element('div[class="AddPermissions-header"]').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.expect.element('div[class="AddPermissions-dialog"] button[class*="exit"]').enabled; - - client.click('div[class="AddPermissions-dialog"] button[class*="exit"]'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - }, - 'check notification form for unsanitized content': client => { - client.navigateTo(urls.notification); - - client.expect.element('#notification_template_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check notification list for unsanitized content': client => { - const itemRow = `#notification_templates_table .List-tableRow[id="${data.notification.id}"]`; - const itemName = `${itemRow} .List-tableCell[class*="name-"] a`; - - client.expect.element('div.at-Panel smart-search').visible; - client.expect.element('div.at-Panel smart-search input').enabled; - - client.sendKeys('div.at-Panel smart-search input', `id:>${data.notification.id - 1} id:<${data.notification.id + 1}`); - client.waitForElementNotPresent('div.at-Panel smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.pause(2000); - client.click('div.at-Panel smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - client.expect.element('.List-titleBadge').text.equal('1'); - client.expect.element(itemName).visible; - - client.moveToElement(itemName, 0, 0, () => { - client.expect.element(itemName).attribute('aria-describedby'); - - client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - const tooltip = `#${value}`; - - client.expect.element(tooltip).present; - client.expect.element(tooltip).visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - client.expect.element(tooltip).attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - }); - }); - - client.click(`${itemRow} i[class*="trash"]`); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check organization form for unsanitized content': client => { - client.navigateTo(urls.organization); - - client.expect.element('#organization_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check organization list for unsanitized content': client => { - const itemName = '#OrgCards h3[class*="-label"]'; - - client.expect.element('div.at-Panel smart-search').visible; - client.expect.element('div.at-Panel smart-search input').enabled; - - client.sendKeys('div.at-Panel smart-search input', `id:>${data.organization.id - 1} id:<${data.organization.id + 1}`); - client.waitForElementNotPresent('div.at-Panel smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div.at-Panel smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - client.expect.element(itemName).visible; - - client.moveToElement(itemName, 0, 0, () => { - client.expect.element(itemName).attribute('aria-describedby'); - - client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - const tooltip = `#${value}`; - - client.expect.element(tooltip).present; - client.expect.element(tooltip).visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - client.expect.element(tooltip).attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - }); - }); - - client.click('#OrgCards i[class*="trash"]'); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check inventory form for unsanitized content': client => { - client.navigateTo(urls.inventory); - - client.expect.element('#inventory_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check inventory list for unsanitized content': client => { - const itemRow = `#inventories_table .List-tableRow[id="${data.inventory.id}"]`; - const itemName = `${itemRow} .List-tableCell[class*="name-"] a`; - - client.expect.element('div.at-Panel smart-search').visible; - client.expect.element('div.at-Panel smart-search input').enabled; - - client.sendKeys('div.at-Panel smart-search input', `id:>${data.inventory.id - 1} id:<${data.inventory.id + 1}`); - client.waitForElementNotPresent('div.at-Panel smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div.at-Panel smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - // client.expect.element('.List-titleBadge').text.equal('1'); - client.expect.element(itemName).visible; - - client.moveToElement(itemName, 0, 0, () => { - client.expect.element(itemName).attribute('aria-describedby'); - - client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - const tooltip = `#${value}`; - - client.expect.element(tooltip).present; - client.expect.element(tooltip).visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - client.expect.element(tooltip).attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - }); - }); - - client.click(`${itemRow} i[class*="trash"]`); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check smart inventory form for unsanitized content': client => { - client.navigateTo(urls.smartInventory, false); - - client.expect.element('#smartinventory_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check inventory script form for unsanitized content': client => { - client.navigateTo(urls.inventoryScript); - - client.expect.element('#inventory_script_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check inventory script list for unsanitized content': client => { - const itemRow = `#inventory_scripts_table .List-tableRow[id="${data.inventoryScript.id}"]`; - const itemName = `${itemRow} .List-tableCell[class*="name-"] a`; - - client.expect.element('div.at-Panel smart-search').visible; - client.expect.element('div.at-Panel smart-search input').enabled; - - client.sendKeys('div.at-Panel smart-search input', `id:>${data.inventoryScript.id - 1} id:<${data.inventoryScript.id + 1}`); - client.waitForElementNotPresent('div.at-Panel smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div.at-Panel smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - client.expect.element('.List-titleBadge').text.equal('1'); - client.expect.element(itemName).visible; - - client.moveToElement(itemName, 0, 0, () => { - client.expect.element(itemName).attribute('aria-describedby'); - - client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - const tooltip = `#${value}`; - - client.expect.element(tooltip).present; - client.expect.element(tooltip).visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - client.expect.element(tooltip).attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - }); - }); - - client.click(`${itemRow} i[class*="trash"]`); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check project form for unsanitized content': client => { - client.navigateTo(urls.project); - - client.expect.element('#project_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check project roles list for unsanitized content': client => { - const itemDelete = `#permissions_table .List-tableRow[id="${data.user.id}"] div[class*="RoleList-deleteContainer"]`; - - client.expect.element('#permissions_tab').visible; - client.expect.element('#permissions_tab').enabled; - - client.pause(1000); - client.click('#permissions_tab'); - client.click('#permissions_tab'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.expect.element('div[ui-view="related"]').visible; - client.expect.element('div[ui-view="related"] smart-search input').enabled; - - client.sendKeys('div[ui-view="related"] smart-search input', `id:>${data.user.id - 1} id:<${data.user.id + 1}`); - client.waitForElementNotPresent('div[ui-view="related"] smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div[ui-view="related"] smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').not.visible; - - client.expect.element(itemDelete).visible; - client.expect.element(itemDelete).enabled; - - client.click(itemDelete); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt-header').text.equal('USER ACCESS REMOVAL'); - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - - client.expect.element('#prompt-header').not.visible; - }, - 'check project permissions view for unsanitized content': client => { - client.expect.element('button[aw-tool-tip="Add a permission"]').visible; - client.expect.element('button[aw-tool-tip="Add a permission"]').enabled; - - client.click('button[aw-tool-tip="Add a permission"]'); - client.expect.element('div.spinny').not.visible; - - client.expect.element('div[class="AddPermissions-header"]').visible; - client.expect.element('div[class="AddPermissions-header"]').attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.expect.element('div[class="AddPermissions-dialog"] button[class*="exit"]').enabled; - - client.click('div[class="AddPermissions-dialog"] button[class*="exit"]'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - // client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - client.waitForAngular(); - - client.expect.element('#project_tab').enabled; - - client.click('#project_tab'); - - client.expect.element('#project_form').visible; - }, - 'check project list for unsanitized content': client => { - const itemRow = `#row-${data.project.id}`; - const itemName = `${itemRow} .at-RowItem-header`; - - client.expect.element('.at-Panel smart-search').visible; - client.expect.element('.at-Panel smart-search input').enabled; - - client.sendKeys('.at-Panel smart-search input', `id:>${data.project.id - 1} id:<${data.project.id + 1}`); - client.waitForElementNotPresent('div.at-Panel smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div.at-Panel smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').not.visible; - - client.expect.element('.at-Panel-headingTitleBadge').text.equal('1'); - client.expect.element(itemName).visible; - - // TODO: uncomment when tooltips are added - // client.moveToElement(itemName, 0, 0, () => { - // client.expect.element(itemName).attribute('aria-describedby'); - // - // client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - // const tooltip = `#${value}`; - // - // client.expect.element(tooltip).present; - // client.expect.element(tooltip).visible; - // - // client.expect.element('#xss').not.present; - // client.expect.element('[class=xss]').not.present; - // client.expect.element(tooltip).attribute('innerHTML') - // .contains('<div id="xss" class="xss">test</div>'); - // }); - // }); - - client.click(`${itemRow} i[class*="trash"]`); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check credential form for unsanitized content': client => { - client.navigateTo(urls.credential); - - client.expect.element('div[ui-view="edit"] form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check credential list for unsanitized content': client => { - const itemRow = `#credentials_table .List-tableRow[id="${data.credential.id}"]`; - const itemName = `${itemRow} .List-tableCell[class*="name-"] a`; - - client.expect.element('div[ui-view="list"] smart-search').visible; - client.expect.element('div[ui-view="list"] smart-search input').enabled; - - client.sendKeys('div[ui-view="list"] smart-search input', `id:>${data.credential.id - 1} id:<${data.credential.id + 1}`); - client.waitForElementNotPresent('div[ui-view="list"] smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div[ui-view="list"] smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - client.expect.element('.List-titleBadge').text.equal('1'); - client.expect.element(itemName).visible; - - client.moveToElement(itemName, 0, 0, () => { - client.expect.element(itemName).attribute('aria-describedby'); - - client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - const tooltip = `#${value}`; - - client.expect.element(tooltip).present; - client.expect.element(tooltip).visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - client.expect.element(tooltip).attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - }); - }); - - client.click(`${itemRow} i[class*="trash"]`); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check team form for unsanitized content': client => { - client.navigateTo(urls.team); - - client.expect.element('#team_form').visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check team list for unsanitized content': client => { - const itemRow = `#teams_table .List-tableRow[id="${data.team.id}"]`; - const itemName = `${itemRow} .List-tableCell[class*="name-"] a`; - - client.expect.element('div.at-Panel smart-search').visible; - client.expect.element('div.at-Panel smart-search input').enabled; - - client.sendKeys('div.at-Panel smart-search input', `id:>${data.team.id - 1} id:<${data.team.id + 1}`); - client.waitForElementNotPresent('div.at-Panel smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div.at-Panel smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - client.expect.element('.List-titleBadge').text.equal('1'); - client.expect.element(itemName).visible; - - client.moveToElement(itemName, 0, 0, () => { - client.expect.element(itemName).attribute('aria-describedby'); - - client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - const tooltip = `#${value}`; - - client.expect.element(tooltip).present; - client.expect.element(tooltip).visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - client.expect.element(tooltip).attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - }); - }); - - client.click(`${itemRow} i[class*="trash"]`); - - client.expect.element('#prompt-header').visible; - client.expect.element('#prompt_cancel_btn').enabled; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - - client.click('#prompt_cancel_btn'); - if (client.isVisible('#prompt_cancel_btn')) { - client.click('#prompt_cancel_btn'); - } - - client.expect.element('#prompt-header').not.visible; - }, - 'check inventory source schedule view for unsanitized content': client => { - client.navigateTo(urls.sourceSchedule); - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check job template schedule view for unsanitized content': client => { - client.navigateTo(urls.jobTemplateSchedule); - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - }, - 'check job schedules view for unsanitized content': client => { - const itemRow = `#schedules_table .List-tableRow[id="${data.jobTemplateSchedule.id}"]`; - const itemName = `${itemRow} .List-tableCell[class*="name-"] a`; - - client.navigateTo(urls.jobsSchedules); - - client.moveToElement(itemName, 0, 0, () => { - client.expect.element(itemName).attribute('aria-describedby'); - client.getAttribute(itemName, 'aria-describedby', ({ value }) => { - const tooltip = `#${value}`; - client.expect.element(tooltip).present; - client.expect.element(tooltip).visible; - - client.expect.element('#xss').not.present; - client.expect.element('[class=xss]').not.present; - client.expect.element(tooltip).attribute('innerHTML') - .contains('<div id="xss" class="xss">test</div>'); - }); - }); - }, - 'check host recent jobs popup for unsanitized content': client => { - const itemRow = `#hosts_table .List-tableRow[id="${data.host.id}"]`; - const itemName = `${itemRow} .List-tableCell[class*="active_failures-"] a`; - - client.navigateTo(urls.inventoryHosts); - client.expect.element('div.at-Panel smart-search').visible; - client.expect.element('div.at-Panel smart-search input').enabled; - - client.sendKeys('div[ui-view="form"] smart-search input', `id:>${data.host.id - 1} id:<${data.host.id + 1}`); - client.waitForElementNotPresent('div[ui-view="form"] smart-search .SmartSearch-searchButton--disabled'); - client.waitForElementNotVisible('.overlay'); - client.click('div[ui-view="form"] smart-search .SmartSearch-searchButton'); - - client.expect.element('div.spinny').visible; - client.expect.element('div.spinny').not.visible; - - client.click(itemName); - client.expect.element('body > div.popover').present; - - client.expect.element('[class=xss]').not.present; - - client.end(); - }, -}; diff --git a/awx/ui/test/spec/column-sort/column-sort.directive-test.js b/awx/ui/test/spec/column-sort/column-sort.directive-test.js deleted file mode 100644 index 64b0eb4971..0000000000 --- a/awx/ui/test/spec/column-sort/column-sort.directive-test.js +++ /dev/null @@ -1,107 +0,0 @@ -'use strict'; - -xdescribe('Directive: column-sort', () =>{ - - let $scope, template, $compile, QuerySet, GetBasePath; - - beforeEach(angular.mock.module('templateUrl')); - beforeEach(function(){ - - this.mock = { - dataset: [ - {name: 'zero', idx: 0}, - {name: 'one', idx: 1}, - {name: 'two', idx: 2} - ] - }; - - this.name_field = angular.element(` - `); - - this.idx_field = angular.element(` - `); - - this.$state = { - params: {}, - go: jasmine.createSpy('go') - }; - - this.$stateParams = {}; - - var mockFilter = function (value) { - return value; - }; - - angular.mock.module('ColumnSortModule', ($provide) =>{ - - QuerySet = jasmine.createSpyObj('qs', ['search']); - QuerySet.search.and.callFake(() => { return { then: function(){} }; }); - GetBasePath = jasmine.createSpy('GetBasePath'); - $provide.value('QuerySet', QuerySet); - $provide.value('GetBasePath', GetBasePath); - $provide.value('$state', this.$state); - $provide.value('$stateParams', this.$stateParams); - $provide.value("translateFilter", mockFilter); - - }); - }); - - beforeEach(angular.mock.inject(($templateCache, _$rootScope_, _$compile_) => { - template = window.__html__['client/src/shared/column-sort/column-sort.partial.html']; - $templateCache.put('/static/partials/shared/column-sort/column-sort.partial.html', template); - - $compile = _$compile_; - $scope = _$rootScope_.$new(); - })); - - it('should be ordered by name', function(){ - - this.$state.params = { - mock_search: {order_by: 'name'} - }; - - $compile(this.name_field)($scope); - $compile(this.idx_field)($scope); - - $scope.$digest(); - expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true); - expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); - }); - - it('should toggle to ascending name order, then ascending idx, then descending idx', function(){ - - this.$state.params = { - mock_search: {order_by: 'idx'} - }; - - $compile(this.name_field)($scope); - $compile(this.idx_field)($scope); - - $scope.$digest(); - - $(this.name_field).click(); - expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true); - expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); - - $(this.idx_field).click(); - expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); - expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true); - - $(this.idx_field).click(); - expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); - expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-down') ).toEqual(true); - }); - -}); diff --git a/awx/ui/test/spec/instance-groups/instance-groups.service-test.js b/awx/ui/test/spec/instance-groups/instance-groups.service-test.js deleted file mode 100644 index 082cd782a2..0000000000 --- a/awx/ui/test/spec/instance-groups/instance-groups.service-test.js +++ /dev/null @@ -1,73 +0,0 @@ -'use strict'; - -const mockUrl = ''; -const mockSavedInstanceGroups = { - data: { - results: [ - { id: 1 }, - { id: 2 }, - { id: 3 }, - { id: 4 }, - { id: 5 }, - { id: 6 }, - ] - } -}; - -const _postData = []; -function MockRest() { - return { - setUrl (){}, - get () { - return Promise.resolve(mockSavedInstanceGroups); - }, - post (data) { - _postData.push(data); - return Promise.resolve({}); - }, - } -} - -describe('instanceGroupsService', () => { - let instanceGroupsService; - - beforeEach(() => { - angular.mock.module('awApp'); - angular.mock.module($provide => { - $provide.service('Rest', MockRest); - }); - angular.mock.module('instanceGroups'); - angular.mock.inject($injector => { - instanceGroupsService = $injector.get('InstanceGroupsService'); - }); - }); - - describe('editInstanceGroups', () => { - it('makes the expected requests', (done) => { - const selectedInstanceGroups = [ - { id: 1 }, - { id: 2 }, - { id: 4 }, - { id: 5 }, - { id: 6 }, - { id: 7 }, - { id: 3 }, - ]; - instanceGroupsService.editInstanceGroups(mockUrl, selectedInstanceGroups) - .then(() => { - expect(_postData).toEqual([ - { id: 3, disassociate: true }, - { id: 4, disassociate: true }, - { id: 5, disassociate: true }, - { id: 6, disassociate: true }, - { id: 4, associate: true }, - { id: 5, associate: true }, - { id: 6, associate: true }, - { id: 7, associate: true }, - { id: 3, associate: true }, - ]); - }) - .finally(() => done()); - }); - }); -}); diff --git a/awx/ui/test/spec/inventories/insights/data/high.insights-data.js b/awx/ui/test/spec/inventories/insights/data/high.insights-data.js deleted file mode 100644 index bd0671cc8f..0000000000 --- a/awx/ui/test/spec/inventories/insights/data/high.insights-data.js +++ /dev/null @@ -1,149 +0,0 @@ -export default [ - { - "details": { - "vulnerable_setting": "hosts: files dns", - "affected_package": "glibc-2.17-55.el7", - "error_key": "GLIBC_CVE_2015_7547" - }, - "id": 709784455, - "rule_id": "CVE_2015_7547_glibc|GLIBC_CVE_2015_7547", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A critical security flaw in the glibc library was found. It allows an attacker to crash an application built against that library or, potentially, execute arbitrary code with privileges of the user running the application.

\n", - "generic_html": "

The glibc library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the libresolv part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when libresolv is called from the nss_dns NSS service module. This flaw is known as CVE-2015-7547.

\n", - "more_info_html": "\n", - "severity": "ERROR", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2015_7547_glibc|GLIBC_CVE_2015_7547", - "error_key": "GLIBC_CVE_2015_7547", - "plugin": "CVE_2015_7547_glibc", - "description": "Remote code execution vulnerability in libresolv via crafted DNS response (CVE-2015-7547)", - "summary": "A critical security flaw in the `glibc` library was found. It allows an attacker to crash an application built against that library or, potentially, execute arbitrary code with privileges of the user running the application.", - "generic": "The `glibc` library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the `libresolv` part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when `libresolv` is called from the nss_dns NSS service module. This flaw is known as [CVE-2015-7547](https://access.redhat.com/security/cve/CVE-2015-7547).", - "reason": "

This host is vulnerable because it has vulnerable package glibc-2.17-55.el7 installed and DNS is enabled in /etc/nsswitch.conf:

\n
hosts:      files dns\n

The glibc library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the libresolv part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when libresolv is called from the nss_dns NSS service module. This flaw is known as CVE-2015-7547.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2015-7547](https://access.redhat.com/security/cve/CVE-2015-7547).\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2168451", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:35.000Z", - "rec_impact": 4, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating glibc and restarting the affected system:

\n
# yum update glibc\n# reboot\n

Alternatively, you can restart all affected services, but because this vulnerability affects a large amount of applications on the system, the best solution is to restart the system.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "mitigation_conf": "no", - "sysctl_live_ack_limit": "100", - "package_name": "kernel", - "sysctl_live_ack_limit_line": "net.ipv4.tcp_challenge_ack_limit = 100", - "error_key": "KERNEL_CVE_2016_5696_URGENT", - "vulnerable_kernel": "3.10.0-123.el7", - "sysctl_conf_ack_limit": "100", - "sysctl_conf_ack_limit_line": "net.ipv4.tcp_challenge_ack_limit=100", - "mitigation_live": "no" - }, - "id": 766342155, - "rule_id": "CVE_2016_5696_kernel|KERNEL_CVE_2016_5696_URGENT", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A flaw in the Linux kernel's TCP/IP networking subsystem implementation of the RFC 5961 challenge ACK rate limiting was found that could allow an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n", - "generic_html": "

A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack (RFC 5961) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n

Red Hat recommends that you update the kernel package or apply mitigations.

\n", - "more_info_html": "\n", - "severity": "ERROR", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_5696_kernel|KERNEL_CVE_2016_5696_URGENT", - "error_key": "KERNEL_CVE_2016_5696_URGENT", - "plugin": "CVE_2016_5696_kernel", - "description": "Kernel vulnerable to man-in-the-middle via payload injection", - "summary": "A flaw in the Linux kernel's TCP/IP networking subsystem implementation of the [RFC 5961](https://tools.ietf.org/html/rfc5961) challenge ACK rate limiting was found that could allow an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.", - "generic": "A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack ([RFC 5961](https://tools.ietf.org/html/rfc5961)) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack. \n\nRed Hat recommends that you update the kernel package or apply mitigations.", - "reason": "

A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack (RFC 5961) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n

Your currently loaded kernel configuration contains this setting:

\n
net.ipv4.tcp_challenge_ack_limit = 100\n

Your currently stored kernel configuration is:

\n
net.ipv4.tcp_challenge_ack_limit=100\n

There is currently no mitigation applied and your system is vulnerable.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-5696](https://access.redhat.com/security/cve/CVE-2016-5696)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2438571", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:32.000Z", - "rec_impact": 4, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update the kernel package and restart the system:

\n
# yum update kernel\n# reboot\n

or

\n

Alternatively, this issue can be addressed by applying the following mitigations until the machine is restarted with the updated kernel package.

\n

Edit /etc/sysctl.conf file as root, add the mitigation configuration, and reload the kernel configuration:

\n
# echo "net.ipv4.tcp_challenge_ack_limit = 2147483647" >> /etc/sysctl.conf \n# sysctl -p\n
" - }, - "maintenance_actions": [{ - "done": false, - "id": 56045, - "maintenance_plan": { - "maintenance_id": 15875, - "name": "Payload Injection Fix", - "description": "", - "start": "2017-06-01T02:00:00.000Z", - "end": "2017-06-01T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 61575, - "maintenance_plan": { - "maintenance_id": 16825, - "name": "Summit 2017 Plan 1", - "description": "", - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 66175, - "maintenance_plan": { - "maintenance_id": 19435, - "name": null, - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 71015, - "maintenance_plan": { - "maintenance_id": 19835, - "name": "Optum Payload", - "description": "", - "start": "2017-05-27T02:00:00.000Z", - "end": "2017-05-27T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }] - } -] diff --git a/awx/ui/test/spec/inventories/insights/data/insights-data.js b/awx/ui/test/spec/inventories/insights/data/insights-data.js deleted file mode 100644 index 91b8fa0503..0000000000 --- a/awx/ui/test/spec/inventories/insights/data/insights-data.js +++ /dev/null @@ -1,662 +0,0 @@ -export default { - "toString": "ansible1.tronik-insights440.atl.redhat.com", - "isCheckingIn": true, - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "display_name": null, - "remote_branch": null, - "remote_leaf": null, - "account_number": "540155", - "hostname": "ansible1.tronik-insights440.atl.redhat.com", - "parent_id": null, - "system_type_id": 105, - "last_check_in": "2017-05-25T14:01:19.000Z", - "stale_ack": false, - "type": "machine", - "product": "rhel", - "created_at": "2016-07-26T23:31:13.000Z", - "updated_at": "2017-05-25T14:01:19.000Z", - "unregistered_at": null, - "reports": [{ - "details": { - "vulnerable_setting": "hosts: files dns", - "affected_package": "glibc-2.17-55.el7", - "error_key": "GLIBC_CVE_2015_7547" - }, - "id": 709784455, - "rule_id": "CVE_2015_7547_glibc|GLIBC_CVE_2015_7547", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A critical security flaw in the glibc library was found. It allows an attacker to crash an application built against that library or, potentially, execute arbitrary code with privileges of the user running the application.

\n", - "generic_html": "

The glibc library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the libresolv part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when libresolv is called from the nss_dns NSS service module. This flaw is known as CVE-2015-7547.

\n", - "more_info_html": "\n", - "severity": "ERROR", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2015_7547_glibc|GLIBC_CVE_2015_7547", - "error_key": "GLIBC_CVE_2015_7547", - "plugin": "CVE_2015_7547_glibc", - "description": "Remote code execution vulnerability in libresolv via crafted DNS response (CVE-2015-7547)", - "summary": "A critical security flaw in the `glibc` library was found. It allows an attacker to crash an application built against that library or, potentially, execute arbitrary code with privileges of the user running the application.", - "generic": "The `glibc` library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the `libresolv` part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when `libresolv` is called from the nss_dns NSS service module. This flaw is known as [CVE-2015-7547](https://access.redhat.com/security/cve/CVE-2015-7547).", - "reason": "

This host is vulnerable because it has vulnerable package glibc-2.17-55.el7 installed and DNS is enabled in /etc/nsswitch.conf:

\n
hosts:      files dns\n

The glibc library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the libresolv part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when libresolv is called from the nss_dns NSS service module. This flaw is known as CVE-2015-7547.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2015-7547](https://access.redhat.com/security/cve/CVE-2015-7547).\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2168451", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:35.000Z", - "rec_impact": 4, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating glibc and restarting the affected system:

\n
# yum update glibc\n# reboot\n

Alternatively, you can restart all affected services, but because this vulnerability affects a large amount of applications on the system, the best solution is to restart the system.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "affected_kernel": "3.10.0-123.el7", - "error_key": "KERNEL_CVE-2016-0728" - }, - "id": 709784465, - "rule_id": "CVE_2016_0728_kernel|KERNEL_CVE-2016-0728", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A vulnerability in the Linux kernel allowing local privilege escalation was discovered. The issue was reported as CVE-2016-0728.

\n", - "generic_html": "

A vulnerability in the Linux kernel rated Important was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as CVE-2016-0728.

\n

Red Hat recommends that you update the kernel and reboot the system. If you cannot reboot now, consider applying the systemtap patch to update your running kernel.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_0728_kernel|KERNEL_CVE-2016-0728", - "error_key": "KERNEL_CVE-2016-0728", - "plugin": "CVE_2016_0728_kernel", - "description": "Kernel key management subsystem vulnerable to local privilege escalation (CVE-2016-0728)", - "summary": "A vulnerability in the Linux kernel allowing local privilege escalation was discovered. The issue was reported as [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).", - "generic": "A vulnerability in the Linux kernel rated **Important** was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).\n\nRed Hat recommends that you update the kernel and reboot the system. If you cannot reboot now, consider applying the [systemtap patch](https://bugzilla.redhat.com/attachment.cgi?id=1116284&action=edit) to update your running kernel.", - "reason": "

A vulnerability in the Linux kernel rated Important was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as CVE-2016-0728.

\n

The host is vulnerable as it is running kernel-3.10.0-123.el7.

\n", - "type": null, - "more_info": "* For more information about the flaws and versions of the package that are vulnerable see [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2130791", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:37.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update kernel and reboot. If you cannot reboot now, consider applying the systemtap patch to update your running kernel.

\n
# yum update kernel\n# reboot\n-or-\n# debuginfo-install kernel     (or equivalent)\n# stap -vgt -Gfix_p=1 -Gtrace_p=0 cve20160728e.stp\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "processes_listening_int": [], - "processes_listening_ext": [], - "error_key": "OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "processes_listening": [], - "processes_names": [], - "vulnerable_package": "openssl-libs-1.0.1e-34.el7" - }, - "id": 709784475, - "rule_id": "CVE_2016_0800_openssl_drown|OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A new cross-protocol attack against SSLv2 protocol has been found. It has been assigned CVE-2016-0800 and is referred to as DROWN - Decrypting RSA using Obsolete and Weakened eNcryption. An attacker can decrypt passively collected TLS sessions between up-to-date client and server which supports SSLv2.

\n", - "generic_html": "

A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.

\n

A more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see CVE-2015-0293).

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_0800_openssl_drown|OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "error_key": "OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "plugin": "CVE_2016_0800_openssl_drown", - "description": "OpenSSL vulnerable to very efficient session decryption (CVE-2016-0800/Special DROWN)", - "summary": "A new cross-protocol attack against SSLv2 protocol has been found. It has been assigned [CVE-2016-0800](https://access.redhat.com/security/cve/CVE-2016-0800) and is referred to as DROWN - Decrypting RSA using Obsolete and Weakened eNcryption. An attacker can decrypt passively collected TLS sessions between up-to-date client and server which supports SSLv2.", - "generic": "A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.\n\nA more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see [CVE-2015-0293](https://access.redhat.com/security/cve/CVE-2015-0293)).", - "reason": "

This host is vulnerable because it has vulnerable package openssl-libs-1.0.1e-34.el7 installed.

\n

This package does not have a patch for CVE-2015-0293 applied, which makes the system especially vulnerable. This is known as Special DROWN. An attacker can use this flaw to perform active man-in-the-middle (MITM) attacks and impersonate a TLS server to connecting TLS client in a matter of minutes.

\n

Fortunately, it does not seem to run any processes that use OpenSSL libraries.

\n

A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.

\n

A more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see CVE-2015-0293).

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-0800](https://access.redhat.com/security/cve/CVE-2016-0800)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2174451", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:32.000Z", - "rec_impact": 3, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update openssl and restart the affected system:

\n
# yum update openssl\n# reboot\n

Alternatively, you can restart all affected services (that is, the ones linked to the openssl library), especially those listening on public IP addresses.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "vulnerable_kernel": "3.10.0-123.el7", - "package_name": "kernel", - "error_key": "KERNEL_CVE_2016_5195" - }, - "id": 709784485, - "rule_id": "CVE_2016_5195_kernel|KERNEL_CVE_2016_5195", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally only have read-only access to and thus increase their privileges on the system.

\n", - "generic_html": "

A race condition was found in the way Linux kernel's memory subsystem handled breakage of the read only shared mappings COW situation on write access. An unprivileged local user could use this flaw to write to files they should normally have read-only access to, and thus increase their privileges on the system.

\n

A process that is able to mmap a file is able to race Copy on Write (COW) page creation (within get_user_pages) with madvise(MADV_DONTNEED) kernel system calls. This would allow modified pages to bypass the page protection mechanism and modify the mapped file. The vulnerability could be abused by allowing an attacker to modify existing setuid files with instructions to elevate permissions. This attack has been found in the wild.

\n

Red Hat recommends that you update the kernel package or apply mitigations.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_5195_kernel|KERNEL_CVE_2016_5195", - "error_key": "KERNEL_CVE_2016_5195", - "plugin": "CVE_2016_5195_kernel", - "description": "Kernel vulnerable to privilege escalation via permission bypass (CVE-2016-5195)", - "summary": "A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally only have read-only access to and thus increase their privileges on the system.", - "generic": "A race condition was found in the way Linux kernel's memory subsystem handled breakage of the read only shared mappings COW situation on write access. An unprivileged local user could use this flaw to write to files they should normally have read-only access to, and thus increase their privileges on the system.\n\nA process that is able to mmap a file is able to race Copy on Write (COW) page creation (within get_user_pages) with madvise(MADV_DONTNEED) kernel system calls. This would allow modified pages to bypass the page protection mechanism and modify the mapped file. The vulnerability could be abused by allowing an attacker to modify existing setuid files with instructions to elevate permissions. This attack has been found in the wild. \n\nRed Hat recommends that you update the kernel package or apply mitigations.", - "reason": "

A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally have read-only access to and thus increase their privileges on the system.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n

There is currently no mitigation applied and your system is vulnerable.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-5195](https://access.redhat.com/security/cve/CVE-2016-5195)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2706661", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:33.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update the kernel package and restart the system:

\n
# yum update kernel\n# reboot\n

or

\n

Alternatively, this issue can be addressed by applying mitigations until the machine is restarted with the updated kernel package.

\n

Please refer to the Resolve Tab in the vulnerability article for information about the mitigation and the latest information.

\n" - }, - "maintenance_actions": [{ - "done": false, - "id": 29885, - "maintenance_plan": { - "maintenance_id": 12195, - "name": null, - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-jnewton", - "silenced": false, - "hidden": true, - "suggestion": "proposed", - "remote_branch": null - } - }] - }, { - "details": { - "package": "bash-4.2.45-5.el7", - "error_key": "VULNERABLE_BASH_DETECTED" - }, - "id": 709784505, - "rule_id": "bash_injection|VULNERABLE_BASH_DETECTED", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

In September 2014, an exploitable bug known as Shellshock was discovered in commonly shipped versions of the bash shell.

\n", - "generic_html": "

Hosts running earlier versions of bash are affected by the code injection vulnerability known as Shellshock.

\n", - "more_info_html": "

For further information about this critical vulnerability, see:

\n\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": true, - "ansible_mitigation": false, - "rule_id": "bash_injection|VULNERABLE_BASH_DETECTED", - "error_key": "VULNERABLE_BASH_DETECTED", - "plugin": "bash_injection", - "description": "Bash locally vulnerable via environment variables (CVE-2014-6271, CVE-2014-7169/Shellshock)", - "summary": "In September 2014, an exploitable bug known as Shellshock was discovered in commonly shipped versions of the bash shell.", - "generic": "Hosts running earlier versions of `bash` are affected by the code injection vulnerability known as **Shellshock**.", - "reason": "

This host is running a version of bash that is affected by the code injection vulnerability known as Shellshock.

\n

The package affected is bash-4.2.45-5.el7.

\n", - "type": null, - "more_info": "For further information about this **critical** vulnerability, see:\n* [Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271, CVE-2014-7169)](https://access.redhat.com/articles/1200223)\n* [CVE-2014-6271](https://access.redhat.com/security/cve/CVE-2014-6271)\n* [CVE-2014-7169](https://access.redhat.com/security/cve/CVE-2014-7169)", - "active": true, - "node_id": "1200223", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:36.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you upgrade bash immediately:

\n
# yum update bash\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "detected_problem_log_perms": [{ - "log_perms_dirfilename": "/var/log/cron", - "log_perms_sensitive": true, - "log_perms_ls_line": "-rw-r--r--. 1 root root 15438 May 25 10:01 cron" - }], - "error_key": "HARDENING_LOGGING_3_LOG_PERMS" - }, - "id": 709784525, - "rule_id": "hardening_logging_log_perms|HARDENING_LOGGING_3_LOG_PERMS", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

Issues related to system logging and auditing were detected on your system. Important services are disabled or log file permissions are not secure.

\n", - "generic_html": "

Issues related to system logging and auditing were detected on your system.

\n

Red Hat recommends that the logging service rsyslog and the auditing service auditd are enabled and that log files in /var/log have secure permissions.

\n", - "more_info_html": "\n", - "severity": "INFO", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "hardening_logging_log_perms|HARDENING_LOGGING_3_LOG_PERMS", - "error_key": "HARDENING_LOGGING_3_LOG_PERMS", - "plugin": "hardening_logging_log_perms", - "description": "Decreased security in system logging permissions", - "summary": "Issues related to system logging and auditing were detected on your system. Important services are disabled or log file permissions are not secure.\n", - "generic": "Issues related to system logging and auditing were detected on your system.\n\nRed Hat recommends that the logging service `rsyslog` and the auditing service `auditd` are enabled and that log files in `/var/log` have secure permissions.\n", - "reason": "

Log files have permission issues.

\n

The following files or directories in /var/log have file permissions that differ from the default RHEL configuration and are possibly non-secure. Red Hat recommends that the file permissions be adjusted to more secure settings.

\n\n \n \n \n \n \n\n\n\n\n\n\n\n
File or directory nameDetected problemOutput from ls -l
/var/log/cronUsers other than root can read or write.-rw-r--r--. 1 root root 15438 May 25 10:01 cron
\n\n\n\n", - "type": null, - "more_info": "* [Why is `/var/log/cron` world readable in RHEL7?](https://access.redhat.com/solutions/1491573)\n* [Using the chkconfig Utility](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s2-services-chkconfig.html) to configure services on RHEL 6\n* [Managing System Services](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Services.html) to configure services on RHEL 7\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2017-05-16T04:08:34.000Z", - "rec_impact": 1, - "rec_likelihood": 1, - "resolution": "

Red Hat recommends that you perform the following adjustments:

\n

Fixing permission issues depends on whether there is a designated safe group on your system that has Read access to the log files. This situation might exist if you want to allow certain administrators to see the log files without becoming root. To prevent log tampering, no other user than root should have permissions to Write to the log files. (The btmp and wtmp files are owned by the utmp group but other users should still be unable to write to them.)

\n

Fix for a default RHEL configuration

\n

(No designated group for reading log files)

\n
chown root:root /var/log/cron\nchmod u=rw,g-x,o-rwx /var/log/cron\n

Fix for a configuration with a designated safe group for reading log files

\n

In the following lines, substitute the name of your designated safe group for the string safegroup:

\n
chown root:safegroup /var/log/cron\nchmod u=rw,g-x,o-rwx /var/log/cron\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "filesystems": [{ - "usage": "99", - "mountpoint": "/" - }, { - "usage": "99", - "mountpoint": "/" - }], - "error_key": "FILESYSTEM_CAPACITY" - }, - "id": 709784535, - "rule_id": "filesystem_capacity|FILESYSTEM_CAPACITY", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.

\n", - "generic_html": "

File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.

\n", - "more_info_html": "

How to increase the filesystem size?\nHow do I find out what is using disk space?

\n", - "severity": "WARN", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "filesystem_capacity|FILESYSTEM_CAPACITY", - "error_key": "FILESYSTEM_CAPACITY", - "plugin": "filesystem_capacity", - "description": "Decreased stability and/or performance due to filesystem over 95% capacity", - "summary": "File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.\n", - "generic": "File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.\n", - "reason": "

This host has the following file systems nearing or at capacity:

\n
    \n\n
  • Filesystem: / Usage: 99%
  • \n\n
  • Filesystem: / Usage: 99%
  • \n\n
", - "type": null, - "more_info": "[How to increase the filesystem size?](https://access.redhat.com/solutions/21820)\n[How do I find out what is using disk space?](https://access.redhat.com/solutions/1154683)\n", - "active": true, - "node_id": "1154683", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:36.000Z", - "rec_impact": 2, - "rec_likelihood": 3, - "resolution": "

To solve the issue, Red Hat recommends that you either add more storage capacity to the identified file systems, or remove unnecessary files to reduce the current usage.\nPlease refer to more_information part for more detailed steps.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "msg": "[ 0.000000] crashkernel=auto resulted in zero bytes of reserved memory.", - "auto_with_low_ram": true, - "rhel_ver": 7, - "error_key": "CRASHKERNEL_RESERVATION_FAILED" - }, - "id": 709784555, - "rule_id": "crashkernel_reservation_failed|CRASHKERNEL_RESERVATION_FAILED", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

The crashkernel configuration has failed to produce a working kdump environment. Configuration changes must be made to enable vmcore capture.

\n", - "generic_html": "

Kdump is unable to reserve memory for the kdump kernel. The kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.

\n", - "more_info_html": "", - "severity": "WARN", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "crashkernel_reservation_failed|CRASHKERNEL_RESERVATION_FAILED", - "error_key": "CRASHKERNEL_RESERVATION_FAILED", - "plugin": "crashkernel_reservation_failed", - "description": "Kdump crashkernel reservation failed due to improper configuration of crashkernel parameter", - "summary": "The crashkernel configuration has failed to produce a working kdump environment. Configuration changes must be made to enable vmcore capture.\n", - "generic": "Kdump is unable to reserve memory for the kdump kernel. The kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.", - "reason": "

This host is unable to reserve memory for the kdump kernel:

\n
[    0.000000] crashkernel=auto resulted in zero bytes of reserved memory.\n

This means the kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.

\n", - "type": null, - "more_info": null, - "active": true, - "node_id": "59432", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:33.000Z", - "rec_impact": 1, - "rec_likelihood": 3, - "resolution": "

To fix this issue, Red Hat recommends that you change the crashkernel setting in the grub.conf file.

\n

This host failed to reserved memory with auto crashkernel parameter due to low physical memory. The memory must be reserved by explicitly requesting the reservation size, for example: crashkernel=128M.

\n

For details of crashkernel setting, please refer to the Knowledge article How should the crashkernel parameter be configured for using kdump on RHEL7? to pickup the setting specifically for your host.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "error_key": "TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION" - }, - "id": 709784565, - "rule_id": "tzdata_need_upgrade|TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.

\n", - "generic_html": "

System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.

\n", - "more_info_html": "", - "severity": "INFO", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "tzdata_need_upgrade|TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "error_key": "TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "plugin": "tzdata_need_upgrade", - "description": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale", - "summary": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.\n", - "generic": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.\n", - "reason": "

This system running as a non-NTP system is following the UTC timescale. In this situation, manual correction is required to avoid system clock inaccuracy when a leap second event happens.

\n", - "type": null, - "more_info": null, - "active": true, - "node_id": "1465713", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 1, - "resolution": "

The system clock of this system needs manual correction when a leap second event happens. For example:

\n
\n\n# date -s \"20170101 HH:MM:SS\"\n\n
\n\n

You need to replace "HH:MM:SS" with the accurate time after the leap second occurs.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "selinux_info": true, - "package_name": "kernel", - "selinux_enforcing": true, - "selinux_can_help": true, - "minimal_selinux_policy": "selinux-policy-3.13.1-81.el7", - "selinux_enabled": true, - "vulnerable_kernel": "3.10.0-123.el7", - "active_policy": "selinux-policy-3.12.1-153.el7", - "dccp_loading_disabled": null, - "error_key": "KERNEL_CVE_2017_6074", - "enough_policy": false, - "dccp_loaded": null, - "mitigation_info": false - }, - "id": 709784575, - "rule_id": "CVE_2017_6074_kernel|KERNEL_CVE_2017_6074", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074. An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system.

\n", - "generic_html": "

A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074.

\n

An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. A local user could initiate a DCCP network connection on any local system network interface and then create specially-crafted memory allocations containing malicious instructions that can then either cause a crash or potentially escalate the user's privileges.

\n

An attacker must have access to a local account on the system; this is not a remote attack and it requires IPv6 support to be enabled on the system.

\n

Red Hat recommends that you update the kernel when possible. Otherwise, you can use proposed mitigation to disable DCCP. SELinux in enforcing mode can also mitigate the issue under specific circumstances.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2017_6074_kernel|KERNEL_CVE_2017_6074", - "error_key": "KERNEL_CVE_2017_6074", - "plugin": "CVE_2017_6074_kernel", - "description": "Kernel vulnerable to local privilege escalation via DCCP module (CVE-2017-6074)", - "summary": "A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned [CVE-2017-6074](https://access.redhat.com/security/cve/CVE-2017-6074). An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system.\n", - "generic": "A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074. \n\nAn unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. A local user could initiate a DCCP network connection on any local system network interface and then create specially-crafted memory allocations containing malicious instructions that can then either cause a crash or potentially escalate the user's privileges.\n\nAn attacker must have access to a local account on the system; this is not a remote attack and it requires IPv6 support to be enabled on the system.\n\nRed Hat recommends that you update the kernel when possible. Otherwise, you can use proposed mitigation to disable DCCP. SELinux in enforcing mode can also mitigate the issue under specific circumstances.\n", - "reason": "

A use-after-free flaw was found within the Linux kernel IPv6 DCCP network protocol code.

\n

This host is affected because:

\n
  • It is running kernel 3.10.0-123.el7.
  • SELinux policy is outdated.
\n\n\n\n\n\n\n

Your installed SELinux policy is selinux-policy-3.12.1-153.el7; however, to mitigate the issue, the earliest required version is selinux-policy-3.13.1-81.el7.

\n", - "type": null, - "more_info": "* For more information about the flaw, see [CVE-2017-6074](https://access.redhat.com/security/cve/CVE-2017-6074).\n* To learn how to upgrade packages, see [What is yum and how do I use it?](https://access.redhat.com/solutions/9934).\n* For more information about SELinux, see [Benefits of running SELinux](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/chap-Security-Enhanced_Linux-Introduction.html#sect-Security-Enhanced_Linux-Introduction-Benefits_of_running_SELinux).\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating the kernel package and rebooting the system.

\n
# yum update kernel\n# reboot\n

Alternatively, apply one of the following mitigations:

\n
Update SELinux policy
\n

Update your SELinux policy:

\n
# yum update selinux-policy\n

The system does not provide enough information for Insights about loaded kernel modules. It is not possible to recommend a mitigation based on kernel modules.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "mitigation_conf": "no", - "sysctl_live_ack_limit": "100", - "package_name": "kernel", - "sysctl_live_ack_limit_line": "net.ipv4.tcp_challenge_ack_limit = 100", - "error_key": "KERNEL_CVE_2016_5696_URGENT", - "vulnerable_kernel": "3.10.0-123.el7", - "sysctl_conf_ack_limit": "100", - "sysctl_conf_ack_limit_line": "net.ipv4.tcp_challenge_ack_limit=100", - "mitigation_live": "no" - }, - "id": 766342155, - "rule_id": "CVE_2016_5696_kernel|KERNEL_CVE_2016_5696_URGENT", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A flaw in the Linux kernel's TCP/IP networking subsystem implementation of the RFC 5961 challenge ACK rate limiting was found that could allow an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n", - "generic_html": "

A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack (RFC 5961) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n

Red Hat recommends that you update the kernel package or apply mitigations.

\n", - "more_info_html": "\n", - "severity": "ERROR", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_5696_kernel|KERNEL_CVE_2016_5696_URGENT", - "error_key": "KERNEL_CVE_2016_5696_URGENT", - "plugin": "CVE_2016_5696_kernel", - "description": "Kernel vulnerable to man-in-the-middle via payload injection", - "summary": "A flaw in the Linux kernel's TCP/IP networking subsystem implementation of the [RFC 5961](https://tools.ietf.org/html/rfc5961) challenge ACK rate limiting was found that could allow an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.", - "generic": "A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack ([RFC 5961](https://tools.ietf.org/html/rfc5961)) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack. \n\nRed Hat recommends that you update the kernel package or apply mitigations.", - "reason": "

A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack (RFC 5961) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n

Your currently loaded kernel configuration contains this setting:

\n
net.ipv4.tcp_challenge_ack_limit = 100\n

Your currently stored kernel configuration is:

\n
net.ipv4.tcp_challenge_ack_limit=100\n

There is currently no mitigation applied and your system is vulnerable.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-5696](https://access.redhat.com/security/cve/CVE-2016-5696)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2438571", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:32.000Z", - "rec_impact": 4, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update the kernel package and restart the system:

\n
# yum update kernel\n# reboot\n

or

\n

Alternatively, this issue can be addressed by applying the following mitigations until the machine is restarted with the updated kernel package.

\n

Edit /etc/sysctl.conf file as root, add the mitigation configuration, and reload the kernel configuration:

\n
# echo "net.ipv4.tcp_challenge_ack_limit = 2147483647" >> /etc/sysctl.conf \n# sysctl -p\n
" - }, - "maintenance_actions": [{ - "done": false, - "id": 56045, - "maintenance_plan": { - "maintenance_id": 15875, - "name": "Payload Injection Fix", - "description": "", - "start": "2017-06-01T02:00:00.000Z", - "end": "2017-06-01T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 61575, - "maintenance_plan": { - "maintenance_id": 16825, - "name": "Summit 2017 Plan 1", - "description": "", - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 66175, - "maintenance_plan": { - "maintenance_id": 19435, - "name": null, - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 71015, - "maintenance_plan": { - "maintenance_id": 19835, - "name": "Optum Payload", - "description": "", - "start": "2017-05-27T02:00:00.000Z", - "end": "2017-05-27T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }] - }, { - "details": { - "mod_loading_disabled": null, - "package_name": "kernel", - "error_key": "KERNEL_CVE_2017_2636", - "vulnerable_kernel": "3.10.0-123.el7", - "mod_loaded": null, - "mitigation_info": false - }, - "id": 766342165, - "rule_id": "CVE_2017_2636_kernel|KERNEL_CVE_2017_2636", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A vulnerability in the Linux kernel allowing local privilege escalation was discovered.\nThe issue was reported as CVE-2017-2636.

\n", - "generic_html": "

A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation. It has been assigned CVE-2017-2636.

\n

An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. The kernel uses a TTY subsystem to take and show terminal output to connected systems. An attacker crafting specific-sized memory allocations could abuse this mechanism to place a kernel function pointer with malicious instructions to be executed on behalf of the attacker.

\n

An attacker must have access to a local account on the system; this is not a remote attack. Exploiting this flaw does not require Microgate or SyncLink hardware to be in use.

\n

Red Hat recommends that you use the proposed mitigation to disable the N_HDLC module.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2017_2636_kernel|KERNEL_CVE_2017_2636", - "error_key": "KERNEL_CVE_2017_2636", - "plugin": "CVE_2017_2636_kernel", - "description": "Kernel vulnerable to local privilege escalation via n_hdlc module (CVE-2017-2636)", - "summary": "A vulnerability in the Linux kernel allowing local privilege escalation was discovered.\nThe issue was reported as [CVE-2017-2636](https://access.redhat.com/security/cve/CVE-2017-2636).\n", - "generic": "A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation. It has been assigned CVE-2017-2636.\n\nAn unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. The kernel uses a TTY subsystem to take and show terminal output to connected systems. An attacker crafting specific-sized memory allocations could abuse this mechanism to place a kernel function pointer with malicious instructions to be executed on behalf of the attacker.\n\nAn attacker must have access to a local account on the system; this is not a remote attack. Exploiting this flaw does not require Microgate or SyncLink hardware to be in use.\n\nRed Hat recommends that you use the proposed mitigation to disable the N_HDLC module.\n", - "reason": "

A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n", - "type": null, - "more_info": "* For more information about the flaw, see [CVE-2017-2636](https://access.redhat.com/security/cve/CVE-2017-2636) and [CVE-2017-2636 article](https://access.redhat.com/security/vulnerabilities/CVE-2017-2636).\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating the kernel package and rebooting the system.

\n
# yum update kernel\n# reboot\n
" - }, - "maintenance_actions": [{ - "done": false, - "id": 58335, - "maintenance_plan": { - "maintenance_id": 16545, - "name": "Insights Summit 2017 - n_HDLC", - "description": "", - "start": "2017-05-06T02:00:00.000Z", - "end": "2017-05-06T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 61895, - "maintenance_plan": { - "maintenance_id": 16835, - "name": "Summit 2017 N_HDLC", - "description": "", - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 66225, - "maintenance_plan": { - "maintenance_id": 19445, - "name": "Seattle's Best Plan", - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 71075, - "maintenance_plan": { - "maintenance_id": 19845, - "name": "Optum N_HDLC FIX", - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }] - }] -} diff --git a/awx/ui/test/spec/inventories/insights/data/low.insights-data.js b/awx/ui/test/spec/inventories/insights/data/low.insights-data.js deleted file mode 100644 index 568e1d76e4..0000000000 --- a/awx/ui/test/spec/inventories/insights/data/low.insights-data.js +++ /dev/null @@ -1,84 +0,0 @@ -export default [ - { - "details": { - "detected_problem_log_perms": [{ - "log_perms_dirfilename": "/var/log/cron", - "log_perms_sensitive": true, - "log_perms_ls_line": "-rw-r--r--. 1 root root 15438 May 25 10:01 cron" - }], - "error_key": "HARDENING_LOGGING_3_LOG_PERMS" - }, - "id": 709784525, - "rule_id": "hardening_logging_log_perms|HARDENING_LOGGING_3_LOG_PERMS", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

Issues related to system logging and auditing were detected on your system. Important services are disabled or log file permissions are not secure.

\n", - "generic_html": "

Issues related to system logging and auditing were detected on your system.

\n

Red Hat recommends that the logging service rsyslog and the auditing service auditd are enabled and that log files in /var/log have secure permissions.

\n", - "more_info_html": "\n", - "severity": "INFO", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "hardening_logging_log_perms|HARDENING_LOGGING_3_LOG_PERMS", - "error_key": "HARDENING_LOGGING_3_LOG_PERMS", - "plugin": "hardening_logging_log_perms", - "description": "Decreased security in system logging permissions", - "summary": "Issues related to system logging and auditing were detected on your system. Important services are disabled or log file permissions are not secure.\n", - "generic": "Issues related to system logging and auditing were detected on your system.\n\nRed Hat recommends that the logging service `rsyslog` and the auditing service `auditd` are enabled and that log files in `/var/log` have secure permissions.\n", - "reason": "

Log files have permission issues.

\n

The following files or directories in /var/log have file permissions that differ from the default RHEL configuration and are possibly non-secure. Red Hat recommends that the file permissions be adjusted to more secure settings.

\n\n \n \n \n \n \n\n\n\n\n\n\n\n
File or directory nameDetected problemOutput from ls -l
/var/log/cronUsers other than root can read or write.-rw-r--r--. 1 root root 15438 May 25 10:01 cron
\n\n\n\n", - "type": null, - "more_info": "* [Why is `/var/log/cron` world readable in RHEL7?](https://access.redhat.com/solutions/1491573)\n* [Using the chkconfig Utility](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s2-services-chkconfig.html) to configure services on RHEL 6\n* [Managing System Services](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Services.html) to configure services on RHEL 7\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2017-05-16T04:08:34.000Z", - "rec_impact": 1, - "rec_likelihood": 1, - "resolution": "

Red Hat recommends that you perform the following adjustments:

\n

Fixing permission issues depends on whether there is a designated safe group on your system that has Read access to the log files. This situation might exist if you want to allow certain administrators to see the log files without becoming root. To prevent log tampering, no other user than root should have permissions to Write to the log files. (The btmp and wtmp files are owned by the utmp group but other users should still be unable to write to them.)

\n

Fix for a default RHEL configuration

\n

(No designated group for reading log files)

\n
chown root:root /var/log/cron\nchmod u=rw,g-x,o-rwx /var/log/cron\n

Fix for a configuration with a designated safe group for reading log files

\n

In the following lines, substitute the name of your designated safe group for the string safegroup:

\n
chown root:safegroup /var/log/cron\nchmod u=rw,g-x,o-rwx /var/log/cron\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "error_key": "TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION" - }, - "id": 709784565, - "rule_id": "tzdata_need_upgrade|TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.

\n", - "generic_html": "

System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.

\n", - "more_info_html": "", - "severity": "INFO", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "tzdata_need_upgrade|TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "error_key": "TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "plugin": "tzdata_need_upgrade", - "description": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale", - "summary": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.\n", - "generic": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.\n", - "reason": "

This system running as a non-NTP system is following the UTC timescale. In this situation, manual correction is required to avoid system clock inaccuracy when a leap second event happens.

\n", - "type": null, - "more_info": null, - "active": true, - "node_id": "1465713", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 1, - "resolution": "

The system clock of this system needs manual correction when a leap second event happens. For example:

\n
\n\n# date -s \"20170101 HH:MM:SS\"\n\n
\n\n

You need to replace "HH:MM:SS" with the accurate time after the leap second occurs.

\n" - }, - "maintenance_actions": [] - } -] diff --git a/awx/ui/test/spec/inventories/insights/data/medium.insights-data.js b/awx/ui/test/spec/inventories/insights/data/medium.insights-data.js deleted file mode 100644 index 9f62d41022..0000000000 --- a/awx/ui/test/spec/inventories/insights/data/medium.insights-data.js +++ /dev/null @@ -1,418 +0,0 @@ -export default [ - { - "details": { - "affected_kernel": "3.10.0-123.el7", - "error_key": "KERNEL_CVE-2016-0728" - }, - "id": 709784465, - "rule_id": "CVE_2016_0728_kernel|KERNEL_CVE-2016-0728", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A vulnerability in the Linux kernel allowing local privilege escalation was discovered. The issue was reported as CVE-2016-0728.

\n", - "generic_html": "

A vulnerability in the Linux kernel rated Important was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as CVE-2016-0728.

\n

Red Hat recommends that you update the kernel and reboot the system. If you cannot reboot now, consider applying the systemtap patch to update your running kernel.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_0728_kernel|KERNEL_CVE-2016-0728", - "error_key": "KERNEL_CVE-2016-0728", - "plugin": "CVE_2016_0728_kernel", - "description": "Kernel key management subsystem vulnerable to local privilege escalation (CVE-2016-0728)", - "summary": "A vulnerability in the Linux kernel allowing local privilege escalation was discovered. The issue was reported as [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).", - "generic": "A vulnerability in the Linux kernel rated **Important** was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).\n\nRed Hat recommends that you update the kernel and reboot the system. If you cannot reboot now, consider applying the [systemtap patch](https://bugzilla.redhat.com/attachment.cgi?id=1116284&action=edit) to update your running kernel.", - "reason": "

A vulnerability in the Linux kernel rated Important was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as CVE-2016-0728.

\n

The host is vulnerable as it is running kernel-3.10.0-123.el7.

\n", - "type": null, - "more_info": "* For more information about the flaws and versions of the package that are vulnerable see [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2130791", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:37.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update kernel and reboot. If you cannot reboot now, consider applying the systemtap patch to update your running kernel.

\n
# yum update kernel\n# reboot\n-or-\n# debuginfo-install kernel     (or equivalent)\n# stap -vgt -Gfix_p=1 -Gtrace_p=0 cve20160728e.stp\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "processes_listening_int": [], - "processes_listening_ext": [], - "error_key": "OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "processes_listening": [], - "processes_names": [], - "vulnerable_package": "openssl-libs-1.0.1e-34.el7" - }, - "id": 709784475, - "rule_id": "CVE_2016_0800_openssl_drown|OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A new cross-protocol attack against SSLv2 protocol has been found. It has been assigned CVE-2016-0800 and is referred to as DROWN - Decrypting RSA using Obsolete and Weakened eNcryption. An attacker can decrypt passively collected TLS sessions between up-to-date client and server which supports SSLv2.

\n", - "generic_html": "

A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.

\n

A more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see CVE-2015-0293).

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_0800_openssl_drown|OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "error_key": "OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "plugin": "CVE_2016_0800_openssl_drown", - "description": "OpenSSL vulnerable to very efficient session decryption (CVE-2016-0800/Special DROWN)", - "summary": "A new cross-protocol attack against SSLv2 protocol has been found. It has been assigned [CVE-2016-0800](https://access.redhat.com/security/cve/CVE-2016-0800) and is referred to as DROWN - Decrypting RSA using Obsolete and Weakened eNcryption. An attacker can decrypt passively collected TLS sessions between up-to-date client and server which supports SSLv2.", - "generic": "A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.\n\nA more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see [CVE-2015-0293](https://access.redhat.com/security/cve/CVE-2015-0293)).", - "reason": "

This host is vulnerable because it has vulnerable package openssl-libs-1.0.1e-34.el7 installed.

\n

This package does not have a patch for CVE-2015-0293 applied, which makes the system especially vulnerable. This is known as Special DROWN. An attacker can use this flaw to perform active man-in-the-middle (MITM) attacks and impersonate a TLS server to connecting TLS client in a matter of minutes.

\n

Fortunately, it does not seem to run any processes that use OpenSSL libraries.

\n

A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.

\n

A more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see CVE-2015-0293).

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-0800](https://access.redhat.com/security/cve/CVE-2016-0800)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2174451", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:32.000Z", - "rec_impact": 3, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update openssl and restart the affected system:

\n
# yum update openssl\n# reboot\n

Alternatively, you can restart all affected services (that is, the ones linked to the openssl library), especially those listening on public IP addresses.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "vulnerable_kernel": "3.10.0-123.el7", - "package_name": "kernel", - "error_key": "KERNEL_CVE_2016_5195" - }, - "id": 709784485, - "rule_id": "CVE_2016_5195_kernel|KERNEL_CVE_2016_5195", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally only have read-only access to and thus increase their privileges on the system.

\n", - "generic_html": "

A race condition was found in the way Linux kernel's memory subsystem handled breakage of the read only shared mappings COW situation on write access. An unprivileged local user could use this flaw to write to files they should normally have read-only access to, and thus increase their privileges on the system.

\n

A process that is able to mmap a file is able to race Copy on Write (COW) page creation (within get_user_pages) with madvise(MADV_DONTNEED) kernel system calls. This would allow modified pages to bypass the page protection mechanism and modify the mapped file. The vulnerability could be abused by allowing an attacker to modify existing setuid files with instructions to elevate permissions. This attack has been found in the wild.

\n

Red Hat recommends that you update the kernel package or apply mitigations.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_5195_kernel|KERNEL_CVE_2016_5195", - "error_key": "KERNEL_CVE_2016_5195", - "plugin": "CVE_2016_5195_kernel", - "description": "Kernel vulnerable to privilege escalation via permission bypass (CVE-2016-5195)", - "summary": "A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally only have read-only access to and thus increase their privileges on the system.", - "generic": "A race condition was found in the way Linux kernel's memory subsystem handled breakage of the read only shared mappings COW situation on write access. An unprivileged local user could use this flaw to write to files they should normally have read-only access to, and thus increase their privileges on the system.\n\nA process that is able to mmap a file is able to race Copy on Write (COW) page creation (within get_user_pages) with madvise(MADV_DONTNEED) kernel system calls. This would allow modified pages to bypass the page protection mechanism and modify the mapped file. The vulnerability could be abused by allowing an attacker to modify existing setuid files with instructions to elevate permissions. This attack has been found in the wild. \n\nRed Hat recommends that you update the kernel package or apply mitigations.", - "reason": "

A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally have read-only access to and thus increase their privileges on the system.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n

There is currently no mitigation applied and your system is vulnerable.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-5195](https://access.redhat.com/security/cve/CVE-2016-5195)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2706661", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:33.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update the kernel package and restart the system:

\n
# yum update kernel\n# reboot\n

or

\n

Alternatively, this issue can be addressed by applying mitigations until the machine is restarted with the updated kernel package.

\n

Please refer to the Resolve Tab in the vulnerability article for information about the mitigation and the latest information.

\n" - }, - "maintenance_actions": [{ - "done": false, - "id": 29885, - "maintenance_plan": { - "maintenance_id": 12195, - "name": null, - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-jnewton", - "silenced": false, - "hidden": true, - "suggestion": "proposed", - "remote_branch": null - } - }] - }, { - "details": { - "package": "bash-4.2.45-5.el7", - "error_key": "VULNERABLE_BASH_DETECTED" - }, - "id": 709784505, - "rule_id": "bash_injection|VULNERABLE_BASH_DETECTED", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

In September 2014, an exploitable bug known as Shellshock was discovered in commonly shipped versions of the bash shell.

\n", - "generic_html": "

Hosts running earlier versions of bash are affected by the code injection vulnerability known as Shellshock.

\n", - "more_info_html": "

For further information about this critical vulnerability, see:

\n\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": true, - "ansible_mitigation": false, - "rule_id": "bash_injection|VULNERABLE_BASH_DETECTED", - "error_key": "VULNERABLE_BASH_DETECTED", - "plugin": "bash_injection", - "description": "Bash locally vulnerable via environment variables (CVE-2014-6271, CVE-2014-7169/Shellshock)", - "summary": "In September 2014, an exploitable bug known as Shellshock was discovered in commonly shipped versions of the bash shell.", - "generic": "Hosts running earlier versions of `bash` are affected by the code injection vulnerability known as **Shellshock**.", - "reason": "

This host is running a version of bash that is affected by the code injection vulnerability known as Shellshock.

\n

The package affected is bash-4.2.45-5.el7.

\n", - "type": null, - "more_info": "For further information about this **critical** vulnerability, see:\n* [Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271, CVE-2014-7169)](https://access.redhat.com/articles/1200223)\n* [CVE-2014-6271](https://access.redhat.com/security/cve/CVE-2014-6271)\n* [CVE-2014-7169](https://access.redhat.com/security/cve/CVE-2014-7169)", - "active": true, - "node_id": "1200223", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:36.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you upgrade bash immediately:

\n
# yum update bash\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "filesystems": [{ - "usage": "99", - "mountpoint": "/" - }, { - "usage": "99", - "mountpoint": "/" - }], - "error_key": "FILESYSTEM_CAPACITY" - }, - "id": 709784535, - "rule_id": "filesystem_capacity|FILESYSTEM_CAPACITY", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.

\n", - "generic_html": "

File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.

\n", - "more_info_html": "

How to increase the filesystem size?\nHow do I find out what is using disk space?

\n", - "severity": "WARN", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "filesystem_capacity|FILESYSTEM_CAPACITY", - "error_key": "FILESYSTEM_CAPACITY", - "plugin": "filesystem_capacity", - "description": "Decreased stability and/or performance due to filesystem over 95% capacity", - "summary": "File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.\n", - "generic": "File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.\n", - "reason": "

This host has the following file systems nearing or at capacity:

\n
    \n\n
  • Filesystem: / Usage: 99%
  • \n\n
  • Filesystem: / Usage: 99%
  • \n\n
", - "type": null, - "more_info": "[How to increase the filesystem size?](https://access.redhat.com/solutions/21820)\n[How do I find out what is using disk space?](https://access.redhat.com/solutions/1154683)\n", - "active": true, - "node_id": "1154683", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:36.000Z", - "rec_impact": 2, - "rec_likelihood": 3, - "resolution": "

To solve the issue, Red Hat recommends that you either add more storage capacity to the identified file systems, or remove unnecessary files to reduce the current usage.\nPlease refer to more_information part for more detailed steps.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "msg": "[ 0.000000] crashkernel=auto resulted in zero bytes of reserved memory.", - "auto_with_low_ram": true, - "rhel_ver": 7, - "error_key": "CRASHKERNEL_RESERVATION_FAILED" - }, - "id": 709784555, - "rule_id": "crashkernel_reservation_failed|CRASHKERNEL_RESERVATION_FAILED", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

The crashkernel configuration has failed to produce a working kdump environment. Configuration changes must be made to enable vmcore capture.

\n", - "generic_html": "

Kdump is unable to reserve memory for the kdump kernel. The kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.

\n", - "more_info_html": "", - "severity": "WARN", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "crashkernel_reservation_failed|CRASHKERNEL_RESERVATION_FAILED", - "error_key": "CRASHKERNEL_RESERVATION_FAILED", - "plugin": "crashkernel_reservation_failed", - "description": "Kdump crashkernel reservation failed due to improper configuration of crashkernel parameter", - "summary": "The crashkernel configuration has failed to produce a working kdump environment. Configuration changes must be made to enable vmcore capture.\n", - "generic": "Kdump is unable to reserve memory for the kdump kernel. The kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.", - "reason": "

This host is unable to reserve memory for the kdump kernel:

\n
[    0.000000] crashkernel=auto resulted in zero bytes of reserved memory.\n

This means the kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.

\n", - "type": null, - "more_info": null, - "active": true, - "node_id": "59432", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:33.000Z", - "rec_impact": 1, - "rec_likelihood": 3, - "resolution": "

To fix this issue, Red Hat recommends that you change the crashkernel setting in the grub.conf file.

\n

This host failed to reserved memory with auto crashkernel parameter due to low physical memory. The memory must be reserved by explicitly requesting the reservation size, for example: crashkernel=128M.

\n

For details of crashkernel setting, please refer to the Knowledge article How should the crashkernel parameter be configured for using kdump on RHEL7? to pickup the setting specifically for your host.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "selinux_info": true, - "package_name": "kernel", - "selinux_enforcing": true, - "selinux_can_help": true, - "minimal_selinux_policy": "selinux-policy-3.13.1-81.el7", - "selinux_enabled": true, - "vulnerable_kernel": "3.10.0-123.el7", - "active_policy": "selinux-policy-3.12.1-153.el7", - "dccp_loading_disabled": null, - "error_key": "KERNEL_CVE_2017_6074", - "enough_policy": false, - "dccp_loaded": null, - "mitigation_info": false - }, - "id": 709784575, - "rule_id": "CVE_2017_6074_kernel|KERNEL_CVE_2017_6074", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074. An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system.

\n", - "generic_html": "

A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074.

\n

An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. A local user could initiate a DCCP network connection on any local system network interface and then create specially-crafted memory allocations containing malicious instructions that can then either cause a crash or potentially escalate the user's privileges.

\n

An attacker must have access to a local account on the system; this is not a remote attack and it requires IPv6 support to be enabled on the system.

\n

Red Hat recommends that you update the kernel when possible. Otherwise, you can use proposed mitigation to disable DCCP. SELinux in enforcing mode can also mitigate the issue under specific circumstances.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2017_6074_kernel|KERNEL_CVE_2017_6074", - "error_key": "KERNEL_CVE_2017_6074", - "plugin": "CVE_2017_6074_kernel", - "description": "Kernel vulnerable to local privilege escalation via DCCP module (CVE-2017-6074)", - "summary": "A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned [CVE-2017-6074](https://access.redhat.com/security/cve/CVE-2017-6074). An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system.\n", - "generic": "A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074. \n\nAn unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. A local user could initiate a DCCP network connection on any local system network interface and then create specially-crafted memory allocations containing malicious instructions that can then either cause a crash or potentially escalate the user's privileges.\n\nAn attacker must have access to a local account on the system; this is not a remote attack and it requires IPv6 support to be enabled on the system.\n\nRed Hat recommends that you update the kernel when possible. Otherwise, you can use proposed mitigation to disable DCCP. SELinux in enforcing mode can also mitigate the issue under specific circumstances.\n", - "reason": "

A use-after-free flaw was found within the Linux kernel IPv6 DCCP network protocol code.

\n

This host is affected because:

\n
  • It is running kernel 3.10.0-123.el7.
  • SELinux policy is outdated.
\n\n\n\n\n\n\n

Your installed SELinux policy is selinux-policy-3.12.1-153.el7; however, to mitigate the issue, the earliest required version is selinux-policy-3.13.1-81.el7.

\n", - "type": null, - "more_info": "* For more information about the flaw, see [CVE-2017-6074](https://access.redhat.com/security/cve/CVE-2017-6074).\n* To learn how to upgrade packages, see [What is yum and how do I use it?](https://access.redhat.com/solutions/9934).\n* For more information about SELinux, see [Benefits of running SELinux](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/chap-Security-Enhanced_Linux-Introduction.html#sect-Security-Enhanced_Linux-Introduction-Benefits_of_running_SELinux).\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating the kernel package and rebooting the system.

\n
# yum update kernel\n# reboot\n

Alternatively, apply one of the following mitigations:

\n
Update SELinux policy
\n

Update your SELinux policy:

\n
# yum update selinux-policy\n

The system does not provide enough information for Insights about loaded kernel modules. It is not possible to recommend a mitigation based on kernel modules.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "mod_loading_disabled": null, - "package_name": "kernel", - "error_key": "KERNEL_CVE_2017_2636", - "vulnerable_kernel": "3.10.0-123.el7", - "mod_loaded": null, - "mitigation_info": false - }, - "id": 766342165, - "rule_id": "CVE_2017_2636_kernel|KERNEL_CVE_2017_2636", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A vulnerability in the Linux kernel allowing local privilege escalation was discovered.\nThe issue was reported as CVE-2017-2636.

\n", - "generic_html": "

A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation. It has been assigned CVE-2017-2636.

\n

An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. The kernel uses a TTY subsystem to take and show terminal output to connected systems. An attacker crafting specific-sized memory allocations could abuse this mechanism to place a kernel function pointer with malicious instructions to be executed on behalf of the attacker.

\n

An attacker must have access to a local account on the system; this is not a remote attack. Exploiting this flaw does not require Microgate or SyncLink hardware to be in use.

\n

Red Hat recommends that you use the proposed mitigation to disable the N_HDLC module.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2017_2636_kernel|KERNEL_CVE_2017_2636", - "error_key": "KERNEL_CVE_2017_2636", - "plugin": "CVE_2017_2636_kernel", - "description": "Kernel vulnerable to local privilege escalation via n_hdlc module (CVE-2017-2636)", - "summary": "A vulnerability in the Linux kernel allowing local privilege escalation was discovered.\nThe issue was reported as [CVE-2017-2636](https://access.redhat.com/security/cve/CVE-2017-2636).\n", - "generic": "A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation. It has been assigned CVE-2017-2636.\n\nAn unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. The kernel uses a TTY subsystem to take and show terminal output to connected systems. An attacker crafting specific-sized memory allocations could abuse this mechanism to place a kernel function pointer with malicious instructions to be executed on behalf of the attacker.\n\nAn attacker must have access to a local account on the system; this is not a remote attack. Exploiting this flaw does not require Microgate or SyncLink hardware to be in use.\n\nRed Hat recommends that you use the proposed mitigation to disable the N_HDLC module.\n", - "reason": "

A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n", - "type": null, - "more_info": "* For more information about the flaw, see [CVE-2017-2636](https://access.redhat.com/security/cve/CVE-2017-2636) and [CVE-2017-2636 article](https://access.redhat.com/security/vulnerabilities/CVE-2017-2636).\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating the kernel package and rebooting the system.

\n
# yum update kernel\n# reboot\n
" - }, - "maintenance_actions": [{ - "done": false, - "id": 58335, - "maintenance_plan": { - "maintenance_id": 16545, - "name": "Insights Summit 2017 - n_HDLC", - "description": "", - "start": "2017-05-06T02:00:00.000Z", - "end": "2017-05-06T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 61895, - "maintenance_plan": { - "maintenance_id": 16835, - "name": "Summit 2017 N_HDLC", - "description": "", - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 66225, - "maintenance_plan": { - "maintenance_id": 19445, - "name": "Seattle's Best Plan", - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 71075, - "maintenance_plan": { - "maintenance_id": 19845, - "name": "Optum N_HDLC FIX", - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }] - } -] diff --git a/awx/ui/test/spec/inventories/insights/data/not_solvable.insights-data.js b/awx/ui/test/spec/inventories/insights/data/not_solvable.insights-data.js deleted file mode 100644 index 6646964585..0000000000 --- a/awx/ui/test/spec/inventories/insights/data/not_solvable.insights-data.js +++ /dev/null @@ -1,381 +0,0 @@ -export default [ - { - "details": { - "vulnerable_setting": "hosts: files dns", - "affected_package": "glibc-2.17-55.el7", - "error_key": "GLIBC_CVE_2015_7547" - }, - "id": 709784455, - "rule_id": "CVE_2015_7547_glibc|GLIBC_CVE_2015_7547", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A critical security flaw in the glibc library was found. It allows an attacker to crash an application built against that library or, potentially, execute arbitrary code with privileges of the user running the application.

\n", - "generic_html": "

The glibc library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the libresolv part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when libresolv is called from the nss_dns NSS service module. This flaw is known as CVE-2015-7547.

\n", - "more_info_html": "\n", - "severity": "ERROR", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2015_7547_glibc|GLIBC_CVE_2015_7547", - "error_key": "GLIBC_CVE_2015_7547", - "plugin": "CVE_2015_7547_glibc", - "description": "Remote code execution vulnerability in libresolv via crafted DNS response (CVE-2015-7547)", - "summary": "A critical security flaw in the `glibc` library was found. It allows an attacker to crash an application built against that library or, potentially, execute arbitrary code with privileges of the user running the application.", - "generic": "The `glibc` library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the `libresolv` part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when `libresolv` is called from the nss_dns NSS service module. This flaw is known as [CVE-2015-7547](https://access.redhat.com/security/cve/CVE-2015-7547).", - "reason": "

This host is vulnerable because it has vulnerable package glibc-2.17-55.el7 installed and DNS is enabled in /etc/nsswitch.conf:

\n
hosts:      files dns\n

The glibc library is vulnerable to a stack-based buffer overflow security flaw. A remote attacker could create specially crafted DNS responses that could cause the libresolv part of the library, which performs dual A/AAAA DNS queries, to crash or potentially execute code with the permissions of the user running the library. The issue is only exposed when libresolv is called from the nss_dns NSS service module. This flaw is known as CVE-2015-7547.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2015-7547](https://access.redhat.com/security/cve/CVE-2015-7547).\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2168451", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:35.000Z", - "rec_impact": 4, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating glibc and restarting the affected system:

\n
# yum update glibc\n# reboot\n

Alternatively, you can restart all affected services, but because this vulnerability affects a large amount of applications on the system, the best solution is to restart the system.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "affected_kernel": "3.10.0-123.el7", - "error_key": "KERNEL_CVE-2016-0728" - }, - "id": 709784465, - "rule_id": "CVE_2016_0728_kernel|KERNEL_CVE-2016-0728", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A vulnerability in the Linux kernel allowing local privilege escalation was discovered. The issue was reported as CVE-2016-0728.

\n", - "generic_html": "

A vulnerability in the Linux kernel rated Important was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as CVE-2016-0728.

\n

Red Hat recommends that you update the kernel and reboot the system. If you cannot reboot now, consider applying the systemtap patch to update your running kernel.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_0728_kernel|KERNEL_CVE-2016-0728", - "error_key": "KERNEL_CVE-2016-0728", - "plugin": "CVE_2016_0728_kernel", - "description": "Kernel key management subsystem vulnerable to local privilege escalation (CVE-2016-0728)", - "summary": "A vulnerability in the Linux kernel allowing local privilege escalation was discovered. The issue was reported as [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).", - "generic": "A vulnerability in the Linux kernel rated **Important** was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).\n\nRed Hat recommends that you update the kernel and reboot the system. If you cannot reboot now, consider applying the [systemtap patch](https://bugzilla.redhat.com/attachment.cgi?id=1116284&action=edit) to update your running kernel.", - "reason": "

A vulnerability in the Linux kernel rated Important was discovered. The use-after-free flaw relates to the way the Linux kernel's key management subsystem handles keyring object reference counting in certain error paths of the join_session_keyring() function. A local, unprivileged user could use this flaw to escalate their privileges on the system. The issue was reported as CVE-2016-0728.

\n

The host is vulnerable as it is running kernel-3.10.0-123.el7.

\n", - "type": null, - "more_info": "* For more information about the flaws and versions of the package that are vulnerable see [CVE-2016-0728](https://access.redhat.com/security/cve/cve-2016-0728).\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2130791", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:37.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update kernel and reboot. If you cannot reboot now, consider applying the systemtap patch to update your running kernel.

\n
# yum update kernel\n# reboot\n-or-\n# debuginfo-install kernel     (or equivalent)\n# stap -vgt -Gfix_p=1 -Gtrace_p=0 cve20160728e.stp\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "processes_listening_int": [], - "processes_listening_ext": [], - "error_key": "OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "processes_listening": [], - "processes_names": [], - "vulnerable_package": "openssl-libs-1.0.1e-34.el7" - }, - "id": 709784475, - "rule_id": "CVE_2016_0800_openssl_drown|OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A new cross-protocol attack against SSLv2 protocol has been found. It has been assigned CVE-2016-0800 and is referred to as DROWN - Decrypting RSA using Obsolete and Weakened eNcryption. An attacker can decrypt passively collected TLS sessions between up-to-date client and server which supports SSLv2.

\n", - "generic_html": "

A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.

\n

A more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see CVE-2015-0293).

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_0800_openssl_drown|OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "error_key": "OPENSSL_CVE_2016_0800_SPECIAL_DROWN", - "plugin": "CVE_2016_0800_openssl_drown", - "description": "OpenSSL vulnerable to very efficient session decryption (CVE-2016-0800/Special DROWN)", - "summary": "A new cross-protocol attack against SSLv2 protocol has been found. It has been assigned [CVE-2016-0800](https://access.redhat.com/security/cve/CVE-2016-0800) and is referred to as DROWN - Decrypting RSA using Obsolete and Weakened eNcryption. An attacker can decrypt passively collected TLS sessions between up-to-date client and server which supports SSLv2.", - "generic": "A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.\n\nA more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see [CVE-2015-0293](https://access.redhat.com/security/cve/CVE-2015-0293)).", - "reason": "

This host is vulnerable because it has vulnerable package openssl-libs-1.0.1e-34.el7 installed.

\n

This package does not have a patch for CVE-2015-0293 applied, which makes the system especially vulnerable. This is known as Special DROWN. An attacker can use this flaw to perform active man-in-the-middle (MITM) attacks and impersonate a TLS server to connecting TLS client in a matter of minutes.

\n

Fortunately, it does not seem to run any processes that use OpenSSL libraries.

\n

A new cross-protocol attack against a vulnerability in the SSLv2 protocol has been found. It can be used to passively decrypt collected TLS/SSL sessions from any connection that used an RSA key exchange cypher suite on a server that supports SSLv2. Even if a given service does not support SSLv2 the connection is still vulnerable if another service does and shares the same RSA private key.

\n

A more efficient variant of the attack exists against unpatched OpenSSL servers using versions that predate security advisories released on March 19, 2015 (see CVE-2015-0293).

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-0800](https://access.redhat.com/security/cve/CVE-2016-0800)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2174451", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:32.000Z", - "rec_impact": 3, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update openssl and restart the affected system:

\n
# yum update openssl\n# reboot\n

Alternatively, you can restart all affected services (that is, the ones linked to the openssl library), especially those listening on public IP addresses.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "package": "bash-4.2.45-5.el7", - "error_key": "VULNERABLE_BASH_DETECTED" - }, - "id": 709784505, - "rule_id": "bash_injection|VULNERABLE_BASH_DETECTED", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

In September 2014, an exploitable bug known as Shellshock was discovered in commonly shipped versions of the bash shell.

\n", - "generic_html": "

Hosts running earlier versions of bash are affected by the code injection vulnerability known as Shellshock.

\n", - "more_info_html": "

For further information about this critical vulnerability, see:

\n\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": true, - "ansible_mitigation": false, - "rule_id": "bash_injection|VULNERABLE_BASH_DETECTED", - "error_key": "VULNERABLE_BASH_DETECTED", - "plugin": "bash_injection", - "description": "Bash locally vulnerable via environment variables (CVE-2014-6271, CVE-2014-7169/Shellshock)", - "summary": "In September 2014, an exploitable bug known as Shellshock was discovered in commonly shipped versions of the bash shell.", - "generic": "Hosts running earlier versions of `bash` are affected by the code injection vulnerability known as **Shellshock**.", - "reason": "

This host is running a version of bash that is affected by the code injection vulnerability known as Shellshock.

\n

The package affected is bash-4.2.45-5.el7.

\n", - "type": null, - "more_info": "For further information about this **critical** vulnerability, see:\n* [Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271, CVE-2014-7169)](https://access.redhat.com/articles/1200223)\n* [CVE-2014-6271](https://access.redhat.com/security/cve/CVE-2014-6271)\n* [CVE-2014-7169](https://access.redhat.com/security/cve/CVE-2014-7169)", - "active": true, - "node_id": "1200223", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:36.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you upgrade bash immediately:

\n
# yum update bash\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "detected_problem_log_perms": [{ - "log_perms_dirfilename": "/var/log/cron", - "log_perms_sensitive": true, - "log_perms_ls_line": "-rw-r--r--. 1 root root 15438 May 25 10:01 cron" - }], - "error_key": "HARDENING_LOGGING_3_LOG_PERMS" - }, - "id": 709784525, - "rule_id": "hardening_logging_log_perms|HARDENING_LOGGING_3_LOG_PERMS", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

Issues related to system logging and auditing were detected on your system. Important services are disabled or log file permissions are not secure.

\n", - "generic_html": "

Issues related to system logging and auditing were detected on your system.

\n

Red Hat recommends that the logging service rsyslog and the auditing service auditd are enabled and that log files in /var/log have secure permissions.

\n", - "more_info_html": "\n", - "severity": "INFO", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "hardening_logging_log_perms|HARDENING_LOGGING_3_LOG_PERMS", - "error_key": "HARDENING_LOGGING_3_LOG_PERMS", - "plugin": "hardening_logging_log_perms", - "description": "Decreased security in system logging permissions", - "summary": "Issues related to system logging and auditing were detected on your system. Important services are disabled or log file permissions are not secure.\n", - "generic": "Issues related to system logging and auditing were detected on your system.\n\nRed Hat recommends that the logging service `rsyslog` and the auditing service `auditd` are enabled and that log files in `/var/log` have secure permissions.\n", - "reason": "

Log files have permission issues.

\n

The following files or directories in /var/log have file permissions that differ from the default RHEL configuration and are possibly non-secure. Red Hat recommends that the file permissions be adjusted to more secure settings.

\n\n \n \n \n \n \n\n\n\n\n\n\n\n
File or directory nameDetected problemOutput from ls -l
/var/log/cronUsers other than root can read or write.-rw-r--r--. 1 root root 15438 May 25 10:01 cron
\n\n\n\n", - "type": null, - "more_info": "* [Why is `/var/log/cron` world readable in RHEL7?](https://access.redhat.com/solutions/1491573)\n* [Using the chkconfig Utility](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s2-services-chkconfig.html) to configure services on RHEL 6\n* [Managing System Services](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Services.html) to configure services on RHEL 7\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2017-05-16T04:08:34.000Z", - "rec_impact": 1, - "rec_likelihood": 1, - "resolution": "

Red Hat recommends that you perform the following adjustments:

\n

Fixing permission issues depends on whether there is a designated safe group on your system that has Read access to the log files. This situation might exist if you want to allow certain administrators to see the log files without becoming root. To prevent log tampering, no other user than root should have permissions to Write to the log files. (The btmp and wtmp files are owned by the utmp group but other users should still be unable to write to them.)

\n

Fix for a default RHEL configuration

\n

(No designated group for reading log files)

\n
chown root:root /var/log/cron\nchmod u=rw,g-x,o-rwx /var/log/cron\n

Fix for a configuration with a designated safe group for reading log files

\n

In the following lines, substitute the name of your designated safe group for the string safegroup:

\n
chown root:safegroup /var/log/cron\nchmod u=rw,g-x,o-rwx /var/log/cron\n
" - }, - "maintenance_actions": [] - }, { - "details": { - "filesystems": [{ - "usage": "99", - "mountpoint": "/" - }, { - "usage": "99", - "mountpoint": "/" - }], - "error_key": "FILESYSTEM_CAPACITY" - }, - "id": 709784535, - "rule_id": "filesystem_capacity|FILESYSTEM_CAPACITY", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.

\n", - "generic_html": "

File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.

\n", - "more_info_html": "

How to increase the filesystem size?\nHow do I find out what is using disk space?

\n", - "severity": "WARN", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "filesystem_capacity|FILESYSTEM_CAPACITY", - "error_key": "FILESYSTEM_CAPACITY", - "plugin": "filesystem_capacity", - "description": "Decreased stability and/or performance due to filesystem over 95% capacity", - "summary": "File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.\n", - "generic": "File systems nearing full capacity can cause performance issues because blocks must be used from different block groups. \nBesides, file systems at or exceeding capacity will have stability issues because applications will no longer be able to write to the file system.\n", - "reason": "

This host has the following file systems nearing or at capacity:

\n
    \n\n
  • Filesystem: / Usage: 99%
  • \n\n
  • Filesystem: / Usage: 99%
  • \n\n
", - "type": null, - "more_info": "[How to increase the filesystem size?](https://access.redhat.com/solutions/21820)\n[How do I find out what is using disk space?](https://access.redhat.com/solutions/1154683)\n", - "active": true, - "node_id": "1154683", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:36.000Z", - "rec_impact": 2, - "rec_likelihood": 3, - "resolution": "

To solve the issue, Red Hat recommends that you either add more storage capacity to the identified file systems, or remove unnecessary files to reduce the current usage.\nPlease refer to more_information part for more detailed steps.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "msg": "[ 0.000000] crashkernel=auto resulted in zero bytes of reserved memory.", - "auto_with_low_ram": true, - "rhel_ver": 7, - "error_key": "CRASHKERNEL_RESERVATION_FAILED" - }, - "id": 709784555, - "rule_id": "crashkernel_reservation_failed|CRASHKERNEL_RESERVATION_FAILED", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

The crashkernel configuration has failed to produce a working kdump environment. Configuration changes must be made to enable vmcore capture.

\n", - "generic_html": "

Kdump is unable to reserve memory for the kdump kernel. The kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.

\n", - "more_info_html": "", - "severity": "WARN", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "crashkernel_reservation_failed|CRASHKERNEL_RESERVATION_FAILED", - "error_key": "CRASHKERNEL_RESERVATION_FAILED", - "plugin": "crashkernel_reservation_failed", - "description": "Kdump crashkernel reservation failed due to improper configuration of crashkernel parameter", - "summary": "The crashkernel configuration has failed to produce a working kdump environment. Configuration changes must be made to enable vmcore capture.\n", - "generic": "Kdump is unable to reserve memory for the kdump kernel. The kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.", - "reason": "

This host is unable to reserve memory for the kdump kernel:

\n
[    0.000000] crashkernel=auto resulted in zero bytes of reserved memory.\n

This means the kdump service has not started and a vmcore will not be captured if the host crashes, which will make it difficult for our support technicians to determine why the machine crashed.

\n", - "type": null, - "more_info": null, - "active": true, - "node_id": "59432", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:33.000Z", - "rec_impact": 1, - "rec_likelihood": 3, - "resolution": "

To fix this issue, Red Hat recommends that you change the crashkernel setting in the grub.conf file.

\n

This host failed to reserved memory with auto crashkernel parameter due to low physical memory. The memory must be reserved by explicitly requesting the reservation size, for example: crashkernel=128M.

\n

For details of crashkernel setting, please refer to the Knowledge article How should the crashkernel parameter be configured for using kdump on RHEL7? to pickup the setting specifically for your host.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "error_key": "TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION" - }, - "id": 709784565, - "rule_id": "tzdata_need_upgrade|TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.

\n", - "generic_html": "

System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.

\n", - "more_info_html": "", - "severity": "INFO", - "ansible": false, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "tzdata_need_upgrade|TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "error_key": "TZDATA_NEED_UPGRADE_INFO_NEED_MANUAL_ACTION", - "plugin": "tzdata_need_upgrade", - "description": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale", - "summary": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.\n", - "generic": "System clock inaccurate when a leap second event happens in a non-NTP system without following the TAI timescale.\n", - "reason": "

This system running as a non-NTP system is following the UTC timescale. In this situation, manual correction is required to avoid system clock inaccuracy when a leap second event happens.

\n", - "type": null, - "more_info": null, - "active": true, - "node_id": "1465713", - "category": "Stability", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 1, - "resolution": "

The system clock of this system needs manual correction when a leap second event happens. For example:

\n
\n\n# date -s \"20170101 HH:MM:SS\"\n\n
\n\n

You need to replace "HH:MM:SS" with the accurate time after the leap second occurs.

\n" - }, - "maintenance_actions": [] - }, { - "details": { - "selinux_info": true, - "package_name": "kernel", - "selinux_enforcing": true, - "selinux_can_help": true, - "minimal_selinux_policy": "selinux-policy-3.13.1-81.el7", - "selinux_enabled": true, - "vulnerable_kernel": "3.10.0-123.el7", - "active_policy": "selinux-policy-3.12.1-153.el7", - "dccp_loading_disabled": null, - "error_key": "KERNEL_CVE_2017_6074", - "enough_policy": false, - "dccp_loaded": null, - "mitigation_info": false - }, - "id": 709784575, - "rule_id": "CVE_2017_6074_kernel|KERNEL_CVE_2017_6074", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074. An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system.

\n", - "generic_html": "

A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074.

\n

An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. A local user could initiate a DCCP network connection on any local system network interface and then create specially-crafted memory allocations containing malicious instructions that can then either cause a crash or potentially escalate the user's privileges.

\n

An attacker must have access to a local account on the system; this is not a remote attack and it requires IPv6 support to be enabled on the system.

\n

Red Hat recommends that you update the kernel when possible. Otherwise, you can use proposed mitigation to disable DCCP. SELinux in enforcing mode can also mitigate the issue under specific circumstances.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2017_6074_kernel|KERNEL_CVE_2017_6074", - "error_key": "KERNEL_CVE_2017_6074", - "plugin": "CVE_2017_6074_kernel", - "description": "Kernel vulnerable to local privilege escalation via DCCP module (CVE-2017-6074)", - "summary": "A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned [CVE-2017-6074](https://access.redhat.com/security/cve/CVE-2017-6074). An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system.\n", - "generic": "A use-after-free flaw was found in the Linux kernel IPv6 DCCP network protocol code. It has been assigned CVE-2017-6074. \n\nAn unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. A local user could initiate a DCCP network connection on any local system network interface and then create specially-crafted memory allocations containing malicious instructions that can then either cause a crash or potentially escalate the user's privileges.\n\nAn attacker must have access to a local account on the system; this is not a remote attack and it requires IPv6 support to be enabled on the system.\n\nRed Hat recommends that you update the kernel when possible. Otherwise, you can use proposed mitigation to disable DCCP. SELinux in enforcing mode can also mitigate the issue under specific circumstances.\n", - "reason": "

A use-after-free flaw was found within the Linux kernel IPv6 DCCP network protocol code.

\n

This host is affected because:

\n
  • It is running kernel 3.10.0-123.el7.
  • SELinux policy is outdated.
\n\n\n\n\n\n\n

Your installed SELinux policy is selinux-policy-3.12.1-153.el7; however, to mitigate the issue, the earliest required version is selinux-policy-3.13.1-81.el7.

\n", - "type": null, - "more_info": "* For more information about the flaw, see [CVE-2017-6074](https://access.redhat.com/security/cve/CVE-2017-6074).\n* To learn how to upgrade packages, see [What is yum and how do I use it?](https://access.redhat.com/solutions/9934).\n* For more information about SELinux, see [Benefits of running SELinux](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/chap-Security-Enhanced_Linux-Introduction.html#sect-Security-Enhanced_Linux-Introduction-Benefits_of_running_SELinux).\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating the kernel package and rebooting the system.

\n
# yum update kernel\n# reboot\n

Alternatively, apply one of the following mitigations:

\n
Update SELinux policy
\n

Update your SELinux policy:

\n
# yum update selinux-policy\n

The system does not provide enough information for Insights about loaded kernel modules. It is not possible to recommend a mitigation based on kernel modules.

\n" - }, - "maintenance_actions": [] - } -] diff --git a/awx/ui/test/spec/inventories/insights/data/solvable.insights-data.js b/awx/ui/test/spec/inventories/insights/data/solvable.insights-data.js deleted file mode 100644 index 97a5ec25f8..0000000000 --- a/awx/ui/test/spec/inventories/insights/data/solvable.insights-data.js +++ /dev/null @@ -1,269 +0,0 @@ -export default [ - { - "details": { - "vulnerable_kernel": "3.10.0-123.el7", - "package_name": "kernel", - "error_key": "KERNEL_CVE_2016_5195" - }, - "id": 709784485, - "rule_id": "CVE_2016_5195_kernel|KERNEL_CVE_2016_5195", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally only have read-only access to and thus increase their privileges on the system.

\n", - "generic_html": "

A race condition was found in the way Linux kernel's memory subsystem handled breakage of the read only shared mappings COW situation on write access. An unprivileged local user could use this flaw to write to files they should normally have read-only access to, and thus increase their privileges on the system.

\n

A process that is able to mmap a file is able to race Copy on Write (COW) page creation (within get_user_pages) with madvise(MADV_DONTNEED) kernel system calls. This would allow modified pages to bypass the page protection mechanism and modify the mapped file. The vulnerability could be abused by allowing an attacker to modify existing setuid files with instructions to elevate permissions. This attack has been found in the wild.

\n

Red Hat recommends that you update the kernel package or apply mitigations.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_5195_kernel|KERNEL_CVE_2016_5195", - "error_key": "KERNEL_CVE_2016_5195", - "plugin": "CVE_2016_5195_kernel", - "description": "Kernel vulnerable to privilege escalation via permission bypass (CVE-2016-5195)", - "summary": "A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally only have read-only access to and thus increase their privileges on the system.", - "generic": "A race condition was found in the way Linux kernel's memory subsystem handled breakage of the read only shared mappings COW situation on write access. An unprivileged local user could use this flaw to write to files they should normally have read-only access to, and thus increase their privileges on the system.\n\nA process that is able to mmap a file is able to race Copy on Write (COW) page creation (within get_user_pages) with madvise(MADV_DONTNEED) kernel system calls. This would allow modified pages to bypass the page protection mechanism and modify the mapped file. The vulnerability could be abused by allowing an attacker to modify existing setuid files with instructions to elevate permissions. This attack has been found in the wild. \n\nRed Hat recommends that you update the kernel package or apply mitigations.", - "reason": "

A flaw was found in the Linux kernel's memory subsystem. An unprivileged local user could use this flaw to write to files they would normally have read-only access to and thus increase their privileges on the system.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n

There is currently no mitigation applied and your system is vulnerable.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-5195](https://access.redhat.com/security/cve/CVE-2016-5195)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2706661", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:33.000Z", - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update the kernel package and restart the system:

\n
# yum update kernel\n# reboot\n

or

\n

Alternatively, this issue can be addressed by applying mitigations until the machine is restarted with the updated kernel package.

\n

Please refer to the Resolve Tab in the vulnerability article for information about the mitigation and the latest information.

\n" - }, - "maintenance_actions": [{ - "done": false, - "id": 29885, - "maintenance_plan": { - "maintenance_id": 12195, - "name": null, - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-jnewton", - "silenced": false, - "hidden": true, - "suggestion": "proposed", - "remote_branch": null - } - }] - }, - { - "details": { - "mitigation_conf": "no", - "sysctl_live_ack_limit": "100", - "package_name": "kernel", - "sysctl_live_ack_limit_line": "net.ipv4.tcp_challenge_ack_limit = 100", - "error_key": "KERNEL_CVE_2016_5696_URGENT", - "vulnerable_kernel": "3.10.0-123.el7", - "sysctl_conf_ack_limit": "100", - "sysctl_conf_ack_limit_line": "net.ipv4.tcp_challenge_ack_limit=100", - "mitigation_live": "no" - }, - "id": 766342155, - "rule_id": "CVE_2016_5696_kernel|KERNEL_CVE_2016_5696_URGENT", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A flaw in the Linux kernel's TCP/IP networking subsystem implementation of the RFC 5961 challenge ACK rate limiting was found that could allow an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n", - "generic_html": "

A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack (RFC 5961) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n

Red Hat recommends that you update the kernel package or apply mitigations.

\n", - "more_info_html": "\n", - "severity": "ERROR", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2016_5696_kernel|KERNEL_CVE_2016_5696_URGENT", - "error_key": "KERNEL_CVE_2016_5696_URGENT", - "plugin": "CVE_2016_5696_kernel", - "description": "Kernel vulnerable to man-in-the-middle via payload injection", - "summary": "A flaw in the Linux kernel's TCP/IP networking subsystem implementation of the [RFC 5961](https://tools.ietf.org/html/rfc5961) challenge ACK rate limiting was found that could allow an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.", - "generic": "A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack ([RFC 5961](https://tools.ietf.org/html/rfc5961)) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack. \n\nRed Hat recommends that you update the kernel package or apply mitigations.", - "reason": "

A flaw was found in the implementation of the Linux kernel's handling of networking challenge ack (RFC 5961) where an attacker is able to determine the\nshared counter. This flaw allows an attacker located on different subnet to inject or take over a TCP connection between a server and client without needing to use a traditional man-in-the-middle (MITM) attack.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n

Your currently loaded kernel configuration contains this setting:

\n
net.ipv4.tcp_challenge_ack_limit = 100\n

Your currently stored kernel configuration is:

\n
net.ipv4.tcp_challenge_ack_limit=100\n

There is currently no mitigation applied and your system is vulnerable.

\n", - "type": null, - "more_info": "* For more information about the flaw see [CVE-2016-5696](https://access.redhat.com/security/cve/CVE-2016-5696)\n* To learn how to upgrade packages, see \"[What is yum and how do I use it?](https://access.redhat.com/solutions/9934)\"\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat Products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).", - "active": true, - "node_id": "2438571", - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": "2016-10-31T04:08:32.000Z", - "rec_impact": 4, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends that you update the kernel package and restart the system:

\n
# yum update kernel\n# reboot\n

or

\n

Alternatively, this issue can be addressed by applying the following mitigations until the machine is restarted with the updated kernel package.

\n

Edit /etc/sysctl.conf file as root, add the mitigation configuration, and reload the kernel configuration:

\n
# echo "net.ipv4.tcp_challenge_ack_limit = 2147483647" >> /etc/sysctl.conf \n# sysctl -p\n
" - }, - "maintenance_actions": [{ - "done": false, - "id": 56045, - "maintenance_plan": { - "maintenance_id": 15875, - "name": "Payload Injection Fix", - "description": "", - "start": "2017-06-01T02:00:00.000Z", - "end": "2017-06-01T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 61575, - "maintenance_plan": { - "maintenance_id": 16825, - "name": "Summit 2017 Plan 1", - "description": "", - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 66175, - "maintenance_plan": { - "maintenance_id": 19435, - "name": null, - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 71015, - "maintenance_plan": { - "maintenance_id": 19835, - "name": "Optum Payload", - "description": "", - "start": "2017-05-27T02:00:00.000Z", - "end": "2017-05-27T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }] - }, - { - "details": { - "mod_loading_disabled": null, - "package_name": "kernel", - "error_key": "KERNEL_CVE_2017_2636", - "vulnerable_kernel": "3.10.0-123.el7", - "mod_loaded": null, - "mitigation_info": false - }, - "id": 766342165, - "rule_id": "CVE_2017_2636_kernel|KERNEL_CVE_2017_2636", - "system_id": "f31b6265939d4a8492d3ce9655dc94be", - "account_number": "540155", - "uuid": "d195e3c5e5e6469781c4e59fa3f5ba87", - "date": "2017-05-25T14:01:19.000Z", - "rule": { - "summary_html": "

A vulnerability in the Linux kernel allowing local privilege escalation was discovered.\nThe issue was reported as CVE-2017-2636.

\n", - "generic_html": "

A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation. It has been assigned CVE-2017-2636.

\n

An unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. The kernel uses a TTY subsystem to take and show terminal output to connected systems. An attacker crafting specific-sized memory allocations could abuse this mechanism to place a kernel function pointer with malicious instructions to be executed on behalf of the attacker.

\n

An attacker must have access to a local account on the system; this is not a remote attack. Exploiting this flaw does not require Microgate or SyncLink hardware to be in use.

\n

Red Hat recommends that you use the proposed mitigation to disable the N_HDLC module.

\n", - "more_info_html": "\n", - "severity": "WARN", - "ansible": true, - "ansible_fix": false, - "ansible_mitigation": false, - "rule_id": "CVE_2017_2636_kernel|KERNEL_CVE_2017_2636", - "error_key": "KERNEL_CVE_2017_2636", - "plugin": "CVE_2017_2636_kernel", - "description": "Kernel vulnerable to local privilege escalation via n_hdlc module (CVE-2017-2636)", - "summary": "A vulnerability in the Linux kernel allowing local privilege escalation was discovered.\nThe issue was reported as [CVE-2017-2636](https://access.redhat.com/security/cve/CVE-2017-2636).\n", - "generic": "A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation. It has been assigned CVE-2017-2636.\n\nAn unprivileged local user could use this flaw to execute arbitrary code in kernel memory and increase their privileges on the system. The kernel uses a TTY subsystem to take and show terminal output to connected systems. An attacker crafting specific-sized memory allocations could abuse this mechanism to place a kernel function pointer with malicious instructions to be executed on behalf of the attacker.\n\nAn attacker must have access to a local account on the system; this is not a remote attack. Exploiting this flaw does not require Microgate or SyncLink hardware to be in use.\n\nRed Hat recommends that you use the proposed mitigation to disable the N_HDLC module.\n", - "reason": "

A use-after-free flaw was found in the Linux kernel implementation of the HDLC (High-Level Data Link Control) TTY line discipline implementation.

\n

This host is affected because it is running kernel 3.10.0-123.el7.

\n", - "type": null, - "more_info": "* For more information about the flaw, see [CVE-2017-2636](https://access.redhat.com/security/cve/CVE-2017-2636) and [CVE-2017-2636 article](https://access.redhat.com/security/vulnerabilities/CVE-2017-2636).\n* The Customer Portal page for the [Red Hat Security Team](https://access.redhat.com/security/) contains more information about policies, procedures, and alerts for Red Hat products.\n* The Security Team also maintains a frequently updated blog at [securityblog.redhat.com](https://securityblog.redhat.com).\n", - "active": true, - "node_id": null, - "category": "Security", - "retired": false, - "reboot_required": false, - "publish_date": null, - "rec_impact": 2, - "rec_likelihood": 2, - "resolution": "

Red Hat recommends updating the kernel package and rebooting the system.

\n
# yum update kernel\n# reboot\n
" - }, - "maintenance_actions": [{ - "done": false, - "id": 58335, - "maintenance_plan": { - "maintenance_id": 16545, - "name": "Insights Summit 2017 - n_HDLC", - "description": "", - "start": "2017-05-06T02:00:00.000Z", - "end": "2017-05-06T03:00:00.000Z", - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 61895, - "maintenance_plan": { - "maintenance_id": 16835, - "name": "Summit 2017 N_HDLC", - "description": "", - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 66225, - "maintenance_plan": { - "maintenance_id": 19445, - "name": "Seattle's Best Plan", - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }, { - "done": false, - "id": 71075, - "maintenance_plan": { - "maintenance_id": 19845, - "name": "Optum N_HDLC FIX", - "description": null, - "start": null, - "end": null, - "created_by": "rhn-support-wnix", - "silenced": false, - "hidden": false, - "suggestion": null, - "remote_branch": null - } - }] - } -] diff --git a/awx/ui/test/spec/inventories/insights/insights.service-test.js b/awx/ui/test/spec/inventories/insights/insights.service-test.js deleted file mode 100644 index 93024a86b9..0000000000 --- a/awx/ui/test/spec/inventories/insights/insights.service-test.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict'; - -import insights_json from './data/insights-data.js'; -import solvable_insights_json from './data/solvable.insights-data.js'; -import not_solvable_insights_json from './data/not_solvable.insights-data.js'; -import high_insights_json from './data/high.insights-data.js'; -import medium_insights_json from './data/medium.insights-data.js'; -import low_insights_json from './data/low.insights-data.js'; - -describe('Service: InsightsService', () => { - let InsightsService; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(angular.mock.inject(( _InsightsService_) => { - InsightsService = _InsightsService_; - })); - - describe('filter()', () => { - it('filter for "total" returns the total set of reports', () => { - let filteredSet = InsightsService.filter('total', insights_json.reports); - expect(filteredSet).toEqual(insights_json.reports); - expect(filteredSet.length).toBe(12); - }); - - it('properly filters the reports dataset for solvable reports', () => { - let filteredSet = InsightsService.filter('solvable', insights_json.reports); - expect(filteredSet).toEqual(solvable_insights_json); - expect(filteredSet.length).toBe(3); - }); - - it('properly filters the reports dataset for not-solvable reports', () => { - let filteredSet = InsightsService.filter('not_solvable', insights_json.reports); - expect(filteredSet).toEqual(not_solvable_insights_json); - expect(filteredSet.length).toBe(9); - }); - - it('properly filters the reports dataset for CRITICAL reports', () => { - let filteredSet = InsightsService.filter('critical', insights_json.reports); - expect(filteredSet).toEqual([]); - expect(filteredSet.length).toBe(0); - }); - - it('properly filters the reports dataset for ERROR reports', () => { - let filteredSet = InsightsService.filter('high', insights_json.reports); - expect(filteredSet).toEqual(high_insights_json); - expect(filteredSet.length).toBe(2); - }); - - it('properly filters the reports dataset for WARN reports', () => { - let filteredSet = InsightsService.filter('medium', insights_json.reports); - expect(filteredSet).toEqual(medium_insights_json); - expect(filteredSet.length).toBe(8); - }); - - it('properly filters the reports dataset for INFO reports', () => { - let filteredSet = InsightsService.filter('low', insights_json.reports); - expect(filteredSet).toEqual(low_insights_json); - expect(filteredSet.length).toBe(2); - }); - }); -}); diff --git a/awx/ui/test/spec/inventories/manage/inventory-manage.service-test.js b/awx/ui/test/spec/inventories/manage/inventory-manage.service-test.js deleted file mode 100644 index c72e49c32e..0000000000 --- a/awx/ui/test/spec/inventories/manage/inventory-manage.service-test.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -describe('Service: InventoriesService', () => { - - let Rest, - InventoriesService; - - beforeEach(angular.mock.module('awApp'), ($provide)=>{ - $provide.value('Rest', Rest); - }); - beforeEach(angular.mock.module('inventoryManage')); - beforeEach(angular.mock.inject(($httpBackend, _InventoriesService_) =>{ - Rest = $httpBackend; - InventoriesService = _InventoriesService_; - })); - - xdescribe('RESTy methods should handle errors', () => { - - beforeEach(() => { - spyOn(InventoriesService, 'error'); - }); - it('InventoriesService.getInventory should handle errors', () => { - Rest.expectGET('/api/v2/inventory:id/').respond(400, {}); - Rest.flush(); - expect(InventoriesService.error).toHaveBeenCalled(); - }); - }); - - // Unit tests often reveal which pieces of our code should be factored out - xit('RESTy methods should start/stop spinny', function(){ - - }); - - afterEach(function() { - Rest.verifyNoOutstandingExpectation(); - Rest.verifyNoOutstandingRequest(); - }); -}); diff --git a/awx/ui/test/spec/karma.spec.js b/awx/ui/test/spec/karma.spec.js deleted file mode 100644 index 0606b5998f..0000000000 --- a/awx/ui/test/spec/karma.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -const path = require('path'); -const webpackConfig = require('./webpack.spec'); - -process.env.CHROME_BIN = process.env.CHROME_BIN || require('puppeteer').executablePath(); - -const SRC_PATH = path.resolve(__dirname, '../../client/src'); -const NODE_MODULES = path.resolve(__dirname, '../../node_modules'); - -module.exports = config => { - config.set({ - basePath: '../..', - autoWatch: true, - colors: true, - browsers: ['Chrome', 'Firefox'], - frameworks: ['jasmine'], - reporters: ['progress', 'junit'], - files:[ - 'client/src/vendor.js', - path.join(NODE_MODULES, 'angular-mocks/angular-mocks.js'), - path.join(SRC_PATH, 'app.js'), - 'client/src/**/*.html', - 'test/spec/**/*-test.js', - ], - preprocessors: { - 'client/src/vendor.js': 'webpack', - [path.join(SRC_PATH, 'app.js')]: 'webpack', - 'client/src/**/*.html': 'html2js', - 'test/spec/**/*-test.js': 'webpack' - }, - webpack: webpackConfig, - webpackMiddleware: { - noInfo: true - }, - junitReporter: { - outputDir: 'reports', - outputFile: 'results.spec.xml', - useBrowserName: false - }, - customLaunchers: { - chromeHeadless: { - base: 'Chrome', - flags: [ - '--no-sandbox', - '--disable-setuid-sandbox', - '--headless', - '--disable-gpu', - '--remote-debugging-port=9222', - ], - }, - }, - }); -}; diff --git a/awx/ui/test/spec/license/license.controller-test.js b/awx/ui/test/spec/license/license.controller-test.js deleted file mode 100644 index 4c00a15546..0000000000 --- a/awx/ui/test/spec/license/license.controller-test.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -describe('Controller: LicenseController', () => { - // Setup - let scope, - LicenseController, - ConfigService, - ProcessErrors, - config, - subscriptionCreds; - - beforeEach(angular.mock.module('awApp')); - beforeEach(angular.mock.module('license', ($provide) => { - ConfigService = jasmine.createSpyObj('ConfigService', [ - 'getConfig', - 'delete' - ]); - - config = { - license_info: { - time_remaining: 1234567 // seconds - }, - version: '3.1.0-devel' - }; - - subscriptionCreds = { - password: '$encrypted$', - username: 'foo', - } - - ProcessErrors = jasmine.createSpy('ProcessErrors'); - - $provide.value('ConfigService', ConfigService); - $provide.value('ProcessErrors', ProcessErrors); - $provide.value('config', config); - $provide.value('subscriptionCreds', subscriptionCreds); - })); - - beforeEach(angular.mock.inject( ($rootScope, $controller, _ConfigService_, _ProcessErrors_, _config_, _subscriptionCreds_) => { - scope = $rootScope.$new(); - ConfigService = _ConfigService_; - ProcessErrors = _ProcessErrors_; - config = _config_; - subscriptionCreds = _subscriptionCreds_; - LicenseController = $controller('licenseController', { - $scope: scope, - ConfigService: ConfigService, - ProcessErrors: ProcessErrors, - config: config, - subscriptionCreds: subscriptionCreds - }); - })); - - xit('should show correct expiration date', ()=>{ - let date = new Date(), - options = { - year: 'numeric', - month: '2-digit', - day: '2-digit' - }; - date.setDate(date.getDate() + 14); - expect(scope.time.expiresOn).toEqual(date.toLocaleDateString(undefined, options)); - }); - - it('should show correct time remaining', ()=>{ - expect(scope.time.remaining).toMatch('14 Days'); - }); - - xit('should throw an error if provided license is invalid JSON', ()=>{ - let event = { - target: {files: [new File(['asdf'], 'license.txt', {type: 'text/html'})]} - }; - scope.getKey(event); - expect(ProcessErrors).toHaveBeenCalled(); - }); - - xit('should submit a valid license'); -}); diff --git a/awx/ui/test/spec/lookup/lookup-modal.directive-test.js b/awx/ui/test/spec/lookup/lookup-modal.directive-test.js deleted file mode 100644 index 7800d8d654..0000000000 --- a/awx/ui/test/spec/lookup/lookup-modal.directive-test.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -xdescribe('Directive: lookupModal', () => { - - let dom, element, listHtml, listDefinition, Dataset, - lookupTemplate, paginateTemplate, searchTemplate, columnSortTemplate, - $scope, $parent, $compile, $state; - - // mock dependency chains - // (shared requires RestServices requires Authorization etc) - beforeEach(angular.mock.module('login')); - beforeEach(angular.mock.module('shared')); - - beforeEach(angular.mock.module('LookupModalModule', ($provide) => { - $provide.value('smartSearch', angular.noop); - $provide.value('columnSort', angular.noop); - $provide.value('paginate', angular.noop); - $state = jasmine.createSpyObj('$state', ['go']); - })); - - beforeEach(angular.mock.inject(($templateCache, _$rootScope_, _$compile_, _generateList_) => { - listDefinition = { - name: 'mocks', - iterator: 'mock', - fields: { - name: {} - } - }; - - listHtml = _generateList_.build({ - mode: 'lookup', - list: listDefinition, - input_type: 'radio' - }); - - Dataset = { - data: { - results: [ - { id: 1, name: 'Mock Resource 1' }, - { id: 2, name: 'Mock Resource 2' }, - { id: 3, name: 'Mock Resource 3' }, - { id: 4, name: 'Mock Resource 4' }, - { id: 5, name: 'Mock Resource 5' }, - ] - } - }; - - dom = angular.element(`${listHtml}`); - - // populate $templateCache with directive.templateUrl at test runtime, - lookupTemplate = window.__html__['client/src/shared/lookup/lookup-modal.partial.html']; - paginateTemplate = window.__html__['client/src/shared/paginate/paginate.partial.html']; - searchTemplate = window.__html__['client/src/shared/smart-search/smart-search.partial.html']; - columnSortTemplate = window.__html__['client/src/shared/column-sort/column-sort.partial.html']; - - $templateCache.put('/static/partials/shared/lookup/lookup-modal.partial.html', lookupTemplate); - $templateCache.put('/static/partials/shared/paginate/paginate.partial.html', paginateTemplate); - $templateCache.put('/static/partials/shared/smart-search/smart-search.partial.html', searchTemplate); - $templateCache.put('/static/partials/shared/column-sort/column-sort.partial.html', columnSortTemplate); - - $compile = _$compile_; - $parent = _$rootScope_.$new(); - - // mock resolvables - $scope = $parent.$new(); - $scope.$resolve = { - ListDefinition: listDefinition, - Dataset: Dataset - }; - })); - - it('Resource is pre-selected in form - corresponding radio should initialize checked', () => { - $parent.mock = 1; // resource id - $parent.mock_name = 'Mock Resource 1'; // resource name - - element = $compile(dom)($scope); - $scope.$digest(); - - expect($(':radio')[0].is(':checked')).toEqual(true); - }); - - it('No resource pre-selected in form - no radio should initialize checked', () => { - element = $compile(dom)($scope); - $scope.$digest(); - - _.forEach($(':radio'), (radio) => { - expect(radio.is('checked')).toEqual(false); - }); - }); - - it('Should update $parent / form scope and exit $state on save', () => { - element = $compile(dom)($scope); - $scope.$digest(); - $(':radio')[1].click(); - $('.Lookup-save')[0].click(); - - expect($parent.mock).toEqual(2); - expect($parent.mock_name).toEqual('Mock Resource 2'); - expect($state.go).toHaveBeenCalled(); - }); - - it('Should not update $parent / form scope on exit via header', () => { - $parent.mock = 3; // resource id - $parent.mock_name = 'Mock Resource 3'; // resource name - element = $compile(dom)($scope); - $scope.$digest(); - - $(':radio')[1].click(); - $('.Form-exit')[0].click(); - - expect($parent.mock).toEqual(3); - expect($parent.mock_name).toEqual('Mock Resource 3'); - expect($state.go).toHaveBeenCalled(); - }); - - it('Should not update $parent / form scope on exit via cancel button', () => { - $parent.mock = 3; // resource id - $parent.mock_name = 'Mock Resource 3'; // resource name - element = $compile(dom)($scope); - $scope.$digest(); - - $(':radio')[1].click(); - $('.Lookup-cancel')[0].click(); - - expect($parent.mock).toEqual(3); - expect($parent.mock_name).toEqual('Mock Resource 3'); - expect($state.go).toHaveBeenCalled(); - }); -}); diff --git a/awx/ui/test/spec/paginate/paginate.directive-test.js b/awx/ui/test/spec/paginate/paginate.directive-test.js deleted file mode 100644 index b8d1802725..0000000000 --- a/awx/ui/test/spec/paginate/paginate.directive-test.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; - -xdescribe('Directive: Paginate', () => { - var dom = angular.element(''), - template, - element, - $scope, - $compile, - $state, - $stateParams = {}; - - beforeEach(angular.mock.module('shared'), ($provide) =>{ - $provide.value('Rest', angular.noop); - }); - beforeEach(angular.mock.module('PaginateModule', ($provide) => { - $state = jasmine.createSpyObj('$state', ['go']); - - $provide.value('$stateParams', $stateParams); - $provide.value('Rest', angular.noop); - })); - beforeEach(angular.mock.inject(($templateCache, _$rootScope_, _$compile_) => { - // populate $templateCache with directive.templateUrl at test runtime, - template = window.__html__['client/src/shared/paginate/paginate.partial.html']; - $templateCache.put('/static/partials/shared/paginate/paginate.partial.html', template); - - $compile = _$compile_; - $scope = _$rootScope_.$new(); - })); - - it('should be hidden if only 1 page of data', () => { - - $scope.mock_dataset = {count: 19}; - $scope.pageSize = 20; - element = $compile(dom)($scope); - $scope.$digest(); - - expect($('.Paginate-wrapper', element)).hasClass('ng-hide'); - }); - describe('it should show expected page range', () => { - - - it('should show 7 pages', () =>{ - - $scope.pageSize = 1; - $scope.mock_dataset = {count: 7}; - element = $compile(dom)($scope); - $scope.$digest(); - // next, previous, 7 pages - expect($('.Paginate-controls--item', element)).length.toEqual(9); - }); - it('should show 100 pages', () =>{ - $scope.pageSize = 1; - $scope.mock_dataset = {count: 100}; - element = $compile(dom)($scope); - $scope.$digest(); - // first, next, previous, last, 100 pages - expect($('.Paginate-controls--item', element)).length.toEqual(104); - }); - }); - describe('it should get expected page', () => { - - it('should get the next page', () =>{ - - $scope.mock_dataset = { - count: 42, - }; - - $stateParams.mock_search = { - page_size: 5, - page: 1 - }; - - element = $compile(dom)($scope); - $('.Paginate-controls--next').click(); - expect($stateParams.mock_search.page).toEqual(2); - }); - - it('should get the previous page', ()=>{ - - $scope.mock_dataset = { - count: 42 - }; - $stateParams.mock_search = { - page_size: 10, - page: 3 - }; - - element = $compile(dom)($scope); - $('.Paginate-controls--previous'); - expect($stateParams.mock_search.page).toEqual(2); - }); - it('should get the last page', ()=>{ - $scope.mock_dataset = { - count: 110 - }; - $stateParams.mock_search = { - page_size: 5, - page: 1 - }; - $('.Paginate-controls--last').click(); - expect($stateParams.mock_search.page).toEqual(42); - }); - it('should get the first page', () => { - $scope.mock_dataset = { - count: 110 - }; - $stateParams.mock_search = { - page_size: 5, - page: 35 - }; - $('.Paginate-controls--first').click(); - expect($stateParams.mock_search.page).toEqual(1); - }); - - }); -}); diff --git a/awx/ui/test/spec/shared/filters/append.filter-test.js b/awx/ui/test/spec/shared/filters/append.filter-test.js deleted file mode 100644 index b687797aef..0000000000 --- a/awx/ui/test/spec/shared/filters/append.filter-test.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -describe('Filter: append', () => { - var filter; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(function(){ - inject(function($injector){ - filter = $injector.get('$filter')('append'); - }); - }); - - it('should append the two parameters passed', function(){ - expect(filter("foo", "bar")).toBe("foobar"); - }); - - it('should return string if no append param passed', function(){ - expect(filter("foo")).toBe("foo"); - }); - - it('should return empty string if no params passed', function(){ - expect(filter()).toBe(""); - }); -}); diff --git a/awx/ui/test/spec/shared/filters/capitalize.filter-test.js b/awx/ui/test/spec/shared/filters/capitalize.filter-test.js deleted file mode 100644 index 671385ce4a..0000000000 --- a/awx/ui/test/spec/shared/filters/capitalize.filter-test.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -describe('Filter: capitalize', () => { - var filter; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(function(){ - inject(function($injector){ - filter = $injector.get('$filter')('capitalize'); - }); - }); - - it('should capitalize the first letter', function(){ - expect(filter("foo")).toBe("Foo"); - expect(filter("Foo")).toBe("Foo"); - expect(filter("FOO")).toBe("Foo"); - expect(filter("FoO")).toBe("Foo"); - }); -}); diff --git a/awx/ui/test/spec/shared/filters/format-epoch.filter-test.js b/awx/ui/test/spec/shared/filters/format-epoch.filter-test.js deleted file mode 100644 index 5b6d54d285..0000000000 --- a/awx/ui/test/spec/shared/filters/format-epoch.filter-test.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -describe('Filter: formatEpoch', () => { - var filter; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(function(){ - inject(function($injector){ - filter = $injector.get('$filter')('formatEpoch'); - }); - }); - - // TODO: this test is opinionated - it assumes that the - // system date on the machine that's running it is EST. - // I'm not quite sure how to foce a moment to use a specific - // timezone. If we can figure that out then we can re-enable - // these tests. - - xit('should convert epoch to datetime string', function(){ - expect(filter(11111)).toBe("Dec 31, 1969 10:05 PM"); - expect(filter(610430400)).toBe("May 6, 1989 12:00 AM"); - }); -}); diff --git a/awx/ui/test/spec/shared/filters/is-empty.filter-test.js b/awx/ui/test/spec/shared/filters/is-empty.filter-test.js deleted file mode 100644 index db6c87ea2a..0000000000 --- a/awx/ui/test/spec/shared/filters/is-empty.filter-test.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -describe('Filter: isEmpty', () => { - var filter; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(function(){ - inject(function($injector){ - filter = $injector.get('$filter')('isEmpty'); - }); - }); - - it('check if an object is empty', function(){ - expect(filter({})).toBe(true); - expect(filter({foo: 'bar'})).toBe(false); - }); -}); diff --git a/awx/ui/test/spec/shared/filters/long-date.filter-test.js b/awx/ui/test/spec/shared/filters/long-date.filter-test.js deleted file mode 100644 index 3bd3857f7a..0000000000 --- a/awx/ui/test/spec/shared/filters/long-date.filter-test.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -describe('Filter: longDate', () => { - var filter; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(function(){ - inject(function($injector){ - filter = $injector.get('$filter')('longDate'); - }); - }); - - // TODO: this test is opinionated - it assumes that the - // system date on the machine that's running it is EST. - // I'm not quite sure how to foce a moment to use a specific - // timezone. If we can figure that out then we can re-enable - // these tests. - - xit('should convert the timestamp to a UI friendly date and time', function(){ - expect(filter("2017-02-13T22:00:14.106Z")).toBe("2/13/2017 5:00:14 PM"); - }); - it('should return an empty string if no timestamp is passed', function(){ - expect(filter()).toBe(""); - }); -}); diff --git a/awx/ui/test/spec/shared/filters/prepend.filter-test.js b/awx/ui/test/spec/shared/filters/prepend.filter-test.js deleted file mode 100644 index 424b023fe8..0000000000 --- a/awx/ui/test/spec/shared/filters/prepend.filter-test.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -describe('Filter: prepend', () => { - var filter; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(function(){ - inject(function($injector){ - filter = $injector.get('$filter')('prepend'); - }); - }); - - it('should prepend the second param to the first', function(){ - expect(filter("foo", "bar")).toBe("barfoo"); - }); - - it('should return string if no prepend param passed', function(){ - expect(filter("foo")).toBe("foo"); - }); - - it('should return empty string if no params passed', function(){ - expect(filter()).toBe(""); - }); -}); diff --git a/awx/ui/test/spec/shared/filters/xss-sanitizer.filter-test.js b/awx/ui/test/spec/shared/filters/xss-sanitizer.filter-test.js deleted file mode 100644 index 2f4db9df83..0000000000 --- a/awx/ui/test/spec/shared/filters/xss-sanitizer.filter-test.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -describe('Filter: sanitize', () => { - var filter; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(function(){ - inject(function($injector){ - filter = $injector.get('$filter')('sanitize'); - }); - }); - - it('should sanitize xss-vulnerable strings', function(){ - expect(filter("
foobar
")).toBe("<div>foobar</div>"); - }); -}); diff --git a/awx/ui/test/spec/smart-search/queryset.service-test.js b/awx/ui/test/spec/smart-search/queryset.service-test.js deleted file mode 100644 index a2771f9344..0000000000 --- a/awx/ui/test/spec/smart-search/queryset.service-test.js +++ /dev/null @@ -1,127 +0,0 @@ -'use strict'; - -describe('Service: QuerySet', () => { - let $httpBackend, - QuerySet, - Authorization, - SmartSearchService; - - beforeEach(angular.mock.module('awApp', ($provide) =>{ - // @todo: improve app source / write testing utilities for interim - // we don't want to be concerned with this provision in every test that involves the Rest module - Authorization = { - getToken: () => true, - isUserLoggedIn: angular.noop - }; - $provide.value('LoadBasePaths', angular.noop); - $provide.value('Authorization', Authorization); - })); - beforeEach(angular.mock.module('RestServices')); - - beforeEach(angular.mock.inject((_$httpBackend_, _QuerySet_, _SmartSearchService_) => { - $httpBackend = _$httpBackend_; - QuerySet = _QuerySet_; - SmartSearchService = _SmartSearchService_; - - // @todo: improve app source - // config.js / local_settings emit $http requests in the app's run block - $httpBackend - .whenGET(/\/static\/*/) - .respond(200, {}); - // @todo: improve appsource - // provide api version via package.json config block - $httpBackend - .whenGET(/^\/api\/?$/) - .respond(200, ''); - })); - - describe('fn encodeParam', () => { - it('should encode parameters properly', () =>{ - expect(QuerySet.encodeParam({term: "name:foo", searchTerm: true})).toEqual({"name__icontains_DEFAULT" : "foo"}); - expect(QuerySet.encodeParam({term: "-name:foo", searchTerm: true})).toEqual({"not__name__icontains_DEFAULT" : "foo"}); - expect(QuerySet.encodeParam({term: "name:'foo bar'", searchTerm: true})).toEqual({"name__icontains_DEFAULT" : "'foo%20bar'"}); - expect(QuerySet.encodeParam({term: "-name:'foo bar'", searchTerm: true})).toEqual({"not__name__icontains_DEFAULT" : "'foo%20bar'"}); - expect(QuerySet.encodeParam({term: "organization:foo", relatedSearchTerm: true})).toEqual({"organization__search_DEFAULT" : "foo"}); - expect(QuerySet.encodeParam({term: "-organization:foo", relatedSearchTerm: true})).toEqual({"not__organization__search_DEFAULT" : "foo"}); - expect(QuerySet.encodeParam({term: "organization.name:foo", relatedSearchTerm: true})).toEqual({"organization__name" : "foo"}); - expect(QuerySet.encodeParam({term: "-organization.name:foo", relatedSearchTerm: true})).toEqual({"not__organization__name" : "foo"}); - expect(QuerySet.encodeParam({term: "id:11", searchTerm: true})).toEqual({"id__icontains_DEFAULT" : "11"}); - expect(QuerySet.encodeParam({term: "-id:11", searchTerm: true})).toEqual({"not__id__icontains_DEFAULT" : "11"}); - expect(QuerySet.encodeParam({term: "id:>11", searchTerm: true})).toEqual({"id__gt" : "11"}); - expect(QuerySet.encodeParam({term: "-id:>11", searchTerm: true})).toEqual({"not__id__gt" : "11"}); - expect(QuerySet.encodeParam({term: "id:>=11", searchTerm: true})).toEqual({"id__gte" : "11"}); - expect(QuerySet.encodeParam({term: "-id:>=11", searchTerm: true})).toEqual({"not__id__gte" : "11"}); - expect(QuerySet.encodeParam({term: "id:<11", searchTerm: true})).toEqual({"id__lt" : "11"}); - expect(QuerySet.encodeParam({term: "-id:<11", searchTerm: true})).toEqual({"not__id__lt" : "11"}); - expect(QuerySet.encodeParam({term: "id:<=11", searchTerm: true})).toEqual({"id__lte" : "11"}); - expect(QuerySet.encodeParam({term: "-id:<=11", searchTerm: true})).toEqual({"not__id__lte" : "11"}); - }); - }); - - describe('getSearchInputQueryset', () => { - it('creates the expected queryset', () =>{ - spyOn(QuerySet, 'encodeParam').and.callThrough(); - - const term = 'name:foo'; - const isFilterableBaseField = (termParts) => termParts[0] === 'name'; - const isRelatedField = () => false; - - expect(QuerySet.getSearchInputQueryset(term, isFilterableBaseField, isRelatedField)).toEqual({ name__icontains_DEFAULT: 'foo' }); - expect(QuerySet.encodeParam).toHaveBeenCalledWith({ term: "name:foo", searchTerm: true, singleSearchParam: null }); - expect(QuerySet.getSearchInputQueryset('foo', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo' }); - expect(QuerySet.getSearchInputQueryset('foo bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20and%20search=bar' }); - expect(QuerySet.getSearchInputQueryset('foo or bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20or%20search=bar' }); - expect(QuerySet.getSearchInputQueryset('name:foo or bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20or%20search=bar' }); - expect(QuerySet.getSearchInputQueryset('name:foo bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20and%20search=bar' }); - expect(QuerySet.getSearchInputQueryset('foo or name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20or%20name__icontains=bar' }); - expect(QuerySet.getSearchInputQueryset('foo name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20and%20name__icontains=bar' }); - expect(QuerySet.getSearchInputQueryset('name:foo or name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20or%20name__icontains=bar' }); - expect(QuerySet.getSearchInputQueryset('name:foo name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20and%20name__icontains=bar' }); - expect(QuerySet.getSearchInputQueryset('name:foo name:bar or baz', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20and%20name__icontains=bar%20or%20search=baz' }); - expect(QuerySet.getSearchInputQueryset('baz or name:foo name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=baz%20or%20name__icontains=foo%20and%20name__icontains=bar' }); - }); - }); - - describe('removeTermsFromQueryset', () => { - it('creates the expected queryset', () =>{ - spyOn(QuerySet, 'encodeParam').and.callThrough(); - - const queryset = { page_size: "20", order_by: "name", project__search_DEFAULT: "foo" }; - const term = 'project:foo'; - const isFilterableBaseField = () => false; - const isRelatedField = () => true; - - expect(QuerySet.removeTermsFromQueryset(queryset, term, isFilterableBaseField, isRelatedField)).toEqual({ page_size: "20", order_by: "name" }); - expect(QuerySet.encodeParam).toHaveBeenCalledWith({ term: 'project:foo', relatedSearchTerm: true, singleSearchParam: null }); - }); - }); - - describe('fn search', () => { - let pattern = /\/api\/v2\/inventories\/(.+)\/groups\/*/, - endpoint = '/api/v2/inventories/1/groups/', - params = { - or__name: 'borg', - or__description__icontains: 'assimilate' - }; - - it('should GET expected URL', () =>{ - $httpBackend - .expectGET(pattern) - .respond(200, {}); - QuerySet.search(endpoint, params).then((data) =>{ - expect(data.config.url).toEqual('/api/v2/inventories/1/groups/?or__name=borg&or__description__icontains=assimilate'); - }); - $httpBackend.flush(); - }); - - xit('should memoize new DjangoModel', ()=>{}); - xit('should not replace memoized DjangoModel', ()=>{}); - xit('should provide an alias interface', ()=>{}); - - afterEach(() => { - $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); - }); - }); - -}); diff --git a/awx/ui/test/spec/smart-search/smart-search.directive-test.js b/awx/ui/test/spec/smart-search/smart-search.directive-test.js deleted file mode 100644 index 6e8f1ab037..0000000000 --- a/awx/ui/test/spec/smart-search/smart-search.directive-test.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; - -describe('Directive: Smart Search', () => { - let $scope, - $q, - template, - element, - dom, - $compile, - $state = {}, - GetBasePath, - QuerySet, - ConfigService = {}, - i18n, - $transitions, - translateFilter; - - beforeEach(angular.mock.module('shared')); - beforeEach(angular.mock.module('SmartSearchModule', ($provide) => { - QuerySet = jasmine.createSpyObj('QuerySet', [ - 'decodeParam', - 'search', - 'stripDefaultParams', - 'createSearchTagsFromQueryset', - 'initFieldset' - ]); - QuerySet.decodeParam.and.callFake((key, value) => { - return `${key.split('__').join(':')}:${value}`; - }); - QuerySet.stripDefaultParams.and.returnValue([]); - QuerySet.createSearchTagsFromQueryset.and.returnValue([]); - - $transitions = jasmine.createSpyObj('$transitions', [ - 'onSuccess' - ]); - $transitions.onSuccess.and.returnValue({}); - - ConfigService = jasmine.createSpyObj('ConfigService', [ - 'getConfig' - ]); - - GetBasePath = jasmine.createSpy('GetBasePath'); - translateFilter = jasmine.createSpy('translateFilter'); - i18n = jasmine.createSpy('i18n'); - $state = jasmine.createSpyObj('$state', ['go']); - $state.go.and.callFake(() => { return { then: function(){} }; }); - - $provide.value('ConfigService', ConfigService); - $provide.value('QuerySet', QuerySet); - $provide.value('GetBasePath', GetBasePath); - $provide.value('$state', $state); - $provide.value('i18n', { '_': (a) => { return a; } }); - $provide.value('translateFilter', translateFilter); - })); - beforeEach(angular.mock.inject(($templateCache, _$rootScope_, _$compile_, _$q_) => { - $q = _$q_; - $compile = _$compile_; - $scope = _$rootScope_.$new(); - - ConfigService.getConfig.and.returnValue($q.when({})); - QuerySet.search.and.returnValue($q.when({})); - - QuerySet.initFieldset.and.callFake(() => { - var deferred = $q.defer(); - deferred.resolve({ - models: { - mock: { - base: {} - } - }, - options: { - data: null - } - }); - return deferred.promise; - }); - - // populate $templateCache with directive.templateUrl at test runtime, - template = window.__html__['client/src/shared/smart-search/smart-search.partial.html']; - $templateCache.put('/static/partials/shared/smart-search/smart-search.partial.html', template); - })); - - describe('clear all', () => { - it('should revert search back to non-null defaults and remove page', () => { - $state.$current = { - path: { - mock: { - params: { - mock_search: { - config: { - value: { - page_size: '20', - order_by: '-finished', - page: '1', - some_null_param: null - } - } - } - } - } - } - }; - $state.params = { - mock_search: { - page_size: '25', - order_by: 'name', - page: '11', - description_icontains: 'ansible', - name_icontains: 'ansible' - } - }; - $scope.list = { - iterator: 'mock' - }; - dom = angular.element(` - `); - element = $compile(dom)($scope); - $scope.$digest(); - const scope = element.isolateScope(); - scope.clearAllTerms(); - expect(QuerySet.search).toHaveBeenCalledWith('mock', {page_size: '20',order_by: '-finished',}); - }); - }); -}); diff --git a/awx/ui/test/spec/smart-search/smart-search.service-test.js b/awx/ui/test/spec/smart-search/smart-search.service-test.js deleted file mode 100644 index cd7aef4848..0000000000 --- a/awx/ui/test/spec/smart-search/smart-search.service-test.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -describe('Service: SmartSearch', () => { - let SmartSearchService; - - beforeEach(angular.mock.module('awApp')); - - beforeEach(angular.mock.module('SmartSearchModule')); - - beforeEach(angular.mock.inject((_SmartSearchService_) => { - SmartSearchService = _SmartSearchService_; - })); - - describe('fn splitSearchIntoTerms', () => { - it('should convert the search string to an array tag strings', () =>{ - expect(SmartSearchService.splitSearchIntoTerms('foo')).toEqual(["foo"]); - expect(SmartSearchService.splitSearchIntoTerms('foo bar')).toEqual(["foo", "bar"]); - expect(SmartSearchService.splitSearchIntoTerms('name:foo bar')).toEqual(["name:foo", "bar"]); - expect(SmartSearchService.splitSearchIntoTerms('name:foo description:bar')).toEqual(["name:foo", "description:bar"]); - expect(SmartSearchService.splitSearchIntoTerms('name:"foo bar"')).toEqual(["name:\"foo bar\""]); - expect(SmartSearchService.splitSearchIntoTerms('name:"foo bar" description:"bar foo"')).toEqual(["name:\"foo bar\"", "description:\"bar foo\""]); - expect(SmartSearchService.splitSearchIntoTerms('name:"foo bar" description:"bar foo"')).toEqual(["name:\"foo bar\"", "description:\"bar foo\""]); - expect(SmartSearchService.splitSearchIntoTerms('name:\'foo bar\'')).toEqual(["name:\'foo bar\'"]); - expect(SmartSearchService.splitSearchIntoTerms('name:\'foo bar\' description:\'bar foo\'')).toEqual(["name:\'foo bar\'", "description:\'bar foo\'"]); - expect(SmartSearchService.splitSearchIntoTerms('name:\'foo bar\' description:\'bar foo\'')).toEqual(["name:\'foo bar\'", "description:\'bar foo\'"]); - expect(SmartSearchService.splitSearchIntoTerms('name:\"foo bar\" description:\'bar foo\'')).toEqual(["name:\"foo bar\"", "description:\'bar foo\'"]); - expect(SmartSearchService.splitSearchIntoTerms('name:\"foo bar\" foo')).toEqual(["name:\"foo bar\"", "foo"]); - expect(SmartSearchService.splitSearchIntoTerms('inventory:¯\_(ツ)_/¯')).toEqual(["inventory:¯\_(ツ)_/¯"]); - expect(SmartSearchService.splitSearchIntoTerms('inventory:¯\_(ツ)_/¯ inventory.name:¯\_(ツ)_/¯')).toEqual(["inventory:¯\_(ツ)_/¯", "inventory.name:¯\_(ツ)_/¯"]); - }); - }); - - describe('fn splitTermIntoParts', () => { - it('should convert the search term to a key and value', () =>{ - expect(SmartSearchService.splitTermIntoParts('foo')).toEqual(["foo"]); - expect(SmartSearchService.splitTermIntoParts('foo:bar')).toEqual(["foo", "bar"]); - expect(SmartSearchService.splitTermIntoParts('foo:bar:foobar')).toEqual(["foo", "bar:foobar"]); - expect(SmartSearchService.splitTermIntoParts('name:\"foo bar\"')).toEqual(["name", "\"foo bar\""]); - expect(SmartSearchService.splitTermIntoParts('name:\"foo:bar\"')).toEqual(["name", "\"foo:bar\""]); - expect(SmartSearchService.splitTermIntoParts('name:\'foo bar\'')).toEqual(["name", "\'foo bar\'"]); - expect(SmartSearchService.splitTermIntoParts('name:\'foo:bar\'')).toEqual(["name", "\'foo:bar\'"]); - }); - }); - - describe('fn splitFilterIntoTerms', () => { - it('should convert the filter term to a key and value with encode quotes and spaces', () => { - expect(SmartSearchService.splitFilterIntoTerms()).toEqual(null); - expect(SmartSearchService.splitFilterIntoTerms('foo')).toEqual(["foo"]); - expect(SmartSearchService.splitFilterIntoTerms('foo bar')).toEqual(["foo", "bar"]); - expect(SmartSearchService.splitFilterIntoTerms('name:foo bar')).toEqual(["name:foo", "bar"]); - expect(SmartSearchService.splitFilterIntoTerms('name:foo description:bar')).toEqual(["name:foo", "description:bar"]); - expect(SmartSearchService.splitFilterIntoTerms('name:"foo bar"')).toEqual(["name:%22foo%20bar%22"]); - expect(SmartSearchService.splitFilterIntoTerms('name:"foo bar" description:"bar foo"')).toEqual(["name:%22foo%20bar%22", "description:%22bar%20foo%22"]); - expect(SmartSearchService.splitFilterIntoTerms('name:"foo bar" a b c')).toEqual(["name:%22foo%20bar%22", 'a', 'b', 'c']); - expect(SmartSearchService.splitFilterIntoTerms('name:"1"')).toEqual(["name:%221%22"]); - expect(SmartSearchService.splitFilterIntoTerms('name:1')).toEqual(["name:1"]); - expect(SmartSearchService.splitFilterIntoTerms('name:"foo ba\'r" a b c')).toEqual(["name:%22foo%20ba%27r%22", 'a', 'b', 'c']); - expect(SmartSearchService.splitFilterIntoTerms('name:"foobar" other:"barbaz"')).toEqual(["name:%22foobar%22", "other:%22barbaz%22"]); - expect(SmartSearchService.splitFilterIntoTerms('name:"foobar" other:"bar baz"')).toEqual(["name:%22foobar%22", "other:%22bar%20baz%22"]); - }); - }); - -}); diff --git a/awx/ui/test/spec/socket/socket.service-test.js b/awx/ui/test/spec/socket/socket.service-test.js deleted file mode 100644 index 8585fd2dde..0000000000 --- a/awx/ui/test/spec/socket/socket.service-test.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -xdescribe('Service: SocketService', () => { - - let SocketService, - rootScope, - event; - - beforeEach(angular.mock.module('shared')); - beforeEach(angular.mock.module('socket', function($provide){ - $provide.value('$rootScope', rootScope); - $provide.value('$location', {url: function(){}}); - })); - beforeEach(angular.mock.inject(($rootScope, _SocketService_) => { - var rootScope = $rootScope.$new(); - rootScope.$emit = jasmine.createSpy('$emit'); - SocketService = _SocketService_; - })); - - describe('socket onmessage() should broadcast to correct event listener', function(){ - - xit('should send to ws-jobs-summary', function(){ - event = {data : {group_name: "jobs"}}; - event.data = JSON.stringify(event.data); - SocketService.onMessage(event); - expect(rootScope.$emit).toHaveBeenCalledWith('ws-jobs-summary', event.data); - }); - }); - -}); diff --git a/awx/ui/test/spec/webpack.spec.js b/awx/ui/test/spec/webpack.spec.js deleted file mode 100644 index 099d6a9964..0000000000 --- a/awx/ui/test/spec/webpack.spec.js +++ /dev/null @@ -1,16 +0,0 @@ -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const base = require('../../build/webpack.base'); - -const STATIC_URL = '/static/'; - -const test = { - devtool: 'inline-source-map', - plugins: [ - new webpack.DefinePlugin({ - $basePath: STATIC_URL - }) - ] -}; - -module.exports = merge(base, test); diff --git a/awx/ui/test/spec/workflow--results/data/workflow_job.js b/awx/ui/test/spec/workflow--results/data/workflow_job.js deleted file mode 100644 index 6893b63216..0000000000 --- a/awx/ui/test/spec/workflow--results/data/workflow_job.js +++ /dev/null @@ -1,63 +0,0 @@ -export default { - "id": 109, - "type": "workflow_job", - "url": "/api/v2/workflow_jobs/109/", - "related": { - "created_by": "/api/v2/users/1/", - "unified_job_template": "/api/v2/workflow_job_templates/27/", - "workflow_job_template": "/api/v2/workflow_job_templates/27/", - "notifications": "/api/v2/workflow_jobs/109/notifications/", - "workflow_nodes": "/api/v2/workflow_jobs/109/workflow_nodes/", - "labels": "/api/v2/workflow_jobs/109/labels/", - "activity_stream": "/api/v2/workflow_jobs/109/activity_stream/", - "relaunch": "/api/v2/workflow_jobs/109/relaunch/", - "cancel": "/api/v2/workflow_jobs/109/cancel/" - }, - "summary_fields": { - "workflow_job_template": { - "id": 27, - "name": "workflow timer", - "description": "" - }, - "unified_job_template": { - "id": 27, - "name": "workflow timer", - "description": "", - "unified_job_type": "workflow_job" - }, - "created_by": { - "id": 1, - "username": "admin", - "first_name": "", - "last_name": "" - }, - "user_capabilities": { - "start": true, - "delete": true - }, - "labels": { - "count": 0, - "results": [] - } - }, - "created": "2017-02-01T14:56:47.416Z", - "modified": "2017-02-01T14:57:14.189Z", - "name": "workflow timer", - "description": "", - "unified_job_template": 27, - "launch_type": "manual", - "status": "successful", - "failed": false, - "started": "2017-02-01T14:56:47.754897Z", - "finished": "2017-02-01T14:57:14.182780Z", - "elapsed": 26.428, - "job_args": "", - "job_cwd": "", - "job_env": {}, - "job_explanation": "", - "result_stdout": "stdout capture is missing", - "execution_node": "", - "result_traceback": "", - "workflow_job_template": 27, - "extra_vars": "{}" -}; \ No newline at end of file diff --git a/awx/ui/test/spec/workflow--results/data/workflow_job_options.js b/awx/ui/test/spec/workflow--results/data/workflow_job_options.js deleted file mode 100644 index 657d6f41fe..0000000000 --- a/awx/ui/test/spec/workflow--results/data/workflow_job_options.js +++ /dev/null @@ -1,203 +0,0 @@ -export default { - "name": "Workflow Job Detail", - "description": "# Retrieve Workflow Job:\n\nMake GET request to this resource to retrieve a single workflow job\nrecord containing the following fields:\n\n* `id`: Database ID for this workflow job. (integer)\n* `type`: Data type for this workflow job. (choice)\n* `url`: URL for this workflow job. (string)\n* `related`: Data structure with URLs of related resources. (object)\n* `summary_fields`: Data structure with name/description for related resources. (object)\n* `created`: Timestamp when this workflow job was created. (datetime)\n* `modified`: Timestamp when this workflow job was last modified. (datetime)\n* `name`: Name of this workflow job. (string)\n* `description`: Optional description of this workflow job. (string)\n* `unified_job_template`: (field)\n* `launch_type`: (choice)\n - `manual`: Manual\n - `relaunch`: Relaunch\n - `callback`: Callback\n - `scheduled`: Scheduled\n - `dependency`: Dependency\n - `workflow`: Workflow\n - `sync`: Sync\n* `status`: (choice)\n - `new`: New\n - `pending`: Pending\n - `waiting`: Waiting\n - `running`: Running\n - `successful`: Successful\n - `failed`: Failed\n - `error`: Error\n - `canceled`: Canceled\n* `failed`: (boolean)\n* `started`: The date and time the job was queued for starting. (datetime)\n* `finished`: The date and time the job finished execution. (datetime)\n* `elapsed`: Elapsed time in seconds that the job ran. (decimal)\n* `job_args`: (string)\n* `job_cwd`: (string)\n* `job_env`: (field)\n* `job_explanation`: A status field to indicate the state of the job if it wasn't able to run and capture stdout (string)\n* `result_stdout`: (field)\n* `execution_node`: The Tower node the job executed on. (string)\n* `result_traceback`: (string)\n* `workflow_job_template`: (field)\n* `extra_vars`: (string)\n\n\n\n# Delete Workflow Job:\n\nMake a DELETE request to this resource to delete this workflow job.\n\n\n\n\n\n\n\n\n\n\n\n> _New in Ansible Tower 3.1.0_", - "renders": [ - "application/json", - "text/html" - ], - "parses": [ - "application/json" - ], - "actions": { - "GET": { - "id": { - "type": "integer", - "label": "ID", - "help_text": "Database ID for this workflow job." - }, - "type": { - "type": "choice", - "label": "Type", - "help_text": "Data type for this workflow job.", - "choices": [ - [ - "workflow_job", - "Workflow Job" - ] - ] - }, - "url": { - "type": "string", - "label": "Url", - "help_text": "URL for this workflow job." - }, - "related": { - "type": "object", - "label": "Related", - "help_text": "Data structure with URLs of related resources." - }, - "summary_fields": { - "type": "object", - "label": "Summary fields", - "help_text": "Data structure with name/description for related resources." - }, - "created": { - "type": "datetime", - "label": "Created", - "help_text": "Timestamp when this workflow job was created." - }, - "modified": { - "type": "datetime", - "label": "Modified", - "help_text": "Timestamp when this workflow job was last modified." - }, - "name": { - "type": "string", - "label": "Name", - "help_text": "Name of this workflow job." - }, - "description": { - "type": "string", - "label": "Description", - "help_text": "Optional description of this workflow job." - }, - "unified_job_template": { - "type": "field", - "label": "unified job template" - }, - "launch_type": { - "type": "choice", - "label": "Launch type", - "choices": [ - [ - "manual", - "Manual" - ], - [ - "relaunch", - "Relaunch" - ], - [ - "callback", - "Callback" - ], - [ - "scheduled", - "Scheduled" - ], - [ - "dependency", - "Dependency" - ], - [ - "workflow", - "Workflow" - ], - [ - "sync", - "Sync" - ] - ] - }, - "status": { - "type": "choice", - "label": "Status", - "choices": [ - [ - "new", - "New" - ], - [ - "pending", - "Pending" - ], - [ - "waiting", - "Waiting" - ], - [ - "running", - "Running" - ], - [ - "successful", - "Successful" - ], - [ - "failed", - "Failed" - ], - [ - "error", - "Error" - ], - [ - "canceled", - "Canceled" - ] - ] - }, - "failed": { - "type": "boolean", - "label": "Failed" - }, - "started": { - "type": "datetime", - "label": "Started", - "help_text": "The date and time the job was queued for starting." - }, - "finished": { - "type": "datetime", - "label": "Finished", - "help_text": "The date and time the job finished execution." - }, - "elapsed": { - "type": "decimal", - "label": "Elapsed", - "help_text": "Elapsed time in seconds that the job ran." - }, - "job_args": { - "type": "string", - "label": "Job args" - }, - "job_cwd": { - "type": "string", - "label": "Job cwd" - }, - "job_env": { - "type": "field", - "label": "job_env" - }, - "job_explanation": { - "type": "string", - "label": "Job explanation", - "help_text": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" - }, - "result_stdout": { - "type": "field", - "label": "Result stdout" - }, - "execution_node": { - "type": "string", - "label": "Execution node", - "help_text": "The Tower node the job executed on." - }, - "result_traceback": { - "type": "string", - "label": "Result traceback" - }, - "workflow_job_template": { - "type": "field", - "label": "Workflow job template" - }, - "extra_vars": { - "type": "string", - "label": "Extra vars" - } - } - }, - "added_in_version": "3.1.0", - "types": [ - "workflow_job" - ] -} \ No newline at end of file diff --git a/awx/ui/test/spec/workflow--results/workflow-results.controller-test.js b/awx/ui/test/spec/workflow--results/workflow-results.controller-test.js deleted file mode 100644 index 15c68045ce..0000000000 --- a/awx/ui/test/spec/workflow--results/workflow-results.controller-test.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; -import moment from 'moment'; -import workflow_job_options_json from './data/workflow_job_options.js'; -import workflow_job_json from './data/workflow_job.js'; - -describe('Controller: workflowResults', () => { - let $controller; - let workflowResults; - let $rootScope; - let workflowResultsService; - let $interval; - - let treeData = { - data: { - children: [] - } - }; - - beforeEach(angular.mock.module('workflowResults', ($provide) => { - ['PromptDialog', 'Prompt', 'Wait', 'Rest', '$state', 'ProcessErrors', - 'jobLabels', 'workflowNodes', 'count', 'WorkflowJobModel', 'ComponentsStrings' - ].forEach((item) => { - $provide.value(item, {}); - }); - $provide.value('$stateExtender', { addState: jasmine.createSpy('addState'), }); - $provide.value('moment', moment); - $provide.value('workflowData', workflow_job_json); - $provide.value('workflowDataOptions', workflow_job_options_json); - $provide.value('ParseTypeChange', function() {}); - $provide.value('ParseVariableString', function() {}); - $provide.value('i18n', { '_': (a) => { return a; } }); - $provide.provider('$stateProvider', { '$get': function() { return function() {}; } }); - $provide.service('WorkflowChartService', function($q) { - return { - generateArraysOfNodesAndLinks: function() { - var deferred = $q.defer(); - deferred.resolve(); - return deferred.promise; - } - }; - }); - })); - - beforeEach(angular.mock.inject(function(_$controller_, _$rootScope_, _workflowResultsService_, _$interval_){ - $controller = _$controller_; - $rootScope = _$rootScope_; - workflowResultsService = _workflowResultsService_; - $interval = _$interval_; - })); - - describe('elapsed timer', () => { - let scope; - - beforeEach(() => { - scope = $rootScope.$new(); - spyOn(workflowResultsService, 'createOneSecondTimer').and.callThrough(); - spyOn(workflowResultsService, 'destroyTimer').and.callThrough(); - }); - - - function jobWaitingWorkflowResultsControllerFixture(started, status) { - workflow_job_json.started = started; - workflow_job_json.status = status; - workflowResults = $controller('workflowResultsController', { - $scope: scope, - $rootScope: $rootScope, - }); - } - - describe('init()', () => { - describe('job running', () => { - beforeEach(() => { - jobWaitingWorkflowResultsControllerFixture(moment(), 'running'); - }); - - // Note: Ensuring the outside service method is called to create a timer may - // be overkill. Especially since we validate the side effect in the next test. - it('should call to start timer on load when job is already running', () => { - expect(workflowResultsService.createOneSecondTimer).toHaveBeenCalled(); - expect(workflowResultsService.createOneSecondTimer.calls.argsFor(0)[0]).toBe(workflow_job_json.started); - }); - - it('should set update scope var with elapsed time', () => { - $interval.flush(10 * 1000); - - // TODO: mock moment() so when we fast-forward time with $interval - // the system clocks seems to fast forward too. - //expect(scope.workflow.elapsed).toBe(10); - }); - - it('should call to destroy timer on destroy', () => { - scope.$destroy(); - expect(workflowResultsService.destroyTimer).toHaveBeenCalled(); - expect(workflowResultsService.destroyTimer.calls.argsFor(0)[0]).not.toBe(null); - }); - }); - - describe('job waiting', () => { - beforeEach(() => { - jobWaitingWorkflowResultsControllerFixture(null, 'waiting'); - }); - - it('should not start elapsed timer', () => { - expect(workflowResultsService.createOneSecondTimer).not.toHaveBeenCalled(); - }); - - }); - - describe('job finished', () => { - beforeEach(() => { - jobWaitingWorkflowResultsControllerFixture(moment(), 'successful'); - }); - - it('should start elapsed timer', () => { - expect(workflowResultsService.createOneSecondTimer).not.toHaveBeenCalled(); - }); - }); - }); - - describe('job transitions to running', () => { - beforeEach(() => { - jobWaitingWorkflowResultsControllerFixture(null, 'waiting'); - $rootScope.$broadcast('ws-jobs', { unified_job_id: workflow_job_json.id, status: "running" }); - }); - - it('should start elapsed timer', () => { - expect(scope.workflow.status).toBe("running"); - expect(workflowResultsService.createOneSecondTimer).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/awx/ui/test/spec/workflow--results/workflow-results.service-test.js b/awx/ui/test/spec/workflow--results/workflow-results.service-test.js deleted file mode 100644 index 8a1bd3b94c..0000000000 --- a/awx/ui/test/spec/workflow--results/workflow-results.service-test.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; -import moment from 'moment'; - -describe('workflowResultsService', () => { - let workflowResultsService; - let $interval; - - beforeEach(angular.mock.module('workflowResults', ($provide) => { - ['i18n', 'PromptDialog', 'Prompt', 'Wait', 'Rest', 'ProcessErrors', '$state', 'WorkflowJobModel', 'ComponentsStrings'] - .forEach(function(item) { - $provide.value(item, {}); - }); - $provide.value('$stateExtender', { addState: jasmine.createSpy('addState'), }); - $provide.value('moment', moment); - })); - - beforeEach(angular.mock.inject((_workflowResultsService_, _$interval_) => { - workflowResultsService = _workflowResultsService_; - $interval = _$interval_; - })); - - describe('createOneSecondTimer()', () => { - it('should create a timer that runs every second, incremented by a second', (done) => { - let ticks = 0; - let ticks_expected = 10; - - workflowResultsService.createOneSecondTimer(moment(), function() { - ticks += 1; - if (ticks >= ticks_expected) { - expect(ticks).toBe(ticks_expected); - // TODO: should verify time is 10 but this requires mocking moment() - // because we "artificially" accelerate time. - done(); - } - }); - - $interval.flush(ticks_expected * 1000); - }); - }); - - describe('destroyTimer()', () => { - beforeEach(() => { - $interval.cancel = jasmine.createSpy('cancel'); - }); - - it('should not destroy null timer', () => { - workflowResultsService.destroyTimer(null); - - expect($interval.cancel).not.toHaveBeenCalled(); - }); - - it('should destroy passed in timer', () => { - let timer = jasmine.createSpy('timer'); - - workflowResultsService.destroyTimer(timer); - - expect($interval.cancel).toHaveBeenCalledWith(timer); - }); - }); -}); diff --git a/awx/ui/test/spec/workflows/workflow-add.controller-test.js b/awx/ui/test/spec/workflows/workflow-add.controller-test.js deleted file mode 100644 index 4edf61f694..0000000000 --- a/awx/ui/test/spec/workflows/workflow-add.controller-test.js +++ /dev/null @@ -1,176 +0,0 @@ -'use strict'; - -describe('Controller: WorkflowAdd', () => { - // Setup - let scope, - state, - WorkflowAdd, - Alert, - GenerateForm, - TemplatesService, - q, - createWorkflowJobTemplateDeferred, - httpBackend, - ProcessErrors, - CreateSelect2, - Wait, - ParseTypeChange, - ToJSON, - availableLabels, - resolvedModels; - - beforeEach(angular.mock.module('awApp')); - beforeEach(angular.mock.module('RestServices')); - beforeEach(angular.mock.module('templates', ($provide) => { - - state = jasmine.createSpyObj('state', [ - '$get', - 'transitionTo', - 'go' - ]); - - GenerateForm = jasmine.createSpyObj('GenerateForm', [ - 'inject', - 'reset', - 'clearApiErrors', - 'applyDefaults' - ]); - - TemplatesService = { - getLabelOptions: function(){ - return angular.noop; - }, - createWorkflowJobTemplate: function(){ - return angular.noop; - } - }; - - availableLabels = [{ - name: "foo", - id: "1" - }]; - - resolvedModels = [ - {}, - { - options: () => { - return true; - } - } - ]; - - Alert = jasmine.createSpy('Alert'); - ProcessErrors = jasmine.createSpy('ProcessErrors'); - CreateSelect2 = jasmine.createSpy('CreateSelect2'); - Wait = jasmine.createSpy('Wait'); - ParseTypeChange = jasmine.createSpy('ParseTypeChange'); - ToJSON = jasmine.createSpy('ToJSON'); - - $provide.value('Alert', Alert); - $provide.value('GenerateForm', GenerateForm); - $provide.value('state', state); - $provide.value('ProcessErrors', ProcessErrors); - $provide.value('CreateSelect2', CreateSelect2); - $provide.value('Wait', Wait); - $provide.value('ParseTypeChange', ParseTypeChange); - $provide.value('ToJSON', ToJSON); - $provide.value('availableLabels', availableLabels); - $provide.value('resolvedModels', resolvedModels); - })); - - beforeEach(angular.mock.inject( ($rootScope, $controller, $q, $httpBackend, _state_, _ConfigService_, _GetChoices_, _Alert_, _GenerateForm_, _ProcessErrors_, _CreateSelect2_, _Wait_, _ParseTypeChange_, _ToJSON_, _availableLabels_) => { - scope = $rootScope.$new(); - state = _state_; - q = $q; - Alert = _Alert_; - GenerateForm = _GenerateForm_; - httpBackend = $httpBackend; - ProcessErrors = _ProcessErrors_; - CreateSelect2 = _CreateSelect2_; - Wait = _Wait_; - createWorkflowJobTemplateDeferred = q.defer(); - ParseTypeChange = _ParseTypeChange_; - ToJSON = _ToJSON_; - availableLabels = _availableLabels_; - - $httpBackend - .whenGET(/^\/api\/?$/) - .respond(200, ''); - - $httpBackend - .when('OPTIONS', '/') - .respond(200, ''); - - $httpBackend - .whenGET(/\/static\/*/) - .respond(200, {}); - - TemplatesService.createWorkflowJobTemplate = jasmine.createSpy('createWorkflowJobTemplate').and.returnValue(createWorkflowJobTemplateDeferred.promise); - - WorkflowAdd = $controller('WorkflowAdd', { - $scope: scope, - $state: state, - Alert: Alert, - GenerateForm: GenerateForm, - TemplatesService: TemplatesService, - ProcessErrors: ProcessErrors, - CreateSelect2: CreateSelect2, - Wait: Wait, - ParseTypeChange: ParseTypeChange, - availableLabels: availableLabels, - ToJSON - }); - })); - - it('should get/set the label options and select2-ify the input', ()=>{ - // We expect the digest cycle to fire off this call to /static/config.js so we go ahead and handle it - httpBackend.expectGET('/static/config.js').respond(200); - scope.$digest(); - expect(scope.labelOptions).toEqual([{ - label: "foo", - value: "1" - }]); - expect(CreateSelect2).toHaveBeenCalledWith({ - element:'#workflow_job_template_labels', - multiple: true, - addNew: true - }); - }); - - describe('scope.formSave()', () => { - - it('should call TemplatesService.createWorkflowJobTemplate', ()=>{ - scope.name = "Test Workflow"; - scope.description = "This is a test description"; - scope.formSave(); - expect(TemplatesService.createWorkflowJobTemplate).toHaveBeenCalledWith({ - name: "Test Workflow", - description: "This is a test description", - organization: undefined, - inventory: undefined, - limit: undefined, - scm_branch: undefined, - labels: undefined, - variables: undefined, - allow_simultaneous: undefined, - webhook_service: '', - webhook_credential: null, - ask_inventory_on_launch: false, - ask_variables_on_launch: false, - ask_limit_on_launch: false, - ask_scm_branch_on_launch: false, - extra_vars: undefined - }); - }); - }); - - describe('scope.formCancel()', () => { - - it('should transition to templates', ()=>{ - scope.formCancel(); - expect(state.transitionTo).toHaveBeenCalledWith('templates'); - }); - - }); - -}); diff --git a/awx/ui/test/unit/.eslintrc.js b/awx/ui/test/unit/.eslintrc.js deleted file mode 100644 index c8aebfd813..0000000000 --- a/awx/ui/test/unit/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - env: { - jasmine: true - } -}; - diff --git a/awx/ui/test/unit/components/file.unit.js b/awx/ui/test/unit/components/file.unit.js deleted file mode 100644 index 1bf7041b56..0000000000 --- a/awx/ui/test/unit/components/file.unit.js +++ /dev/null @@ -1,61 +0,0 @@ -describe('Components | Input | File', () => { - let $scope; - let element; - let state; - let controller; - - const getMockFileEvent = file => ({ target: { files: [file] } }); - - beforeEach(() => { - angular.mock.module('at.lib.services'); - angular.mock.module('at.lib.components'); - }); - - describe('AtInputFileController', () => { - beforeEach(angular.mock.inject(($rootScope, $compile) => { - const component = ''; - const dom = angular.element(`${component}`); - - $scope = $rootScope.$new(); - $scope.vm = { form: { disabled: false, unit: {} } }; - - $compile(dom)($scope); - $scope.$digest(); - - element = dom.find('#unit'); - state = $scope.vm.form.unit; - controller = element.controller('atInputFile'); - })); - - it('should initialize without a value by default', () => { - expect(state._value).not.toBeDefined(); - expect(state._displayValue).not.toBeDefined(); - }); - - it('should update display value with file name when file is read', () => { - const name = 'notavirus.exe'; - const reader = { result: 'AAAAAAA' }; - - controller.check = jasmine.createSpy('check'); - - controller.readFile(reader, getMockFileEvent({ name })); - - $scope.$digest(); - - expect(state._value).toBeDefined(); - expect(state._displayValue).toEqual(name); - - expect(controller.check).toHaveBeenCalled(); - }); - - it('should notify handler on file input change event', () => { - controller.handleFileChangeEvent = jasmine.createSpy('handleFileChangeEvent'); - - element.find('input')[0].dispatchEvent(new Event('change')); - - $scope.$digest(); - - expect(controller.handleFileChangeEvent).toHaveBeenCalled(); - }); - }); -}); diff --git a/awx/ui/test/unit/components/index.js b/awx/ui/test/unit/components/index.js deleted file mode 100644 index 7ae48d5dbc..0000000000 --- a/awx/ui/test/unit/components/index.js +++ /dev/null @@ -1,11 +0,0 @@ -// Import angular and angular-mocks to the global scope -import 'angular-mocks'; - -// Import tests -import './file.unit'; -import './layout.unit'; -import './side-nav.unit'; -import './side-nav-item.unit'; -import './jobs-list.unit'; -import './job-details-split-jobs.unit'; -import './stream.unit'; diff --git a/awx/ui/test/unit/components/job-details-split-jobs.unit.js b/awx/ui/test/unit/components/job-details-split-jobs.unit.js deleted file mode 100644 index 39099969aa..0000000000 --- a/awx/ui/test/unit/components/job-details-split-jobs.unit.js +++ /dev/null @@ -1,185 +0,0 @@ -import moment from 'moment'; - -describe('View: Job Details', () => { - let JobDetails; - let scope; - let state; - let OutputStrings; - let Prompt; - let filter; - let ProcessErrors; - let Wait; - let httpBackend; - let ParseVariableString; - let subscribe; - let OutputStatusService; - - let mockData = { - job_slice_count: 2, - job_slice_number: 2, - labels: { - SLICE_JOB: 'foo' - }, - tooltips: { - SLICE_JOB_DETAILS: 'bar' - } - }; - const resource = { - id: '147', - type: 'playbook', - model: { - get: (obj) => obj.split('.').reduce((i, o) => i && i[o] || null, mockData), - has: jasmine.createSpy('has'), - options: jasmine.createSpy('options'), - }, - events: {}, - ws: {} - }; - - beforeEach(angular.mock.module('at.features.output', ($provide) => { - state = { - params: { - job_search: {} - }, - go: jasmine.createSpy('go'), - includes: jasmine.createSpy('includes') - }; - - OutputStrings = { - get: (obj) => obj.split('.').reduce((i, o) => i && i[o] || null, mockData), - }; - - OutputStatusService = { - subscribe: jasmine.createSpy('subscribe') - }; - - ProcessErrors = jasmine.createSpy('ProcessErrors'); - Wait = jasmine.createSpy('Wait'); - Prompt = jasmine.createSpy('Prompt'); - - $provide.value('state', state); - $provide.value('ProcessErrors', ProcessErrors); - $provide.value('Wait', Wait); - $provide.value('Prompt', Prompt); - $provide.value('OutputStrings', OutputStrings); - $provide.value('ParseVariableString', angular.noop); - $provide.value('OutputStatusService', OutputStatusService); - - $provide.provider('$stateProvider', { $get: jasmine.createSpy('$get'), }); - $provide.value('$stateExtender', { addState: jasmine.createSpy('addState'), }); - $provide.value('$stateRegistry', { register: jasmine.createSpy('regster'), }); - $provide.value('sanitizeFilter', angular.noop); - $provide.value('subscribe', subscribe); - $provide.value('moment', moment); - $provide.value('longDateFilter', angular.noop); - })); - - beforeEach(angular.mock.inject(( - $injector, $componentController, $rootScope, - $httpBackend, _state_, _OutputStrings_, _ParseVariableString_, _Prompt_, - _ProcessErrors_, _Wait_, _OutputStatusService_ - ) => { - scope = $rootScope.$new(); - state = _state_; - OutputStrings = _OutputStrings_; - Prompt = _Prompt_; - filter = $injector.get('$filter'); - ProcessErrors = _ProcessErrors_; - Wait = _Wait_; - ParseVariableString = _ParseVariableString_; - httpBackend = $httpBackend; - OutputStatusService = _OutputStatusService_; - - JobDetails = $componentController('atJobDetails', { - $scope: scope, - $state: state, - OutputStrings, - ProcessErrors, - Wait, - Prompt, - $filter: filter, - ParseVariableString, - httpBackend, - OutputStatusService, - }, { resource }); - JobDetails.$onInit(); - })); - - describe('JobDetails Component', () => { - it('is created successfully', () => { - expect(JobDetails).toBeDefined(); - }); - it('has method "sliceJobDetails"', () => { - expect(JobDetails.sliceJobDetails).toBeDefined(); - }); - describe('splitJobDetails method', () => { - it('returned values are strings', () => { - const result = JobDetails.sliceJobDetails; - const { label, offset, tooltip } = result; - expect(offset).toEqual('2/2'); - expect(label).toEqual('foo'); - expect(tooltip).toEqual('bar'); - }); - it('returns null if label, offset, or tooltip is undefined', () => { - mockData = { - job_slice_count: 2, - job_slice_number: 2, - labels: { - SLICE_JOB: null - }, - tooltips: { - SLICE_JOB_DETAILS: null - } - }; - JobDetails.$onInit(); - const result = JobDetails.sliceJobDetails; - expect(result).toBeNull(); - }); - it('returns null if job_slice_count is undefined or null', () => { - mockData = { - job_slice_count: null, - job_slice_number: 2, - labels: { - SLICE_JOB: 'foo' - }, - tooltips: { - SLICE_JOB_DETAILS: 'bar' - } - }; - JobDetails.$onInit(); - const result = JobDetails.sliceJobDetails; - expect(result).toBeNull(); - }); - it('returns null if job_slice_number is undefined or null', () => { - mockData = { - job_slice_count: 2, - job_slice_number: null, - labels: { - SLICE_JOB: 'foo' - }, - tooltips: { - SLICE_JOB_DETAILS: 'bar' - } - }; - JobDetails.$onInit(); - const result = JobDetails.sliceJobDetails; - expect(result).toBeNull(); - }); - it('returns null if job is a non-sliced job', () => { - mockData = { - job_slice_count: 1, - job_slice_number: null, - labels: { - SLICE_JOB: 'foo' - }, - tooltips: { - SLICE_JOB_DETAILS: 'bar' - } - }; - JobDetails.$onInit(); - const result = JobDetails.sliceJobDetails; - expect(result).toBeNull(); - }); - }); - }); -}); diff --git a/awx/ui/test/unit/components/jobs-list.unit.js b/awx/ui/test/unit/components/jobs-list.unit.js deleted file mode 100644 index 845225201c..0000000000 --- a/awx/ui/test/unit/components/jobs-list.unit.js +++ /dev/null @@ -1,149 +0,0 @@ -describe('View: Split Jobs List', () => { - let JobList; - let scope; - let state; - let Dataset; - let resolvedModels; - let JobsStrings; - let QuerySet; - let Prompt; - let filter; - let ProcessErrors; - let Wait; - let Rest; - let SearchBasePath; - - beforeEach(angular.mock.module('at.features.jobs', ($provide) => { - Dataset = { - data: { - results: {} - } - }; - state = { - params: { - job_search: {} - }, - go: jasmine.createSpy('go'), - includes: jasmine.createSpy('includes') - }; - resolvedModels = [ - { - options: () => ['foo', 'bar'], - } - ]; - JobsStrings = { - get: (str) => { - if (str === 'list.SLICE_JOB') { - return 'Slice Job'; - } - if (str === 'list.ROW_ITEM_LABEL_WEBHOOK') { - return 'Webhook'; - } - return ''; - } - }; - - ProcessErrors = jasmine.createSpy('ProcessErrors'); - Wait = jasmine.createSpy('Wait'); - Prompt = jasmine.createSpy('Prompt'); - - $provide.value('state', state); - $provide.value('Dataset', Dataset); - $provide.value('resolvedModels', resolvedModels); - $provide.value('ProcessErrors', ProcessErrors); - $provide.value('Wait', Wait); - $provide.value('Prompt', Prompt); - $provide.value('Rest', angular.noop); - $provide.value('SearchBasePath', ''); - $provide.value('JobsStrings', JobsStrings); - $provide.value('QuerySet', angular.noop); - - $provide.provider('$stateProvider', { $get: jasmine.createSpy('$get'), }); - $provide.value('$stateExtender', { addState: jasmine.createSpy('addState'), }); - })); - - beforeEach(angular.mock.inject(( - $controller, $rootScope, _state_, _Dataset_, _resolvedModels_, _JobsStrings_, - _QuerySet_, _Prompt_, _$filter_, _ProcessErrors_, _Wait_, _Rest_, _SearchBasePath_ - ) => { - scope = $rootScope.$new(); - state = _state_; - Dataset = _Dataset_; - resolvedModels = _resolvedModels_; - JobsStrings = _JobsStrings_; - QuerySet = _QuerySet_; - Prompt = _Prompt_; - filter = _$filter_; - ProcessErrors = _ProcessErrors_; - Wait = _Wait_; - Rest = _Rest_; - SearchBasePath = _SearchBasePath_; - - JobList = $controller('jobsListController', { - $scope: scope, - $state: state, - Dataset, - resolvedModels, - JobsStrings, - ProcessErrors, - QuerySet, - Wait, - Prompt, - $filter: filter, - Rest, - SearchBasePath, - }); - })); - - describe('JobList Controller', () => { - it('is created successfully', () => { - expect(JobList).toBeDefined(); - }); - it('has method "getSecondaryTagLabel"', () => { - expect(JobList.getSecondaryTagLabel).toBeDefined(); - }); - it('returns the expected string when slice data is available', () => { - const data = { - job_slice_number: 1, - job_slice_count: 2, - launch_type: 'manual', - }; - const result = JobList.getSecondaryTagLabel(data); - expect(result).toEqual('Slice Job 1/2'); - }); - it('returns null when slice data is null', () => { - const data = { - job_slice_number: null, - job_slice_count: null, - launch_type: 'manual', - }; - const result = JobList.getSecondaryTagLabel(data); - expect(result).toBeNull(); - }); - it('returns null when slice data is undefined', () => { - const data = { - job_slice_number: undefined, - job_slice_count: undefined, - launch_type: 'manual', - }; - const result = JobList.getSecondaryTagLabel(data); - expect(result).toBeNull(); - }); - it('returns null when job is not a sliced or webhook job', () => { - const data = { - job_slice_number: null, - job_slice_count: 1, - launch_type: 'manual', - }; - const result = JobList.getSecondaryTagLabel(data); - expect(result).toBeNull(); - }); - it('returns the expected string for webhook jobs', () => { - const data = { - launch_type: 'webhook', - }; - const result = JobList.getSecondaryTagLabel(data); - expect(result).toEqual('Webhook'); - }); - }); -}); diff --git a/awx/ui/test/unit/components/layout.unit.js b/awx/ui/test/unit/components/layout.unit.js deleted file mode 100644 index e6434ebf82..0000000000 --- a/awx/ui/test/unit/components/layout.unit.js +++ /dev/null @@ -1,171 +0,0 @@ -describe('Components | Layout', () => { - let $compile; - let $rootScope; - let $httpBackend; - let element; - let scope; - - beforeEach(() => { - angular.mock.module('gettext'); - angular.mock.module('I18N'); - angular.mock.module('ui.router'); - angular.mock.module('at.lib.services'); - angular.mock.module('at.lib.components'); - angular.mock.module('Utilities'); - angular.mock.module('ngCookies'); - }); - - beforeEach(angular.mock.inject((_$compile_, _$rootScope_, _$httpBackend_) => { - $compile = _$compile_; - $rootScope = _$rootScope_; - $httpBackend = _$httpBackend_; - scope = $rootScope.$new(); - - element = angular.element(''); - element = $compile(element)(scope); - scope.$digest(); - })); - - describe('AtLayoutController', () => { - let controller; - - beforeEach(() => { - const mockOrgAdminResponse = { - data: { - count: 3 - } - }; - - const mockNotificationAdminResponse = { - data: { - count: 1 - } - }; - - controller = element.controller('atLayout'); - $httpBackend.when('GET', /admin_of_organizations/) - .respond(mockOrgAdminResponse); - - $httpBackend.when('GET', /organizations\/\?role_level=notification_admin_role/) - .respond(mockNotificationAdminResponse); - }); - - xit('$scope.$on($stateChangeSuccess) should assign toState name to currentState', () => { - const next = { name: 'dashboard' }; - $rootScope.$broadcast('$stateChangeSuccess', next); - expect(controller.currentState).toBe('dashboard'); - }); - - describe('$root.current_user watcher should assign value to ', () => { - beforeEach(() => { - const val = { - username: 'admin', - id: 1 - }; - $rootScope.current_user = val; - scope.$digest(); - }); - - it('isLoggedIn', () => { - expect(controller.isLoggedIn).toBe('admin'); - - $rootScope.current_user = { id: 1 }; - scope.$digest(); - expect(controller.isLoggedIn).not.toBeDefined(); - }); - - it('isSuperUser', () => { - $rootScope.current_user = 'one'; - $rootScope.user_is_superuser = true; - $rootScope.user_is_system_auditor = false; - scope.$digest(); - expect(controller.isSuperUser).toBe(true); - - $rootScope.current_user = 'two'; - $rootScope.user_is_superuser = false; - $rootScope.user_is_system_auditor = true; - scope.$digest(); - expect(controller.isSuperUser).toBe(true); - - $rootScope.current_user = 'three'; - $rootScope.user_is_superuser = true; - $rootScope.user_is_system_auditor = true; - scope.$digest(); - expect(controller.isSuperUser).toBe(true); - - $rootScope.current_user = 'four'; - $rootScope.user_is_superuser = false; - $rootScope.user_is_system_auditor = false; - scope.$digest(); - expect(controller.isSuperUser).toBe(false); - }); - - it('currentUsername', () => { - expect(controller.currentUsername).toBeTruthy(); - expect(controller.currentUsername).toBe('admin'); - }); - - it('currentUserId', () => { - expect(controller.currentUserId).toBeTruthy(); - expect(controller.currentUserId).toBe(1); - }); - }); - - describe('$root.socketStatus watcher should assign newStatus to', () => { - const statuses = ['connecting', 'error', 'ok']; - - it('socketState', () => { - _.forEach(statuses, (status) => { - $rootScope.socketStatus = status; - scope.$digest(); - expect(controller.socketState).toBeTruthy(); - expect(controller.socketState).toBe(status); - }); - }); - - it('socketIconClass', () => { - _.forEach(statuses, (status) => { - $rootScope.socketStatus = status; - scope.$digest(); - expect(controller.socketIconClass).toBe(`icon-socket-${status}`); - }); - }); - }); - - describe('$root.licenseMissing watcher should assign true or false to', () => { - it('licenseIsMissing', () => { - $rootScope.licenseMissing = true; - scope.$digest(); - expect(controller.licenseIsMissing).toBe(true); - - $rootScope.licenseMissing = false; - scope.$digest(); - expect(controller.licenseIsMissing).toBe(false); - }); - }); - - describe('getString()', () => { - it('calls ComponentsStrings get() method', angular.mock.inject((_ComponentsStrings_) => { - spyOn(_ComponentsStrings_, 'get'); - controller.getString('VIEW_DOCS'); - expect(_ComponentsStrings_.get).toHaveBeenCalled(); - })); - - it('ComponentsStrings get() method should return undefined if string is not a property name of the layout class', () => { - expect(controller.getString('SUBMISSION_ERROR_TITLE')).toBe(undefined); - }); - - it('should return layout string', () => { - const layoutStrings = { - CURRENT_USER_LABEL: 'Logged in as', - VIEW_DOCS: 'View Documentation', - LOGOUT: 'Logout', - }; - - _.forEach(layoutStrings, (value, key) => { - expect(controller.getString(key)).toBe(value); - }); - }); - }); - }); -}); diff --git a/awx/ui/test/unit/components/side-nav-item.unit.js b/awx/ui/test/unit/components/side-nav-item.unit.js deleted file mode 100644 index e0deffa245..0000000000 --- a/awx/ui/test/unit/components/side-nav-item.unit.js +++ /dev/null @@ -1,55 +0,0 @@ -describe('Components | Side Nav Item', () => { - let $compile; - let $rootScope; - let element; - let scope; - - beforeEach(() => { - angular.mock.module('gettext'); - angular.mock.module('I18N'); - angular.mock.module('ui.router'); - angular.mock.module('at.lib.services'); - angular.mock.module('at.lib.components'); - angular.mock.module('Utilities'); - angular.mock.module('ngCookies'); - }); - - beforeEach(angular.mock.inject((_$compile_, _$rootScope_) => { - $compile = _$compile_; - $rootScope = _$rootScope_; - scope = $rootScope.$new(); - - element = angular.element(''); - element = $compile(element)(scope); - scope.name = 'dashboard'; - scope.$digest(); - })); - - describe('Side Nav Item Controller', () => { - let SideNavItem; - let SideNavItemCtrl; - - beforeEach(() => { - SideNavItem = angular.element(element[0].querySelector('at-side-nav-item')); - SideNavItemCtrl = SideNavItem.controller('atSideNavItem'); - }); - - xit('layoutVm.currentState watcher should assign isRoute', () => { - let current = { name: 'dashboard' }; - $rootScope.$broadcast('$stateChangeSuccess', current); - scope.$digest(); - expect(SideNavItemCtrl.isRoute).toBe(true); - - current = { name: 'inventories' }; - $rootScope.$broadcast('$stateChangeSuccess', current); - scope.$digest(); - expect(SideNavItemCtrl.isRoute).toBe(false); - }); - - it('should load name, icon, and route from scope', () => { - expect(SideNavItem.isolateScope().name).toBeDefined(); - expect(SideNavItem.isolateScope().iconClass).toBeDefined(); - expect(SideNavItem.isolateScope().route).toBeDefined(); - }); - }); -}); diff --git a/awx/ui/test/unit/components/side-nav.unit.js b/awx/ui/test/unit/components/side-nav.unit.js deleted file mode 100644 index e460528a2e..0000000000 --- a/awx/ui/test/unit/components/side-nav.unit.js +++ /dev/null @@ -1,80 +0,0 @@ -describe('Components | Side Nav', () => { - let $compile; - let $rootScope; - let element; - let scope; - const windowMock = { - innerWidth: 500 - }; - - beforeEach(() => { - angular.mock.module('gettext'); - angular.mock.module('I18N'); - angular.mock.module('ui.router'); - angular.mock.module('at.lib.services'); - angular.mock.module('at.lib.components', ($provide) => { - $provide.value('$window', windowMock); - }); - angular.mock.module('Utilities'); - angular.mock.module('ngCookies'); - }); - - beforeEach(angular.mock.inject((_$compile_, _$rootScope_) => { - $compile = _$compile_; - $rootScope = _$rootScope_; - scope = $rootScope.$new(); - - element = angular.element(''); - element = $compile(element)(scope); - scope.$digest(); - })); - - describe('Side Nav Controller', () => { - let sideNav; - let sideNavCtrl; - - beforeEach(() => { - sideNav = angular.element(element[0].querySelector('.at-Layout-side')); - sideNavCtrl = sideNav.controller('atSideNav'); - }); - - it('isExpanded defaults to false', () => { - expect(sideNavCtrl.isExpanded).toBe(false); - }); - - it('toggleExpansion()', () => { - expect(sideNavCtrl.isExpanded).toBe(false); - - sideNavCtrl.toggleExpansion(); - expect(sideNavCtrl.isExpanded).toBe(true); - - sideNavCtrl.toggleExpansion(); - expect(sideNavCtrl.isExpanded).toBe(false); - - sideNavCtrl.toggleExpansion(); - expect(sideNavCtrl.isExpanded).toBe(true); - - sideNavCtrl.toggleExpansion(); - expect(sideNavCtrl.isExpanded).toBe(false); - }); - - xit('isExpanded should be false after state change event', () => { - sideNavCtrl.isExpanded = true; - - const current = { - name: 'dashboard' - }; - $rootScope.$broadcast('$stateChangeSuccess', current); - scope.$digest(); - expect(sideNavCtrl.isExpanded).toBe(false); - }); - - it('clickOutsideSideNav watcher should assign isExpanded to false', () => { - sideNavCtrl.isExpanded = true; - - $rootScope.$broadcast('clickOutsideSideNav'); - scope.$digest(); - expect(sideNavCtrl.isExpanded).toBe(false); - }); - }); -}); diff --git a/awx/ui/test/unit/components/stream.unit.js b/awx/ui/test/unit/components/stream.unit.js deleted file mode 100644 index 5d979592be..0000000000 --- a/awx/ui/test/unit/components/stream.unit.js +++ /dev/null @@ -1,103 +0,0 @@ -import StreamService from '~features/output/stream.service'; - -describe('Output | StreamService', () => { - angular.module('test', []).service('StreamService', StreamService); - let stream; - - beforeEach(() => { - angular.mock.module('test'); - }); - - beforeEach(angular.mock.inject(($injector) => { - stream = $injector.get('StreamService'); - - const onFrames = angular.noop; - const onFrameRate = angular.noop; - - stream.init({ onFrames, onFrameRate }); - })); - - describe('calcFactors', () => { - it('returns the expected values', () => { - const params = [ - [-1, [1]], - [0, [1]], - [1, [1]], - [1.0, [1]], - [1.1, [1]], - [2, [1, 2]], - ['1', [1]], - [{}, [1]], - [null, [1]], - [undefined, [1]], - [250, [1, 2, 5, 10, 25, 50, 125, 250]] - ]; - - params.forEach(([size, expected]) => - expect(stream.calcFactors(size)).toEqual(expected)); - }); - }); - - describe('setMissingCounterThreshold', () => { - it('returns the correct counter threshold', () => { - const gt = 2; - stream.setMissingCounterThreshold(gt); - expect(stream.counters.min).toEqual(gt); - - const lt = -1; - stream.setMissingCounterThreshold(lt); - expect(stream.counters.min).toEqual(gt); - }); - }); - - describe('isReadyToRender', () => { - it("it's never ready to render when live updates are enabled unless the result of getReadyCount is greater than 0", () => { - delete window.liveUpdates; - Object.defineProperty(window, 'liveUpdates', { - value: true, - writable: false - }); - - const params = [ - [-1, false], - [0, false], - [1, true] - ]; - const spy = spyOn(stream, 'getReadyCount'); - - params.forEach(([readyCount, expected]) => { - spy.and.returnValue(readyCount); - expect(stream.isReadyToRender()).toEqual(expected); - }); - }); - }); - - describe('getMaxCounter', () => { - it('returns the same value as max counter', () => { - const res = stream.getMaxCounter(); - expect(res).toEqual(stream.counters.max); - }); - }); - - describe('getReadyCount', () => { - it('references min and max counters', () => { - expect(stream.getReadyCount()).toEqual(stream.counters.max - stream.counters.min + 1); - }); - it('returns expected values if min or max value is a non-integer', () => { - const params = [ - [null, 1, 0], - [undefined, 1, NaN], - ['1', 1, 1], - [-1, -3, 3], - [0, 0, 1], - [6, 5, 2] - ]; - - params.forEach(([max, min, expected]) => { - stream.counters.ready = max; - stream.counters.min = min; - expect(stream.getReadyCount()).toEqual(expected); - }); - }); - }); -}); diff --git a/awx/ui/test/unit/index.js b/awx/ui/test/unit/index.js deleted file mode 100644 index 7c8967ef87..0000000000 --- a/awx/ui/test/unit/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import './components'; -import './models'; diff --git a/awx/ui/test/unit/karma.unit.js b/awx/ui/test/unit/karma.unit.js deleted file mode 100644 index b3d6088ed8..0000000000 --- a/awx/ui/test/unit/karma.unit.js +++ /dev/null @@ -1,58 +0,0 @@ -const path = require('path'); -const webpackConfig = require('../../build/webpack.test.js'); - -process.env.CHROME_BIN = process.env.CHROME_BIN || require('puppeteer').executablePath(); - -const SRC_PATH = path.resolve(__dirname, '../../client/src'); - -module.exports = config => { - config.set({ - basePath: '', - singleRun: true, - autoWatch: false, - colors: true, - frameworks: ['jasmine'], - browsers: ['chromeHeadless'], - reporters: ['progress', 'junit'], - files: [ - path.join(SRC_PATH, 'vendor.js'), - path.join(SRC_PATH, 'app.js'), - path.join(SRC_PATH, '**/*.html'), - 'index.js' - ], - plugins: [ - 'karma-webpack', - 'karma-jasmine', - 'karma-junit-reporter', - 'karma-chrome-launcher', - 'karma-html2js-preprocessor' - ], - preprocessors: { - [path.join(SRC_PATH, 'vendor.js')]: 'webpack', - [path.join(SRC_PATH, 'app.js')]: 'webpack', - [path.join(SRC_PATH, '**/*.html')]: 'html2js', - 'index.js': 'webpack' - }, - webpack: webpackConfig, - webpackMiddleware: { - noInfo: 'errors-only' - }, - junitReporter: { - outputDir: 'reports', - outputFile: 'results.unit.xml', - useBrowserName: false - }, - customLaunchers: { - chromeHeadless: { - base: 'Chrome', - flags: [ - '--no-sandbox', - '--disable-setuid-sandbox', - '--headless', - '--disable-gpu', - '--remote-debugging-port=9222', - ], - }, - }, - }); -}; diff --git a/awx/ui/test/unit/models/base.unit.js b/awx/ui/test/unit/models/base.unit.js deleted file mode 100644 index f721c12a0a..0000000000 --- a/awx/ui/test/unit/models/base.unit.js +++ /dev/null @@ -1,25 +0,0 @@ -describe('Models | BaseModel', () => { - let baseModel; - - beforeEach(() => { - angular.mock.module('at.lib.services'); - angular.mock.module('at.lib.models'); - }); - - beforeEach(angular.mock.inject(($injector) => { - baseModel = new ($injector.get('BaseModel'))('test'); - })); - - describe('parseRequestConfig', () => { - it('always returns the expected configuration', () => { - const { parseRequestConfig } = baseModel; - const data = { name: 'foo' }; - - expect(parseRequestConfig('get')).toEqual({ method: 'get', resource: undefined }); - expect(parseRequestConfig('get', 1)).toEqual({ method: 'get', resource: 1 }); - expect(parseRequestConfig('post', { data })).toEqual({ method: 'post', data }); - expect(parseRequestConfig(['get', 'post'], [1, 2], { data })) - .toEqual({ resource: [1, 2], method: ['get', 'post'] }); - }); - }); -}); diff --git a/awx/ui/test/unit/models/index.js b/awx/ui/test/unit/models/index.js deleted file mode 100644 index a1a9b3452a..0000000000 --- a/awx/ui/test/unit/models/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// Import angular and angular-mocks to the global scope -import 'angular-mocks'; - -// Import tests -import './base.unit'; diff --git a/awx/ui/test/unit/webpack.unit.js b/awx/ui/test/unit/webpack.unit.js deleted file mode 100644 index 7ec1a9a723..0000000000 --- a/awx/ui/test/unit/webpack.unit.js +++ /dev/null @@ -1,16 +0,0 @@ -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const base = require('../../build/webpack.base'); - -const STATIC_URL = '/static/'; - -const test = { - devtool: 'cheap-source-map', - plugins: [ - new webpack.DefinePlugin({ - $basePath: STATIC_URL - }) - ] -}; - -module.exports = merge(base, test); diff --git a/awx/ui/urls.py b/awx/ui/urls.py deleted file mode 100644 index 1b4e6775d2..0000000000 --- a/awx/ui/urls.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2015 Ansible, Inc. -# All Rights Reserved. - -from django.conf.urls import url -from awx.ui.views import ( - index, - portal_redirect, - migrations_notran, -) - - -app_name = 'ui' -urlpatterns = [ - url(r'^$', index, name='index'), - url(r'^migrations_notran/$', migrations_notran, name='migrations_notran'), - url(r'^portal/$', portal_redirect, name='portal_redirect'), -] diff --git a/awx/ui/utils/get_licenses.js b/awx/ui/utils/get_licenses.js deleted file mode 100755 index 17ceb79b8c..0000000000 --- a/awx/ui/utils/get_licenses.js +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env node -/* eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */ - -const { lstatSync, readdirSync, readFileSync, existsSync, writeFileSync, mkdirSync } = require('fs'); -const { join } = require('path'); -const licenseTexts = require('./license_texts'); - -// path to shrinkwrap file -const SHRINKWRAP_PATH = `${__dirname}/../package-lock.json`; -// folder that npm install node_modules to -const NODE_MODULES_FOLDER = `${__dirname}/../node_modules`; -// the folder which we will put the ui license files -const UI_LICENSE_FOLDER = `${__dirname}/../../../docs/licenses/ui`; -// these folders in node_modules should be ommited -const OMITTED_NODE_MODULES_FOLDERS = ['@uirouter', '.bin', 'cycle']; -// all the ways in which deps with license files have license files named -const LICENSE_FILE_NAMES = ['LICENSE', 'LICENCE', 'LICENSE.md', 'LICENSE.txt', 'MIT-LICENSE.txt', 'LICENSE-MIT.txt', 'LICENSE-MIT', 'LICENSE.MIT', 'LICENSE.APACHE2', 'LICENSE.BSD']; -// all the ways in which deps with license info included in readme have the license header -const LICENSE_HEADER_NAMES = ['## License']; -// all the ways in which deps with license info included in readme have readme files named -const README_FILE_NAMES = ['README', 'README.md', 'README.markdown']; -// deps that we need to manually grab the license info (and that info) -const MANUAL_NODE_MODULES_LICENSE_INFO = []; -// commenting out for now as cycle is a dev dependency, -// leaving in to show the format expected for this array -// { -// module_name: 'cycle', -// license_info: 'cycle was released as JSON-js -// under the public domain (original repo here: https://github.com/douglascrockford/JSON-js) -// and published to npm as cycle (repo here: https://github.com/dscape/cycle)' -// } -// ]; - -// texts of the licenses when the license attr is grabbed from package.json -const LICENSE_TEXTS = licenseTexts; - -// below are helper functions the getters and main script execution functions -// call to piece together the license info -const isDirectory = source => lstatSync(source).isDirectory(); - -const manualNodeModulesSubDirectories = source => [join(source, '@uirouter/angularjs'), join(source, '@uirouter/core')]; - -const getNonDevDependencyModulesFromShrinkwrap = () => { - const getModDeps = (deps) => { - const depNamesArr = Object.keys(deps); - let arr = []; - depNamesArr.forEach(name => { - if (deps[name].dependecies) { - arr = arr.concat(getModDeps(deps[name].dependecies)); - } - if (!deps[name].dev) { - arr.push(name); - } - }); - return arr; - }; - - const shrinkwrap = JSON.parse(readFileSync(SHRINKWRAP_PATH).toString()); - - return getModDeps(shrinkwrap.dependencies); -}; - -const getSubdirectories = source => { - const listOfNonDevDependencyModules = getNonDevDependencyModulesFromShrinkwrap(); - const fromNodeModsDir = readdirSync(source) - .filter(name => OMITTED_NODE_MODULES_FOLDERS.indexOf(name) === -1) - .filter(name => listOfNonDevDependencyModules.indexOf(name) !== -1) - .map(name => join(source, name)) - .filter(isDirectory); - return fromNodeModsDir.concat(manualNodeModulesSubDirectories(source)); -}; - -const getModulename = path => { - let updatedPath; - if (path.includes('@uirouter')) { - updatedPath = path.split('/').slice(-2).join('-'); - } else { - updatedPath = path.split('/').slice(-1).join(''); - } - - return updatedPath; -}; - -const licenseTextIncludedInReadme = (readmeText, returnLicenseText) => LICENSE_HEADER_NAMES - .reduce((a, b) => { - let licenseVal; - if (!returnLicenseText) { - licenseVal = a || readmeText.includes(b); - } else if (a !== false) { - licenseVal = a; - } else if (readmeText.includes(b)) { - licenseVal = readmeText.split(b).slice(1, readmeText.split(b).length); - } else { - licenseVal = false; - } - return licenseVal; - }, false); - -const readmeIncludedInLicense = (path, returnLicenseText) => { - const readmeText = readFileSync(path).toString(); - return licenseTextIncludedInReadme(readmeText, returnLicenseText); -}; - -const licenseAttrInPackageJSON = (path, returnLicenseType) => { - const packageJSON = JSON.parse(readFileSync(path).toString()); - let isInPackageJSON; - if (!returnLicenseType) { - isInPackageJSON = packageJSON.license !== undefined || packageJSON.licenses !== undefined; - } else if (packageJSON.license && packageJSON.license.type) { - isInPackageJSON = packageJSON.license.type.toString(); - } else if (packageJSON.licenses && Array - .isArray(packageJSON.licenses) && packageJSON.licenses[0] && packageJSON.licenses[0].type) { - isInPackageJSON = packageJSON.licenses[0].type.toString(); - } else if (packageJSON.licenses) { - isInPackageJSON = packageJSON.licenses.toString(); - } else { - isInPackageJSON = packageJSON.license.toString(); - } - return isInPackageJSON; -}; - -// below are getters for the various types of ways licenses are included in the packages - -const hasLicenseFile = (path, returnFileName) => LICENSE_FILE_NAMES - .reduce((a, b) => { - let isLicenseFile; - if (!returnFileName) { - isLicenseFile = a || existsSync(join(path, b)); - } else if (a !== false) { - isLicenseFile = a; - } else if (existsSync(join(path, b))) { - isLicenseFile = join(path, b); - } else { - isLicenseFile = false; - } - return isLicenseFile; - }, false); - -const hasLicenseAttrInNPM = (path, returnLicenseType) => { - const packageJSONPath = join(path, 'package.json'); - return existsSync(packageJSONPath) && - licenseAttrInPackageJSON(packageJSONPath, returnLicenseType); -}; - -const hasLicenseInReadme = (path, returnLicenseText) => README_FILE_NAMES - .reduce((a, b) => { - const readmePath = join(path, b); - const readmeIncluded = existsSync(readmePath) && readmeIncludedInLicense(readmePath); - let isLicenseInReadme; - if (!returnLicenseText) { - isLicenseInReadme = a || readmeIncluded; - } else if (a !== false) { - isLicenseInReadme = a; - } else if (readmeIncluded) { - isLicenseInReadme = readmeIncludedInLicense(readmePath, returnLicenseText); - } else { - isLicenseInReadme = false; - } - return isLicenseInReadme; - }, false); - -const hasManualLicenseInfo = (path) => Object.prototype.hasOwnProperty - .call(MANUAL_NODE_MODULES_LICENSE_INFO, path); - -// checks to make sure all deps have some sort of license info associated -const licenseCheck = () => { - console.log('Checking each module for license.'); - - const noLicensePackage = getSubdirectories(NODE_MODULES_FOLDER) - .filter(path => !hasLicenseFile(path) && - !hasLicenseAttrInNPM(path) && - !hasLicenseInReadme(path) && - !hasManualLicenseInfo(path)); - - if (noLicensePackage.length === 0) { - console.log('Success! All modules probably have a license associated.'); - } else { - console.log(`ERROR! The following modules do not have license info associated with them: ${noLicensePackage.join(', ')}.`); - process.exit(1); - } -}; - -// copies the license info from the deps into a licenses folder -const licenseWrite = () => { - // create the ui license folder if it doesn't exist - if (!existsSync(UI_LICENSE_FOLDER)) { - mkdirSync(UI_LICENSE_FOLDER); - } - - console.log('Copying licenses from modules with license files.'); - - const modulesWithLicenseFile = getSubdirectories(NODE_MODULES_FOLDER) - .filter(path => hasLicenseFile(path)); - - console.log(`${modulesWithLicenseFile.length} modules with license files.`); - - modulesWithLicenseFile.forEach(path => { - writeFileSync( - join(UI_LICENSE_FOLDER, `${getModulename(path)}.txt`), - readFileSync(hasLicenseFile(path, true)).toString() - ); - }); - - const modulesWithPackageJSONLicenseAttr = getSubdirectories(NODE_MODULES_FOLDER) - .filter(path => !hasLicenseFile(path) && hasLicenseAttrInNPM(path)); - - console.log(`${modulesWithPackageJSONLicenseAttr.length} modules with license attr in package.json.`); - - modulesWithPackageJSONLicenseAttr.forEach(path => { - const licenseType = hasLicenseAttrInNPM(path, true); - const licenseText = LICENSE_TEXTS[licenseType]; - - if (!licenseText) { - console.log(`ERROR! License text for ${licenseType} is not in license_texts.js.`); - process.exit(1); - } - - writeFileSync(join(UI_LICENSE_FOLDER, `${getModulename(path)}.txt`), licenseText); - }); - - const modulesWithLicenseInfoInReadme = getSubdirectories(NODE_MODULES_FOLDER) - .filter(path => !hasLicenseFile(path) && - !hasLicenseAttrInNPM(path) && - hasLicenseInReadme(path)); - - console.log(`${modulesWithLicenseInfoInReadme.length} modules with license text in readme.`); - - modulesWithLicenseInfoInReadme.forEach(path => { - writeFileSync(join(UI_LICENSE_FOLDER, `${getModulename(path)}.txt`), hasLicenseInReadme(path, true)); - }); - - console.log(`${MANUAL_NODE_MODULES_LICENSE_INFO.length} modules with license info manually added to this script.`); - - MANUAL_NODE_MODULES_LICENSE_INFO.forEach(mod => { - writeFileSync(join(UI_LICENSE_FOLDER, `${getModulename(mod.module_name)}.txt`), mod.license_info); - }); -}; - -licenseCheck(); -licenseWrite(); diff --git a/awx/ui/utils/license_texts.js b/awx/ui/utils/license_texts.js deleted file mode 100644 index 0c0f2ee1f1..0000000000 --- a/awx/ui/utils/license_texts.js +++ /dev/null @@ -1,539 +0,0 @@ -module.exports = { - MIT: ` -MIT -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. - `, - 'CC0-1.0': ` -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. - `, - 'MIT OR GPL-2.0': ` -MIT -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.`, - ISC: ` -ISC -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - `, - 'MIT,OFL-1.1': ` -MIT -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. - -SIL OPEN FONT LICENSE -Version 1.1 - 26 February 2007 - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting - in part or in whole - any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - `, - BSD: ` -BSD -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - `, - 'BSD-2-Clause': ` -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - `, - 'AFLv2.1': ` -The Academic Free License -v. 2.1 - -This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: - -Licensed under the Academic Free License version 2.1 - -1. Grant of Copyright License. Licensor hereby grants You a -world-wide, royalty-free, non-exclusive, perpetual, sublicenseable -license to do the following: - -a. to reproduce the Original Work in copies; - -b. to prepare derivative works ("Derivative Works") based upon the Original Work; - -c. to distribute copies of the Original Work and Derivative Works to the public; - -d. to perform the Original Work publicly; and - -e. to display the Original Work publicly. - -2. Grant of Patent License. Licensor hereby grants You a world-wide, -royalty-free, non-exclusive, perpetual, sublicenseable license, under -patent claims owned or controlled by the Licensor that are embodied in -the Original Work as furnished by the Licensor, to make, use, sell and -offer for sale the Original Work and Derivative Works. - -3. Grant of Source Code License. The term "Source Code" means the -preferred form of the Original Work for making modifications to it and -all available documentation describing how to modify the Original -Work. Licensor hereby agrees to provide a machine-readable copy of the -Source Code of the Original Work along with each copy of the Original -Work that Licensor distributes. Licensor reserves the right to satisfy -this obligation by placing a machine-readable copy of the Source Code -in an information repository reasonably calculated to permit -inexpensive and convenient access by You for as long as Licensor -continues to distribute the Original Work, and by publishing the -address of that information repository in a notice immediately -following the copyright notice that applies to the Original Work. - -4. Exclusions From License Grant. Neither the names of Licensor, nor -the names of any contributors to the Original Work, nor any of their -trademarks or service marks, may be used to endorse or promote -products derived from this Original Work without express prior written -permission of the Licensor. Nothing in this License shall be deemed to -grant any rights to trademarks, copyrights, patents, trade secrets or -any other intellectual property of Licensor except as expressly stated -herein. No patent license is granted to make, use, sell or offer to -sell embodiments of any patent claims other than the licensed claims -defined in Section 2. No right is granted to the trademarks of -Licensor even if such marks are included in the Original Work. Nothing -in this License shall be interpreted to prohibit Licensor from -licensing under different terms from this License any Original Work -that Licensor otherwise would have a right to license. - -5. This section intentionally omitted. - -6. Attribution Rights. You must retain, in the Source Code of any -Derivative Works that You create, all copyright, patent or trademark -notices from the Source Code of the Original Work, as well as any -notices of licensing and any descriptive text identified therein as an -"Attribution Notice." You must cause the Source Code for any -Derivative Works that You create to carry a prominent Attribution -Notice reasonably calculated to inform recipients that You have -modified the Original Work. - -7. Warranty of Provenance and Disclaimer of Warranty. Licensor -warrants that the copyright in and to the Original Work and the patent -rights granted herein by Licensor are owned by the Licensor or are -sublicensed to You under the terms of this License with the permission -of the contributor(s) of those copyrights and patent rights. Except as -expressly stated in the immediately proceeding sentence, the Original -Work is provided under this License on an "AS IS" BASIS and WITHOUT -WARRANTY, either express or implied, including, without limitation, -the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL -WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential -part of this License. No license to Original Work is granted hereunder -except under this disclaimer. - -8. Limitation of Liability. Under no circumstances and under no legal -theory, whether in tort (including negligence), contract, or -otherwise, shall the Licensor be liable to any person for any direct, -indirect, special, incidental, or consequential damages of any -character arising as a result of this License or the use of the -Original Work including, without limitation, damages for loss of -goodwill, work stoppage, computer failure or malfunction, or any and -all other commercial damages or losses. This limitation of liability -shall not apply to liability for death or personal injury resulting -from Licensor's negligence to the extent applicable law prohibits such -limitation. Some jurisdictions do not allow the exclusion or -limitation of incidental or consequential damages, so this exclusion -and limitation may not apply to You. - -9. Acceptance and Termination. If You distribute copies of the -Original Work or a Derivative Work, You must make a reasonable effort -under the circumstances to obtain the express assent of recipients to -the terms of this License. Nothing else but this License (or another -written agreement between Licensor and You) grants You permission to -create Derivative Works based upon the Original Work or to exercise -any of the rights granted in Section 1 herein, and any attempt to do -so except under the terms of this License (or another written -agreement between Licensor and You) is expressly prohibited by -U.S. copyright law, the equivalent laws of other countries, and by -international treaty. Therefore, by exercising any of the rights -granted to You in Section 1 herein, You indicate Your acceptance of -this License and all of its terms and conditions. - -10. Termination for Patent Action. This License shall terminate -automatically and You may no longer exercise any of the rights granted -to You by this License as of the date You commence an action, -including a cross-claim or counterclaim, against Licensor or any -licensee alleging that the Original Work infringes a patent. This -termination provision shall not apply for an action alleging patent -infringement by combinations of the Original Work with other software -or hardware. - -11. Jurisdiction, Venue and Governing Law. Any action or suit relating -to this License may be brought only in the courts of a jurisdiction -wherein the Licensor resides or in which Licensor conducts its primary -business, and under the laws of that jurisdiction excluding its -conflict-of-law provisions. The application of the United Nations -Convention on Contracts for the International Sale of Goods is -expressly excluded. Any use of the Original Work outside the scope of -this License or after its termination shall be subject to the -requirements and penalties of the U.S. Copyright Act, 17 U.S.C. √Ç¬ß 101 -et seq., the equivalent laws of other countries, and international -treaty. This section shall survive the termination of this License. - -12. Attorneys Fees. In any action to enforce the terms of this License -or seeking damages relating thereto, the prevailing party shall be -entitled to recover its costs and expenses, including, without -limitation, reasonable attorneys' fees and costs incurred in -connection with such action, including any appeal of such action. This -section shall survive the termination of this License. - -13. Miscellaneous. This License represents the complete agreement -concerning the subject matter hereof. If any provision of this License -is held to be unenforceable, such provision shall be reformed only to -the extent necessary to make it enforceable. - -14. Definition of "You" in This License. "You" throughout this -License, whether in upper or lower case, means an individual or a -legal entity exercising rights under, and complying with all of the -terms of, this License. For legal entities, "You" includes any entity -that controls, is controlled by, or is under common control with -you. For purposes of this definition, "control" means (i) the power, -direct or indirect, to cause the direction or management of such -entity, whether by contract or otherwise, or (ii) ownership of fifty -percent (50%) or more of the outstanding shares, or (iii) beneficial -ownership of such entity. - -15. Right to Use. You may use the Original Work in all ways not -otherwise restricted or conditioned by this License or by law, and -Licensor promises not to interfere with or be responsible for such -uses by You. - -This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights -reserved. Permission is hereby granted to copy and distribute this -license without modification. This license may not be modified without -the express written permission of its copyright owner. - `, - 'Public Domain': ` -This library is in the public domain. - `, - 'Apache License, Version 2.0': ` -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - `, - 'CC-BY-3.0': ` -Creative Commons Attribution 3.0 Unported - -CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. - -1. Definitions -a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. -b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. -c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. -d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. -e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. -f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. -g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. -h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. -i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. -2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. -3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: -a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; -b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; -c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, -d. to Distribute and Publicly Perform Adaptations. -e. For the avoidance of doubt: -i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; -ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, -iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. -The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: -a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. -b. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv), consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. -c. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. -5. Representations, Warranties and Disclaimer -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -7. Termination -a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. -b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. -8. Miscellaneous -a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. -b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. -c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. -d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. -e. This License may not be modified without the mutual written agreement of the Licensor and You. -f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. -Creative Commons Notice - -Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. - -Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. - -Creative Commons may be contacted at http://creativecommons.org/. - ` -}; diff --git a/awx/ui/views.py b/awx/ui/views.py deleted file mode 100644 index 9e99ad9d22..0000000000 --- a/awx/ui/views.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (c) 2015 Ansible, Inc. -# All Rights Reserved. - -from django.views.generic.base import TemplateView, RedirectView -from django.conf import settings - -class IndexView(TemplateView): - - template_name = 'ui/index.html' - - def get_context_data(self, **kwargs): - context = super(IndexView, self).get_context_data(**kwargs) - context['UI_LIVE_UPDATES_ENABLED'] = settings.UI_LIVE_UPDATES_ENABLED - # Add any additional context info here. - return context - -index = IndexView.as_view() - -class PortalRedirectView(RedirectView): - - permanent = True - url = '/#/portal' - -portal_redirect = PortalRedirectView.as_view() - -class MigrationsNotran(TemplateView): - - template_name = 'ui/installing.html' - -migrations_notran = MigrationsNotran.as_view() diff --git a/awx/ui/client/assets/default.strings.json b/awx/ui_next/public/static/media/default.strings.json similarity index 100% rename from awx/ui/client/assets/default.strings.json rename to awx/ui_next/public/static/media/default.strings.json diff --git a/awx/ui/client/assets/logo-header.svg b/awx/ui_next/public/static/media/logo-header.svg similarity index 100% rename from awx/ui/client/assets/logo-header.svg rename to awx/ui_next/public/static/media/logo-header.svg diff --git a/awx/ui/client/assets/logo-login.svg b/awx/ui_next/public/static/media/logo-login.svg similarity index 100% rename from awx/ui/client/assets/logo-login.svg rename to awx/ui_next/public/static/media/logo-login.svg diff --git a/awx/ui_next/src/App.jsx b/awx/ui_next/src/App.jsx index 9b230ac553..ffafd07dba 100644 --- a/awx/ui_next/src/App.jsx +++ b/awx/ui_next/src/App.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { useRouteMatch, useLocation, - BrowserRouter, + HashRouter, Route, Switch, Redirect, @@ -76,7 +76,7 @@ function App() { } export default () => ( - + - + ); diff --git a/awx/ui_next/src/api/models/Root.js b/awx/ui_next/src/api/models/Root.js index ffba170c41..e930d3cc59 100644 --- a/awx/ui_next/src/api/models/Root.js +++ b/awx/ui_next/src/api/models/Root.js @@ -25,6 +25,14 @@ class Root extends Base { logout() { return this.http.get(`${this.baseUrl}logout/`); } + + readAssetVariables() { + // TODO: There's better ways of doing this. Build tools, scripts, + // automation etc. should relocate this variable file to an importable + // location in src prior to building. That said, a raw http call + // works for now. + return this.http.get('/static/media/default.strings.json'); + } } export default Root; diff --git a/awx/ui_next/src/components/AppContainer/AppContainer.jsx b/awx/ui_next/src/components/AppContainer/AppContainer.jsx index 1d968906d8..b107fd0f40 100644 --- a/awx/ui_next/src/components/AppContainer/AppContainer.jsx +++ b/awx/ui_next/src/components/AppContainer/AppContainer.jsx @@ -27,10 +27,6 @@ const PageHeader = styled(PFPageHeader)` &:hover { color: inherit; } - - & svg { - height: 76px; - } } `; diff --git a/awx/ui_next/src/components/AppContainer/BrandLogo.jsx b/awx/ui_next/src/components/AppContainer/BrandLogo.jsx index 7943d1c287..be15af6773 100644 --- a/awx/ui_next/src/components/AppContainer/BrandLogo.jsx +++ b/awx/ui_next/src/components/AppContainer/BrandLogo.jsx @@ -1,374 +1,18 @@ -import React, { Component } from 'react'; -import { withI18n } from '@lingui/react'; -import { t } from '@lingui/macro'; +import React from 'react'; import styled from 'styled-components'; -const ST0 = styled.g` - display: none; +const BrandImg = styled.img` + flex: initial; + height: 76px; + width: initial; + padding-left: 0px; + margin: 0px 0px 0px 0px; + max-width: 100px; + max-height: initial; + pointer-events: none; `; -const ST1 = styled.path` - display: inline; - fill: #ed1c24; -`; +const BrandLogo = () => ; -const ST2 = styled.path` - fill: #42210b; -`; - -const ST3 = styled.path` - fill: #ffffff; -`; - -const ST4 = styled.path` - fill: #c69c6d; - stroke: #8c6239; - stroke-width: 5; - stroke-miterlimit: 10; -`; - -const ST5 = styled.path` - fill: #ffffff; - stroke: #42210b; - stroke-width: 3; - stroke-miterlimit: 10; -`; - -const ST6 = styled.ellipse` - fill: #ed1c24; - stroke: #8c6239; - stroke-width: 5; - stroke-miterlimit: 10; -`; - -const ST7 = styled.path` - fill: #a67c52; -`; - -const ST8 = styled.path` - fill: #ed1c24; -`; - -const ST9 = styled.ellipse` - fill: #42210b; -`; - -class BrandLogo extends Component { - render() { - const { i18n } = this.props; - return ( - - {i18n._(t`AWX Logo`)} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); - } -} - -export default withI18n()(BrandLogo); +export default BrandLogo; diff --git a/awx/ui_next/src/components/AppContainer/BrandLogo.test.jsx b/awx/ui_next/src/components/AppContainer/BrandLogo.test.jsx index 02ba644586..641332be66 100644 --- a/awx/ui_next/src/components/AppContainer/BrandLogo.test.jsx +++ b/awx/ui_next/src/components/AppContainer/BrandLogo.test.jsx @@ -4,11 +4,11 @@ import BrandLogo from './BrandLogo'; let logoWrapper; let brandLogoElem; -let svgElem; +let imgElem; const findChildren = () => { brandLogoElem = logoWrapper.find('BrandLogo'); - svgElem = logoWrapper.find('svg'); + imgElem = logoWrapper.find('img'); }; describe('', () => { @@ -17,6 +17,6 @@ describe('', () => { findChildren(); expect(logoWrapper.length).toBe(1); expect(brandLogoElem.length).toBe(1); - expect(svgElem.length).toBe(1); + expect(imgElem.length).toBe(1); }); }); diff --git a/awx/ui_next/src/components/AppContainer/PageHeaderToolbar.jsx b/awx/ui_next/src/components/AppContainer/PageHeaderToolbar.jsx index 970e5651d6..f09bdbdf3f 100644 --- a/awx/ui_next/src/components/AppContainer/PageHeaderToolbar.jsx +++ b/awx/ui_next/src/components/AppContainer/PageHeaderToolbar.jsx @@ -118,8 +118,8 @@ class PageHeaderToolbar extends Component { key="user" href={ loggedInUser - ? `/next/users/${loggedInUser.id}/details` - : '/next/home' + ? `/users/${loggedInUser.id}/details` + : '/home' } > {i18n._(t`User Details`)} diff --git a/awx/ui_next/src/screens/Login/Login.jsx b/awx/ui_next/src/screens/Login/Login.jsx index ff0254b848..f08c8e68a7 100644 --- a/awx/ui_next/src/screens/Login/Login.jsx +++ b/awx/ui_next/src/screens/Login/Login.jsx @@ -5,9 +5,8 @@ import { t } from '@lingui/macro'; import styled from 'styled-components'; import { LoginForm, LoginPage as PFLoginPage } from '@patternfly/react-core'; import { RootAPI } from '../../api'; -import { BrandName } from '../../variables'; -import brandLogo from './brand-logo.svg'; +const loginLogoSrc = '/static/media/logo-login.svg'; const LoginPage = styled(PFLoginPage)` & .pf-c-brand { @@ -28,6 +27,7 @@ class AWXLogin extends Component { isLoading: true, logo: null, loginInfo: null, + brandName: null, }; this.handleChangeUsername = this.handleChangeUsername.bind(this); @@ -43,14 +43,24 @@ class AWXLogin extends Component { async loadCustomLoginInfo() { this.setState({ isLoading: true }); try { - const { - data: { custom_logo, custom_login_info }, - } = await RootAPI.read(); - const logo = custom_logo ? `data:image/jpeg;${custom_logo}` : brandLogo; - - this.setState({ logo, loginInfo: custom_login_info }); + const [ + { + data: { custom_logo, custom_login_info }, + }, + { + data: { BRAND_NAME }, + }, + ] = await Promise.all([RootAPI.read(), RootAPI.readAssetVariables()]); + const logo = custom_logo + ? `data:image/jpeg;${custom_logo}` + : loginLogoSrc; + this.setState({ + brandName: BRAND_NAME, + logo, + loginInfo: custom_login_info, + }); } catch (err) { - this.setState({ logo: brandLogo }); + this.setState({ brandName: 'AWX', logo: loginLogoSrc }); } finally { this.setState({ isLoading: false }); } @@ -91,6 +101,7 @@ class AWXLogin extends Component { render() { const { + brandName, hasAuthError, hasValidationError, username, @@ -100,10 +111,6 @@ class AWXLogin extends Component { loginInfo, } = this.state; const { alt, i18n, isAuthenticated } = this.props; - // Setting BrandName to a variable here is necessary to get the jest tests - // passing. Attempting to use BrandName in the template literal results - // in failing tests. - const brandName = BrandName; if (isLoading) { return null; @@ -124,7 +131,11 @@ class AWXLogin extends Component { ', () => { custom_logo: 'images/foo.jpg', }, }); + RootAPI.readAssetVariables.mockResolvedValue({ + data: { + BRAND_NAME: 'AWX', + }, + }); }); afterEach(() => { @@ -98,7 +103,8 @@ describe('', () => { ); const { loginHeaderLogo } = await findChildren(loginWrapper); const { alt, src } = loginHeaderLogo.props(); - expect([alt, src]).toEqual(['AWX', 'brand-logo.svg']); + expect(alt).toEqual('AWX'); + expect(src).toContain('logo-login.svg'); done(); }); @@ -109,7 +115,8 @@ describe('', () => { ); const { loginHeaderLogo } = await findChildren(loginWrapper); const { alt, src } = loginHeaderLogo.props(); - expect([alt, src]).toEqual(['AWX', 'brand-logo.svg']); + expect(alt).toEqual('AWX'); + expect(src).toContain('logo-login.svg'); done(); }); diff --git a/awx/ui_next/src/screens/Login/brand-logo.svg b/awx/ui_next/src/screens/Login/brand-logo.svg deleted file mode 100644 index 6d80915fb6..0000000000 --- a/awx/ui_next/src/screens/Login/brand-logo.svg +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/awx/ui_next/urls.py b/awx/ui_next/urls.py index bb288cf625..03c3bbd3d2 100644 --- a/awx/ui_next/urls.py +++ b/awx/ui_next/urls.py @@ -10,5 +10,6 @@ class IndexView(TemplateView): app_name = 'ui_next' urlpatterns = [ - url(r'^next/*', IndexView.as_view(), name='ui_next') + url(r'^$', IndexView.as_view(), name='index'), + #url(r'^migrations_notran/$', migrations_notran, name='migrations_notran'), ] diff --git a/awx/urls.py b/awx/urls.py index bdcae84bcb..d26ea0d6f5 100644 --- a/awx/urls.py +++ b/awx/urls.py @@ -15,7 +15,6 @@ from awx.main.views import ( urlpatterns = [ url(r'', include('awx.ui_next.urls', namespace='ui_next')), - url(r'', include('awx.ui.urls', namespace='ui')), url(r'^api/', include('awx.api.urls', namespace='api')), url(r'^sso/', include('awx.sso.urls', namespace='sso')), url(r'^sso/', include('social_django.urls', namespace='social')), diff --git a/installer/roles/image_build/tasks/main.yml b/installer/roles/image_build/tasks/main.yml index 9679161a86..f69c8a5816 100644 --- a/installer/roles/image_build/tasks/main.yml +++ b/installer/roles/image_build/tasks/main.yml @@ -14,8 +14,8 @@ - name: Copy logos for inclusion in sdist copy: - src: "../../awx-logos/awx/ui/client/assets" - dest: "../awx/ui/client/" + src: "../../awx-logos/awx/ui/client/assets/" + dest: "../awx/ui_next/public/static/media/" delegate_to: localhost when: awx_official|default(false)|bool