ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
142 lines • 5.99 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReferenceArrayInputBase = void 0;
var React = __importStar(require("react"));
var useReferenceArrayInputController_1 = require("./useReferenceArrayInputController");
var ResourceContextProvider_1 = require("../../core/ResourceContextProvider");
var ChoicesContextProvider_1 = require("../../form/choices/ChoicesContextProvider");
/**
* An Input component for fields containing a list of references to another resource.
* Useful for 'hasMany' relationship.
*
* @example
* The post object has many tags, so the post resource looks like:
* {
* id: 1234,
* tag_ids: [ "1", "23", "4" ]
* }
*
* ReferenceArrayInputBase component fetches the current resources (using
* `dataProvider.getMany()`) as well as possible resources (using
* `dataProvider.getList()`) in the reference endpoint. It then
* delegates rendering to its child component, to which it makes the possible
* choices available through the ChoicesContext.
*
* Use it with a selector component as child, like `<SelectArrayInput>`
* or <CheckboxGroupInput>.
*
* @example
* export const PostEdit = () => (
* <Edit>
* <SimpleForm>
* <ReferenceArrayInputBase source="tag_ids" reference="tags">
* <SelectArrayInput optionText="name" />
* </ReferenceArrayInputBase>
* </SimpleForm>
* </Edit>
* );
*
* By default, restricts the possible values to 25. You can extend this limit
* by setting the `perPage` prop.
*
* @example
* <ReferenceArrayInputBase
* source="tag_ids"
* reference="tags"
* perPage={100}>
* <SelectArrayInput optionText="name" />
* </ReferenceArrayInputBase>
*
* By default, orders the possible values by id desc. You can change this order
* by setting the `sort` prop (an object with `field` and `order` properties).
*
* @example
* <ReferenceArrayInputBase
* source="tag_ids"
* reference="tags"
* sort={{ field: 'name', order: 'ASC' }}>
* <SelectArrayInput optionText="name" />
* </ReferenceArrayInputBase>
*
* Also, you can filter the query used to populate the possible values. Use the
* `filter` prop for that.
*
* @example
* <ReferenceArrayInputBase
* source="tag_ids"
* reference="tags"
* filter={{ is_public: true }}>
* <SelectArrayInput optionText="name" />
* </ReferenceArrayInputBase>
*
* The enclosed component may filter results. ReferenceArrayInputBase create a ChoicesContext which provides
* a `setFilters` function. You can call this function to filter the results.
*/
var ReferenceArrayInputBase = function (props) {
var children = props.children, _a = props.filter, filter = _a === void 0 ? defaultFilter : _a, offline = props.offline, reference = props.reference, render = props.render, sort = props.sort;
if (children && React.Children.count(children) !== 1) {
throw new Error('<ReferenceArrayInputBase> only accepts a single child (like <AutocompleteArrayInput>)');
}
if (!render && !children) {
throw new Error("<ReferenceArrayInputBase> requires either a 'render' prop or 'children' prop");
}
var controllerProps = (0, useReferenceArrayInputController_1.useReferenceArrayInputController)(__assign(__assign({}, props), { sort: sort, filter: filter }));
var isPaused = controllerProps.isPaused, isPending = controllerProps.isPending;
// isPending is true: there's no cached data and no query attempt was finished yet
// isPaused is true: the query was paused (e.g. due to a network issue)
// Both true: we're offline and have no data to show
var shouldRenderOffline = isPaused && isPending && offline !== undefined && offline !== false;
return (React.createElement(ResourceContextProvider_1.ResourceContextProvider, { value: reference },
React.createElement(ChoicesContextProvider_1.ChoicesContextProvider, { value: controllerProps }, shouldRenderOffline
? offline
: render
? render(controllerProps)
: children)));
};
exports.ReferenceArrayInputBase = ReferenceArrayInputBase;
var defaultFilter = {};
//# sourceMappingURL=ReferenceArrayInputBase.js.map