{"version":3,"file":"templateHelpers.js","names":["includeComponent","b","arguments","length","args","Array","d","parent","pop","section","id","data","configId","model","subModelPath","parentModel","root","suppressRender","template","Handlebars","templates","SafeString","carousel","context","options","carouselConfig","handlebarOptions","componentOptions","Object","assign","items","map","itemContext","content","fn","openTag","type","closing","attr","html","keys","forEach","key","push","join","closeTag","createElement","contents","extend","obj1","obj2","helperTag","TagName","hash","tagAttributes","value","JSON","stringify","helperTagClosing","contextHelper","contextName","contextOptions","a","setters","default","execute","registerHelper"],"sources":["core/templateHelpers.js"],"sourcesContent":["/* eslint-disable complexity */\nimport Handlebars from 'handlebars/handlebars.runtime'; // this can be removed (linting fails)\n\n/**\n * Returns component HTML with already defined model\n *\n * @param {string} section component section\n * @param {string} id component ID\n * @param {object|string} data could be component model explicitly passed as a param\n * @param {object} configId component configuration ID\n * @returns {string} Component HTML\n */\nfunction includeComponent(...args) {\n const parent = args.pop();\n const [section, id, data, configId] = args;\n let model = data && typeof data === 'object' ? data : null;\n if (!model) {\n /**\n * Logic to allow client-side rendering for sub-components\n * included through render_component or include-component helpers.\n *\n * In complex cases, such components could have dynamic configId parameter passed.\n * Sub-component must be defined in server file with all possible #configId in such case.\n * like exports.subComponents=['sub/component#config1', 'sub/component#config2']\n *\n * Ajax model for rendering must be created using proper configuration\n * (done automatically with createSubComponentsModel in abstractpagecomponent)\n * and passed under respective key in parrent model like {\"section/component#config1\":{}}\n */\n const subModelPath = `${section}/${id}${configId && typeof configId === 'string' ? `#${configId}` : ''}`;\n const parentModel = parent.data && parent.data.root;\n if (typeof parentModel === 'object' && parentModel !== null) {\n model = parentModel[subModelPath];\n }\n }\n if (model && model.suppressRender) {\n return '';\n }\n\n\n const helperId = `templates/${section}/${id}`;\n // Hadlebars.templates filled in appropriate pre-compiled hbs template, check tasks/handlebars.js#addHelpers\n const template = Handlebars.templates[helperId];\n\n if (template) {\n return new Handlebars.SafeString(template(model));\n }\n\n return '';\n}\n\n/**\n * Block helper iterator.\n * Wraps each element into a carousel using common/carousel component.\n * To render this carousel inside the component it is needed to add 'common/carousel' as a helper on BE side\n * Example: exports.helpers = [\n * 'common/carousel',\n * ];\n * check tasks/handlebars.js#addHelpers\n *\n * @param {object[]} context -s\n * @param {...object} options carousel config (optional) and hanlebar options.\n * @return {string} get template HTML\n */\nfunction carousel(context, ...options) {\n if (!context) {\n return '';\n }\n const carouselConfig = (options && options.length > 1 && options[0]) || {};\n const handlebarOptions = options[options.length - 1];\n\n const componentOptions = carouselConfig.componentOptions || carouselConfig.options || {};\n const model = Object.assign({}, componentOptions, carouselConfig);\n\n model.items = context.map((itemContext) => {\n const content = handlebarOptions.fn(itemContext);\n return { content };\n });\n return includeComponent('common', 'carousel', model, null);\n}\n\n/**\n* Markup helper which renders open tag\n* @param {string} type - name of HTML tag which will be rendered\n* @param {boolean} closing - define if tag should be closed\n* @param {object} attr - hash with tag attributes\n* @return {HTMLElement} opened tag\n*/\nfunction openTag(type, closing, attr) {\n const html = [`<${type}`];\n\n Object.keys(attr).forEach((key) => {\n if (attr[key] || type === 'option') {\n html.push(`${key}='${attr[key]}'`);\n }\n });\n\n return `${html.join(' ') + (!closing ? ' /' : '')}>`;\n}\n\n/**\n* Markup helper which renders open tag\n* @param {string} type - name of HTML tag which will be rendered\n* @return {HTMLElement} closed tag\n*/\nfunction closeTag(type) {\n return ``;\n}\n\n/**\n* Markup helper which renders open tag\n* @param {string} type - name of HTML tag which will be rendered\n* @param {object} attr - hash with tag attributes\n* @param {object} contents - content of tag\n* @return {HTMLElement} created element\n*/\nfunction createElement(type, attr, contents) {\n const closing = typeof attr.closing !== 'undefined' ? attr.closing : true;\n delete attr.closing;\n return openTag(type, closing, attr) + (closing ? (contents || '') + closeTag(type) : '');\n}\n\n/**\n* Extends objects\n* @param {Object} obj1 - extended object\n* @param {Object} obj2 - object to extend\n* @return {Object} obj1 - extended object\n*/\nfunction extend(obj1, obj2) {\n Object.keys(obj2).forEach((key) => {\n obj1[key] = obj2[key];\n });\n\n return obj1;\n}\n\n/**\n* Creates tag element\n* @param {String} TagName - tag name\n* @param {Object} options - options\n* @return {HTMLElement} created element\n*/\nfunction helperTag(TagName, options) {\n if (options && options.hash && typeof options.hash.tagAttributes === 'object') {\n // translate tagAttributes to hash options and remove it from hash\n Object.keys(options.hash.tagAttributes).forEach((key) => {\n const value = options.hash.tagAttributes[key];\n options.hash[key] = value && typeof value === 'object' ? JSON.stringify(value) : value;\n });\n delete options.hash.tagAttributes;\n }\n return createElement(TagName, extend({}, options.hash), options.fn(this));\n}\n\n/**\n* Creates closing tag element\n* @param {String} TagName - tag name\n* @param {Object} options - options\n* @return {HTMLElement} created element\n*/\nfunction helperTagClosing(TagName, options) {\n if (options && options.hash && typeof options.hash.tagAttributes === 'object') {\n // translate tagAttributes to hash options and remove it from hash\n Object.keys(options.hash.tagAttributes).forEach((key) => {\n const value = options.hash.tagAttributes[key];\n options.hash[key] = value && typeof value === 'object' ? JSON.stringify(value) : value;\n });\n delete options.hash.tagAttributes;\n }\n return createElement(TagName, extend({\n closing: true,\n }, options.hash));\n}\n\n/**\n * Returns component HTML. Used in pair with BE\n * helper which preserves context for wrapped component\n * @param {String} contextName name of context\n * @param {Object} contextOptions object containing context options\n * @param {Object} options Handlebars options helper object\n * @returns {String} html of component\n */\nfunction contextHelper(contextName, contextOptions, options) {\n return options.fn(this);\n}\n\nHandlebars.registerHelper('include_component', includeComponent);\nHandlebars.registerHelper('render_component', includeComponent);\nHandlebars.registerHelper('carousel', carousel);\nHandlebars.registerHelper('tagName', helperTag);\nHandlebars.registerHelper('tagNameSelfClosing', helperTagClosing);\nHandlebars.registerHelper('context', contextHelper);\n\n/**\n * Returnds stringified JSON data.\n * @param {object} data data which need to be stringified\n */\nHandlebars.registerHelper('include_json', data => JSON.stringify(data));\n"],"mappings":"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","ignoreList":[]}