Skip to content

Commit

Permalink
serializable decorator added for proper JSON export (#125)
Browse files Browse the repository at this point in the history
  • Loading branch information
udos86 committed Sep 26, 2016
1 parent 78168b8 commit e1e12ac
Show file tree
Hide file tree
Showing 13 changed files with 101 additions and 42 deletions.
17 changes: 17 additions & 0 deletions modules/core/src/decorator/serialize.decorator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
declare var Reflect:any;

export const METADATA_KEY_SERIALIZABLE = "SERIALIZABLE";

export function serializable(context, key) {

var serializable = Reflect.getMetadata(METADATA_KEY_SERIALIZABLE, context) || [];

serializable.push(key);

Reflect.defineMetadata(METADATA_KEY_SERIALIZABLE, serializable, context);
}

export function getSerializable (context): Array<string> {

return Reflect.getMetadata(METADATA_KEY_SERIALIZABLE, context) || [];
}
7 changes: 4 additions & 3 deletions modules/core/src/model/checkbox/dynamic-checkbox.model.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {ClsConfig} from "../dynamic-form-control.model";
import {DynamicFormValueControlModel, DynamicFormValueControlModelConfig} from "../dynamic-form-value-control.model";
import {serializable} from "../../decorator/serialize.decorator";
import {getValue} from "../../utils";

export const DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX = "CHECKBOX";
Expand All @@ -15,10 +16,10 @@ export interface DynamicCheckboxModelConfig extends DynamicFormValueControlModel

export class DynamicCheckboxModel extends DynamicFormValueControlModel<boolean> {

align: string;
indeterminate: boolean;
@serializable align: string;
@serializable indeterminate: boolean;

readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX;
@serializable readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX;

constructor(config: DynamicCheckboxModelConfig, cls?: ClsConfig) {

Expand Down
15 changes: 8 additions & 7 deletions modules/core/src/model/dynamic-form-control.model.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {getValue, isEmptyString} from "../utils";
import {DynamicFormControlRelationGroup} from "./dynamic-form-control-relation.model";
import {serializable} from "../decorator/serialize.decorator";
import {getValue, isEmptyString} from "../utils";

export interface Cls {

Expand All @@ -24,12 +25,12 @@ export interface DynamicFormControlModelConfig {

export abstract class DynamicFormControlModel {

cls: any = {};
disabled: boolean;
id: string;
label: string | null;
name: string;
relation: Array<DynamicFormControlRelationGroup>;
@serializable cls: any = {};
@serializable disabled: boolean;
@serializable id: string;
@serializable label: string | null;
@serializable name: string;
@serializable relation: Array<DynamicFormControlRelationGroup>;

abstract readonly type: string;

Expand Down
11 changes: 6 additions & 5 deletions modules/core/src/model/dynamic-form-value-control.model.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {ValidatorFn, AsyncValidatorFn} from "@angular/forms";
import {DynamicFormControlModel, DynamicFormControlModelConfig, ClsConfig} from "./dynamic-form-control.model";
import {BehaviorSubject} from "rxjs/BehaviorSubject";
import {DynamicFormControlModel, DynamicFormControlModelConfig, ClsConfig} from "./dynamic-form-control.model";
import {serializable} from "../decorator/serialize.decorator";
import {getValue} from "../utils";

export interface DynamicFormValueControlModelConfig extends DynamicFormControlModelConfig {
Expand All @@ -16,11 +17,11 @@ export interface DynamicFormValueControlModelConfig extends DynamicFormControlMo
export abstract class DynamicFormValueControlModel<T> extends DynamicFormControlModel {

asyncValidators: Array<AsyncValidatorFn>;
hint: string | null;
required: boolean;
tabIndex: number | null;
@serializable hint: string | null;
@serializable required: boolean;
@serializable tabIndex: number | null;
validators: Array<ValidatorFn>;
value: T | null;
@serializable value: T | null;
valueChanges: BehaviorSubject<T>;

constructor(config: DynamicFormValueControlModelConfig, cls?: ClsConfig) {
Expand Down
19 changes: 10 additions & 9 deletions modules/core/src/model/dynamic-input-control.model.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {ClsConfig} from "./dynamic-form-control.model";
import {DynamicFormValueControlModel, DynamicFormValueControlModelConfig} from "./dynamic-form-value-control.model";
import {AUTOCOMPLETE_ON} from "../service/dynamic-form-autofill.service";
import {serializable} from "../decorator/serialize.decorator";
import {getValue} from "../utils";

export interface DynamicInputControlModelConfig extends DynamicFormValueControlModelConfig {
Expand All @@ -18,15 +19,15 @@ export interface DynamicInputControlModelConfig extends DynamicFormValueControlM

export abstract class DynamicInputControlModel<T> extends DynamicFormValueControlModel<T> {

autoComplete: boolean;
autoFocus: boolean;
maxLength: number | null;
minLength: number | null;
placeholder: string;
prefix: string | null;
readOnly: boolean;
spellCheck: boolean;
suffix: string | null;
@serializable autoComplete: boolean;
@serializable autoFocus: boolean;
@serializable maxLength: number | null;
@serializable minLength: number | null;
@serializable placeholder: string;
@serializable prefix: string | null;
@serializable readOnly: boolean;
@serializable spellCheck: boolean;
@serializable suffix: string | null;

constructor(config: DynamicInputControlModelConfig, cls?: ClsConfig) {

Expand Down
3 changes: 2 additions & 1 deletion modules/core/src/model/dynamic-option-control.model.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {ClsConfig} from "./dynamic-form-control.model";
import {DynamicFormValueControlModel, DynamicFormValueControlModelConfig} from "./dynamic-form-value-control.model";
import {serializable} from "../decorator/serialize.decorator";
import {getValue} from "../utils";

export interface DynamicFormOptionConfig {
Expand Down Expand Up @@ -38,7 +39,7 @@ export interface DynamicOptionControlModelConfig extends DynamicFormValueControl

export abstract class DynamicOptionControlModel<T> extends DynamicFormValueControlModel<T> {

options: Array<DynamicFormOption>;
@serializable options: Array<DynamicFormOption>;

constructor(config: DynamicOptionControlModelConfig, cls?: ClsConfig) {

Expand Down
19 changes: 10 additions & 9 deletions modules/core/src/model/input/dynamic-input.model.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {ClsConfig} from "../dynamic-form-control.model";
import {DynamicInputControlModel, DynamicInputControlModelConfig} from "../dynamic-input-control.model";
import {serializable} from "../../decorator/serialize.decorator";
import {getValue} from "../../utils";

export const DYNAMIC_FORM_CONTROL_TYPE_INPUT = "INPUT";
Expand Down Expand Up @@ -34,18 +35,18 @@ export interface DynamicInputModelConfig extends DynamicInputControlModelConfig

export class DynamicInputModel extends DynamicInputControlModel<any> {

accept: string | null;
inputType: string;
@serializable accept: string | null;
@serializable inputType: string;
files: FileList | null = null;
list: Array<string> | null;
max: number | null;
min: number | null;
multiple: boolean | null;
pattern: string | null;
step: number | null;
@serializable list: Array<string> | null;
@serializable max: number | null;
@serializable min: number | null;
@serializable multiple: boolean | null;
@serializable pattern: string | null;
@serializable step: number | null;

private listId: string | null = null;
readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_INPUT;
@serializable readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_INPUT;

constructor(config: DynamicInputModelConfig, cls?: ClsConfig) {

Expand Down
5 changes: 3 additions & 2 deletions modules/core/src/model/radio/dynamic-radio-group.model.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {ClsConfig} from "../dynamic-form-control.model";
import {DynamicOptionControlModel, DynamicOptionControlModelConfig} from "../dynamic-option-control.model";
import {DynamicFieldSet} from "../form-group/dynamic-form-group.model";
import {serializable} from "../../decorator/serialize.decorator";
import {getValue} from "../../utils";

export const DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP = "RADIO_GROUP";
Expand All @@ -12,9 +13,9 @@ export interface DynamicRadioGroupModelConfig extends DynamicOptionControlModelC

export class DynamicRadioGroupModel<T> extends DynamicOptionControlModel<T> implements DynamicFieldSet {

legend: string | null;
@serializable legend: string | null;

readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP;
@serializable readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP;

constructor(config: DynamicRadioGroupModelConfig, cls?: ClsConfig) {

Expand Down
3 changes: 2 additions & 1 deletion modules/core/src/model/select/dynamic-select.model.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import {ClsConfig} from "../dynamic-form-control.model";
import {DynamicOptionControlModel, DynamicOptionControlModelConfig} from "../dynamic-option-control.model";
import {serializable} from "../../decorator/serialize.decorator";

export const DYNAMIC_FORM_CONTROL_TYPE_SELECT = "SELECT";

export class DynamicSelectModel<T> extends DynamicOptionControlModel<T> {

readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_SELECT;
@serializable readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_SELECT;

constructor(config: DynamicOptionControlModelConfig, cls?: ClsConfig) {

Expand Down
3 changes: 2 additions & 1 deletion modules/core/src/model/switch/dynamic-switch.model.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import {ClsConfig} from "../dynamic-form-control.model";
import {DynamicFormValueControlModel, DynamicFormValueControlModelConfig} from "../dynamic-form-value-control.model";
import {serializable} from "../../decorator/serialize.decorator";

export const DYNAMIC_FORM_CONTROL_TYPE_SWITCH = "SWITCH";

export class DynamicSwitchModel extends DynamicFormValueControlModel<boolean> {

readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_SWITCH;
@serializable readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_SWITCH;

constructor(config: DynamicFormValueControlModelConfig, cls?: ClsConfig) {

Expand Down
9 changes: 5 additions & 4 deletions modules/core/src/model/textarea/dynamic-textarea.model.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {ClsConfig} from "../dynamic-form-control.model";
import {DynamicInputControlModel, DynamicInputControlModelConfig} from "../dynamic-input-control.model";
import {serializable} from "../../decorator/serialize.decorator";
import {getValue} from "../../utils";

export const DYNAMIC_FORM_CONTROL_TYPE_TEXTAREA = "TEXTAREA";
Expand All @@ -16,11 +17,11 @@ export interface DynamicTextAreaModelConfig extends DynamicInputControlModelConf

export class DynamicTextAreaModel extends DynamicInputControlModel<string> {

cols: number;
rows: number;
wrap: string;
@serializable cols: number;
@serializable rows: number;
@serializable wrap: string;

readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_TEXTAREA;
@serializable readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_TEXTAREA;

constructor(config: DynamicTextAreaModelConfig, cls?: ClsConfig) {

Expand Down
31 changes: 31 additions & 0 deletions modules/core/src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
import {getSerializable} from "./decorator/serialize.decorator";

if (typeof Object.assign !== "function") {
Object.assign = function (target) {
"use strict";
if (target === null) {
throw new TypeError("Cannot convert undefined or null to object");
}
target = Object(target);
for (var index = 1; index < arguments.length; index++) {
var source = arguments[index];
if (source !== null) {
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
}
return target;
};
}

export function isDefined(object: any): boolean {
return object !== undefined && object !== null;
}
Expand Down Expand Up @@ -36,4 +59,12 @@ export function getValue(object: any, key: string, defaultValue: any): any {
}

return value;
}

export function serialize (context): Object {

return getSerializable(context).reduce((prev, key) => {
prev[key] = context[key];
return prev;
}, {});
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
"@types/hammerjs": "^2.0.33",
"@types/jasmine": "^2.2.34",
"@types/node": "^6.0.41",
"@types/reflect-metadata": "0.0.4",
"codelyzer": "^1.0.0-beta.0",
"dateformat": "^1.0.12",
"del": "^2.2.2",
Expand Down

0 comments on commit e1e12ac

Please sign in to comment.