@europeana/portal
Version:
Europeana Portal
271 lines (219 loc) • 11.1 kB
JavaScript
exports.ids = [55];
exports.modules = {
/***/ 325:
/***/ (function(module, exports, __webpack_require__) {
// style-loader: Adds some css to the DOM by adding a <style> tag
// load the styles
var content = __webpack_require__(406);
if(content.__esModule) content = content.default;
if(typeof content === 'string') content = [[module.i, content, '']];
if(content.locals) module.exports = content.locals;
// add CSS to SSR context
var add = __webpack_require__(13).default
module.exports.__inject__ = function (context) {
add("d3ad8346", content, true, context)
};
/***/ }),
/***/ 405:
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_sass_loader_dist_cjs_js_ref_7_oneOf_1_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_04b474bb_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(325);
/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_sass_loader_dist_cjs_js_ref_7_oneOf_1_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_04b474bb_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_sass_loader_dist_cjs_js_ref_7_oneOf_1_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_04b474bb_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__);
/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_sass_loader_dist_cjs_js_ref_7_oneOf_1_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_04b474bb_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_sass_loader_dist_cjs_js_ref_7_oneOf_1_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_04b474bb_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
/***/ }),
/***/ 406:
/***/ (function(module, exports, __webpack_require__) {
// Imports
var ___CSS_LOADER_API_IMPORT___ = __webpack_require__(12);
var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(false);
// Module
___CSS_LOADER_EXPORT___.push([module.i, ".contentful[data-v-04b474bb]{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";font-size:.875rem}.contentful .form-control[data-v-04b474bb]{font-size:.875rem;border-radius:0;outline:none;background-color:#fff;border:1px solid #d3dce0;max-height:2.5rem;color:#536171;padding:.6563rem;padding-left:.6563rem;margin:0;width:100%;appearance:textfield}.contentful .form-control[data-v-04b474bb]:focus{border:1px solid #2e75d4;box-shadow:0 0 7px #2e75d4}.contentful .form-control.error[data-v-04b474bb]{border:1px solid #bf3045}.contentful .form-control.error[data-v-04b474bb]:focus{box-shadow:0 0 7px #bf3045}.contentful .error-message[data-v-04b474bb]{color:#bf3045;margin-top:.75em}", ""]);
// Exports
module.exports = ___CSS_LOADER_EXPORT___;
/***/ }),
/***/ 555:
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/contentful/slug-validation/index.vue?vue&type=template&id=04b474bb&scoped=true&
var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"contentful"},[_c('b-form',[_c('b-form-group',[_c('b-form-input',{class:_vm.errorMessage? 'error' : '',attrs:{"autocomplete":"off"},on:{"input":_vm.handleSlugChange},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:"value"}}),_vm._v(" "),(_vm.errorMessage)?_c('label',{staticClass:"error-message",domProps:{"textContent":_vm._s(_vm.errorMessage)}}):_vm._e()],1)],1)],1)}
var staticRenderFns = []
// CONCATENATED MODULE: ./src/pages/contentful/slug-validation/index.vue?vue&type=template&id=04b474bb&scoped=true&
// CONCATENATED MODULE: ./node_modules/babel-loader/lib??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/contentful/slug-validation/index.vue?vue&type=script&lang=js&
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
/* harmony default export */ var slug_validationvue_type_script_lang_js_ = ({
name: 'ContentfulSlugValidationPage',
layout: 'contentful',
data() {
return {
value: null,
contentTypes: [],
slugField: null,
titleField: null,
slugFromTitle: false,
errorMessage: null,
debouncedDuplicateStatus: null,
contentfulExtensionSdk: null
};
},
head() {
return {
title: this.$pageHeadTitle('Slug validation - Contentful app'),
script: [{
src: 'https://cdn.jsdelivr.net/npm/speakingurl@13.0.0/speakingurl.min.js'
}]
};
},
watch: {
value: 'updateContentfulField',
debouncedDuplicateStatus: 'handleStatus'
},
mounted() {
window.contentfulExtension.init(sdk => {
this.contentfulExtensionSdk = sdk;
if (sdk.location.is(window.contentfulExtension.locations.LOCATION_ENTRY_FIELD)) {
sdk.window.startAutoResizer();
this.contentTypes = [sdk.contentType.sys.id].concat(sdk.parameters.instance.contentTypes.split(','));
this.value = sdk.field.getValue();
this.slugField = sdk.field;
const titleFieldName = sdk.contentType.displayField;
this.titleField = sdk.entry.fields[titleFieldName];
this.titleField.onValueChanged(this.handleTitleChange);
const titleValue = this.titleField.getValue();
if (!this.value || this.value === 'undefined' || this.value === '') {
// No slug exists, use the title as a default
this.slugFromTitle = true;
this.handleTitleChange(titleValue);
} else if (this.value === this.convertToSlug(titleValue)) {
// slug is the same as title, enable automatic update when the title changes.
this.slugFromTitle = true;
}
}
});
},
methods: {
updateContentfulField() {
var _this$contentfulExten, _this$contentfulExten2;
(_this$contentfulExten = this.contentfulExtensionSdk) === null || _this$contentfulExten === void 0 ? void 0 : (_this$contentfulExten2 = _this$contentfulExten.field) === null || _this$contentfulExten2 === void 0 ? void 0 : _this$contentfulExten2.setValue(this.value);
},
// Convert using the speakingurl package, which is included in the contentful layout.
convertToSlug(text) {
return window.getSlug(text);
},
/**
* Handle change of slug value caused by either changing slug field
* or changing the title of the entry
*/
handleValueChange(value) {
this.value = value;
this.getDebouncedDuplicateStatus(value);
},
/**
* Handle change of slug value caused by changing the slug of the entry.
* This will disable updates of the slug from the title for the current form.
*/
handleSlugChange(value) {
this.slugFromTitle = false;
this.handleValueChange(value);
},
/**
* Handle change of title value caused by changing the title of the entry.
* If the slug was changed independently, don't update based of title changes.
*/
handleTitleChange(value) {
if (this.slugFromTitle) {
this.handleValueChange(this.convertToSlug(value || ''));
}
},
/**
* Handle validation status, setting the field to valid/invalid and
* removing the value in order to prevent publication if the slug is a duplicate.
*/
async handleStatus() {
const status = await this.debouncedDuplicateStatus;
if (status) {
this.slugField.removeValue();
this.slugField.setInvalid(true);
this.errorMessage = 'This slug has already been published in another entry';
} else {
this.slugField.setInvalid(false);
this.errorMessage = null;
}
},
// To prevent multiple API calls, or validation from a previous slug when typing fast.
getDebouncedDuplicateStatus(slug) {
if (this.timeout) {
clearTimeout(this.timeout);
}
this.timeout = setTimeout(() => {
this.debouncedDuplicateStatus = this.getDuplicates(slug);
}, 500);
},
/**
* Check if slug is already in use.
* Resolves to 'true' if there are entries of the given content type that have
* the same 'slug' value.
*/
async getDuplicates(slug) {
if (!slug) {
return Promise.resolve(false);
}
const query = {};
query['fields.' + this.slugField.id] = slug;
query['sys.id[ne]'] = this.contentfulExtensionSdk.entry.getSys().id;
query['sys.publishedAt[exists]'] = true;
for (const contentType of this.contentTypes) {
query['content_type'] = contentType;
const result = await this.contentfulExtensionSdk.space.getEntries(query);
if (result.total >= 1) {
return true;
}
}
return false;
}
}
});
// CONCATENATED MODULE: ./src/pages/contentful/slug-validation/index.vue?vue&type=script&lang=js&
/* harmony default export */ var contentful_slug_validationvue_type_script_lang_js_ = (slug_validationvue_type_script_lang_js_);
// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js
var componentNormalizer = __webpack_require__(3);
// CONCATENATED MODULE: ./src/pages/contentful/slug-validation/index.vue
function injectStyles (context) {
var style0 = __webpack_require__(405)
if (style0.__inject__) style0.__inject__(context)
}
/* normalize component */
var component = Object(componentNormalizer["a" /* default */])(
contentful_slug_validationvue_type_script_lang_js_,
render,
staticRenderFns,
false,
injectStyles,
"04b474bb",
"1a86cfce"
)
/* harmony default export */ var slug_validation = __webpack_exports__["default"] = (component.exports);
/***/ })
};;
//# sourceMappingURL=index.js.map