@kaspernj/api-maker 1.0.2011 → 1.0.2012
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.
- package/{.eslintrc.cjs → .eslintrc.js} +10 -1
- package/README.md +35 -0
- package/android/build.gradle +43 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +50 -0
- package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +30 -0
- package/build/api.js +120 -0
- package/build/attribute-not-loaded-error.js +2 -0
- package/build/base-component.js +5 -0
- package/build/base-error.js +33 -0
- package/build/base-model/attribute.js +25 -0
- package/build/base-model/column.js +11 -0
- package/build/base-model/reflection.js +14 -0
- package/build/base-model/scope.js +11 -0
- package/build/base-model.js +828 -0
- package/build/bootstrap/attribute-row.js +135 -0
- package/build/bootstrap/attribute-rows.js +31 -0
- package/build/bootstrap/card.js +138 -0
- package/build/bootstrap/checkbox.js +97 -0
- package/build/bootstrap/checkboxes.js +183 -0
- package/build/bootstrap/index.js +2 -0
- package/build/bootstrap/input.js +129 -0
- package/build/bootstrap/invalid-feedback.js +27 -0
- package/build/bootstrap/paginate.js +150 -0
- package/build/bootstrap/radio-buttons.js +72 -0
- package/build/bootstrap/select.js +88 -0
- package/build/bootstrap/sort-link.js +131 -0
- package/build/cable-connection-pool.js +128 -0
- package/build/cable-subscription-pool.js +207 -0
- package/build/cable-subscription.js +21 -0
- package/build/cache-key-generator.js +81 -0
- package/build/can-can.js +134 -0
- package/build/channels-consumer.js +9 -0
- package/build/collection-loader.js +48 -0
- package/build/collection.js +280 -0
- package/build/command-submit-data.js +81 -0
- package/build/commands-pool.js +195 -0
- package/build/compose.js +9 -0
- package/build/config.js +62 -0
- package/build/custom-error.js +5 -0
- package/build/data-set-to-attributes.js +10 -0
- package/build/deserializer.js +56 -0
- package/build/destroy-error.js +5 -0
- package/build/devise.js +112 -0
- package/build/draggable-sort/controller.js +136 -0
- package/build/draggable-sort/index.js +114 -0
- package/build/draggable-sort/item.js +188 -0
- package/build/error-logger.js +101 -0
- package/build/error-messages.js +13 -0
- package/build/event-connection.js +32 -0
- package/build/event-emitter-listener.js +15 -0
- package/build/event-model-class.js +24 -0
- package/build/events.js +5 -0
- package/build/flash-message.js +79 -0
- package/build/form.js +83 -0
- package/build/history-expo.js +20 -0
- package/build/history-react-native.js +20 -0
- package/build/history.js +3 -0
- package/build/index.js +3 -0
- package/build/inputs/attachment.js +133 -0
- package/build/inputs/auto-submit.js +36 -0
- package/build/inputs/checkbox.js +138 -0
- package/build/inputs/checkboxes.js +112 -0
- package/build/inputs/id-for-component.js +15 -0
- package/build/inputs/input-wrapper.js +19 -0
- package/build/inputs/input.js +243 -0
- package/build/inputs/money.js +179 -0
- package/build/inputs/name-for-component.js +13 -0
- package/build/inputs/select.js +93 -0
- package/build/instance-of-class-name.js +23 -0
- package/build/key-value-store.js +53 -0
- package/build/link.js +73 -0
- package/build/logger.js +30 -0
- package/build/modal.js +38 -0
- package/build/model-class-require.js +13 -0
- package/build/model-events.js +30 -0
- package/build/model-name.js +28 -0
- package/build/model-prop-type.js +101 -0
- package/build/model-recipes-loader.js +32 -0
- package/build/model-recipes-model-loader.js +357 -0
- package/build/models-response-reader.js +40 -0
- package/build/models.js +8 -0
- package/build/money-formatter.js +78 -0
- package/build/not-loaded-error.js +2 -0
- package/build/params.js +61 -0
- package/build/preloaded.js +38 -0
- package/build/resize-observer.js +11 -0
- package/build/result.js +13 -0
- package/build/router/route.js +270 -0
- package/build/router/switch.js +72 -0
- package/build/router.js +59 -0
- package/build/routes-native.js +202 -0
- package/build/routes.js +50 -0
- package/build/run-last.js +35 -0
- package/build/serializer.js +63 -0
- package/build/services.js +20 -0
- package/build/session-status-updater.js +134 -0
- package/build/source-maps-loader.js +184 -0
- package/build/super-admin/config-reader.js +85 -0
- package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
- package/build/super-admin/edit-page/edit-attribute-content.js +55 -0
- package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
- package/build/super-admin/edit-page/edit-attribute.js +77 -0
- package/build/super-admin/edit-page.js +123 -0
- package/build/super-admin/has-edit-config.js +12 -0
- package/build/super-admin/index-page.js +25 -0
- package/build/super-admin/index.js +181 -0
- package/build/super-admin/layout/header/index.js +161 -0
- package/build/super-admin/layout/index.js +164 -0
- package/build/super-admin/layout/menu/index.js +206 -0
- package/build/super-admin/layout/menu/menu-content.js +46 -0
- package/build/super-admin/layout/menu/menu-item.js +84 -0
- package/build/super-admin/layout/no-access.js +27 -0
- package/build/super-admin/model-class-table.js +61 -0
- package/build/super-admin/models.js +8 -0
- package/build/super-admin/show-nav.js +51 -0
- package/build/super-admin/show-page/belongs-to-attribute-row.js +29 -0
- package/build/super-admin/show-page/index.js +141 -0
- package/build/super-admin/show-reflection-actions.js +47 -0
- package/build/super-admin/show-reflection-link.js +48 -0
- package/build/super-admin/show-reflection-page.js +48 -0
- package/build/table/column-content.js +117 -0
- package/build/table/column-identifier.js +18 -0
- package/build/table/column-visible.js +7 -0
- package/build/table/components/column.js +21 -0
- package/build/table/components/flat-list.js +21 -0
- package/build/table/components/header.js +26 -0
- package/build/table/components/row.js +26 -0
- package/build/table/filters/attribute-element.js +44 -0
- package/build/table/filters/filter-form.js +402 -0
- package/build/table/filters/filter.js +90 -0
- package/build/table/filters/index.js +184 -0
- package/build/table/filters/load-search-modal.js +175 -0
- package/build/table/filters/reflection-element.js +37 -0
- package/build/table/filters/save-search-modal.js +88 -0
- package/build/table/filters/scope-element.js +42 -0
- package/build/table/header-column-content.js +68 -0
- package/build/table/header-column.js +144 -0
- package/build/table/header-select.js +105 -0
- package/build/table/model-callback-args.js +10 -0
- package/build/table/model-column.js +97 -0
- package/build/table/model-row.js +193 -0
- package/build/table/select-calculator.js +63 -0
- package/build/table/settings/column-row.js +97 -0
- package/build/table/settings/download-action.js +79 -0
- package/build/table/settings/index.js +92 -0
- package/build/table/table-settings.js +219 -0
- package/build/table/table.js +972 -0
- package/build/table/use-sorting.js +34 -0
- package/build/table/widths.js +75 -0
- package/build/table/worker-plugins-check-all-checkbox.js +125 -0
- package/build/table/worker-plugins-checkbox.js +115 -0
- package/build/translated-attributes.js +10 -0
- package/build/translated-collections.js +12 -0
- package/build/updated-attribute.js +76 -0
- package/build/url-encode.js +15 -0
- package/build/use-breakpoint.js +62 -0
- package/build/use-can-can.js +55 -0
- package/build/use-collection.js +225 -0
- package/build/use-created-event.js +52 -0
- package/build/use-current-user.js +76 -0
- package/build/use-destroyed-event.js +60 -0
- package/build/use-event-emitter.js +13 -0
- package/build/use-event-listener.js +16 -0
- package/build/use-input.js +137 -0
- package/build/use-model-event.js +60 -0
- package/build/use-model.js +169 -0
- package/build/use-resize-observer.js +23 -0
- package/build/use-router.js +104 -0
- package/build/use-screen-layout.js +39 -0
- package/build/use-updated-event.js +60 -0
- package/build/use-validation-errors.js +30 -0
- package/build/utils/card.js +51 -0
- package/build/utils/checkbox.js +78 -0
- package/build/utils/checkboxes.js +163 -0
- package/build/utils/default-style.js +18 -0
- package/build/utils/icon.js +23 -0
- package/build/utils/invalid-feedback.js +19 -0
- package/build/utils/modal.js +62 -0
- package/build/utils/text.js +19 -0
- package/build/validation-error.js +28 -0
- package/build/validation-errors.js +98 -0
- package/build/with-api-maker.js +29 -0
- package/build/with-collection.js +14 -0
- package/build/with-current-user.js +10 -0
- package/build/with-model.js +15 -0
- package/build/with-router.js +22 -0
- package/expo-module.config.json +17 -0
- package/ios/ApiMaker.podspec +29 -0
- package/ios/ApiMakerModule.swift +48 -0
- package/ios/ApiMakerView.swift +38 -0
- package/link.sh +8 -0
- package/package.json +49 -46
- package/src/{api.mjs → api.js} +38 -37
- package/src/base-component.jsx +5 -0
- package/src/{base-error.mjs → base-error.js} +4 -6
- package/src/base-model/attribute.js +33 -0
- package/src/base-model/column.js +13 -0
- package/src/base-model/reflection.js +15 -0
- package/src/base-model/scope.js +12 -0
- package/src/{base-model.mjs → base-model.js} +302 -144
- package/src/bootstrap/attribute-row.jsx +135 -0
- package/src/bootstrap/attribute-rows.jsx +27 -0
- package/src/bootstrap/card.jsx +149 -0
- package/src/bootstrap/checkbox.jsx +86 -0
- package/src/bootstrap/checkboxes.jsx +185 -0
- package/src/bootstrap/index.js +0 -0
- package/src/bootstrap/input.jsx +173 -0
- package/src/bootstrap/invalid-feedback.jsx +31 -0
- package/src/bootstrap/paginate.jsx +187 -0
- package/src/bootstrap/radio-buttons.jsx +87 -0
- package/src/bootstrap/select.jsx +110 -0
- package/src/bootstrap/sort-link.jsx +106 -0
- package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +16 -36
- package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +26 -21
- package/src/{cable-subscription.mjs → cable-subscription.js} +6 -4
- package/src/cache-key-generator.js +100 -0
- package/src/{can-can.mjs → can-can.js} +13 -12
- package/src/channels-consumer.js +10 -0
- package/src/collection-loader.jsx +58 -224
- package/src/{collection.mjs → collection.js} +98 -44
- package/src/{command-submit-data.mjs → command-submit-data.js} +2 -7
- package/src/{commands-pool.mjs → commands-pool.js} +57 -41
- package/src/compose.js +11 -0
- package/src/{config.mjs → config.js} +6 -2
- package/src/{custom-error.mjs → custom-error.js} +1 -1
- package/src/data-set-to-attributes.js +13 -0
- package/src/{deserializer.mjs → deserializer.js} +3 -3
- package/src/destroy-error.js +7 -0
- package/src/devise.js +129 -0
- package/src/draggable-sort/controller.js +137 -0
- package/src/draggable-sort/index.jsx +108 -0
- package/src/draggable-sort/item.jsx +174 -0
- package/src/{error-logger.mjs → error-logger.js} +12 -7
- package/src/{error-messages.mjs → error-messages.js} +1 -0
- package/src/event-connection.jsx +1 -1
- package/src/event-emitter-listener.jsx +8 -27
- package/src/event-model-class.jsx +2 -4
- package/src/events.js +7 -0
- package/src/flash-message.js +70 -0
- package/src/form.jsx +91 -0
- package/src/history-expo.js +23 -0
- package/src/history-react-native.js +25 -0
- package/src/history.js +3 -0
- package/src/index.js +3 -0
- package/src/inputs/attachment.jsx +108 -0
- package/src/inputs/auto-submit.js +37 -0
- package/src/inputs/checkbox.jsx +125 -0
- package/src/inputs/checkboxes.jsx +116 -0
- package/src/inputs/id-for-component.js +15 -0
- package/src/inputs/input-wrapper.jsx +16 -0
- package/src/inputs/input.jsx +260 -0
- package/src/inputs/money.jsx +187 -0
- package/src/inputs/name-for-component.js +15 -0
- package/src/inputs/select.jsx +104 -0
- package/src/{key-value-store.mjs → key-value-store.js} +1 -1
- package/src/link.jsx +54 -9
- package/src/logger.js +38 -0
- package/src/modal.jsx +37 -0
- package/src/model-class-require.js +17 -0
- package/src/{model-events.mjs → model-events.js} +1 -1
- package/src/{model-name.mjs → model-name.js} +8 -8
- package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
- package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +5 -5
- package/src/{models-response-reader.mjs → models-response-reader.js} +3 -4
- package/src/models.js +7 -0
- package/src/{models.mjs.erb → models.js.erb} +6 -3
- package/src/{money-formatter.mjs → money-formatter.js} +5 -4
- package/src/{params.mjs → params.js} +17 -7
- package/src/{preloaded.mjs → preloaded.js} +2 -2
- package/src/resize-observer.jsx +10 -0
- package/src/result.js +13 -0
- package/src/router/route.jsx +246 -0
- package/src/router/switch.jsx +76 -0
- package/src/router.jsx +23 -21
- package/src/{routes-native.mjs → routes-native.js} +12 -6
- package/src/{routes.mjs → routes.js} +1 -1
- package/src/run-last.js +39 -0
- package/src/{serializer.mjs → serializer.js} +2 -2
- package/src/{services.mjs → services.js} +1 -1
- package/src/session-status-updater.js +172 -0
- package/src/{source-maps-loader.mjs → source-maps-loader.js} +54 -28
- package/src/super-admin/config-reader.jsx +93 -0
- package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +81 -0
- package/src/super-admin/edit-page/edit-attribute-content.jsx +57 -0
- package/src/super-admin/edit-page/edit-attribute-input.jsx +71 -0
- package/src/super-admin/edit-page/edit-attribute.jsx +81 -0
- package/src/super-admin/edit-page.jsx +117 -0
- package/src/super-admin/has-edit-config.js +15 -0
- package/src/super-admin/index-page.jsx +23 -0
- package/src/super-admin/index.jsx +197 -0
- package/src/super-admin/layout/header/index.jsx +144 -0
- package/src/super-admin/layout/header/style.scss +45 -0
- package/src/super-admin/layout/index.jsx +154 -0
- package/src/super-admin/layout/menu/index.jsx +171 -0
- package/src/super-admin/layout/menu/menu-content.jsx +43 -0
- package/src/super-admin/layout/menu/menu-item.jsx +70 -0
- package/src/super-admin/layout/menu/style.scss +11 -0
- package/src/super-admin/layout/no-access.jsx +26 -0
- package/src/super-admin/model-class-table.jsx +66 -0
- package/src/super-admin/models.js +11 -0
- package/src/super-admin/show-nav.jsx +44 -0
- package/src/super-admin/show-page/belongs-to-attribute-row.jsx +30 -0
- package/src/super-admin/show-page/index.jsx +141 -0
- package/src/super-admin/show-reflection-actions.jsx +49 -0
- package/src/super-admin/show-reflection-link.jsx +40 -0
- package/src/super-admin/show-reflection-page.jsx +47 -0
- package/src/super-admin/stylesheets/variables.scss +11 -0
- package/src/table/column-content.jsx +122 -0
- package/src/table/column-identifier.js +23 -0
- package/src/table/column-visible.js +7 -0
- package/src/table/components/column.jsx +19 -0
- package/src/table/components/flat-list.jsx +19 -0
- package/src/table/components/header.jsx +21 -0
- package/src/table/components/row.jsx +23 -0
- package/src/table/filters/attribute-element.jsx +47 -0
- package/src/table/filters/filter-form.jsx +407 -0
- package/src/table/filters/filter.jsx +70 -0
- package/src/table/filters/index.jsx +170 -0
- package/src/table/filters/load-search-modal.jsx +146 -0
- package/src/table/filters/reflection-element.jsx +38 -0
- package/src/table/filters/save-search-modal.jsx +74 -0
- package/src/table/filters/scope-element.jsx +44 -0
- package/src/table/header-column-content.jsx +55 -0
- package/src/table/header-column.jsx +129 -0
- package/src/table/header-select.jsx +73 -0
- package/src/table/model-callback-args.js +10 -0
- package/src/table/model-column.jsx +82 -0
- package/src/table/model-row.jsx +136 -0
- package/src/table/select-calculator.js +65 -0
- package/src/table/settings/column-row.jsx +93 -0
- package/src/table/settings/download-action.jsx +68 -0
- package/src/table/settings/index.jsx +65 -0
- package/src/table/table-settings.js +263 -0
- package/src/table/table.jsx +950 -0
- package/src/table/use-sorting.js +35 -0
- package/src/table/variables.scss +11 -0
- package/src/table/widths.jsx +87 -0
- package/src/table/worker-plugins-check-all-checkbox.jsx +112 -0
- package/src/table/worker-plugins-checkbox.jsx +104 -0
- package/src/translated-attributes.js +11 -0
- package/src/{translated-collections.mjs → translated-collections.js} +3 -2
- package/src/updated-attribute.jsx +1 -1
- package/src/url-encode.js +18 -0
- package/src/use-breakpoint.js +76 -0
- package/src/use-can-can.js +55 -0
- package/src/use-collection.js +280 -0
- package/src/use-created-event.js +55 -0
- package/src/use-current-user.js +88 -0
- package/src/use-destroyed-event.js +60 -0
- package/src/use-event-emitter.js +15 -0
- package/src/use-event-listener.js +19 -0
- package/src/use-input.js +157 -0
- package/src/use-model-event.js +60 -0
- package/src/use-model.js +189 -0
- package/src/use-resize-observer.js +24 -0
- package/src/use-router.jsx +128 -0
- package/src/use-screen-layout.js +49 -0
- package/src/use-updated-event.js +60 -0
- package/src/use-validation-errors.js +33 -0
- package/src/utils/card.jsx +49 -0
- package/src/utils/checkbox.jsx +80 -0
- package/src/utils/checkboxes.jsx +158 -0
- package/src/utils/default-style.jsx +25 -0
- package/src/utils/icon.jsx +21 -0
- package/src/utils/invalid-feedback.jsx +20 -0
- package/src/utils/modal.jsx +60 -0
- package/src/utils/text.jsx +16 -0
- package/src/{validation-error.mjs → validation-error.js} +9 -5
- package/src/{validation-errors.mjs → validation-errors.js} +15 -27
- package/src/with-api-maker.jsx +31 -0
- package/src/with-collection.jsx +17 -0
- package/src/with-current-user.jsx +7 -25
- package/src/with-model.jsx +16 -0
- package/src/with-router.jsx +7 -129
- package/__tests__/base-model.test.js +0 -71
- package/__tests__/cable-connection-pool.test.js +0 -227
- package/__tests__/cable-subscription-pool.test.js +0 -26
- package/__tests__/can-can.test.js +0 -34
- package/__tests__/collection.test.js +0 -51
- package/__tests__/custom-error.test.js +0 -13
- package/__tests__/model-name.test.js +0 -34
- package/__tests__/model-prop-type.test.js +0 -113
- package/__tests__/params.test.js +0 -40
- package/__tests__/routes-native.test.js +0 -103
- package/__tests__/routes.test.js +0 -46
- package/__tests__/serializer.test.js +0 -30
- package/__tests__/support/task.js +0 -27
- package/__tests__/support/user.js +0 -32
- package/index.js +0 -1
- package/jest.config.js +0 -4
- package/src/can-can-loader.jsx +0 -54
- package/src/channels-consumer.mjs +0 -3
- package/src/destroy-error.mjs +0 -7
- package/src/devise.mjs +0 -122
- package/src/event-created.jsx +0 -65
- package/src/event-destroyed.jsx +0 -29
- package/src/event-listener.jsx +0 -38
- package/src/event-updated.jsx +0 -74
- package/src/logger.mjs +0 -25
- package/src/model-class-require.mjs +0 -10
- package/src/model-load-wrapper.jsx +0 -116
- package/src/result.mjs +0 -29
- package/src/session-status-updater.mjs +0 -116
- package/webpack.config.js +0 -15
- /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
- /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
- /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
- /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
- /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import BaseComponent from "../base-component"
|
|
2
|
+
import ConfigReader from "./config-reader"
|
|
3
|
+
import {digg} from "diggerize"
|
|
4
|
+
import hasEditConfig from "./has-edit-config"
|
|
5
|
+
import * as inflection from "inflection"
|
|
6
|
+
import memo from "set-state-compare/src/memo"
|
|
7
|
+
import Params from "../params"
|
|
8
|
+
import PropTypes from "prop-types"
|
|
9
|
+
import React, {useMemo} from "react"
|
|
10
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
11
|
+
import Table from "../table/table"
|
|
12
|
+
import useCurrentUser from "../use-current-user"
|
|
13
|
+
|
|
14
|
+
export default memo(shapeComponent(class ApiMakerSuperAdminModelClassTable extends BaseComponent {
|
|
15
|
+
static propTypes = {
|
|
16
|
+
modelClass: PropTypes.func.isRequired
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
render() {
|
|
20
|
+
const {modelClass, ...restProps} = this.props
|
|
21
|
+
const currentUser = useCurrentUser()
|
|
22
|
+
const configReader = useMemo(() => ConfigReader.forModel(modelClass), [modelClass])
|
|
23
|
+
const {columns, select} = useMemo(() => configReader.tableColumns(), [modelClass])
|
|
24
|
+
const tableConfig = configReader.modelConfig?.table
|
|
25
|
+
const tableProps = {}
|
|
26
|
+
|
|
27
|
+
if (!columns) throw new Error("No columns given")
|
|
28
|
+
|
|
29
|
+
if (tableConfig?.query) tableProps.collection = tableConfig.query
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<Table
|
|
33
|
+
columns={columns}
|
|
34
|
+
currentUser={currentUser}
|
|
35
|
+
editModelPath={hasEditConfig(modelClass) ? this.tt.editModelPath : undefined}
|
|
36
|
+
modelClass={modelClass}
|
|
37
|
+
select={select}
|
|
38
|
+
viewModelPath={this.tt.viewModelPath}
|
|
39
|
+
workplace
|
|
40
|
+
{...tableProps}
|
|
41
|
+
{...restProps}
|
|
42
|
+
/>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
editModelPath = (args) => {
|
|
47
|
+
const argName = inflection.camelize(digg(this.p.modelClass.modelClassData(), "name"), true)
|
|
48
|
+
const model = digg(args, argName)
|
|
49
|
+
|
|
50
|
+
return Params.withParams({
|
|
51
|
+
model: this.p.modelClass.modelClassData().name,
|
|
52
|
+
model_id: model.primaryKey(),
|
|
53
|
+
mode: "edit"
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
viewModelPath = (args) => {
|
|
58
|
+
const argName = inflection.camelize(digg(this.p.modelClass.modelClassData(), "name"), true)
|
|
59
|
+
const model = digg(args, argName)
|
|
60
|
+
|
|
61
|
+
return Params.withParams({
|
|
62
|
+
model: this.p.modelClass.modelClassData().name,
|
|
63
|
+
model_id: model.primaryKey()
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
}))
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import BaseComponent from "../base-component"
|
|
2
|
+
import Link from "../link"
|
|
3
|
+
import PropTypes from "prop-types"
|
|
4
|
+
import PropTypesExact from "prop-types-exact"
|
|
5
|
+
import memo from "set-state-compare/src/memo"
|
|
6
|
+
import Params from "../params"
|
|
7
|
+
import React from "react"
|
|
8
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
9
|
+
import ShowReflectionLink from "./show-reflection-link"
|
|
10
|
+
import Text from "../utils/text"
|
|
11
|
+
import useI18n from "i18n-on-steroids/src/use-i18n"
|
|
12
|
+
import useQueryParams from "on-location-changed/build/use-query-params"
|
|
13
|
+
import {View} from "react-native"
|
|
14
|
+
|
|
15
|
+
export default memo(shapeComponent(class ApiMakerSuperAdminShowNav extends BaseComponent {
|
|
16
|
+
static propTypes = PropTypesExact({
|
|
17
|
+
model: PropTypes.object.isRequired,
|
|
18
|
+
modelClass: PropTypes.func.isRequired
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
render() {
|
|
22
|
+
const {t} = useI18n({namespace: "js.api_maker.suprt_admin.show_reflection_page"})
|
|
23
|
+
const {model, modelClass} = this.props
|
|
24
|
+
const queryParams = useQueryParams()
|
|
25
|
+
const reflections = modelClass.reflections()
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<View dataSet={{component: "super-admin--show-nav"}}>
|
|
29
|
+
<View>
|
|
30
|
+
<Link to={Params.withParams({model: modelClass.modelClassData().name, model_id: queryParams.model_id})}>
|
|
31
|
+
<Text>
|
|
32
|
+
{t(".general", {defaultValue: "General"})}
|
|
33
|
+
</Text>
|
|
34
|
+
</Link>
|
|
35
|
+
</View>
|
|
36
|
+
{model && reflections.filter((reflection) => reflection.macro() == "has_many").map((reflection) =>
|
|
37
|
+
<View key={reflection.name()}>
|
|
38
|
+
<ShowReflectionLink model={model} modelClass={modelClass} reflection={reflection} />
|
|
39
|
+
</View>
|
|
40
|
+
)}
|
|
41
|
+
</View>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
}))
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import AttributeRow from "../../bootstrap/attribute-row"
|
|
2
|
+
import BaseComponent from "../../base-component"
|
|
3
|
+
import * as inflection from "inflection"
|
|
4
|
+
import Link from "../../link"
|
|
5
|
+
import memo from "set-state-compare/src/memo"
|
|
6
|
+
import Params from "../../params"
|
|
7
|
+
import React from "react"
|
|
8
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
9
|
+
import Text from "../../utils/text"
|
|
10
|
+
|
|
11
|
+
export default memo(shapeComponent(class ApiMakerSuperAdminShowPageBelongsToAttributeRow extends BaseComponent {
|
|
12
|
+
render() {
|
|
13
|
+
const {model, modelClass, reflection} = this.props
|
|
14
|
+
const reflectionMethodName = inflection.camelize(reflection.name(), true)
|
|
15
|
+
const subModel = model[reflectionMethodName]()
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<AttributeRow label={modelClass.humanAttributeName(inflection.camelize(reflection.name(), true))}>
|
|
19
|
+
{subModel &&
|
|
20
|
+
<Link to={Params.withParams({model: subModel.modelClassData().name, model_id: subModel.primaryKey()})}>
|
|
21
|
+
<Text>
|
|
22
|
+
{subModel && "name" in subModel && subModel.name()}
|
|
23
|
+
{subModel && !("name" in subModel) && subModel?.id()}
|
|
24
|
+
</Text>
|
|
25
|
+
</Link>
|
|
26
|
+
}
|
|
27
|
+
</AttributeRow>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
}))
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import React, {useMemo} from "react"
|
|
2
|
+
import AttributeRow from "../../bootstrap/attribute-row"
|
|
3
|
+
import BaseComponent from "../../base-component"
|
|
4
|
+
import BelongsToAttributeRow from "./belongs-to-attribute-row"
|
|
5
|
+
import ConfigReader from "../config-reader"
|
|
6
|
+
import {digg} from "diggerize"
|
|
7
|
+
import memo from "set-state-compare/src/memo"
|
|
8
|
+
import * as inflection from "inflection"
|
|
9
|
+
import PropTypes from "prop-types"
|
|
10
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
11
|
+
import ShowNav from "../show-nav"
|
|
12
|
+
import useModel from "../../use-model"
|
|
13
|
+
import {View} from "react-native"
|
|
14
|
+
|
|
15
|
+
const AttributePresenter = memo(({attribute, model, modelArgs}) => {
|
|
16
|
+
const attributeRowProps = {
|
|
17
|
+
model
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (typeof attribute == "object") {
|
|
21
|
+
if (attribute.attribute) attributeRowProps.attribute = attribute.attribute
|
|
22
|
+
if (attribute.content) attributeRowProps.children = attribute.content(modelArgs)
|
|
23
|
+
if (attribute.label) attributeRowProps.label = attribute.label
|
|
24
|
+
} else if (attribute) {
|
|
25
|
+
attributeRowProps.attribute = attribute
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<AttributeRow {...attributeRowProps} />
|
|
30
|
+
)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
export default memo(shapeComponent(class ApiMakerSuperAdminShowPage extends BaseComponent {
|
|
34
|
+
static propTypes = {
|
|
35
|
+
modelClass: PropTypes.func.isRequired
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
setup() {
|
|
39
|
+
const {modelClass} = this.props
|
|
40
|
+
const configReader = useMemo(() => ConfigReader.forModel(modelClass), [modelClass])
|
|
41
|
+
const showConfig = configReader.modelConfig?.show
|
|
42
|
+
|
|
43
|
+
this.setInstance({configReader, showConfig})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
render() {
|
|
47
|
+
const {modelClass} = this.props
|
|
48
|
+
const {configReader, showConfig} = this.tt
|
|
49
|
+
const attributes = configReader.attributesToShow()
|
|
50
|
+
const extraContent = showConfig?.extraContent
|
|
51
|
+
const modelClassName = modelClass.modelClassData().name
|
|
52
|
+
const primaryKeyName = modelClass.primaryKey()
|
|
53
|
+
const preload = []
|
|
54
|
+
const select = showConfig?.extraSelect || {}
|
|
55
|
+
const modelClassSelect = select[modelClassName] || []
|
|
56
|
+
|
|
57
|
+
if (showConfig?.preload) {
|
|
58
|
+
for (const showConfigPreload of showConfig.preload) {
|
|
59
|
+
preload.push(showConfigPreload)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!(modelClassName in select)) select[modelClassName] = modelClassSelect
|
|
64
|
+
if (!modelClassSelect.includes(primaryKeyName)) modelClassSelect.push(primaryKeyName)
|
|
65
|
+
|
|
66
|
+
// Select all attributes selected by default because they will be shown by default
|
|
67
|
+
for (const attribute of modelClass.attributes()) {
|
|
68
|
+
if ((attribute.isSelectedByDefault() || attribute.name() == "name") && !modelClassSelect.includes(attribute.name())) {
|
|
69
|
+
modelClassSelect.push(attribute.name())
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
for (const reflection of modelClass.reflections()) {
|
|
74
|
+
if (reflection.macro() == "belongs_to") {
|
|
75
|
+
const reflectionModelClass = reflection.modelClass()
|
|
76
|
+
const reflectionModelClassName = reflectionModelClass.modelClassData().name
|
|
77
|
+
const reflectionModelClassAttributes = reflectionModelClass.attributes()
|
|
78
|
+
const nameAttribute = reflectionModelClassAttributes.find((attribute) => attribute.name() == "name")
|
|
79
|
+
|
|
80
|
+
preload.push(inflection.underscore(reflection.name()))
|
|
81
|
+
|
|
82
|
+
if (!(reflectionModelClassName in select)) select[reflectionModelClassName] = []
|
|
83
|
+
if (!select[reflectionModelClassName].includes("id")) select[reflectionModelClassName].push("id")
|
|
84
|
+
if (nameAttribute && !select[reflectionModelClassName].includes("name")) select[reflectionModelClassName].push("name")
|
|
85
|
+
|
|
86
|
+
// The foreign key is needed to look up any belongs-to-relationships
|
|
87
|
+
if (!modelClassSelect.includes(reflection.foreignKey())) {
|
|
88
|
+
const foreignKeyAttribute = reflectionModelClassAttributes.find((attribute) => attribute.name() == reflection.foreignKey())
|
|
89
|
+
|
|
90
|
+
if (!foreignKeyAttribute) {
|
|
91
|
+
throw new Error(`${reflection.foreignKey()} wasn't defined as an attribute on ${modelClassName}`)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
modelClassSelect.push(reflection.foreignKey())
|
|
95
|
+
}
|
|
96
|
+
} else if (reflection.macro() == "has_one") {
|
|
97
|
+
const reflectionModelClass = reflection.modelClass()
|
|
98
|
+
const reflectionModelClassName = reflectionModelClass.modelClassData().name
|
|
99
|
+
const reflectionModelClassAttributes = reflectionModelClass.attributes()
|
|
100
|
+
const nameAttribute = reflectionModelClassAttributes.find((attribute) => attribute.name() == "name")
|
|
101
|
+
|
|
102
|
+
preload.push(inflection.underscore(reflection.name()))
|
|
103
|
+
|
|
104
|
+
if (!(reflectionModelClassName in select)) select[reflectionModelClassName] = []
|
|
105
|
+
if (!select[reflectionModelClassName].includes("id")) select[reflectionModelClassName].push("id")
|
|
106
|
+
if (nameAttribute && !select[reflectionModelClassName].includes("name")) select[reflectionModelClassName].push("name")
|
|
107
|
+
|
|
108
|
+
// The foreign key is needed to look up any has-one-relationships
|
|
109
|
+
if (!modelClassSelect.includes(reflection.foreignKey()) && !select[reflectionModelClassName].includes(reflection.foreignKey()) && !reflection.through()) {
|
|
110
|
+
select[reflectionModelClassName].push(reflection.foreignKey())
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const useModelResult = useModel(modelClass, {
|
|
116
|
+
loadByQueryParam: ({queryParams}) => queryParams.model_id,
|
|
117
|
+
preload,
|
|
118
|
+
select
|
|
119
|
+
})
|
|
120
|
+
const camelizedLower = digg(modelClass.modelClassData(), "camelizedLower")
|
|
121
|
+
const model = digg(useModelResult, camelizedLower)
|
|
122
|
+
const modelArgs = {}
|
|
123
|
+
|
|
124
|
+
modelArgs[inflection.camelize(modelClass.modelClassData().name, true)] = model
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<View dataSet={{component: "super-admin--show-page"}}>
|
|
128
|
+
{model &&
|
|
129
|
+
<ShowNav model={model} modelClass={modelClass} />
|
|
130
|
+
}
|
|
131
|
+
{attributes && model && attributes.map((attribute) =>
|
|
132
|
+
<AttributePresenter attribute={attribute} key={attribute.key || attribute.attribute || attribute} modelArgs={modelArgs} model={model} />
|
|
133
|
+
)}
|
|
134
|
+
{model && modelClass.reflections().filter((reflection) => reflection.macro() == "belongs_to" || reflection.macro() == "has_one").map((reflection) =>
|
|
135
|
+
<BelongsToAttributeRow key={reflection.name()} model={model} modelClass={modelClass} reflection={reflection} />
|
|
136
|
+
)}
|
|
137
|
+
{model && extraContent && extraContent(modelArgs)}
|
|
138
|
+
</View>
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
}))
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import BaseComponent from "../base-component"
|
|
2
|
+
import {digg} from "diggerize"
|
|
3
|
+
import memo from "set-state-compare/src/memo"
|
|
4
|
+
import React, {useMemo} from "react"
|
|
5
|
+
import PropTypes from "prop-types"
|
|
6
|
+
import propTypesExact from "prop-types-exact"
|
|
7
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
8
|
+
|
|
9
|
+
export default memo(shapeComponent(class SuperAdminShowReflectionActions extends BaseComponent {
|
|
10
|
+
static propTypes = propTypesExact({
|
|
11
|
+
model: PropTypes.object,
|
|
12
|
+
modelClass: PropTypes.func,
|
|
13
|
+
reflectionName: PropTypes.string
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
setup() {
|
|
17
|
+
const {modelClass, reflectionName} = this.p
|
|
18
|
+
|
|
19
|
+
this.reflection = useMemo(() => modelClass.reflections().find((reflection) => reflection.name() == reflectionName), [modelClass, reflectionName])
|
|
20
|
+
this.canCan = useCanCan(() => [[this.reflection.modelClass(), ["new"]]])
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
render() {
|
|
24
|
+
const {canCan, reflection} = this.tt
|
|
25
|
+
const {model} = this.p
|
|
26
|
+
const modelClassName = digg(reflection, "reflectionData", "className")
|
|
27
|
+
const modelData = {}
|
|
28
|
+
const dataParamName = inflection.singularize(reflection.reflectionData.collectionName)
|
|
29
|
+
|
|
30
|
+
modelData[reflection.foreignKey()] = model?.id()
|
|
31
|
+
|
|
32
|
+
const linkParams = {
|
|
33
|
+
model: modelClassName,
|
|
34
|
+
mode: "new"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
linkParams[dataParamName] = modelData
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<>
|
|
41
|
+
{canCan?.can("new", reflection.modelClass()) &&
|
|
42
|
+
<Link dataSet={{class: "create-new-model-link"}} to={Params.withParams(linkParams)}>
|
|
43
|
+
Create new
|
|
44
|
+
</Link>
|
|
45
|
+
}
|
|
46
|
+
</>
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
}))
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import BaseComponent from "../base-component"
|
|
2
|
+
import {digg} from "diggerize"
|
|
3
|
+
import Link from "../link"
|
|
4
|
+
import memo from "set-state-compare/src/memo"
|
|
5
|
+
import Params from "../params"
|
|
6
|
+
import React from "react"
|
|
7
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
8
|
+
import Text from "../utils/text"
|
|
9
|
+
import {useMemo} from "react"
|
|
10
|
+
|
|
11
|
+
export default memo(shapeComponent(class ApiMakerSuperAdminShowReflectionLink extends BaseComponent {
|
|
12
|
+
setup() {
|
|
13
|
+
this.useStates({count: undefined})
|
|
14
|
+
|
|
15
|
+
useMemo(() => {
|
|
16
|
+
this.countRelationship()
|
|
17
|
+
}, [])
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
countRelationship = async () => {
|
|
21
|
+
const {model, reflection} = this.p
|
|
22
|
+
const query = model[reflection.name()]()
|
|
23
|
+
const count = await query.ransack().count()
|
|
24
|
+
|
|
25
|
+
this.setState({count})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
render() {
|
|
29
|
+
const {model, modelClass, reflection} = this.p
|
|
30
|
+
const {count} = this.s
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Link to={Params.withParams({model: digg(modelClass.modelClassData(), "name"), model_id: model.primaryKey(), model_reflection: reflection.name()})}>
|
|
34
|
+
<Text>
|
|
35
|
+
{modelClass.humanAttributeName(reflection.name())} ({count})
|
|
36
|
+
</Text>
|
|
37
|
+
</Link>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
}))
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import BaseComponent from "../base-component"
|
|
2
|
+
import {digg} from "diggerize"
|
|
3
|
+
import PropTypes from "prop-types"
|
|
4
|
+
import propTypesExact from "prop-types-exact"
|
|
5
|
+
import memo from "set-state-compare/src/memo"
|
|
6
|
+
import ModelClassTable from "./model-class-table"
|
|
7
|
+
import React from "react"
|
|
8
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
9
|
+
import ShowNav from "./show-nav"
|
|
10
|
+
import useQueryParams from "on-location-changed/build/use-query-params"
|
|
11
|
+
import {View} from "react-native"
|
|
12
|
+
|
|
13
|
+
export default memo(shapeComponent(class ApiMakerSuperAdminShowReflectionPage extends BaseComponent {
|
|
14
|
+
static propTypes = propTypesExact({
|
|
15
|
+
modelClass: PropTypes.func.isRequired,
|
|
16
|
+
modelId: PropTypes.string.isRequired
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
render() {
|
|
20
|
+
const {modelClass} = this.p
|
|
21
|
+
const queryParams = useQueryParams()
|
|
22
|
+
const camelizedLower = digg(modelClass.modelClassData(), "camelizedLower")
|
|
23
|
+
const useModelResult = useModel(modelClass, {loadByQueryParam: ({queryParams}) => digg(queryParams, "model_id")})
|
|
24
|
+
const model = digg(useModelResult, camelizedLower)
|
|
25
|
+
const reflections = modelClass.reflections()
|
|
26
|
+
const reflection = reflections.find((reflectionI) => reflectionI.name() == queryParams.model_reflection)
|
|
27
|
+
const reflectionModelClass = reflection.modelClass()
|
|
28
|
+
let collection
|
|
29
|
+
|
|
30
|
+
if (model) collection = model[reflection.name()]()
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<View dataSet={{component: "super-admin--show-page"}}>
|
|
34
|
+
{model &&
|
|
35
|
+
<ShowNav model={model} modelClass={modelClass} />
|
|
36
|
+
}
|
|
37
|
+
{collection &&
|
|
38
|
+
<ModelClassTable
|
|
39
|
+
collection={collection}
|
|
40
|
+
key={reflectionModelClass.modelName().human()}
|
|
41
|
+
modelClass={reflectionModelClass}
|
|
42
|
+
/>
|
|
43
|
+
}
|
|
44
|
+
</View>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
}))
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {digs} from "diggerize"
|
|
2
|
+
import * as inflection from "inflection"
|
|
3
|
+
import modelCallbackArgs from "./model-callback-args"
|
|
4
|
+
import MoneyFormatter from "../money-formatter"
|
|
5
|
+
import React from "react"
|
|
6
|
+
import Text from "../utils/text"
|
|
7
|
+
|
|
8
|
+
export default class ApiMakerTableColumnContent {
|
|
9
|
+
constructor({column, l, mode = "react-native", model, t, table}) {
|
|
10
|
+
this.column = column
|
|
11
|
+
this.l = l
|
|
12
|
+
this.mode = mode
|
|
13
|
+
this.model = model
|
|
14
|
+
this.t = t
|
|
15
|
+
this.table = table
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
columnContentFromContentArg() {
|
|
19
|
+
const args = modelCallbackArgs(this.table, this.model)
|
|
20
|
+
|
|
21
|
+
args.mode = this.mode
|
|
22
|
+
|
|
23
|
+
const value = this.column.content(args)
|
|
24
|
+
|
|
25
|
+
return this.presentColumnValue(value)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
columnsContentFromAttributeAndPath() {
|
|
29
|
+
const {attribute: attributeName} = digs(this.column, "attribute")
|
|
30
|
+
const attributeNameUnderscore = inflection.underscore(attributeName)
|
|
31
|
+
const path = this.column.path || []
|
|
32
|
+
let value
|
|
33
|
+
let currentModel = this.model
|
|
34
|
+
|
|
35
|
+
if (path.length > 0) {
|
|
36
|
+
for (const pathPart of path) {
|
|
37
|
+
currentModel = currentModel[pathPart]()
|
|
38
|
+
if (!currentModel) return
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!(attributeName in currentModel)) {
|
|
43
|
+
throw new Error(`${currentModel.constructor.modelName().human()} doesn't respond to ${attributeName}`)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (currentModel.isAttributeLoaded(attributeName)) {
|
|
47
|
+
value = currentModel[attributeName]()
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const attribute = currentModel.constructor.attributes().find((attribute) => attribute.name() == attributeNameUnderscore)
|
|
51
|
+
const modelColumn = attribute?.getColumn()
|
|
52
|
+
|
|
53
|
+
if (modelColumn?.getType() == "date" && value) {
|
|
54
|
+
const contentText = this.presentDateTime({apiMakerType: "date", value})
|
|
55
|
+
|
|
56
|
+
if (this.mode == "html") {
|
|
57
|
+
return contentText
|
|
58
|
+
} else {
|
|
59
|
+
return (
|
|
60
|
+
<Text>{contentText}</Text>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return this.presentColumnValue(value)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
content() {
|
|
69
|
+
if (this.column.content) {
|
|
70
|
+
return this.columnContentFromContentArg()
|
|
71
|
+
} else if (!this.column.content && this.column.attribute) {
|
|
72
|
+
return this.columnsContentFromAttributeAndPath()
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
presentColumnValue(value) {
|
|
77
|
+
let contentText
|
|
78
|
+
|
|
79
|
+
if (value instanceof Date) {
|
|
80
|
+
contentText = this.presentDateTime({value})
|
|
81
|
+
} else if (MoneyFormatter.isMoney(value)) {
|
|
82
|
+
contentText = MoneyFormatter.format(value)
|
|
83
|
+
} else if (typeof value == "boolean") {
|
|
84
|
+
if (value) {
|
|
85
|
+
contentText = this.t("js.shared.yes", {defaultValue: "Yes"})
|
|
86
|
+
} else {
|
|
87
|
+
contentText = this.t("js.shared.no", {defaultValue: "No"})
|
|
88
|
+
}
|
|
89
|
+
} else if (Array.isArray(value)) {
|
|
90
|
+
contentText = value
|
|
91
|
+
.map((valuePart) => this.presentColumnValue(valuePart))
|
|
92
|
+
.filter((valuePart) => Boolean(valuePart))
|
|
93
|
+
.join(", ")
|
|
94
|
+
|
|
95
|
+
} else if (typeof value == "string") {
|
|
96
|
+
contentText = value
|
|
97
|
+
} else {
|
|
98
|
+
// Its a React node - just return it and trust the provider to be HTML compatible.
|
|
99
|
+
return value
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (this.mode == "html") {
|
|
103
|
+
return contentText
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return <Text>{contentText}</Text>
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
presentDateTime({apiMakerType, value}) {
|
|
110
|
+
if (!apiMakerType || apiMakerType == "time") {
|
|
111
|
+
const dateTimeFormatName = this.table.props.defaultDateTimeFormatName || "time.formats.default"
|
|
112
|
+
|
|
113
|
+
return this.l(dateTimeFormatName, value)
|
|
114
|
+
} else if (apiMakerType == "date") {
|
|
115
|
+
const dateFormatName = this.table.props.defaultDateFormatName || "date.formats.default"
|
|
116
|
+
|
|
117
|
+
return this.l(dateFormatName, value)
|
|
118
|
+
} else {
|
|
119
|
+
throw new Error(`Unhandled type: ${apiMakerType}`)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export default function columnIdentifier(column) {
|
|
2
|
+
if ("identifier" in column) return column.identifier
|
|
3
|
+
|
|
4
|
+
const parts = []
|
|
5
|
+
|
|
6
|
+
if ("path" in column) {
|
|
7
|
+
for (const pathPart of column.path) {
|
|
8
|
+
parts.push(pathPart)
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if ("attribute" in column) {
|
|
13
|
+
parts.push(`attribute-${column.attribute}`)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if ("sortKey" in column) {
|
|
17
|
+
parts.push(`sort-key-${column.sortKey}`)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (parts.length == 0) throw new Error(`Couldn't figure out the identifier for that column: ${JSON.stringify(column)}`)
|
|
21
|
+
|
|
22
|
+
return parts.join("--")
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import BaseComponent from "../../base-component"
|
|
2
|
+
import memo from "set-state-compare/src/memo"
|
|
3
|
+
import React from "react"
|
|
4
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
5
|
+
import {Animated, View} from "react-native"
|
|
6
|
+
|
|
7
|
+
export default memo(shapeComponent(class SharedTableColumn extends BaseComponent {
|
|
8
|
+
render() {
|
|
9
|
+
const {dataSet, ...restProps} = this.props
|
|
10
|
+
const actualDataSet = Object.assign(
|
|
11
|
+
{component: "api-maker/table/components/column"},
|
|
12
|
+
dataSet
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<Animated.View dataSet={actualDataSet} {...restProps} />
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
}))
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import BaseComponent from "../../base-component"
|
|
2
|
+
import {FlatList} from "react-native"
|
|
3
|
+
import memo from "set-state-compare/src/memo"
|
|
4
|
+
import React from "react"
|
|
5
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
6
|
+
|
|
7
|
+
export default memo(shapeComponent(class SharedTagble extends BaseComponent {
|
|
8
|
+
render() {
|
|
9
|
+
const {style, ...restProps} = this.props
|
|
10
|
+
const actualStyle = Object.assign(
|
|
11
|
+
{width: "100%"},
|
|
12
|
+
style
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<FlatList style={actualStyle} {...restProps} />
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
}))
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import BaseComponent from "../../base-component"
|
|
2
|
+
import classNames from "classnames"
|
|
3
|
+
import memo from "set-state-compare/src/memo"
|
|
4
|
+
import React from "react"
|
|
5
|
+
import {shapeComponent} from "set-state-compare/src/shape-component"
|
|
6
|
+
import {Animated} from "react-native"
|
|
7
|
+
|
|
8
|
+
export default memo(shapeComponent(class SharedTableHeader extends BaseComponent {
|
|
9
|
+
render() {
|
|
10
|
+
const {dataSet, ...restProps} = this.props
|
|
11
|
+
const {component, ...restDataSet} = dataSet || {}
|
|
12
|
+
const actualDataSet = Object.assign(
|
|
13
|
+
{component: classNames("api-maker/table/header", component)},
|
|
14
|
+
restDataSet
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<Animated.View dataSet={actualDataSet} {...restProps} />
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
}))
|