UNPKG

react-hook-core

Version:
583 lines (582 loc) 17.9 kB
"use strict" 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) } Object.defineProperty(exports, "__esModule", { value: true }) var react_1 = require("react") var react_router_1 = require("react-router") var common_1 = require("./common") var core_1 = require("./core") var edit_1 = require("./edit") var formutil_1 = require("./formutil") var reflect_1 = require("./reflect") var state_1 = require("./state") var update_1 = require("./update") function buildKeys(attributes) { if (!attributes) { return [] } var ks = Object.keys(attributes) var ps = [] for (var _i = 0, ks_1 = ks; _i < ks_1.length; _i++) { var k = ks_1[_i] var attr = attributes[k] if (attr.key === true) { ps.push(k) } } return ps } exports.buildKeys = buildKeys function buildId(p, keys) { if (!keys || keys.length === 0 || keys.length === 1) { if (keys && keys.length === 1) { if (p[keys[0]]) { return p[keys[0]] } } return p["id"] } var id = {} for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { var key = keys_1[_i] var v = p[key] if (!v) { v = p[key] if (!v) { return null } } id[key] = v } return id } exports.buildId = buildId function build(attributes, name) { if (!attributes) { return undefined } if (core_1.resources.cache && name && name.length > 0) { var meta = core_1.resources._cache[name] if (!meta) { meta = buildMetaModel(attributes) core_1.resources._cache[name] = meta } return meta } else { return buildMetaModel(attributes) } } exports.build = build function buildMetaModel(attributes) { if (!attributes) { return {} } var md = {} var pks = new Array() var keys = Object.keys(attributes) for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) { var key = keys_2[_i] var attr = attributes[key] if (attr) { if (attr.version) { md.version = key } if (attr.key === true) { pks.push(key) } } } md.keys = pks return md } function handleVersion(obj, version) { if (obj && version && version.length > 0) { var v = obj[version] if (v && typeof v === "number") { obj[version] = v + 1 } else { obj[version] = 1 } } } exports.handleVersion = handleVersion exports.useEdit = function (refForm, initialState, service, resource, p2, p) { var params = react_router_1.useParams() var baseProps = exports.useCoreEdit(refForm, initialState, service, resource, p2, p) react_1.useEffect(function () { if (refForm) { var registerEvents = p2.ui ? p2.ui.registerEvents : undefined common_1.initForm(baseProps.refForm.current, registerEvents) } var n = baseProps.getModelName(refForm.current) var obj = {} obj[n] = baseProps.createModel() baseProps.setState(obj) var keys if (p && !p.keys && service && service.metadata) { var metadata = p.metadata ? p.metadata : service.metadata() if (metadata) { var meta = build(metadata) keys = p.keys ? p.keys : meta ? meta.keys : undefined var version = p.version ? p.version : meta ? meta.version : undefined p.keys = keys p.version = version } } var id = buildId(params, keys) if (p && p.initialize) { p.initialize(id, baseProps.load, baseProps.setState, p.callback) } else { try { baseProps.load(id, p ? p.callback : undefined) } catch (error) { p2.showError(error) common_1.hideLoading(p2.loading) } } }, []) return __assign({}, baseProps) } exports.useEditProps = function (props, refForm, initialState, service, resource, p2, p) { var params = react_router_1.useParams() var baseProps = exports.useCoreEdit(refForm, initialState, service, resource, p2, p, props) react_1.useEffect(function () { if (refForm) { var registerEvents = p2.ui ? p2.ui.registerEvents : undefined common_1.initForm(baseProps.refForm.current, registerEvents) } var n = baseProps.getModelName(refForm.current) var obj = {} obj[n] = baseProps.createModel() baseProps.setState(obj) var keys if (p && !p.keys && service && service.metadata) { var metadata = p.metadata ? p.metadata : service.metadata() if (metadata) { var meta = build(metadata) keys = p.keys ? p.keys : meta ? meta.keys : undefined var version = p.version ? p.version : meta ? meta.version : undefined p.keys = keys p.version = version } } var id = buildId(params, keys) if (p && p.initialize) { p.initialize(id, baseProps.load, baseProps.setState, p.callback) } else { baseProps.load(id, p ? p.callback : undefined) } }, []) return __assign({}, baseProps) } exports.useEditOneProps = function (resource, p) { return exports.useEditProps(p.props, p.refForm, p.initialState, p.service, resource, p, p) } exports.useEditOne = function (resource, p) { return exports.useEdit(p.refForm, p.initialState, p.service, resource, p, p) } exports.useCoreEdit = function (refForm, initialState, service, resource, p1, p, props) { var navigate = react_router_1.useNavigate() var _a = react_1.useState(), running = _a[0], setRunning = _a[1] var getModelName = function (f) { if (p && p.name && p.name.length > 0) { return p.name } return update_1.getModelName(f) } var baseProps = update_1.useUpdate(initialState, getModelName, p1.getLocale) var state = baseProps.state, setState = baseProps.setState var _b = update_1.useMergeState({ newMode: false, setBack: false, readOnly: p ? p.readOnly : undefined, originalModel: undefined, }), flag = _b[0], setFlag = _b[1] var showModel = function (model) { var n = getModelName(refForm.current) var objSet = {} objSet[n] = model setState(objSet) if (p && p.readOnly) { var f = refForm.current formutil_1.setReadOnly(f) } } var resetState = function (newMode, model, originalModel) { setFlag({ newMode: newMode, originalModel: originalModel }) showModel(model) } var _handleNotFound = function (form) { if (form) { formutil_1.setReadOnly(form) } p1.showError( resource.error_404, function () { return window.history.back }, resource.error, ) } var handleNotFound = p && p.handleNotFound ? p.handleNotFound : _handleNotFound var _getModel = function () { var n = getModelName(refForm.current) if (props) { return props[n] || state[n] } else { return state[n] } } var getModel = p && p.getModel ? p.getModel : _getModel var back = function (event) { if (event) { event.preventDefault() } if (flag.newMode === true) { navigate(-1) } else { var obj = getModel() var diffObj = reflect_1.makeDiff(flag.originalModel, obj) var objKeys = Object.keys(diffObj) if (objKeys.length === 0) { navigate(-1) } else { p1.confirm( resource.msg_confirm_back, function () { navigate(-1) }, resource.confirm, resource.no, resource.yes, ) } } } var _createModel = function () { var metadata = p && p.metadata ? p.metadata : service.metadata ? service.metadata() : undefined if (metadata) { var obj = edit_1.createModel(metadata) return obj } else { var obj = {} return obj } } var createModel = p && p.createModel ? p.createModel : _createModel var create = function (event) { event.preventDefault() var obj = createModel() resetState(true, obj, undefined) var u = p1.ui if (u) { setTimeout(function () { u.removeFormError(refForm.current) }, 100) } } var _onSave = function (isBack) { if (p && p.readOnly) { if (flag.newMode === true) { p1.showError(resource.error_permission_add, undefined, resource.error_permission) } else { p1.showError(resource.error_permission_edit, undefined, resource.error_permission) } } else { if (running === true) { return } var obj_1 = getModel() var metadata = p && p.metadata ? p.metadata : service.metadata ? service.metadata() : undefined var keys = void 0 var version_1 if (p && metadata && (!p.keys || !p.version)) { var meta = build(metadata) keys = p.keys ? p.keys : meta ? meta.keys : undefined version_1 = p.version ? p.version : meta ? meta.version : undefined } if (flag.newMode) { validate(obj_1, function () { p1.confirm( resource.msg_confirm_save, function () { doSave(obj_1, undefined, version_1, isBack) }, resource.confirm, resource.no, resource.yes, ) }) } else { var diffObj_1 = reflect_1.makeDiff(flag.originalModel, obj_1, keys, version_1) var objKeys = Object.keys(diffObj_1) if (objKeys.length === 0) { p1.showMessage(resource.msg_no_change) } else { validate(obj_1, function () { p1.confirm( resource.msg_confirm_save, function () { doSave(obj_1, diffObj_1, version_1, isBack) }, resource.confirm, resource.no, resource.yes, ) }) } } } } var onSave = p && p.onSave ? p.onSave : _onSave var save = function (event) { event.preventDefault() event.persist() onSave() } var _validate = function (obj, callback) { if (p1.ui) { var valid = p1.ui.validateForm(refForm.current, state_1.localeOf(undefined, p1.getLocale)) if (valid) { callback(obj) } } else { callback(obj) } } var validate = p && p.validate ? p.validate : _validate var _succeed = function (msg, origin, version, isBack, model) { if (model) { setFlag({ newMode: false }) if (model && flag.setBack === true) { resetState(false, model, reflect_1.clone(model)) } else { handleVersion(origin, version) } } else { handleVersion(origin, version) } p1.showMessage(msg) if (isBack) { back(undefined) } } var succeed = p && p.succeed ? p.succeed : _succeed var _fail = function (result) { var f = refForm.current var u = p1.ui if (u && f) { var unmappedErrors = u.showFormError(f, result) formutil_1.focusFirstError(f) if (unmappedErrors && unmappedErrors.length > 0) { var t = resource.error if (p1.ui && p1.ui.buildErrorMessage) { var msg = p1.ui.buildErrorMessage(unmappedErrors) p1.showError(msg, undefined, t) } else { p1.showError(unmappedErrors[0].field + " " + unmappedErrors[0].code + " " + unmappedErrors[0].message, undefined, t) } } } else { var t = resource.error if (result.length > 0) { p1.showError(result[0].field + " " + result[0].code + " " + result[0].message, undefined, t) } else { p1.showError(t, undefined, t) } } } var fail = p && p.fail ? p.fail : _fail var _handleError = function (err) { if (err) { setRunning(false) common_1.hideLoading(p1.loading) var errHeader = resource.error var errMsg = resource.error_internal var data = err && err.response ? err.response : err if (data.status === 400) { var errMsg_1 = resource.error_400 p1.showError(errMsg_1, undefined, errHeader) } else { p1.showError(errMsg, undefined, errHeader) } } } var handleError = p && p.handleError ? p.handleError : _handleError var _postSave = function (r, origin, version, isPatch, backOnSave) { setRunning(false) common_1.hideLoading(p1.loading) var x = r var successMsg = resource.msg_save_success var newMod = flag.newMode if (Array.isArray(x)) { fail(x) } else if (!isNaN(x)) { if (x > 0) { succeed(successMsg, origin, version, backOnSave) } else { if (newMod && x <= 0) { handleDuplicateKey() } else if (!newMod && x === 0) { handleNotFound() } else { var title = resource.error var err = resource.error_version p1.showError(err, undefined, title) } } } else { var result = r if (isPatch) { var keys = Object.keys(result) var a = origin for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) { var k = keys_3[_i] a[k] = result[k] } succeed(successMsg, a, undefined, backOnSave, a) } else { succeed(successMsg, origin, version, backOnSave, r) } p1.showMessage(successMsg) } } var postSave = p && p.postSave ? p.postSave : _postSave var _handleDuplicateKey = function (result) { p1.showError(resource.error_duplicate_key, undefined, resource.error) } var handleDuplicateKey = p && p.handleDuplicateKey ? p.handleDuplicateKey : _handleDuplicateKey var _doSave = function (obj, body, version, isBack) { setRunning(true) common_1.showLoading(p1.loading) var isBackO = isBack != null && isBack !== undefined ? isBack : false var patchable = p ? p.patchable : true if (flag.newMode === false) { if (service.patch && patchable !== false && body && Object.keys(body).length > 0) { service .patch(body) .then(function (res) { postSave(res, obj, version, true, isBackO) }) .catch(handleError) } else { service .update(obj) .then(function (res) { return postSave(res, obj, version, false, isBackO) }) .catch(handleError) } } else { service .create(obj) .then(function (res) { return postSave(res, obj, version, false, isBackO) }) .catch(handleError) } } var doSave = p && p.doSave ? p.doSave : _doSave var _load = function (_id, callback) { var id = _id if (id != null && id !== "") { setRunning(true) common_1.showLoading(p1.loading) service .load(id) .then(function (obj) { if (!obj) { handleNotFound(refForm.current) } else { setFlag({ newMode: false, originalModel: reflect_1.clone(obj) }) if (callback) { callback(obj, showModel) } else { showModel(obj) } } setRunning(false) common_1.hideLoading(p1.loading) }) .catch(function (err) { var _a, _b, _c var data = err && err.response ? err.response : err var title = resource.error var msg = resource.error_internal if (data && data.status === 422) { fail((_a = err.response) === null || _a === void 0 ? void 0 : _a.data) var obj = (_c = (_b = err.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.value if (obj) { callback ? callback(obj, showModel) : showModel(obj) } } else { if (data && data.status === 404) { handleNotFound(refForm.current) } else { if (data.status && !isNaN(data.status)) { msg = common_1.messageByHttpStatus(data.status, resource) } if (data && (data.status === 401 || data.status === 403)) { formutil_1.setReadOnly(refForm.current) } p1.showError(msg, undefined, title) } } setRunning(false) common_1.hideLoading(p1.loading) }) } else { var obj = createModel() setFlag({ newMode: true, originalModel: undefined }) if (callback) { callback(obj, showModel) } else { showModel(obj) } } } var load = p && p.load ? p.load : _load return __assign(__assign({}, baseProps), { back: back, refForm: refForm, ui: p1.ui, flag: flag, running: running, setRunning: setRunning, showModel: showModel, getModelName: getModelName, resetState: resetState, handleNotFound: handleNotFound, getModel: getModel, createModel: createModel, create: create, save: save, onSave: onSave, confirm: confirm, validate: validate, showMessage: p1.showMessage, succeed: succeed, fail: fail, postSave: postSave, handleDuplicateKey: handleDuplicateKey, load: load, doSave: doSave, }) }