api_maker 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/api_maker/api_helpers/api_maker_helpers.rb +5 -0
- data/app/api_maker/services/can_can/load_abilities.rb +30 -0
- data/app/api_maker/services/devise/sign_in.rb +64 -0
- data/app/api_maker/services/devise/sign_out.rb +9 -0
- data/app/api_maker/services/models/find_or_create_by.rb +18 -0
- data/app/channels/api_maker/subscriptions_channel.rb +33 -2
- data/app/controllers/api_maker/base_controller.rb +7 -3
- data/app/controllers/api_maker/commands_controller.rb +26 -4
- data/app/controllers/api_maker/session_statuses_controller.rb +1 -1
- data/app/services/api_maker/abilities_loader.rb +104 -0
- data/app/services/api_maker/application_service.rb +2 -1
- data/app/services/api_maker/base_command.rb +248 -0
- data/app/services/api_maker/collection_command_service.rb +29 -15
- data/app/services/api_maker/collection_loader.rb +124 -0
- data/app/services/api_maker/command_failed_error.rb +3 -0
- data/app/services/api_maker/command_response.rb +17 -6
- data/app/services/api_maker/command_service.rb +3 -3
- data/app/services/api_maker/create_command.rb +11 -26
- data/app/services/api_maker/create_command_service.rb +3 -3
- data/app/services/api_maker/database_type.rb +9 -0
- data/app/services/api_maker/deep_merge_params.rb +26 -0
- data/app/services/api_maker/deserializer.rb +35 -0
- data/app/services/api_maker/destroy_command.rb +15 -21
- data/app/services/api_maker/destroy_command_service.rb +3 -3
- data/app/services/api_maker/generate_react_native_api_service.rb +3 -19
- data/app/services/api_maker/include_helpers.rb +17 -0
- data/app/services/api_maker/index_command.rb +8 -88
- data/app/services/api_maker/index_command_service.rb +5 -5
- data/app/services/api_maker/js_method_namer_service.rb +1 -1
- data/app/services/api_maker/locals_from_controller.rb +14 -0
- data/app/services/api_maker/member_command_service.rb +15 -13
- data/app/services/api_maker/model_classes_java_script_generator_service.rb +37 -0
- data/app/services/api_maker/model_content_generator_service.rb +17 -21
- data/app/services/api_maker/models/save.rb +29 -0
- data/app/services/api_maker/models_finder_service.rb +6 -2
- data/app/services/api_maker/models_generator_service.rb +6 -43
- data/app/services/api_maker/move_components_to_routes.rb +50 -0
- data/app/services/api_maker/primary_id_for_model.rb +6 -0
- data/app/services/api_maker/reset_indexed_db_service.rb +36 -0
- data/app/services/api_maker/routes_file_reloader.rb +20 -0
- data/app/services/api_maker/select_columns_on_collection.rb +78 -0
- data/app/services/api_maker/select_parser.rb +32 -0
- data/app/services/api_maker/service_command.rb +27 -0
- data/app/services/api_maker/service_command_service.rb +14 -0
- data/app/services/api_maker/simple_model_errors.rb +52 -0
- data/app/services/api_maker/update_command.rb +8 -24
- data/app/services/api_maker/update_command_service.rb +3 -3
- data/app/services/api_maker/valid_command.rb +4 -13
- data/app/services/api_maker/valid_command_service.rb +3 -3
- data/app/services/api_maker/validation_errors_generator_service.rb +146 -0
- data/app/views/api_maker/_data.html.erb +17 -11
- data/config/routes.rb +0 -2
- data/lib/api_maker/ability.rb +22 -7
- data/lib/api_maker/ability_loader.rb +9 -6
- data/lib/api_maker/base_collection_instance.rb +15 -0
- data/lib/api_maker/base_resource.rb +135 -9
- data/lib/api_maker/base_service.rb +14 -0
- data/lib/api_maker/collection_serializer.rb +95 -34
- data/lib/api_maker/command_spec_helper.rb +41 -11
- data/lib/api_maker/configuration.rb +31 -4
- data/lib/api_maker/expect_to_able_to_helper.rb +31 -0
- data/lib/api_maker/individual_command.rb +24 -9
- data/lib/api_maker/javascript/model-template.js.erb +39 -25
- data/lib/api_maker/javascript/models.js.erb +6 -0
- data/lib/api_maker/loader.rb +1 -1
- data/lib/api_maker/memory_storage.rb +1 -1
- data/lib/api_maker/model_extensions.rb +34 -18
- data/lib/api_maker/permitted_params_argument.rb +5 -1
- data/lib/api_maker/preloader.rb +71 -32
- data/lib/api_maker/preloader_base.rb +108 -0
- data/lib/api_maker/preloader_belongs_to.rb +34 -33
- data/lib/api_maker/preloader_has_many.rb +45 -39
- data/lib/api_maker/preloader_has_one.rb +30 -47
- data/lib/api_maker/railtie.rb +3 -11
- data/lib/api_maker/relationship_preloader.rb +42 -0
- data/lib/api_maker/resource_routing.rb +18 -4
- data/lib/api_maker/result_parser.rb +34 -20
- data/lib/api_maker/serializer.rb +53 -22
- data/lib/api_maker/spec_helper/browser_logs.rb +14 -0
- data/lib/api_maker/spec_helper/execute_collection_command.rb +46 -0
- data/lib/api_maker/spec_helper/execute_member_command.rb +52 -0
- data/lib/api_maker/spec_helper/expect_no_browser_errors.rb +18 -0
- data/lib/api_maker/spec_helper/wait_for_expect.rb +20 -0
- data/lib/api_maker/spec_helper/wait_for_flash_message.rb +21 -0
- data/lib/api_maker/spec_helper.rb +112 -48
- data/lib/api_maker/version.rb +1 -1
- data/lib/api_maker.rb +7 -3
- metadata +108 -89
- data/README.md +0 -476
- data/app/controllers/api_maker/devise_controller.rb +0 -60
- data/lib/api_maker/base_command.rb +0 -81
- data/lib/api_maker/javascript/api.js +0 -92
- data/lib/api_maker/javascript/base-model.js +0 -543
- data/lib/api_maker/javascript/bootstrap/attribute-row.jsx +0 -16
- data/lib/api_maker/javascript/bootstrap/attribute-rows.jsx +0 -47
- data/lib/api_maker/javascript/bootstrap/card.jsx +0 -79
- data/lib/api_maker/javascript/bootstrap/checkbox.jsx +0 -127
- data/lib/api_maker/javascript/bootstrap/checkboxes.jsx +0 -105
- data/lib/api_maker/javascript/bootstrap/live-table.jsx +0 -168
- data/lib/api_maker/javascript/bootstrap/money-input.jsx +0 -136
- data/lib/api_maker/javascript/bootstrap/radio-buttons.jsx +0 -80
- data/lib/api_maker/javascript/bootstrap/select.jsx +0 -168
- data/lib/api_maker/javascript/bootstrap/string-input.jsx +0 -203
- data/lib/api_maker/javascript/cable-connection-pool.js +0 -169
- data/lib/api_maker/javascript/cable-subscription-pool.js +0 -111
- data/lib/api_maker/javascript/cable-subscription.js +0 -33
- data/lib/api_maker/javascript/collection.js +0 -186
- data/lib/api_maker/javascript/commands-pool.js +0 -123
- data/lib/api_maker/javascript/custom-error.js +0 -14
- data/lib/api_maker/javascript/deserializer.js +0 -35
- data/lib/api_maker/javascript/devise.js.erb +0 -113
- data/lib/api_maker/javascript/error-logger.js +0 -119
- data/lib/api_maker/javascript/event-connection.jsx +0 -24
- data/lib/api_maker/javascript/event-created.jsx +0 -26
- data/lib/api_maker/javascript/event-destroyed.jsx +0 -26
- data/lib/api_maker/javascript/event-emitter-listener.jsx +0 -32
- data/lib/api_maker/javascript/event-listener.jsx +0 -41
- data/lib/api_maker/javascript/event-updated.jsx +0 -26
- data/lib/api_maker/javascript/form-data-to-object.js +0 -70
- data/lib/api_maker/javascript/included.js +0 -39
- data/lib/api_maker/javascript/key-value-store.js +0 -47
- data/lib/api_maker/javascript/logger.js +0 -23
- data/lib/api_maker/javascript/model-name.js +0 -21
- data/lib/api_maker/javascript/models-response-reader.js +0 -43
- data/lib/api_maker/javascript/paginate.jsx +0 -128
- data/lib/api_maker/javascript/params.js +0 -68
- data/lib/api_maker/javascript/resource-route.jsx +0 -75
- data/lib/api_maker/javascript/resource-routes.jsx +0 -36
- data/lib/api_maker/javascript/result.js +0 -25
- data/lib/api_maker/javascript/session-status-updater.js +0 -113
- data/lib/api_maker/javascript/sort-link.jsx +0 -88
- data/lib/api_maker/javascript/updated-attribute.jsx +0 -60
- data/lib/api_maker/preloader_through.rb +0 -101
- data/lib/api_maker/relationship_includer.rb +0 -42
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
import CableConnectionPool from "./cable-connection-pool"
|
|
2
|
-
import Collection from "./collection"
|
|
3
|
-
import CommandsPool from "./commands-pool"
|
|
4
|
-
import CustomError from "./custom-error"
|
|
5
|
-
import FormDataToObject from "./form-data-to-object"
|
|
6
|
-
import ModelName from "./model-name"
|
|
7
|
-
import Money from "js-money"
|
|
8
|
-
import objectToFormData from "object-to-formdata"
|
|
9
|
-
|
|
10
|
-
const inflection = require("inflection")
|
|
11
|
-
|
|
12
|
-
export default class BaseModel {
|
|
13
|
-
static modelClassData() {
|
|
14
|
-
throw new Error("modelClassData should be overriden by child")
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
static async find(id) {
|
|
18
|
-
var primaryKeyName = this.modelClassData().primaryKey
|
|
19
|
-
var query = {}
|
|
20
|
-
query[`${primaryKeyName}_eq`] = id
|
|
21
|
-
|
|
22
|
-
var model = await this.ransack(query).first()
|
|
23
|
-
|
|
24
|
-
if (model) {
|
|
25
|
-
return model
|
|
26
|
-
} else {
|
|
27
|
-
throw new CustomError("Record not found")
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
static modelName() {
|
|
32
|
-
return new ModelName({modelClassData: this.modelClassData()})
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
static ransack(query = {}) {
|
|
36
|
-
return new Collection({modelClass: this}, {ransack: query})
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
constructor(args = {}) {
|
|
40
|
-
this.changes = {}
|
|
41
|
-
this.newRecord = args.isNewRecord
|
|
42
|
-
this.relationshipsCache = {}
|
|
43
|
-
|
|
44
|
-
if (args && args.data && args.data.a) {
|
|
45
|
-
this._readModelDataFromArgs(args)
|
|
46
|
-
} else if (args.a) {
|
|
47
|
-
this.modelData = args.a
|
|
48
|
-
} else if (args) {
|
|
49
|
-
this.modelData = args
|
|
50
|
-
} else {
|
|
51
|
-
this.modelData = {}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
isAssociationLoaded(associationName) {
|
|
56
|
-
if (associationName in this.relationshipsCache)
|
|
57
|
-
return true
|
|
58
|
-
|
|
59
|
-
return false
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
connect(eventName, callback) {
|
|
63
|
-
var cableSubscription = CableConnectionPool.current().connectEvent(this.modelClassData().name, this._primaryKey(), eventName, callback)
|
|
64
|
-
return cableSubscription
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
static connectCreated(callback) {
|
|
68
|
-
var cableSubscription = CableConnectionPool.current().connectCreated(this.modelClassData().name, callback)
|
|
69
|
-
return cableSubscription
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
connectDestroyed(callback) {
|
|
73
|
-
var cableSubscription = CableConnectionPool.current().connectDestroyed(this.modelClassData().name, this._primaryKey(), callback)
|
|
74
|
-
return cableSubscription
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
connectUpdated(callback) {
|
|
78
|
-
var cableSubscription = CableConnectionPool.current().connectUpdate(this.modelClassData().name, this._primaryKey(), callback)
|
|
79
|
-
return cableSubscription
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
assignAttributes(newAttributes) {
|
|
83
|
-
for(var key in newAttributes) {
|
|
84
|
-
var oldValue = this._getAttribute(key)
|
|
85
|
-
var originalValue = this.modelData[key]
|
|
86
|
-
var newValue = newAttributes[key]
|
|
87
|
-
|
|
88
|
-
if (newValue != oldValue) {
|
|
89
|
-
if (newValue == originalValue) {
|
|
90
|
-
delete this.changes[key]
|
|
91
|
-
} else {
|
|
92
|
-
this.changes[key] = newValue
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
cacheKey() {
|
|
99
|
-
if (this.isPersisted()) {
|
|
100
|
-
var keyParts = [
|
|
101
|
-
this.modelClassData().paramKey,
|
|
102
|
-
this._primaryKey()
|
|
103
|
-
]
|
|
104
|
-
|
|
105
|
-
if ("updated_at" in this.modelData) {
|
|
106
|
-
keyParts.push(`updatedAt-${this.updatedAt().getTime()}`)
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return keyParts.join("-")
|
|
110
|
-
} else {
|
|
111
|
-
return this.uniqueKey()
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
async create() {
|
|
116
|
-
var paramKey = this.modelClassData().paramKey
|
|
117
|
-
var modelData = this.getAttributes()
|
|
118
|
-
var dataToUse = {}
|
|
119
|
-
dataToUse[paramKey] = modelData
|
|
120
|
-
|
|
121
|
-
var response = await CommandsPool.addCommand({args: dataToUse, command: `${this.modelClassData().collectionName}-create`, collectionName: this.modelClassData().collectionName, primaryKey: this._primaryKey(), type: "create"}, {})
|
|
122
|
-
|
|
123
|
-
if (response.success) {
|
|
124
|
-
if (response.model) {
|
|
125
|
-
this._setNewModelData(response.model.a)
|
|
126
|
-
this.changes = {}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return {model: this, response: response}
|
|
130
|
-
} else {
|
|
131
|
-
throw new new CustomError("Response wasn't successful", {model: this, response: response})
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
async createRaw(data) {
|
|
136
|
-
var formData = FormDataToObject.toObject(data)
|
|
137
|
-
var response = await CommandsPool.addCommand({args: formData, command: `${this.modelClassData().collectionName}-create`, collectionName: this.modelClassData().collectionName, primaryKey: this._primaryKey(), type: "create"}, {})
|
|
138
|
-
|
|
139
|
-
if (response.success) {
|
|
140
|
-
if (response.model) {
|
|
141
|
-
this._setNewModelData(response.model.a)
|
|
142
|
-
this.changes = {}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return {model: this, response: response}
|
|
146
|
-
} else {
|
|
147
|
-
throw new CustomError("Response wasn't successful", {model: this, response: response})
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async destroy() {
|
|
152
|
-
var response = await CommandsPool.addCommand({command: `${this.modelClassData().collectionName}-destroy`, collectionName: this.modelClassData().collectionName, primaryKey: this._primaryKey(), type: "destroy"}, {})
|
|
153
|
-
|
|
154
|
-
if (response.success) {
|
|
155
|
-
if (response.model) {
|
|
156
|
-
this._setNewModelData(response.model.a)
|
|
157
|
-
this.changes = {}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return {model: this, response: response}
|
|
161
|
-
} else {
|
|
162
|
-
throw new CustomError("Response wasn't successful", {model: this, response: response})
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
getAttributes() {
|
|
167
|
-
return Object.assign(this.modelData, this.changes)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
static humanAttributeName(attributeName) {
|
|
171
|
-
var keyName = this.modelClassData().i18nKey
|
|
172
|
-
return I18n.t(`activerecord.attributes.${keyName}.${BaseModel.snakeCase(attributeName)}`)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
static snakeCase(string) {
|
|
176
|
-
return inflection.underscore(string)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
isAttributeChanged(attributeName) {
|
|
180
|
-
var attributeNameUnderscore = inflection.underscore(attributeName)
|
|
181
|
-
var attributeData = this.modelClassData().attributes.find(attribute => attribute.name == attributeNameUnderscore)
|
|
182
|
-
|
|
183
|
-
if (!attributeData) {
|
|
184
|
-
var attributeNames = this.modelClassData().attributes.map(attribute => attribute.name)
|
|
185
|
-
throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`)
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (!(attributeNameUnderscore in this.changes))
|
|
189
|
-
return false
|
|
190
|
-
|
|
191
|
-
var oldValue = this.modelData[attributeNameUnderscore]
|
|
192
|
-
var newValue = this.changes[attributeNameUnderscore]
|
|
193
|
-
var changedMethod = this[`_is${inflection.camelize(attributeData.type, true)}Changed`]
|
|
194
|
-
|
|
195
|
-
if (!changedMethod)
|
|
196
|
-
throw new Error(`Don't know how to handle type: ${attributeData.type}`)
|
|
197
|
-
|
|
198
|
-
return changedMethod(oldValue, newValue)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
savedChangeToAttribute(attributeName) {
|
|
202
|
-
if (!this.previousModelData)
|
|
203
|
-
return false
|
|
204
|
-
|
|
205
|
-
var attributeNameUnderscore = inflection.underscore(attributeName)
|
|
206
|
-
var attributeData = this.modelClassData().attributes.find(attribute => attribute.name == attributeNameUnderscore)
|
|
207
|
-
|
|
208
|
-
if (!attributeData) {
|
|
209
|
-
var attributeNames = this.modelClassData().attributes.map(attribute => attribute.name)
|
|
210
|
-
throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`)
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (!(attributeNameUnderscore in this.previousModelData))
|
|
214
|
-
return true
|
|
215
|
-
|
|
216
|
-
var oldValue = this.previousModelData[attributeNameUnderscore]
|
|
217
|
-
var newValue = this.modelData[attributeNameUnderscore]
|
|
218
|
-
var changedMethodName = `_is${inflection.camelize(attributeData.type)}Changed`
|
|
219
|
-
var changedMethod = this[changedMethodName]
|
|
220
|
-
|
|
221
|
-
if (!changedMethod)
|
|
222
|
-
throw new Error(`Don't know how to handle type: ${attributeData.type}`)
|
|
223
|
-
|
|
224
|
-
return changedMethod(oldValue, newValue)
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
_setNewModelData(modelData) {
|
|
228
|
-
this.previousModelData = this.modelData
|
|
229
|
-
this.modelData = modelData
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
_isDateChanged(oldValue, newValue) {
|
|
233
|
-
if (Date.parse(oldValue) != Date.parse(newValue))
|
|
234
|
-
return true
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
_isIntegerChanged(oldValue, newValue) {
|
|
238
|
-
if (parseInt(oldValue) != parseInt(newValue))
|
|
239
|
-
return true
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
_isStringChanged(oldValue, newValue) {
|
|
243
|
-
var oldConvertedValue = `${oldValue}`
|
|
244
|
-
var newConvertedValue = `${newValue}`
|
|
245
|
-
|
|
246
|
-
if (oldConvertedValue != newConvertedValue)
|
|
247
|
-
return true
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
isChanged() {
|
|
251
|
-
var keys = Object.keys(this.changes)
|
|
252
|
-
|
|
253
|
-
if (keys.length > 0) {
|
|
254
|
-
return true
|
|
255
|
-
} else {
|
|
256
|
-
return false
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
isNewRecord() {
|
|
261
|
-
if (this.newRecord === false) {
|
|
262
|
-
return false
|
|
263
|
-
} else if ("id" in this.modelData && this.modelData.id) {
|
|
264
|
-
return false
|
|
265
|
-
} else {
|
|
266
|
-
return true
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
isPersisted() {
|
|
271
|
-
return !this.isNewRecord()
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
modelClassData() {
|
|
275
|
-
return this.constructor.modelClassData()
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
async reload() {
|
|
279
|
-
var primaryKeyName = this.modelClassData().primaryKey
|
|
280
|
-
var query = {}
|
|
281
|
-
query[`${primaryKeyName}_eq`] = this._primaryKey()
|
|
282
|
-
|
|
283
|
-
var model = await this.constructor.ransack(query).first()
|
|
284
|
-
this._setNewModelData(model.modelData)
|
|
285
|
-
this.changes = {}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
save() {
|
|
289
|
-
if (this.isNewRecord()) {
|
|
290
|
-
return this.create()
|
|
291
|
-
} else {
|
|
292
|
-
return this.update()
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
saveRaw(rawData) {
|
|
297
|
-
if (this.isNewRecord()) {
|
|
298
|
-
return this.createRaw(rawData)
|
|
299
|
-
} else {
|
|
300
|
-
return this.updateRaw(rawData)
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
async update(newAttributes = null) {
|
|
305
|
-
if (newAttributes)
|
|
306
|
-
this.assignAttributes(newAttributes)
|
|
307
|
-
|
|
308
|
-
if (this.changes.length == 0)
|
|
309
|
-
return resolve({model: this})
|
|
310
|
-
|
|
311
|
-
var paramKey = this.modelClassData().paramKey
|
|
312
|
-
var modelData = this.changes
|
|
313
|
-
var dataToUse = {}
|
|
314
|
-
dataToUse[paramKey] = modelData
|
|
315
|
-
|
|
316
|
-
var response = await CommandsPool.addCommand({args: dataToUse, command: `${this.modelClassData().collectionName}-update`, collectionName: this.modelClassData().collectionName, primaryKey: this._primaryKey(), type: "update"}, {})
|
|
317
|
-
|
|
318
|
-
if (response.success) {
|
|
319
|
-
if (response.model) {
|
|
320
|
-
this._setNewModelData(response.model.a)
|
|
321
|
-
this.changes = {}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
return {"model": this, "response": response}
|
|
325
|
-
} else {
|
|
326
|
-
throw new CustomError("Response wasn't successful", {"model": this, "response": response})
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
async updateRaw(data) {
|
|
331
|
-
var formData = FormDataToObject.toObject(data)
|
|
332
|
-
var response = await CommandsPool.addCommand({args: formData, command: `${this.modelClassData().collectionName}-update`, collectionName: this.modelClassData().collectionName, primaryKey: this._primaryKey(), type: "update"}, {})
|
|
333
|
-
|
|
334
|
-
if (response.success) {
|
|
335
|
-
if (response.model) {
|
|
336
|
-
this._setNewModelData(response.model.a)
|
|
337
|
-
this.changes = {}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return {model: this, response: response}
|
|
341
|
-
} else {
|
|
342
|
-
throw new CustomError("Response wasn't successful", {"model": this, "response": response})
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
isValid() {
|
|
347
|
-
throw new Error("Not implemented yet")
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
async isValidOnServer() {
|
|
351
|
-
var modelData = this.getAttributes()
|
|
352
|
-
var paramKey = this.modelClassData().paramKey
|
|
353
|
-
var dataToUse = {}
|
|
354
|
-
dataToUse[paramKey] = modelData
|
|
355
|
-
|
|
356
|
-
var response = await CommandsPool.addCommand({args: dataToUse, command: `${this.modelClassData().collectionName}-valid`, collectionName: this.modelClassData().collectionName, primaryKey: this._primaryKey(), type: "valid"}, {})
|
|
357
|
-
|
|
358
|
-
return {valid: response.valid, errors: response.errors}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
modelClass() {
|
|
362
|
-
return this.constructor
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
preloadRelationship(relationshipName, model) {
|
|
366
|
-
this.relationshipsCache[BaseModel.snakeCase(relationshipName)] = model
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
uniqueKey() {
|
|
370
|
-
if (!this.uniqueKeyValue) {
|
|
371
|
-
var min = 500000000000000000
|
|
372
|
-
var max = 999999999999999999
|
|
373
|
-
var randomBetween = Math.floor(Math.random() * (max - min + 1) + min)
|
|
374
|
-
this.uniqueKeyValue = randomBetween
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
return this.uniqueKeyValue
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
static _callCollectionCommand(args, commandArgs) {
|
|
381
|
-
return CommandsPool.addCommand(args, commandArgs)
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
_callMemberCommand(args, commandArgs) {
|
|
385
|
-
return CommandsPool.addCommand(args, commandArgs)
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
static _postDataFromArgs(args) {
|
|
389
|
-
var postData
|
|
390
|
-
|
|
391
|
-
if (args) {
|
|
392
|
-
if (args instanceof FormData) {
|
|
393
|
-
postData = args
|
|
394
|
-
} else {
|
|
395
|
-
postData = objectToFormData(args, {}, null, "args")
|
|
396
|
-
}
|
|
397
|
-
} else {
|
|
398
|
-
postData = new FormData()
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
return postData
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
_getAttribute(attributeName) {
|
|
405
|
-
if (attributeName in this.changes) {
|
|
406
|
-
return this.changes[attributeName]
|
|
407
|
-
} else if (attributeName in this.modelData) {
|
|
408
|
-
return this.modelData[attributeName]
|
|
409
|
-
} else if (this.isNewRecord()) {
|
|
410
|
-
// Return null if this is a new record and the attribute name is a recognized attribute
|
|
411
|
-
var attributes = this.modelClassData().attributes
|
|
412
|
-
for(var attribute of attributes) {
|
|
413
|
-
if (attribute.name == attributeName)
|
|
414
|
-
return null
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
throw new Error(`No such attribute: ${this.modelClassData().name}#${attributeName}`)
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
_getAttributeDateTime(attributeName) {
|
|
422
|
-
var value = this._getAttribute(attributeName)
|
|
423
|
-
|
|
424
|
-
if (!value) {
|
|
425
|
-
return value
|
|
426
|
-
} else if (value instanceof Date) {
|
|
427
|
-
return value
|
|
428
|
-
} else {
|
|
429
|
-
return new Date(value)
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
_isPresent(value) {
|
|
434
|
-
if (!value) {
|
|
435
|
-
return false
|
|
436
|
-
} else if (typeof value == "string" && value.match(/^\s*$/)) {
|
|
437
|
-
return false
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
return true
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
_getAttributeMoney(attributeName) {
|
|
444
|
-
var value = this._getAttribute(attributeName)
|
|
445
|
-
|
|
446
|
-
if (!value)
|
|
447
|
-
return null
|
|
448
|
-
|
|
449
|
-
var cents = value.amount
|
|
450
|
-
var currency = value.currency
|
|
451
|
-
return Money.fromInteger(cents, currency)
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
async _loadBelongsToReflection(args, queryArgs = {}) {
|
|
455
|
-
if (args.reflectionName in this.relationshipsCache) {
|
|
456
|
-
return this.relationshipsCache[args.reflectionName]
|
|
457
|
-
} else {
|
|
458
|
-
var collection = new Collection(args, queryArgs)
|
|
459
|
-
var model = await collection.first()
|
|
460
|
-
this.relationshipsCache[args.reflectionName] = model
|
|
461
|
-
return model
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
_readBelongsToReflection(args) {
|
|
466
|
-
if (!(args.reflectionName in this.relationshipsCache)) {
|
|
467
|
-
if (this.isNewRecord())
|
|
468
|
-
return null
|
|
469
|
-
|
|
470
|
-
throw new Error(`${this.modelClassData().name}#${args.reflectionName} hasn't been loaded yet`)
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
return this.relationshipsCache[args.reflectionName]
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
async _loadHasOneReflection(args, queryArgs = {}) {
|
|
477
|
-
if (args.reflectionName in this.relationshipsCache) {
|
|
478
|
-
return this.relationshipsCache[args.reflectionName]
|
|
479
|
-
} else {
|
|
480
|
-
var collection = new Collection(args, queryArgs)
|
|
481
|
-
var model = await collection.first()
|
|
482
|
-
this.relationshipsCache[args.reflectionName] = model
|
|
483
|
-
return model
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
_readHasOneReflection(args) {
|
|
488
|
-
if (!(args.reflectionName in this.relationshipsCache)) {
|
|
489
|
-
if (this.isNewRecord())
|
|
490
|
-
return null
|
|
491
|
-
|
|
492
|
-
throw new Error(`${this.modelClassData().name}#${args.reflectionName} hasn't been loaded yet`)
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
return this.relationshipsCache[args.reflectionName]
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
_readModelDataFromArgs(args) {
|
|
499
|
-
this.modelData = args.data.a
|
|
500
|
-
this.includedRelationships = args.data.r
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
_readIncludedRelationships(included) {
|
|
504
|
-
if (!this.includedRelationships)
|
|
505
|
-
return
|
|
506
|
-
|
|
507
|
-
for(var relationshipName in this.includedRelationships) {
|
|
508
|
-
var relationshipData = this.includedRelationships[relationshipName]
|
|
509
|
-
var relationshipClassData = this.modelClassData().relationships.find(relationship => relationship.name == relationshipName)
|
|
510
|
-
|
|
511
|
-
if (!relationshipClassData)
|
|
512
|
-
throw new Error(`No relationship on ${this.modelClassData().name} by that name: ${relationshipName}`)
|
|
513
|
-
|
|
514
|
-
var relationshipType = relationshipClassData.collectionName
|
|
515
|
-
|
|
516
|
-
if (!relationshipData) {
|
|
517
|
-
this.relationshipsCache[relationshipName] = null
|
|
518
|
-
} else if (Array.isArray(relationshipData)) {
|
|
519
|
-
var result = []
|
|
520
|
-
|
|
521
|
-
for(var relationshipId of relationshipData) {
|
|
522
|
-
var model = included.getModel(relationshipType, relationshipId)
|
|
523
|
-
result.push(model)
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
this.relationshipsCache[relationshipName] = result
|
|
527
|
-
} else {
|
|
528
|
-
var model = included.getModel(relationshipType, relationshipData)
|
|
529
|
-
this.relationshipsCache[relationshipName] = model
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
_primaryKey() {
|
|
535
|
-
return this._getAttribute(this.modelClassData().primaryKey)
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
static _token() {
|
|
539
|
-
var csrfTokenElement = document.querySelector("meta[name='csrf-token']")
|
|
540
|
-
if (csrfTokenElement)
|
|
541
|
-
return csrfTokenElement.getAttribute("content")
|
|
542
|
-
}
|
|
543
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import React from "react"
|
|
2
|
-
|
|
3
|
-
export default class BootstrapAttributeRow extends React.Component {
|
|
4
|
-
render() {
|
|
5
|
-
return (
|
|
6
|
-
<tr>
|
|
7
|
-
<th>
|
|
8
|
-
{this.props.label}
|
|
9
|
-
</th>
|
|
10
|
-
<td>
|
|
11
|
-
{this.props.value || this.props.children}
|
|
12
|
-
</td>
|
|
13
|
-
</tr>
|
|
14
|
-
)
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import AttributeRow from "./attribute-row"
|
|
2
|
-
import PropTypes from "prop-types"
|
|
3
|
-
import React from "react"
|
|
4
|
-
|
|
5
|
-
export default class BootstrapAttributeRows extends React.Component {
|
|
6
|
-
static propTypes = {
|
|
7
|
-
attributes: PropTypes.array.isRequired,
|
|
8
|
-
model: PropTypes.object.isRequired
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
constructor(props) {
|
|
12
|
-
super(props)
|
|
13
|
-
this.state = {
|
|
14
|
-
classObject: props.model.modelClass()
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
render() {
|
|
19
|
-
return this.props.attributes.map((attribute) =>
|
|
20
|
-
<AttributeRow key={`attribute-${attribute}`} label={this.state.classObject.humanAttributeName(attribute)}>
|
|
21
|
-
{this.valueContent(attribute)}
|
|
22
|
-
</AttributeRow>
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
value(attribute) {
|
|
27
|
-
if (!(attribute in this.props.model))
|
|
28
|
-
throw new Error(`Attribute not found: ${this.props.model.modelClassData().name}#${attribute}`)
|
|
29
|
-
|
|
30
|
-
return this.props.model[attribute]()
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
valueContent(attribute) {
|
|
34
|
-
var value = this.value(attribute)
|
|
35
|
-
|
|
36
|
-
if (value instanceof Date) {
|
|
37
|
-
return I18n.strftime(value, "%Y-%m-%d %H:%M")
|
|
38
|
-
} else if (typeof value === "boolean") {
|
|
39
|
-
if (value)
|
|
40
|
-
return I18n.t("js.shared.yes")
|
|
41
|
-
|
|
42
|
-
return I18n.t("js.shared.no")
|
|
43
|
-
} else {
|
|
44
|
-
return this.value(attribute)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import PropTypes from "prop-types"
|
|
2
|
-
import PropTypesExact from "prop-types-exact"
|
|
3
|
-
import React from "react"
|
|
4
|
-
|
|
5
|
-
export default class Card extends React.Component {
|
|
6
|
-
static defaultProps = {
|
|
7
|
-
responsiveTable: true
|
|
8
|
-
}
|
|
9
|
-
static propTypes = PropTypesExact({
|
|
10
|
-
className: PropTypes.string,
|
|
11
|
-
children: PropTypes.node,
|
|
12
|
-
controls: PropTypes.node,
|
|
13
|
-
header: PropTypes.string,
|
|
14
|
-
onClick: PropTypes.func,
|
|
15
|
-
striped: PropTypes.bool,
|
|
16
|
-
style: PropTypes.object,
|
|
17
|
-
responsiveTable: PropTypes.bool,
|
|
18
|
-
table: PropTypes.bool
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
render() {
|
|
22
|
-
var { children, controls, header, onClick, style, table } = this.props
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<div className={this.classNames()} onClick={onClick} ref="card" style={style}>
|
|
26
|
-
{(controls || header) &&
|
|
27
|
-
<div className="card-header">
|
|
28
|
-
{header}
|
|
29
|
-
{controls &&
|
|
30
|
-
<div className="float-right">
|
|
31
|
-
{controls}
|
|
32
|
-
</div>
|
|
33
|
-
}
|
|
34
|
-
</div>
|
|
35
|
-
}
|
|
36
|
-
<div className={this.bodyClassNames()}>
|
|
37
|
-
{table &&
|
|
38
|
-
<table className={this.tableClassNames()}>
|
|
39
|
-
{children}
|
|
40
|
-
</table>
|
|
41
|
-
}
|
|
42
|
-
{!table && children}
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
classNames() {
|
|
49
|
-
var classNames = ["component-bootstrap-card", "card", "card-default"]
|
|
50
|
-
|
|
51
|
-
if (this.props.className)
|
|
52
|
-
classNames.push(this.props.className)
|
|
53
|
-
|
|
54
|
-
return classNames.join(" ")
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
bodyClassNames() {
|
|
58
|
-
var classNames = ["card-body"]
|
|
59
|
-
|
|
60
|
-
if (this.props.table) {
|
|
61
|
-
if (this.props.responsiveTable){
|
|
62
|
-
classNames.push("table-responsive")
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
classNames.push("p-0")
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return classNames.join(" ")
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
tableClassNames() {
|
|
72
|
-
var classNames = ["table", "table-hover", "mb-0", "w-100"]
|
|
73
|
-
|
|
74
|
-
if (this.props.striped)
|
|
75
|
-
classNames.push("table-striped")
|
|
76
|
-
|
|
77
|
-
return classNames.join(" ")
|
|
78
|
-
}
|
|
79
|
-
}
|