UNPKG

4.25 kBJavaScriptView Raw
1import ModelProperty from './ModelProperty'
2
3if (global.__MODEL_REGISTRY__ == null || typeof global.__MODEL_REGISTRY__ === 'undefined') {
4 global.__MODEL_SPEC_REGISTRY__ = {}
5}
6
7class 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 // TODO: data[pk].value?
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
161export default Model