UNPKG

@oarepo/invenio-vue

Version:

Vue 3 library for handling invenio REST

1,320 lines (1,143 loc) 35.1 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib = require('tslib'); var axios = require('axios'); var useSWRV = require('swrv'); var vue = require('vue'); var merge = require('deepmerge'); var _typeof = require('@babel/runtime/helpers/typeof'); var LocalStorageCache = require('swrv/dist/cache/adapters/localStorage'); var deepcopy = require('deepcopy'); var vueQuerySynchronizer = require('@oarepo/vue-query-synchronizer'); var vueRouter = require('vue-router'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios); var useSWRV__default = /*#__PURE__*/_interopDefaultLegacy(useSWRV); var merge__default = /*#__PURE__*/_interopDefaultLegacy(merge); var _typeof__default = /*#__PURE__*/_interopDefaultLegacy(_typeof); var LocalStorageCache__default = /*#__PURE__*/_interopDefaultLegacy(LocalStorageCache); var deepcopy__default = /*#__PURE__*/_interopDefaultLegacy(deepcopy); function callAndWatch(what, callback, options) { vue.watch(what, callback, options); callback(); } var encodeReserveRE = /[!'()*]/g; var encodeReserveReplacer = function encodeReserveReplacer(c) { return '%' + c.charCodeAt(0).toString(16); }; var commaRE = /%2C/g; var encode = function encode(str) { return encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ','); }; function stringifyQuery(obj) { var res = obj ? Object.keys(obj).sort().map(function (key) { var val = obj[key]; if (val === undefined || val === false) { return ''; } if (val === null) { return ''; } if (val === true) { return encode(key); } if (val === '') { return ''; } if (Array.isArray(val)) { var result_1 = []; val.forEach(function (val2) { if (val2 === undefined) { return; } if (val2 === null) { result_1.push(encode(key)); } else { result_1.push(encode(key) + '=' + encode(val2)); } }); return result_1.join('&'); } return encode(key) + '=' + encode(val); }).filter(function (x) { return x.length > 0; }).join('&') : null; return res ? "?" + res : ''; } function defaultErrorFormatter(rawError) { var err = vue.unref(rawError); if (!err) { return null; } var ret; var response = err.response; if (response) { if (response.status === 403 || response.status === 405 || response.status === 401) { ret = { type: 'unauthorized', rawError: err, status: response.status, reason: response.data, request: err.request, response: response }; } else if (response.status >= 400 && response.status < 500) { ret = { type: 'clientError', rawError: err, status: response.status, reason: response.data, request: err.request, response: response }; } else { ret = { type: 'serverError', rawError: err, status: response.status, reason: response.data, request: err.request, response: response }; } } else if (err.request) { ret = { type: 'responseMissing', rawError: err, request: err.request }; } else { ret = { type: 'unknown', rawError: err }; } return ret; } /** * A simple http wrapper around fetcher that uses axios. * @see useFetcher * * @param initialUrl the base url * @param initialQuery the initial query * @param options * @returns {Http<DataType, ErrorType>} */ function useHttp(initialUrl, initialQuery, options) { var _this = this; var loadEnabled = vue.ref((options === null || options === void 0 ? void 0 : options.loadInitial) || false); var url = vue.ref(initialUrl); var query = vue.ref(tslib.__assign({}, initialQuery || {})); var keepPrevious = false; var stale = vue.ref(false); var loaded = vue.ref(false); var data = vue.ref(); var error = vue.ref(); var forceCounter = vue.ref(1); var finishedAt = vue.ref(); var headers = vue.ref((options === null || options === void 0 ? void 0 : options.headers) || {}); var promise = {}; function makeFullUrl(_url, _query) { if (_query && _url) { return "" + _url + stringifyQuery(_query); } return _url; } function makeActionUrl(action) { if (action) { var _url = url.value; if (!_url) { return makeFullUrl(action, query.value); } if (!_url.endsWith('/')) { _url += '/'; } _url += action; return makeFullUrl(_url, query.value); } else { return makeFullUrl(url.value, query.value); } } var fullUrl = vue.computed(function () { return makeFullUrl(url.value, query.value); }); var key = vue.computed(function () { return directKey(); }); function directKey() { if (loadEnabled.value && fullUrl.value) { return ((options === null || options === void 0 ? void 0 : options.method) || 'get') + ":" + forceCounter.value + ":" + fullUrl.value; } else { return null; } } var _a = useSWRV__default['default'](function () { return key.value; }, function (key) { return tslib.__awaiter(_this, void 0, void 0, function () { var resp, e_1, response; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2,, 3]); return [4 /*yield*/ , axios__default['default'][(options === null || options === void 0 ? void 0 : options.method) || 'get'](fullUrl.value, { headers: headers.value })]; case 1: resp = _a.sent().data; return [2 /*return*/ , { promiseKey: promise.key, payload: resp }]; case 2: e_1 = _a.sent(); response = e_1.response; if (response) { return [2 /*return*/ , { promiseKey: promise.key, error: e_1 }]; } else { throw { promiseKey: promise.key, error: e_1 }; } case 3: return [2 /*return*/ ]; } }); }); }, options || {}), rawData = _a.data, rawError = _a.error, isValidating = _a.isValidating, mutate = _a.mutate; vue.watch([isValidating, rawData, rawError], function (_a) { var val = _a[0]; _a[1]; _a[2]; if (val) { if (keepPrevious && data.value) { stale.value = true; } } else { finishedAt.value = new Date(); var err = rawError.value; if (!err && rawData.value && rawData.value.error) { err = rawData.value; } if (err) { error.value = (options === null || options === void 0 ? void 0 : options.errorFormatter) ? options.errorFormatter(err.error) : defaultErrorFormatter(err.error); if (err.promiseKey) { rejectPromise(error.value); } } else if (rawData.value) { loaded.value = true; data.value = rawData.value.payload; error.value = undefined; if (rawData.value.promiseKey) { acceptPromise(rawData.value.payload); } } } }); function acceptPromise(data) { if (promise.accept) { var accept = promise.accept; promise.accept = undefined; promise.reject = undefined; accept(data); } } function rejectPromise(error) { if (promise.reject) { var reject = promise.reject; promise.accept = undefined; promise.reject = undefined; reject(error); } } function load(opts) { if ((opts === null || opts === void 0 ? void 0 : opts.keepPrevious) !== undefined) { keepPrevious = opts.keepPrevious; } else { if ((options === null || options === void 0 ? void 0 : options.keepData) && data.value && url.value) { keepPrevious = options.keepData(data.value, error.value, url.value, query.value, (opts === null || opts === void 0 ? void 0 : opts.url) || url.value, (opts === null || opts === void 0 ? void 0 : opts.query) || query.value, options); } else { keepPrevious = false; } } if (!keepPrevious) { loaded.value = false; } query.value = (opts === null || opts === void 0 ? void 0 : opts.query) || {}; if (opts === null || opts === void 0 ? void 0 : opts.url) { url.value = opts.url; } if ((opts === null || opts === void 0 ? void 0 : opts.force) || !(opts === null || opts === void 0 ? void 0 : opts.url)) { forceCounter.value += 1; } loadEnabled.value = true; if (opts === null || opts === void 0 ? void 0 : opts.returnPromise) { return new Promise(function (accept, reject) { promise.accept = accept; promise.reject = reject; promise.key = directKey(); }); } } function reload(opts) { load(tslib.__assign(tslib.__assign({}, opts || {}), { force: true })); } function prefetch(data, _query) { forceCounter.value + ":" + makeFullUrl(url.value, _query); mutate(function () { return { promiseKey: undefined, payload: data }; }, {}); query.value = _query || {}; } function store(_data, _error) { finishedAt.value = new Date(); if (_data) { prefetch(_data); data.value = _data; loaded.value = true; error.value = undefined; } if (_error) { error.value = _error; loaded.value = false; } } function op(opts) { return tslib.__awaiter(this, void 0, void 0, function () { var newHttp, resp, data_1, location_1, parsedError; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (opts.returnNew) { newHttp = ((opts === null || opts === void 0 ? void 0 : opts.factory) || useHttp)(url.value, query.value, tslib.__assign(tslib.__assign({}, options || {}), { loadInitial: false })); } _a.label = 1; case 1: _a.trys.push([1, 3,, 4]); return [4 /*yield*/ , axios__default['default'].request(tslib.__assign(tslib.__assign({ method: opts.method, url: makeActionUrl(opts.action), data: opts.data }, opts.options || {}), { headers: headers.value }))]; case 2: resp = _a.sent(); data_1 = resp.data; location_1 = resp.headers['Location']; if (opts === null || opts === void 0 ? void 0 : opts.replaceContent) { if (data_1) { store(data_1); } else { store(opts.data); } if (location_1) { loadEnabled.value = false; url.value = location_1; } } else if (opts === null || opts === void 0 ? void 0 : opts.returnNew) { if (data_1) { newHttp.store(data_1); } else { newHttp.store(opts.data); } if (location_1) { newHttp.loadEnabled.value = false; newHttp.url.value = location_1; } return [2 /*return*/ , newHttp]; } return [3 /*break*/ , 4]; case 3: _a.sent(); parsedError = (options === null || options === void 0 ? void 0 : options.errorFormatter) ? options.errorFormatter(rawError.value) : defaultErrorFormatter(rawError.value); if (opts === null || opts === void 0 ? void 0 : opts.replaceContent) { store(undefined, parsedError); } else if (opts === null || opts === void 0 ? void 0 : opts.returnNew) { newHttp.store(undefined, parsedError); return [2 /*return*/ , newHttp]; } return [3 /*break*/ , 4]; case 4: return [2 /*return*/ , th]; } }); }); } function post(opts) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/ , op(tslib.__assign(tslib.__assign({}, opts), { method: 'post', options: merge__default['default']({ headers: { 'Content-Type': 'application/json' } }, (opts === null || opts === void 0 ? void 0 : opts.options) || {}) }))]; case 1: return [2 /*return*/ , _a.sent()]; } }); }); } function patch(opts) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/ , op(tslib.__assign(tslib.__assign({}, opts), { data: opts.operations, method: 'patch', options: merge__default['default']({ headers: { 'Content-Type': 'application/json-patch+json' } }, (opts === null || opts === void 0 ? void 0 : opts.options) || {}) }))]; case 1: return [2 /*return*/ , _a.sent()]; } }); }); } function remove(opts) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2,, 3]); return [4 /*yield*/ , axios__default['default'].request(tslib.__assign(tslib.__assign({ method: 'delete', url: fullUrl.value }, opts.options || {}), { headers: headers.value }))]; case 1: return [2 /*return*/ , _a.sent().data]; case 2: _a.sent(); throw (options === null || options === void 0 ? void 0 : options.errorFormatter) ? options.errorFormatter(rawError.value) : defaultErrorFormatter(rawError.value); case 3: return [2 /*return*/ ]; } }); }); } var th = { loadEnabled: loadEnabled, url: url, query: query, fullUrl: fullUrl, stale: stale, loading: isValidating, loaded: loaded, data: data, error: error, load: load, reload: reload, prefetch: prefetch, store: store, post: post, patch: patch, remove: remove, op: op, finishedAt: finishedAt, headers: headers }; return th; } var optionsCache = new LocalStorageCache__default['default'](); function useInvenioCollection(url, initialQuery, options) { options = options || {}; initialQuery = initialQuery || {}; if (!options.headers) { options.headers = {}; } options.headers['Accept'] = 'application/json'; var recordTransformer = options.recordTransformer || function (record) { return record; }; options.facetsTransformer || function (facets) { return facets; }; var facetDefinitionTransformer = options.facetDefinitionTransformer || function (facetDefinitions) { return facetDefinitions; }; var records = vue.ref([]); var pageSize = vue.ref(parseInt(initialQuery.size || "") || 10); var page = vue.ref(parseInt(initialQuery.page || "") || 1); var http = useHttp(url, tslib.__assign({ page: page.value.toString(), size: pageSize.value.toString() }, initialQuery), tslib.__assign({ method: 'get' }, options)); var httpFacets = useHttp(url, tslib.__assign(tslib.__assign({}, initialQuery), { size: '0' }), tslib.__assign(tslib.__assign({ method: 'get' }, options), { loadInitial: false })); var httpOptions = useHttp(url, tslib.__assign(tslib.__assign({}, initialQuery), { facets: null }), tslib.__assign(tslib.__assign({}, options), { method: 'options', cache: options.optionsCache || optionsCache })); vue.watch(http.data, function () { var _a, _b; records.value = (((_b = (_a = http.data.value) === null || _a === void 0 ? void 0 : _a.hits) === null || _b === void 0 ? void 0 : _b.hits) || []).map(function (record) { var _a, _b; if (!((_a = record.links) === null || _a === void 0 ? void 0 : _a.ui) && ((_b = record.links) === null || _b === void 0 ? void 0 : _b.self)) { record.links.ui = new URL(record.links.self).pathname; } return recordTransformer(record, { options: options, collection: th }); }); }); function load(opts) { if (!httpOptions.loaded.value) { httpOptions.reload(); } var query = tslib.__assign(tslib.__assign({}, http.query.value), (opts === null || opts === void 0 ? void 0 : opts.query) || {}); query.facets = true; http.load(tslib.__assign(tslib.__assign({}, opts || {}), { query: query })); } function loadFacets(opts) { httpFacets.load({ query: tslib.__assign(tslib.__assign({}, httpFacets.query.value), { facets: opts.selectedFacets }) }); } var facetDefinitions = vue.computed(function () { var _a; var defs = (((_a = httpOptions.data.value) === null || _a === void 0 ? void 0 : _a.facets) || []).reduce(function (p, d, idx) { var _a; p[d.code] = tslib.__assign({ label: (_a = d.facet) === null || _a === void 0 ? void 0 : _a.label, order: idx }, d); return p; }, {}); return facetDefinitionTransformer(defs, { options: options, collection: th }); }); vue.watch(pageSize, function () { if (pageSize.value <= 0) { pageSize.value = 10; } if (http.query.value.size != pageSize.value.toString()) { http.query.value.size = pageSize.value.toString(); } }); vue.watch(function () { return http.query.value.size; }, function (ps) { pageSize.value = parseInt(ps); }); var pages = vue.computed(function () { if (!http.data.value) { return 0; } var hits = http.data.value.hits.total; var records = _typeof__default['default'](hits) === 'object' ? hits.value : hits; return Math.ceil(records / pageSize.value); }); vue.watch(page, function () { if (page.value < 1) { page.value = 1; } if (pages.value && page.value > pages.value) { page.value = pages.value; } if (http.query.value.page != page.value.toString()) { http.query.value.page = page.value.toString(); } }); vue.watch(function () { return http.query.value.page; }, function (ps) { page.value = parseInt(ps); }); function setUrl(url) { http.url.value = url; httpOptions.url.value = url; httpFacets.url.value = url; httpFacets.loadEnabled.value = false; // reload options httpOptions.reload({ keepPrevious: false }); // load list of records together with facets http.load({ query: http.query.value, keepPrevious: false }); } var recordsCount = vue.computed(function () { if (!http.data.value) { return 0; } var hits = http.data.value.hits.total; return _typeof__default['default'](hits) === 'object' ? hits.value : hits; }); var recordsCountString = vue.computed(function () { if (!http.data.value) { return ''; } var hits = http.data.value.hits.total; if (_typeof__default['default'](hits) === 'object') { if (hits.relation === 'gte') { return "\u2265 " + hits.value; } else { return "" + hits.value; } } else { return "" + hits; } }); var th = { records: records, http: http, httpOptions: httpOptions, httpFacets: httpFacets, load: load, loadFacets: loadFacets, facetDefinitions: facetDefinitions, stale: http.stale, loading: http.loading, loaded: http.loaded, pages: pages, page: page, pageSize: pageSize, setUrl: setUrl, recordsCount: recordsCount, recordsCountString: recordsCountString }; return th; } function useInvenioRecord(url, options) { options = options || {}; if (!options.headers) { options.headers = {}; } options.headers['Accept'] = 'application/json'; var http = useHttp(url, {}, tslib.__assign({ method: 'get' }, options)); var model = vue.ref(); var metadata = vue.computed(function () { if (http.data.value) { return http.data.value.metadata; } return undefined; }); function setUrl(url) { http.url.value = url; } function createModel() { if (model.value) { return model; } if (metadata.value) { model.value = deepcopy__default['default'](vue.toRaw(metadata)); } return model; } function releaseModel() { model.value = undefined; } // when metadata are fetched, set the inner model to them vue.watch(metadata, function () { if (model.value) { model.value = deepcopy__default['default'](vue.toRaw(metadata)); } }); return { http: http, metadata: metadata, setUrl: setUrl, createModel: createModel, releaseModel: releaseModel }; } var script$3 = vue.defineComponent({ setup: function setup() {} }); function render$3(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createBlock("div", null, [vue.createCommentVNode(" loading ")]); } script$3.render = render$3; var script$2 = vue.defineComponent({ name: 'simple-error', props: { collection: { type: Object }, record: { type: Object }, title: { type: String, default: 'Error loading data' } }, emits: ['reload'], setup: function setup(props, ctx) { var err = vue.computed(function () { var _props$collection, _props$record; return ((_props$collection = props.collection) === null || _props$collection === void 0 ? void 0 : _props$collection.http.error) || ((_props$record = props.record) === null || _props$record === void 0 ? void 0 : _props$record.http.error); }); var hasHtmlError = vue.computed(function () { return err.value && err.value.reason && typeof err.value.reason === 'string'; }); return { err: err, hasHtmlError: hasHtmlError, reload: function reload() { return ctx.emit('reload'); } }; } }); var _hoisted_1 = { key: 0, class: "invenio-error-loading-page" }; var _hoisted_2 = { key: 0 }; var _hoisted_3 = /*#__PURE__*/vue.createVNode("h4", null, "Unknown error", -1 /* HOISTED */ ); var _hoisted_4 = { key: 1 }; var _hoisted_5 = /*#__PURE__*/vue.createVNode("h4", null, "No response from server", -1 /* HOISTED */ ); var _hoisted_6 = /*#__PURE__*/vue.createTextVNode(" The request has not been delivered to the server due to network error or the server has not responded in time. "); var _hoisted_7 = { key: 2 }; var _hoisted_8 = /*#__PURE__*/vue.createVNode("h4", null, "Unauthorized", -1 /* HOISTED */ ); var _hoisted_9 = /*#__PURE__*/vue.createTextVNode(" The server says you have no rights to access the resource "); var _hoisted_10 = { key: 3 }; var _hoisted_11 = /*#__PURE__*/vue.createVNode("h4", null, "The client send invalid data", -1 /* HOISTED */ ); var _hoisted_12 = /*#__PURE__*/vue.createTextVNode(" The client has sent invalid data. Details: "); var _hoisted_13 = { key: 1 }; var _hoisted_14 = { key: 4 }; var _hoisted_15 = /*#__PURE__*/vue.createVNode("h4", null, "Server error", -1 /* HOISTED */ ); var _hoisted_16 = /*#__PURE__*/vue.createTextVNode(" The server experienced error during handling your request. "); var _hoisted_17 = { key: 1 }; function render$2(_ctx, _cache, $props, $setup, $data, $options) { return _ctx.err ? (vue.openBlock(), vue.createBlock("div", _hoisted_1, [vue.createVNode("h3", null, vue.toDisplayString(_ctx.title), 1 /* TEXT */ ), _ctx.err.type === 'unknown' ? (vue.openBlock(), vue.createBlock("div", _hoisted_2, [_hoisted_3, vue.createVNode("pre", null, " " + vue.toDisplayString(_ctx.err.raw) + "\n ", 1 /* TEXT */ )])) : _ctx.err.type === 'responseMissing' ? (vue.openBlock(), vue.createBlock("div", _hoisted_4, [_hoisted_5, _hoisted_6])) : _ctx.err.type === 'unauthorized' ? (vue.openBlock(), vue.createBlock("div", _hoisted_7, [_hoisted_8, _hoisted_9])) : _ctx.err.type === 'clientError' ? (vue.openBlock(), vue.createBlock("div", _hoisted_10, [_hoisted_11, _hoisted_12, _ctx.hasHtmlError ? (vue.openBlock(), vue.createBlock("div", { key: 0, innerHTML: _ctx.err.reason }, null, 8 /* PROPS */ , ["innerHTML"])) : (vue.openBlock(), vue.createBlock("pre", _hoisted_13, vue.toDisplayString(_ctx.err.reason), 1 /* TEXT */ ))])) : _ctx.err.type === 'serverError' ? (vue.openBlock(), vue.createBlock("div", _hoisted_14, [_hoisted_15, _hoisted_16, _ctx.hasHtmlError ? (vue.openBlock(), vue.createBlock("div", { key: 0, innerHTML: _ctx.err.reason }, null, 8 /* PROPS */ , ["innerHTML"])) : (vue.openBlock(), vue.createBlock("pre", _hoisted_17, vue.toDisplayString(_ctx.err.reason), 1 /* TEXT */ ))])) : vue.createCommentVNode("v-if", true), vue.createVNode("button", { class: "reload", onClick: _cache[1] || (_cache[1] = vue.withModifiers(function ($event) { return _ctx.reload(); }, ["prevent"])) }, "Reload")])) : vue.createCommentVNode("v-if", true); } script$2.render = render$2; var script$1 = vue.defineComponent({ name: 'invenio-collection-wrapper', props: { viewerComponent: { required: true, type: [Object, Function, String] }, loadingComponent: { type: [Object, Function, String], default: undefined }, errorComponent: { type: [Object, Function, String], default: undefined }, url: { type: String }, options: { type: Object } }, setup: function setup(props, ctx) { var collection = vue.ref(); var query = vueQuerySynchronizer.useQuery(); var route = vueRouter.useRoute(); var beingUnmounted = vue.ref(false); var currentUrl = vue.computed(function () { return props.url || route.path; }); callAndWatch(function () { return props.options; }, function () { collection.value = useInvenioCollection(currentUrl.value, query, props.options); }, { deep: true }); vue.watch(currentUrl, function (newUrl) { setTimeout(function () { if (!beingUnmounted.value) { collection.value.setUrl(newUrl); } }); }); callAndWatch([query], function () { setTimeout(function () { if (!beingUnmounted.value) { reload(); } }); }, { deep: true }); vue.watch(collection, function () { setTimeout(function () { if (!beingUnmounted.value) { reload(); } }); }); vue.onBeforeUnmount(function () { beingUnmounted.value = true; }); function reload() { collection.value.load({ query: query }); } function resolve(c, viewer, defaultComponent) { if (c === 'viewer') { return viewer; } if (!c) { return defaultComponent; } if (typeof c === 'string') { return vue.resolveComponent(c); } return vue.defineAsyncComponent(c); // return c } var viewerComponent = resolve(props.viewerComponent, script$3, script$3); var loadingComponent = resolve(props.loadingComponent, viewerComponent, script$3); var errorComponent = resolve(props.errorComponent, viewerComponent, script$2); var currentComponent = vue.computed(function () { var col = collection.value; if (!col) { return null; } if (col.http.error) { return errorComponent; } if (col.http.data) { return viewerComponent; } return loadingComponent; }); return { collection: collection, propsAndAttributes: tslib.__assign(tslib.__assign({}, props), ctx.attrs), currentComponent: currentComponent }; } }); function render$1(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.currentComponent), vue.mergeProps({ collection: _ctx.collection }, _ctx.propsAndAttributes, { onReload: _ctx.collection.http.reload }), null, 16 /* FULL_PROPS */ , ["collection", "onReload"]); } script$1.render = render$1; var script = vue.defineComponent({ name: 'invenio-record-wrapper', props: { viewerComponent: { required: true, type: [Object, Function] }, loadingComponent: { type: [Object, Function, String], default: undefined }, errorComponent: { type: [Object, Function, String], default: undefined }, url: { type: String }, options: { type: Object } }, setup: function setup(props, ctx) { var record = vue.ref(); var route = vueRouter.useRoute(); var currentUrl = vue.computed(function () { return props.url || route.path; }); callAndWatch(function () { return props.options; }, function () { console.log('record current url', currentUrl.value); record.value = useInvenioRecord(currentUrl.value, tslib.__assign(tslib.__assign({}, props.options), { loadInitial: true })); }, { deep: true }); function resolve(c, viewer, defaultComponent) { if (c === 'viewer') { return viewer; } if (!c) { return defaultComponent; } if (typeof c === 'string') { return vue.resolveComponent(c); } return vue.defineAsyncComponent(c); // return c } var viewerComponent = resolve(props.viewerComponent, script$3, script$3); var loadingComponent = resolve(props.loadingComponent, viewerComponent, script$3); var errorComponent = resolve(props.errorComponent, viewerComponent, script$2); var currentComponent = vue.computed(function () { var rec = record.value; if (!rec) { return null; } if (rec.http.error) { return errorComponent; } if (rec.http.data) { return viewerComponent; } return loadingComponent; }); return { record: record, propsAndAttributes: tslib.__assign(tslib.__assign({}, props), ctx.attrs), currentComponent: currentComponent }; } }); function render(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.currentComponent), vue.mergeProps({ record: _ctx.record }, _ctx.propsAndAttributes, { onReload: _ctx.record.http.reload }), null, 16 /* FULL_PROPS */ , ["record", "onReload"]); } script.render = render; // @ts-ignore // workaround for https://github.com/ezolenko/rollup-plugin-typescript2/issues/129 /** * Generates route path for a collection * * @param options options * @param {string} options.name Route name * @param {string} options.url Invenio api url, defaults to the current route path * @param {string} options.path route path. * @param {Component} options.component * viewer component for showing the records and facets * @param {string|Component} options.errorComponent component shown on error * * - if component is passed it will be used to render the error * - If set to 'viewer', viewerComponent will be used * - If undefined, simple component showing the error with a retry button is shown * * @param {string|Component} options.loadingComponent component shown while loading records * * - if component is passed it will be used during loading when records are not available. * - If set to 'viewer', viewerComponent will be used during loading * - If undefined, empty space is shown during load * * @param {InvenioHttpOptionOptions} options.httpOptionsProps * InvenioHttpOptionOptions used for fetching collection options * @param {InvenioCollectionListOptions} options.httpGetProps * InvenioCollectionListOptions used for fetching the collection * * @param extra extra parameters to be merged with the route object * * @returns object to put into the router routes * * *Viewer/Loading/Error component* * * The component is passed the following props: * * ```html * <component :is="currentComponent" :collection="collection" (instance of InvenioCollectionComposable) v-bind="propsAndAttributes" ></component> * ``` * * *Example*: * * ```javascript * routes = [ * collection({ * name: 'all', * path: '/all/' * component: MyCollectionViewer, * }, * ) * ] * ``` */ function collection(opts, extra) { var proto = { path: opts.path !== undefined ? opts.path : '/', name: opts.name, component: script$1, props: { viewerComponent: opts.component, errorComponent: opts.errorComponent, loadingComponent: opts.loadingComponent, url: opts.url, options: opts.options || { revalidateOnFocus: false } }, meta: { query: { page: 'int:1', size: 'int:10', facets: 'array:', q: 'string:' } } }; if (extra) { proto = merge__default['default'](proto, extra); } return proto; } function record(opts, extra) { var proto = { path: opts.path !== undefined ? opts.path : '/', name: opts.name, component: script, props: { viewerComponent: opts.component, errorComponent: opts.errorComponent, loadingComponent: opts.loadingComponent, url: opts.url, options: opts.options || { revalidateOnFocus: false } }, meta: {} }; if (extra) { proto = merge__default['default'](proto, extra); } return proto; } var index = { install: function install() {} }; exports.CollectionWrapper = script$1; exports.RecordWrapper = script; exports.collection = collection; exports.default = index; exports.record = record; exports.useHttp = useHttp; exports.useInvenioCollection = useInvenioCollection; exports.useInvenioRecord = useInvenioRecord; //# sourceMappingURL=oarepo-invenio-vue.cjs.js.map