1 | import ModelProperty from './ModelProperty'
|
2 |
|
3 | if (global.__MODEL_REGISTRY__ == null || typeof global.__MODEL_REGISTRY__ === 'undefined') {
|
4 | global.__MODEL_SPEC_REGISTRY__ = {}
|
5 | }
|
6 |
|
7 | class Model {
|
8 | constructor (spec) {
|
9 | this.props = {}
|
10 | this._initFromSpec(spec)
|
11 | }
|
12 |
|
13 | _initFromSpec (spec) {
|
14 | this._key = '' + spec.key
|
15 | this._option = spec.option || {}
|
16 | Object.keys(spec.props).forEach((k) => {
|
17 | let field = spec.props[k]
|
18 | let defaultValue = null
|
19 | if (field.defaultValue != null && typeof field.defaultValue !== 'undefined') {
|
20 | defaultValue = field.defaultValue
|
21 | }
|
22 | this.props[k] = new ModelProperty(
|
23 | this,
|
24 | k,
|
25 | field.display,
|
26 | field.validators,
|
27 | defaultValue
|
28 | )
|
29 | if (field.defaultValue != null && typeof field.defaultValue !== 'undefined') {
|
30 | this.props[k].setValue(field.defaultValue)
|
31 | this.props[k].defaultValidation()
|
32 | }
|
33 | this[k] = this.props[k]
|
34 | })
|
35 | }
|
36 |
|
37 | set (data) {
|
38 | Object.keys(this.props).forEach((pk) => {
|
39 | if (typeof data[pk] === 'undefined') {
|
40 | throw new Error('[CATELA_MODEL] [' + pk + '] property is not found in data.')
|
41 | } else {
|
42 | this.props[pk].setValue(data[pk].value)
|
43 | }
|
44 | })
|
45 | return this
|
46 | }
|
47 |
|
48 | bind (data) {
|
49 | Object.keys(this.props).forEach((pk) => {
|
50 | if (typeof data[pk] === 'undefined') {
|
51 | throw new Error('[CATELA_MODEL] [' + pk + '] property is not found in data.')
|
52 | } else {
|
53 | if (data[pk] != null && typeof data[pk] !== 'undefined') {
|
54 |
|
55 | this.props[pk].set(data[pk])
|
56 | }
|
57 | }
|
58 | })
|
59 | return this
|
60 | }
|
61 |
|
62 | get () {
|
63 | let data = {}
|
64 | Object.keys(this.props).forEach((pk) => {
|
65 | let props = this.props[pk]
|
66 | data[pk] = {
|
67 | value: props.getValue(),
|
68 | validation: props.getValidation()
|
69 | }
|
70 | })
|
71 | data.__MODEL_KEY__ = this._key
|
72 | return data
|
73 | }
|
74 |
|
75 | getValue () {
|
76 | let data = {}
|
77 | Object.keys(this.props).forEach((pk) => {
|
78 | let props = this.props[pk]
|
79 | data[pk] = props.getValue()
|
80 | })
|
81 | return data
|
82 | }
|
83 |
|
84 | value (field) {
|
85 | if (this.props[field] == null || typeof this.props[field] === 'undefined') {
|
86 | throw new Error('[CATELA_MODEL] [' + field + '] property is not found in data.')
|
87 | } else {
|
88 | return this.props[field].getValue()
|
89 | }
|
90 | }
|
91 |
|
92 | clearValidation () {
|
93 | Object.keys(this.props).forEach((pk) => {
|
94 | let props = this.props[pk]
|
95 | props.defaultValidation()
|
96 | })
|
97 | return this
|
98 | }
|
99 |
|
100 | default () {
|
101 | Object.keys(this.props).forEach((pk) => {
|
102 | let props = this.props[pk]
|
103 | props.default()
|
104 | })
|
105 | return this
|
106 | }
|
107 |
|
108 | validate () {
|
109 | let valid = true
|
110 | let validations = {}
|
111 | Object.keys(this.props).forEach((pk) => {
|
112 | let propsValidationResult = this.props[pk].validate(this.props[pk].getValue())
|
113 | valid = valid && propsValidationResult.valid
|
114 | validations[pk] = propsValidationResult
|
115 | })
|
116 | return {
|
117 | valid: valid,
|
118 | validations: validations
|
119 | }
|
120 | }
|
121 |
|
122 | static fromSpec (spec) {
|
123 | if (global.__MODEL_SPEC_REGISTRY__[spec.key] == null || typeof global.__MODEL_SPEC_REGISTRY__[spec.key] === 'undefined') {
|
124 | global.__MODEL_SPEC_REGISTRY__[spec.key] = spec
|
125 | }
|
126 | return new Model(global.__MODEL_SPEC_REGISTRY__[spec.key])
|
127 | }
|
128 |
|
129 | static fromData (modelData) {
|
130 | if (modelData.__MODEL_KEY__ != null && typeof modelData.__MODEL_KEY__ !== 'undefined') {
|
131 | let spec = global.__MODEL_SPEC_REGISTRY__[modelData.__MODEL_KEY__]
|
132 | let model = new Model(spec)
|
133 | model.bind(Model.dataOf(modelData))
|
134 | return model
|
135 | } else {
|
136 | throw new Error('[CATELA_MODEL] Model is not properly constructed (no __MODEL_KEY__ property in the object). You may need to specify get() when getting the model data.')
|
137 | }
|
138 | }
|
139 |
|
140 | static valueOf (data) {
|
141 | let dataValue = {}
|
142 | Object.keys(data).forEach((pk) => {
|
143 | dataValue[pk] = {
|
144 | value: data[pk]
|
145 | }
|
146 | })
|
147 | return dataValue
|
148 | }
|
149 |
|
150 | static dataOf (modelData) {
|
151 | let dataValue = {}
|
152 | Object.keys(modelData).forEach((pk) => {
|
153 | if (typeof modelData[pk].value !== 'undefined') {
|
154 | dataValue[pk] = modelData[pk].value
|
155 | }
|
156 | })
|
157 | return dataValue
|
158 | }
|
159 | }
|
160 |
|
161 | export default Model
|