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,41 +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 ApiMakerEventListener extends React.Component {
|
|
6
|
-
static callEvent(target, eventName, args = []) {
|
|
7
|
-
let event = document.createEvent("Event")
|
|
8
|
-
event.initEvent(eventName, false, true)
|
|
9
|
-
target.dispatchEvent(event, args)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
static propTypes = PropTypesExact({
|
|
13
|
-
event: PropTypes.string.isRequired,
|
|
14
|
-
onCalled: PropTypes.func.isRequired,
|
|
15
|
-
target: PropTypes.object
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
constructor(props) {
|
|
19
|
-
super(props)
|
|
20
|
-
this.onCalled = this.onCalled.bind(this)
|
|
21
|
-
|
|
22
|
-
if (!this.props.target)
|
|
23
|
-
throw new Error("'target' was expected but not given")
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
componentDidMount() {
|
|
27
|
-
this.props.target.addEventListener(this.props.event, this.onCalled)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
componentWillUnmount() {
|
|
31
|
-
this.props.target.removeEventListener(this.props.event, this.onCalled)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
onCalled(...args) {
|
|
35
|
-
this.props.onCalled.apply(null, args)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
render() {
|
|
39
|
-
return ""
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,26 +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 ApiMakerEventUpdated extends React.Component {
|
|
6
|
-
static propTypes = PropTypesExact({
|
|
7
|
-
model: PropTypes.object.isRequired,
|
|
8
|
-
onUpdated: PropTypes.func.isRequired
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
componentDidMount() {
|
|
12
|
-
this.connect()
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
componentWillUnmount() {
|
|
16
|
-
this.connectUpdated.unsubscribe()
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
connect() {
|
|
20
|
-
this.connectUpdated = this.props.model.connectUpdated(this.props.onUpdated)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
render() {
|
|
24
|
-
return ""
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
export default class FormDataToObject {
|
|
2
|
-
static toObject(formData) {
|
|
3
|
-
var formDataToObject = new FormDataToObject(formData)
|
|
4
|
-
return formDataToObject.toObject()
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
constructor(formData) {
|
|
8
|
-
this.formData = formData
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
toObject() {
|
|
12
|
-
var result = {}
|
|
13
|
-
|
|
14
|
-
for(var entry of this.formData.entries()) {
|
|
15
|
-
var key = entry[0]
|
|
16
|
-
var value = entry[1]
|
|
17
|
-
|
|
18
|
-
this.treatInitial(key, value, result)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return result
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
treatInitial(key, value, result) {
|
|
25
|
-
var firstMatch = key.match(/^(.+?)(\[([\s\S]+$))/)
|
|
26
|
-
|
|
27
|
-
if (firstMatch) {
|
|
28
|
-
var inputName = firstMatch[1]
|
|
29
|
-
var rest = firstMatch[2]
|
|
30
|
-
|
|
31
|
-
if (inputName in result) {
|
|
32
|
-
var newResult = result[inputName]
|
|
33
|
-
} else if (rest == "[]") {
|
|
34
|
-
var newResult = []
|
|
35
|
-
result[inputName] = newResult
|
|
36
|
-
} else {
|
|
37
|
-
var newResult = {}
|
|
38
|
-
result[inputName] = newResult
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
this.treatSecond(value, rest, newResult)
|
|
42
|
-
} else {
|
|
43
|
-
result[key] = value
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
treatSecond(value, rest, result) {
|
|
48
|
-
var secondMatch = rest.match(/^\[(.*?)\]([\s\S]*)$/)
|
|
49
|
-
var key = secondMatch[1]
|
|
50
|
-
var newRest = secondMatch[2]
|
|
51
|
-
|
|
52
|
-
if (rest == "[]") {
|
|
53
|
-
result.push(value)
|
|
54
|
-
} else if (newRest == "") {
|
|
55
|
-
result[key] = value
|
|
56
|
-
} else {
|
|
57
|
-
if (key in result) {
|
|
58
|
-
var newResult = result[key]
|
|
59
|
-
} else if (newRest == "[]") {
|
|
60
|
-
var newResult = []
|
|
61
|
-
result[key] = newResult
|
|
62
|
-
} else {
|
|
63
|
-
var newResult = {}
|
|
64
|
-
result[key] = newResult
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
this.treatSecond(value, newRest, newResult)
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
const inflection = require("inflection")
|
|
2
|
-
|
|
3
|
-
export default class ApiMakerIncluded {
|
|
4
|
-
constructor(response) {
|
|
5
|
-
this.response = response
|
|
6
|
-
this.loadIncludedModels()
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
loadIncludedModels() {
|
|
10
|
-
this.included = {}
|
|
11
|
-
|
|
12
|
-
for(var includedType in this.response.included) {
|
|
13
|
-
for(var includedId in this.response.included[includedType]) {
|
|
14
|
-
var includedData = this.response.included[includedType][includedId]
|
|
15
|
-
var modelClassName = inflection.dasherize(inflection.singularize(includedType))
|
|
16
|
-
var modelClass = require(`api-maker/models/${modelClassName}`).default
|
|
17
|
-
var model = new modelClass({data: includedData, isNewRecord: false})
|
|
18
|
-
|
|
19
|
-
if (!this.included[includedType])
|
|
20
|
-
this.included[includedType] = {}
|
|
21
|
-
|
|
22
|
-
this.included[includedType][includedId] = model
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
for(var modelType in this.included) {
|
|
27
|
-
for(var modelId in this.included[modelType]) {
|
|
28
|
-
this.included[modelType][modelId]._readIncludedRelationships(this)
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
getModel(type, id) {
|
|
34
|
-
if (!this.included[type] || !this.included[type][id])
|
|
35
|
-
throw new Error(`Could not find a ${type} by that ID: ${id}`)
|
|
36
|
-
|
|
37
|
-
return this.included[type][id]
|
|
38
|
-
}
|
|
39
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import Dexie from "dexie"
|
|
2
|
-
|
|
3
|
-
export default class KeyValueStore {
|
|
4
|
-
static current() {
|
|
5
|
-
if (!window.currentKeyValueStore)
|
|
6
|
-
window.currentKeyValueStore = new KeyValueStore()
|
|
7
|
-
|
|
8
|
-
return window.currentKeyValueStore
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
static async get(key) {
|
|
12
|
-
return await KeyValueStore.current().get(key)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
static async set(key, value) {
|
|
16
|
-
return await KeyValueStore.current().set(key, value)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
constructor() {
|
|
20
|
-
this.database = new Dexie("KeyValueStoreDatabase")
|
|
21
|
-
this.database.version(1).stores({
|
|
22
|
-
keyValues: "++id, key, value"
|
|
23
|
-
})
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async get(key) {
|
|
27
|
-
var row = await this.database.keyValues.where("key").equals(key).first()
|
|
28
|
-
|
|
29
|
-
if (row)
|
|
30
|
-
return row.value
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async set(key, value) {
|
|
34
|
-
var row = await this.database.keyValues.where("key").equals(key).first()
|
|
35
|
-
|
|
36
|
-
if (row) {
|
|
37
|
-
await this.database.keyValues.update(row.id, {value: value})
|
|
38
|
-
} else {
|
|
39
|
-
await this.database.keyValues.add({
|
|
40
|
-
key: key,
|
|
41
|
-
value: value
|
|
42
|
-
})
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return true
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export default class ApiMakerLogger {
|
|
2
|
-
static current() {
|
|
3
|
-
if (!window.apiMakerLogger) {
|
|
4
|
-
window.apiMakerLogger = new ApiMakerLogger()
|
|
5
|
-
// window.apiMakerLogger.setDebug(true)
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
return window.apiMakerLogger
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
static log(message) {
|
|
12
|
-
ApiMakerLogger.current().log(message)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
log(message) {
|
|
16
|
-
if (this.debug)
|
|
17
|
-
console.log("ApiMaker", message)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
setDebug(value) {
|
|
21
|
-
this.debug = value
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export default class ModelName {
|
|
2
|
-
constructor(data) {
|
|
3
|
-
this.data = data
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
human(args) {
|
|
7
|
-
if (!args)
|
|
8
|
-
args = {count: 1}
|
|
9
|
-
|
|
10
|
-
var countKey
|
|
11
|
-
|
|
12
|
-
if (args.count > 1 || args.count < 0) {
|
|
13
|
-
countKey = "other"
|
|
14
|
-
} else {
|
|
15
|
-
countKey = "one"
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
var key = `activerecord.models.${this.data.modelClassData.i18nKey}.${countKey}`
|
|
19
|
-
return I18n.t(key)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import Included from "./included"
|
|
2
|
-
|
|
3
|
-
const inflection = require("inflection")
|
|
4
|
-
|
|
5
|
-
export default class ModelsResponseReader {
|
|
6
|
-
static first(response) {
|
|
7
|
-
return ModelsResponseReader.collection(response)[0]
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
static collection(response) {
|
|
11
|
-
var reader = new ModelsResponseReader({response: response})
|
|
12
|
-
return reader.models()
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
constructor(args) {
|
|
16
|
-
this.response = args.response
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
models() {
|
|
20
|
-
var included = new Included(this.response)
|
|
21
|
-
var models = []
|
|
22
|
-
|
|
23
|
-
for(var modelType in this.response.data) {
|
|
24
|
-
var modelClassName = inflection.singularize(modelType)
|
|
25
|
-
var modelClass = require(`api-maker/models/${modelClassName}`).default
|
|
26
|
-
var collectionName = inflection.dasherize(modelClass.modelClassData().collectionName)
|
|
27
|
-
|
|
28
|
-
for(var modelId of this.response.data[modelType]) {
|
|
29
|
-
var modelData = this.response.included[collectionName][modelId]
|
|
30
|
-
|
|
31
|
-
if (!modelData)
|
|
32
|
-
throw new Error(`Couldn't find model data for ${collectionName}(${modelId})`)
|
|
33
|
-
|
|
34
|
-
var model = new modelClass({data: modelData, isNewRecord: false, response: this.response})
|
|
35
|
-
|
|
36
|
-
model._readIncludedRelationships(included)
|
|
37
|
-
models.push(model)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return models
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { Link } from "react-router-dom"
|
|
2
|
-
import qs from "qs"
|
|
3
|
-
import React from "react"
|
|
4
|
-
|
|
5
|
-
export default class extends React.Component {
|
|
6
|
-
isPageActiveClass(pageNumber) {
|
|
7
|
-
if (this.props.result.currentPage() == pageNumber)
|
|
8
|
-
return "active"
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
pages() {
|
|
12
|
-
var currentPage = this.props.result.currentPage()
|
|
13
|
-
var pages = []
|
|
14
|
-
var totalPages = this.props.result.totalPages()
|
|
15
|
-
var pagesFrom = currentPage - 5
|
|
16
|
-
var pagesTo = currentPage + 5
|
|
17
|
-
|
|
18
|
-
if (pagesFrom < 1)
|
|
19
|
-
pagesFrom = 1
|
|
20
|
-
|
|
21
|
-
if (pagesTo > totalPages)
|
|
22
|
-
pagesTo = totalPages
|
|
23
|
-
|
|
24
|
-
for(var i = pagesFrom; i <= pagesTo; i++) {
|
|
25
|
-
pages.push(i)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return pages
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
pagePath(pageNumber) {
|
|
32
|
-
var pageKey = this.props.result.data.collection.queryArgs.pageKey
|
|
33
|
-
if (!pageKey)
|
|
34
|
-
pageKey = "page"
|
|
35
|
-
|
|
36
|
-
var currentParams = qs.parse(window.location.search.substr(1))
|
|
37
|
-
currentParams[pageKey] = pageNumber
|
|
38
|
-
var newParams = qs.stringify(currentParams)
|
|
39
|
-
var newPath = `${location.pathname}?${newParams}`
|
|
40
|
-
|
|
41
|
-
return newPath
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
previousPagePath() {
|
|
45
|
-
var previousPage
|
|
46
|
-
|
|
47
|
-
if (this.props.result.currentPage() > 1) {
|
|
48
|
-
previousPage = this.props.result.currentPage() - 1
|
|
49
|
-
} else {
|
|
50
|
-
previousPage = this.props.result.currentPage()
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return this.pagePath(previousPage)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
nextPagePath() {
|
|
57
|
-
var nextPage
|
|
58
|
-
|
|
59
|
-
if (this.props.result.currentPage() < this.props.result.totalPages()) {
|
|
60
|
-
nextPage = this.props.result.currentPage() + 1
|
|
61
|
-
} else {
|
|
62
|
-
nextPage = this.props.result.currentPage()
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return this.pagePath(nextPage)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
showBackwardsDots() {
|
|
69
|
-
var currentPage = this.props.result.currentPage()
|
|
70
|
-
|
|
71
|
-
return (currentPage - 5 > 1)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
showForwardsDots() {
|
|
75
|
-
var currentPage = this.props.result.currentPage()
|
|
76
|
-
var totalPages = this.props.result.totalPages()
|
|
77
|
-
|
|
78
|
-
return (currentPage + 5 < totalPages)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
render() {
|
|
82
|
-
return (
|
|
83
|
-
<ul className="pagination">
|
|
84
|
-
<li className={`page-item ${this.props.result.currentPage() <= 1 ? "disabled" : ""}`} key="page-first">
|
|
85
|
-
<Link className="page-link" to={this.pagePath(1)}>
|
|
86
|
-
⇤
|
|
87
|
-
</Link>
|
|
88
|
-
</li>
|
|
89
|
-
<li className={`page-item ${this.props.result.currentPage() <= 1 ? "disabled" : ""}`} key="page-previous">
|
|
90
|
-
<Link className="page-link" to={this.previousPagePath()}>
|
|
91
|
-
←
|
|
92
|
-
</Link>
|
|
93
|
-
</li>
|
|
94
|
-
{this.showBackwardsDots() &&
|
|
95
|
-
<li className="page-item">
|
|
96
|
-
<a className="page-link disabled" href="#">
|
|
97
|
-
…
|
|
98
|
-
</a>
|
|
99
|
-
</li>
|
|
100
|
-
}
|
|
101
|
-
{this.pages().map(page =>
|
|
102
|
-
<li className={`page-item ${this.isPageActiveClass(page)}`} key={`page-${page}`}>
|
|
103
|
-
<Link className="page-link" to={this.pagePath(page)}>
|
|
104
|
-
{page}
|
|
105
|
-
</Link>
|
|
106
|
-
</li>
|
|
107
|
-
)}
|
|
108
|
-
{this.showForwardsDots() &&
|
|
109
|
-
<li className="page-item">
|
|
110
|
-
<a className="page-link disabled" href="#">
|
|
111
|
-
…
|
|
112
|
-
</a>
|
|
113
|
-
</li>
|
|
114
|
-
}
|
|
115
|
-
<li className={`page-item ${this.props.result.currentPage() >= this.props.result.totalPages() ? "disabled" : ""}`} key="page-next">
|
|
116
|
-
<Link className="page-link" to={this.nextPagePath()}>
|
|
117
|
-
→
|
|
118
|
-
</Link>
|
|
119
|
-
</li>
|
|
120
|
-
<li className={`page-item ${this.props.result.currentPage() >= this.props.result.totalPages() ? "disabled" : ""}`} key="page-last">
|
|
121
|
-
<Link className="page-link" to={this.pagePath(this.props.result.totalPages())}>
|
|
122
|
-
⇥
|
|
123
|
-
</Link>
|
|
124
|
-
</li>
|
|
125
|
-
</ul>
|
|
126
|
-
)
|
|
127
|
-
}
|
|
128
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import formSerialize from "form-serialize"
|
|
2
|
-
import KeyValueStore from "api-maker/key-value-store"
|
|
3
|
-
import merge from "merge"
|
|
4
|
-
import qs from "qs"
|
|
5
|
-
|
|
6
|
-
export default class Params {
|
|
7
|
-
static parse() {
|
|
8
|
-
return qs.parse(window.location.search.substr(1))
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
static change(given) {
|
|
12
|
-
return merge.recursive(true, Params.parse(), given)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
static changeParams(given) {
|
|
16
|
-
var params = Params.change(given)
|
|
17
|
-
var newParams = qs.stringify(params)
|
|
18
|
-
var newPath = `${location.pathname}?${newParams}`
|
|
19
|
-
|
|
20
|
-
AppHistory.push(newPath)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
static async getCachedParams(paramName, args = {}) {
|
|
24
|
-
var oldQuery = await KeyValueStore.get(paramName)
|
|
25
|
-
var params = Params.parse()
|
|
26
|
-
|
|
27
|
-
if (params && paramName in params) {
|
|
28
|
-
return params[paramName]
|
|
29
|
-
} else if (oldQuery) {
|
|
30
|
-
return oldQuery
|
|
31
|
-
} else {
|
|
32
|
-
return args.default || {}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
static async setCachedParams(paramName, qParams) {
|
|
37
|
-
return await KeyValueStore.set(paramName, qParams)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
static serializeForm(form) {
|
|
41
|
-
var hash = formSerialize(form, {empty: true, hash: true})
|
|
42
|
-
return Params.setUndefined(hash)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// This is used to set all empty values to 'undefined' which makes qs removed those elements from the query string
|
|
46
|
-
static setUndefined(given) {
|
|
47
|
-
if (Array.isArray(given)) {
|
|
48
|
-
if (given.length == 0)
|
|
49
|
-
return undefined
|
|
50
|
-
|
|
51
|
-
return given.map(givenI => Params.setUndefined(givenI))
|
|
52
|
-
} else if (typeof given === "object") {
|
|
53
|
-
if (Object.keys(given).length == 0)
|
|
54
|
-
return undefined
|
|
55
|
-
|
|
56
|
-
var newGiven = {}
|
|
57
|
-
for(var key in given) {
|
|
58
|
-
newGiven[key] = Params.setUndefined(given[key])
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return newGiven
|
|
62
|
-
} else if (given === "") {
|
|
63
|
-
return undefined
|
|
64
|
-
} else {
|
|
65
|
-
return given
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
const inflection = require("inflection")
|
|
2
|
-
|
|
3
|
-
export default class ResourceRoute {
|
|
4
|
-
constructor(args) {
|
|
5
|
-
this.args = args.args
|
|
6
|
-
this.parsedContext = args.parsedContext
|
|
7
|
-
this.route = args.route
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
routes() {
|
|
11
|
-
if (this.args.locales) {
|
|
12
|
-
return this.withLocale()
|
|
13
|
-
} else {
|
|
14
|
-
return this.withoutLocale()
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
findRouteParams(route) {
|
|
19
|
-
var result = []
|
|
20
|
-
var parts = route.path.split("/")
|
|
21
|
-
|
|
22
|
-
for(var part of parts) {
|
|
23
|
-
if (part.match(/^:([a-z_]+)$/))
|
|
24
|
-
result.push(part)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return result
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
requireComponent() {
|
|
31
|
-
var requireResult = this.parsedContext[`components/${this.route.component}.jsx`]
|
|
32
|
-
|
|
33
|
-
if (!requireResult)
|
|
34
|
-
var requireResult = this.parsedContext[`components/${this.route.component}/index.jsx`]
|
|
35
|
-
|
|
36
|
-
if (!requireResult)
|
|
37
|
-
throw new Error(`No such require: ${this.route.component}`)
|
|
38
|
-
|
|
39
|
-
return requireResult.default
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
withLocale() {
|
|
43
|
-
var component = this.requireComponent()
|
|
44
|
-
var Locales = require("shared/locales").default
|
|
45
|
-
var Path = require("shared/path").default
|
|
46
|
-
var routes = []
|
|
47
|
-
|
|
48
|
-
for(var locale of Locales.availableLocales()) {
|
|
49
|
-
var path = Path.localized(inflection.camelize(this.route.name, true), this.findRouteParams(this.route), {locale: locale})
|
|
50
|
-
|
|
51
|
-
routes.push({
|
|
52
|
-
path: path,
|
|
53
|
-
component: component
|
|
54
|
-
})
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return routes
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
withoutLocale() {
|
|
61
|
-
var routePathName = inflection.camelize(this.route.name, true)
|
|
62
|
-
var routePathMethod = Routes[`${routePathName}Path`]
|
|
63
|
-
|
|
64
|
-
if (!routePathMethod)
|
|
65
|
-
throw new Error(`No such route could be found: ${routePathName}`)
|
|
66
|
-
|
|
67
|
-
var path = routePathMethod.apply(null, this.findRouteParams(this.route))
|
|
68
|
-
var component = this.requireComponent()
|
|
69
|
-
|
|
70
|
-
return [{
|
|
71
|
-
path: path,
|
|
72
|
-
component: component
|
|
73
|
-
}]
|
|
74
|
-
}
|
|
75
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import React from "react" // This fixes an issue with the Baristo project where it needed it to be loaded
|
|
2
|
-
import ResourceRoute from "./resource-route"
|
|
3
|
-
import { Route } from "react-router-dom"
|
|
4
|
-
|
|
5
|
-
export default class ApiMakerResourceRoutes {
|
|
6
|
-
static readRoutes(args = {}) {
|
|
7
|
-
if (!args.routes)
|
|
8
|
-
throw new Error("Please pass 'routes' to this method")
|
|
9
|
-
|
|
10
|
-
var parsedContext = ApiMakerResourceRoutes.parseContext(args)
|
|
11
|
-
var routesJson = args.routes
|
|
12
|
-
var routes = []
|
|
13
|
-
|
|
14
|
-
for(var route of routesJson.routes) {
|
|
15
|
-
var resourceRoute = new ResourceRoute({args, parsedContext, route})
|
|
16
|
-
|
|
17
|
-
for(var newRoute of resourceRoute.routes()) {
|
|
18
|
-
routes.push(
|
|
19
|
-
<Route exact key={`route-${newRoute.path}`} path={newRoute.path} component={newRoute.component} />
|
|
20
|
-
)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return routes
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
static parseContext(args) {
|
|
28
|
-
var result = {}
|
|
29
|
-
args.context.keys().forEach(key => {
|
|
30
|
-
var newKey = `${args.path}/${key.substring(2, key.length)}`
|
|
31
|
-
result[newKey] = args.context(key)
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
return result
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export default class Result {
|
|
2
|
-
constructor(data) {
|
|
3
|
-
this.data = data
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
currentPage() {
|
|
7
|
-
return this.data.response.meta.currentPage
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
models() {
|
|
11
|
-
return this.data.models
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
modelClass() {
|
|
15
|
-
return this.data.collection.modelClass()
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
totalCount() {
|
|
19
|
-
return this.data.response.meta.totalCount
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
totalPages() {
|
|
23
|
-
return this.data.response.meta.totalPages
|
|
24
|
-
}
|
|
25
|
-
}
|