Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/core/edit/edit.cell.view.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import { getFactory as valueFactory } from '../services/value';
import { getFactory as labelFactory } from '../services/label';
import { parseFactory } from '../services/convert';
import { Td } from '../dom/td';
import * as validationService from '../validation/validation.service';
import * as validationService from '../validation/validator.builder';
import {ValidatorBuilder} from "../validation/validator.builder";

export class EditCellView {
constructor(model, table, shortcut) {
Expand Down Expand Up @@ -148,7 +149,7 @@ export class EditCellView {
if (canEdit) {
const context = this.contextFactory(cell, this.value, this.label, this.tag);
const key = context.column.key;
const validator = validationService.createValidator(model.validation().rules, key);
const validator = new ValidatorBuilder(model.validation().rules, key);
return model.edit().commit.canExecute(context) && validator.validate({ [key]: this.value });
}
return false;
Expand Down Expand Up @@ -183,7 +184,7 @@ export class EditCellView {
if (canEdit) {
const context = this.contextFactory(cell, this.value, this.label, this.tag);
const key = context.column.key;
const validator = validationService.createValidator(model.validation().rules, key);
const validator = new ValidatorBuilder(model.validation().rules, key);
return model.edit().commit.canExecute(context) && validator.validate({ [key]: this.value });
}

Expand Down
7 changes: 0 additions & 7 deletions src/core/validation/validation.service.d.ts

This file was deleted.

35 changes: 0 additions & 35 deletions src/core/validation/validation.service.js

This file was deleted.

18 changes: 18 additions & 0 deletions src/core/validation/validator.builder.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
export declare interface Validator {
validate(value: any): boolean;
getErrors(): { [key: string]: string };
}


export declare interface ValidatorBuilder extends Validator {
rules: any;
livrRules: any;
errors: any;
livrValidator: Validator;
hasLivrRules: boolean;
hasCustomRules: boolean;
registerRules(rules: any, key: string): void;
hasRules(): boolean;
}

export declare function createValidator(rules: any): Validator;
80 changes: 80 additions & 0 deletions src/core/validation/validator.builder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import * as LIVR from 'livr';

export const { Validator: LivrValidator } = LIVR;


export function createLivrValidator(rules) {
return new LivrValidator(rules);
}

export class ValidatorBuilder {
constructor(rules, key) {
this.rules = rules;
this.livrRules = null;
this.errors = null;
this.livrValidator = null;
this.hasLivrRules = false;
this.hasCustomRules = false;

this.registerRules(rules, key);
}

registerRules(rules, key) {
const livrRules = [];
const keyRules = rules.filter(r => r.key === key);
keyRules.forEach(rule => {
for (let name of Object.keys(rule)) {
if (name === 'customValidation') {
this.customRule = {[key]: rule[name]};
this.hasCustomRules = !!this.customRule;
} else if (!['for', 'key'].includes(name)) {
livrRules.push({
[name]: rule[name]
});
}
}
});

this.hasLivrRules = livrRules.length > 0;
if (this.hasLivrRules) {
this.livrRules = {[key]: livrRules};
this.livrValidator = new LivrValidator({[key]: livrRules});
}
}

get hasRules() {
return this.hasLivrRules || this.hasCustomRules;
}

validate(data) {
let isValid = true;

if (this.hasLivrRules) {
isValid = this.livrValidator.validate(data);
if (!isValid) {
this.errors = this.livrValidator.getErrors();
}
}

if (this.hasCustomRules) {
Object.keys(data)
.forEach(k => {
const isValidCustom = this.customRule[k].validationFunction(data[k]);
if (!isValidCustom) {
this.errors = this.errors || {};
this.errors[k] = this.customRule[k].validationMessage;
}

isValid = isValid && isValidCustom;
});
}

return isValid;
}

getErrors() {
return this.errors;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
<q-grid-column key="source"
title="Url">
</q-grid-column>
<q-grid-column key="discoveredIn"
title="Should be > 1800 and even">
</q-grid-column>
</q-grid-columns>
<q-grid-validation>
<q-grid-rule for="cell"
Expand Down Expand Up @@ -73,6 +76,10 @@
key="source"
url>
</q-grid-rule>
<q-grid-rule for="cell"
key="discoveredIn"
[customValidation]="checkNumberCustom()">
</q-grid-rule>
</q-grid-validation>

</q-grid>
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,15 @@ export class ExampleValidationBasicComponent {
constructor(dataService: DataService) {
this.rows = dataService.getAtoms();
}

checkNumberCustom() {
return {
validationMessage: 'Should be > 1800 and even',
validationFunction: this.checkNumber
};
}

checkNumber(v) {
return v > 1800 && v % 2 === 0;
}
}
4 changes: 2 additions & 2 deletions src/lib/plugins/query-builder/schema/validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
import { AppError } from 'ng2-qgrid/core/infrastructure/error';
import { isArray } from 'ng2-qgrid/core/utility/kit';
import { Column, QueryBuilderService, ColumnMap } from '../query-builder.service';
import { createValidator } from 'ng2-qgrid/core/validation/validation.service';
import { createLivrValidator } from 'ng2-qgrid/core/validation/validator.builder';

export class Validator {
private columnMap: ColumnMap;
Expand Down Expand Up @@ -56,7 +56,7 @@ export class Validator {
}

const target = { [id]: value };
const validator = createValidator(schema);
const validator = createLivrValidator(schema);
const isValid = validator.validate(target);
if (isValid) {
return trueResult;
Expand Down
1 change: 1 addition & 0 deletions src/lib/plugins/validation/rule.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export class RuleComponent implements OnChanges {
@Input('isoDate') iso_date?: string;
@Input('equalToField') equal_to_field?: string;
@Input('listOf') list_of?: string;
@Input('customValidation') customValidation?;

@ViewChild(TemplateRef) templateRef: TemplateRef<any>;

Expand Down
2 changes: 1 addition & 1 deletion src/plugin/validation/validator.view.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Model } from '../../core/infrastructure/model';
import { Validator } from '../../core/validation/validation.service';
import { Validator } from '../../core/validation/validator.builder';

export declare class ValidatorView {
constructor(model: Model, context: any);
Expand Down
16 changes: 8 additions & 8 deletions src/plugin/validation/validator.view.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { isString, isEqual } from '../../core/utility/kit';
import { hasRules, createValidator } from '../../core/validation/validation.service';
import { ValidatorBuilder } from '../../core/validation/validator.builder';

export class ValidatorView {
constructor(model, context) {
this.model = model;
this.context = context;

this.oldErrors = [];
if (hasRules(this.rules, this.key)) {
this.validator = createValidator(this.rules, this.key);
}
this.validator = new ValidatorBuilder(this.rules, this.key);
}

get errors() {
Expand Down Expand Up @@ -49,11 +47,13 @@ export class ValidatorView {
}

stringify(errors) {
const customErrors = [];
let rules = {};
for (const rule of this.validator.livrRules[this.key]) {
rules = Object.assign(rules, rule);
if (!this.validator.hasRules){
return [];
} else if (!this.validator.hasLivrRules){
return errors;
}
const customErrors = [];
const rules = {...this.validator.livrRules[this.key]};

for (const error of errors) {
switch (error) {
Expand Down