diff --git a/src/ui_ng/lib/src/create-edit-rule/create-edit-rule.component.ts b/src/ui_ng/lib/src/create-edit-rule/create-edit-rule.component.ts index feae8fea8..6a1effbf5 100644 --- a/src/ui_ng/lib/src/create-edit-rule/create-edit-rule.component.ts +++ b/src/ui_ng/lib/src/create-edit-rule/create-edit-rule.component.ts @@ -21,11 +21,11 @@ import { EventEmitter, Output } from "@angular/core"; -import {Filter, ReplicationRule, Endpoint, Label} from "../service/interface"; +import { Filter, ReplicationRule, Endpoint, Label } from "../service/interface"; import { Subject } from "rxjs/Subject"; import { Subscription } from "rxjs/Subscription"; import { FormArray, FormBuilder, FormGroup, Validators } from "@angular/forms"; -import {clone, compareValue, isEmptyObject, toPromise} from "../utils"; +import { clone, compareValue, isEmptyObject, toPromise } from "../utils"; import { InlineAlertComponent } from "../inline-alert/inline-alert.component"; import { ReplicationService } from "../service/replication.service"; import { ErrorHandler } from "../error-handler/error-handler"; @@ -33,7 +33,7 @@ import { TranslateService } from "@ngx-translate/core"; import { EndpointService } from "../service/endpoint.service"; import { ProjectService } from "../service/project.service"; import { Project } from "../project-policy-config/project"; -import {LabelState} from "../tag/tag.component"; +import { LabelState } from "../tag/tag.component"; const ONE_HOUR_SECONDS = 3600; const ONE_DAY_SECONDS: number = 24 * ONE_HOUR_SECONDS; @@ -165,19 +165,19 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { if (this.isRuleNameValid) { this.inNameChecking = true; toPromise( - this.repService.getReplicationRules(0, ruleName) + this.repService.getReplicationRules(0, ruleName) ) - .then(response => { - if (response.some(rule => rule.name === ruleName)) { - this.ruleNameTooltip = "TOOLTIP.RULE_USER_EXISTING"; - this.isRuleNameValid = false; - } - this.inNameChecking = false; - }) - .catch(() => { - this.inNameChecking = false; - }); - }else { + .then(response => { + if (response.some(rule => rule.name === ruleName)) { + this.ruleNameTooltip = "TOOLTIP.RULE_USER_EXISTING"; + this.isRuleNameValid = false; + } + this.inNameChecking = false; + }) + .catch(() => { + this.inNameChecking = false; + }); + } else { this.ruleNameTooltip = "REPLICATION.NAME_TOOLTIP"; } } @@ -336,11 +336,11 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { // delete api return label info, replace with label count if (delLabel || count) { let len = filterLabels.length; - for (let i = 0 ; i < len; i ++) { + for (let i = 0; i < len; i++) { let lab = filterLabels.find(data => data.kind === this.filterSelect[2]); - if (lab) {filterLabels.splice(filterLabels.indexOf(lab), 1); } - } - filterLabels.push({kind: 'label', value: count + ' labels'}); + if (lab) { filterLabels.splice(filterLabels.indexOf(lab), 1); } + } + filterLabels.push({ kind: 'label', value: count + ' labels' }); this.labelInputVal = count.toString(); } } @@ -386,7 +386,7 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { let name: string = $event.target.name; let value: string = $event.target["value"]; - const controlArray = this.ruleForm.get('filters'); + const controlArray = this.ruleForm.get('filters'); this.filterListData.forEach((data, index) => { if (index === +id) { data.name = $event.target.name = value; @@ -425,7 +425,7 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { this.filterListData.forEach((data, index) => { if (index === indexId) { data.isOpen = true; - }else { + } else { data.isOpen = false; } }); @@ -487,7 +487,7 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { } addNewFilter(): void { - const controlArray = this.ruleForm.get('filters'); + const controlArray = this.ruleForm.get('filters'); if (this.filterCount === 0) { this.filterListData.push( this.baseFilterData( @@ -537,7 +537,8 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { } const control = this.ruleForm.get('filters'); if (control.controls[i].get('kind').value === this.filterSelect[2]) { - this.labelInputVal = control.controls[i].get('value').value.split(' ')[0]; + this.filterLabelInfo = []; + this.labelInputVal = ""; } control.removeAt(i); this.setFilter(control.value); @@ -610,7 +611,7 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { selectedLabelList(selectedLabels: LabelState[], indexId: number) { // set input value of filter label - const controlArray = this.ruleForm.get('filters'); + const controlArray = this.ruleForm.get('filters'); this.filterListData.forEach((data, index) => { if (data.name === this.filterSelect[2]) { @@ -618,7 +619,7 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { if (labelsLength > 0) { controlArray.controls[index].get('value').setValue(labelsLength + ' labels'); this.labelInputVal = labelsLength.toString(); - }else { + } else { controlArray.controls[index].get('value').setValue(''); } }; @@ -688,14 +689,14 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { filters.splice(filters.indexOf(labels), 1); let info: any[] = []; this.filterLabelInfo.forEach(data => { - info.push({kind: 'label', value: data.id}); + info.push({ kind: 'label', value: data.id }); }); filters.push.apply(filters, info); } } public hasFormChange(): boolean { - return !isEmptyObject(this.getChanges()); + return !isEmptyObject(this.hasChanges()); } onSubmit() { @@ -884,55 +885,29 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy { return utcTimes; } - getChanges(): { [key: string]: any | any[] } { - let changes: { [key: string]: any | any[] } = {}; - let ruleValue: { [key: string]: any | any[] } = clone(this.ruleForm.value); - if (ruleValue.filters && ruleValue.filters.length) { - ruleValue.filters.forEach((data, index) => { + hasChanges(): boolean { + let formValue = clone(this.ruleForm.value); + let initValue = clone(this.copyUpdateForm); + let initValueCopy: any = {}; + for (let key of Object.keys(formValue)) { + initValueCopy[key] = initValue[key]; + } + + if (formValue.filters && formValue.filters.length > 0) { + formValue.filters.forEach((data, index) => { if (data.kind === this.filterSelect[2]) { - ruleValue.filters.splice(index, 1); + formValue.filters.splice(index, 1); } }); // rewrite filter label this.filterLabelInfo.forEach(data => { - ruleValue.filters.push({kind: "label", pattern: "", value: data}); + formValue.filters.push({ kind: "label", pattern: "", value: data }); }); - } - if (!ruleValue || !this.copyUpdateForm) { - return changes; + if (!compareValue(formValue, initValueCopy)) { + return true; } - for (let prop of Object.keys(ruleValue)) { - let field: any = this.copyUpdateForm[prop]; - if (!compareValue(field, ruleValue[prop])) { - if ( - ruleValue[prop][0] && - ruleValue[prop][0].project_id && - ruleValue[prop][0].project_id === field[0].project_id - ) { - break; - } - if ( - ruleValue[prop][0] && - ruleValue[prop][0].id && - ruleValue[prop][0].id === field[0].id - ) { - break; - } - changes[prop] = ruleValue[prop]; - // Number - if (typeof field === "number") { - changes[prop] = +changes[prop]; - } - - // Trim string value - if (typeof field === "string") { - changes[prop] = ("" + changes[prop]).trim(); - } - } - } - - return changes; + return false; } } diff --git a/src/ui_ng/package-lock.json b/src/ui_ng/package-lock.json index 164f5c590..817bf2f1a 100644 --- a/src/ui_ng/package-lock.json +++ b/src/ui_ng/package-lock.json @@ -3482,40 +3482,6 @@ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, - "fileset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz", - "integrity": "sha1-WI74lzxmI7KnbfRlEFaWuWqsgGc=", - "dev": true, - "requires": { - "glob": "5.x", - "minimatch": "2.x" - }, - "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" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - } - } - }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", @@ -4879,13 +4845,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true + "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" @@ -4896,6 +4864,7 @@ "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" @@ -6284,13 +6253,13 @@ } }, "karma-remap-istanbul": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-remap-istanbul/-/karma-remap-istanbul-0.2.2.tgz", - "integrity": "sha1-HN9shaVcayDpxxScCoxVUzA42dk=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/karma-remap-istanbul/-/karma-remap-istanbul-0.6.0.tgz", + "integrity": "sha1-l/O3cAZSVPm0ck8tm+SjouG69vw=", "dev": true, "requires": { "istanbul": "^0.4.3", - "remap-istanbul": "^0.6.4" + "remap-istanbul": "^0.9.0" } }, "karma-source-map-support": { @@ -6388,6 +6357,39 @@ "promise": "^7.1.1", "request": "2.81.0", "source-map": "^0.5.3" + }, + "dependencies": { + "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" + } + } } }, "less-loader": { @@ -8012,7 +8014,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true + "dev": true, + "optional": true }, "pify": { "version": "3.0.0", @@ -8444,7 +8447,8 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true + "dev": true, + "optional": true }, "querystring": { "version": "0.2.0", @@ -8826,79 +8830,19 @@ "dev": true }, "remap-istanbul": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.6.4.tgz", - "integrity": "sha1-rFUe/xqmQVBLTzGNAwPdph47tpU=", + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.9.6.tgz", + "integrity": "sha512-l0WDBsVjaTzP8m3glERJO6bjlAFUahcgfcgvcX+owZw7dKeDLT3CVRpS7UO4L9LfGcMiNsqk223HopwVxlh8Hg==", "dev": true, "requires": { - "amdefine": "1.0.0", + "amdefine": "^1.0.0", "gulp-util": "3.0.7", - "istanbul": "0.4.3", - "source-map": ">=0.5.6", + "istanbul": "0.4.5", + "minimatch": "^3.0.3", + "source-map": "^0.6.1", "through2": "2.0.1" }, "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - }, - "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 - }, - "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 - }, - "istanbul": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.3.tgz", - "integrity": "sha1-W3FO4K5JOsXvIEuZ84crzu9z1To=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "fileset": "0.2.x", - "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" - } - }, - "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" - } - }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", @@ -8919,10 +8863,10 @@ "util-deprecate": "~1.0.1" } }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "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 }, "string_decoder": { @@ -8931,15 +8875,6 @@ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "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" - } - }, "through2": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", @@ -8949,12 +8884,6 @@ "readable-stream": "~2.0.0", "xtend": "~4.0.0" } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true } } }, @@ -9013,33 +8942,107 @@ "dev": true }, "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", "caseless": "~0.12.0", "combined-stream": "~1.0.5", - "extend": "~3.0.0", + "extend": "~3.0.1", "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", + "form-data": "~2.3.1", + "har-validator": "~5.0.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.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", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" + "uuid": "^3.1.0" + }, + "dependencies": { + "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" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "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 + }, + "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" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.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" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "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 + } } }, "require-directory": { diff --git a/src/ui_ng/package.json b/src/ui_ng/package.json index 5109042ee..efb0eb70f 100644 --- a/src/ui_ng/package.json +++ b/src/ui_ng/package.json @@ -58,7 +58,7 @@ "karma-cli": "^1.0.1", "karma-jasmine": "~1.1.0", "karma-mocha-reporter": "^2.2.4", - "karma-remap-istanbul": "^0.2.1", + "karma-remap-istanbul": "^0.6.0", "ng-packagr": "^1.7.0", "protractor": "4.0.9", "rollup": "^0.41.6",