Fix replication rule sometimes save button can not click

when user create a label filter and delete it in replication rule edit dialog, the save button is not enabled.
This commit is contained in:
Mia ZHOU 2018-08-10 13:51:40 +08:00
parent 0123dfbe45
commit b0b9e29851
3 changed files with 192 additions and 214 deletions

View File

@ -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<ReplicationRule[]>(
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 = <FormArray> this.ruleForm.get('filters');
const controlArray = <FormArray>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 = <FormArray> this.ruleForm.get('filters');
const controlArray = <FormArray>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 = <FormArray>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 = <FormArray> this.ruleForm.get('filters');
const controlArray = <FormArray>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;
}
}

View File

@ -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": {

View File

@ -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",