@blaze-cms/react-page-builder 0.141.0 → 0.142.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/lib/components/DateTime/DateTime.js +37 -0
- package/lib/components/DateTime/DateTime.js.map +1 -0
- package/lib/components/DateTime/index.js +11 -0
- package/lib/components/DateTime/index.js.map +1 -0
- package/lib/components/index.js +5 -0
- package/lib/components/index.js.map +1 -1
- package/lib/hooks/helpers/buildPBComponents.js +12 -12
- package/lib/hooks/helpers/buildPBComponents.js.map +1 -1
- package/lib/hooks/helpers/get-components-to-insert-by-type.js +35 -0
- package/lib/hooks/helpers/get-components-to-insert-by-type.js.map +1 -0
- package/lib/hooks/helpers/inject-element-components.js +70 -0
- package/lib/hooks/helpers/inject-element-components.js.map +1 -0
- package/lib/hooks/helpers/inject-textblock-banners.js +4 -2
- package/lib/hooks/helpers/inject-textblock-banners.js.map +1 -1
- package/lib-es/components/DateTime/DateTime.js +30 -0
- package/lib-es/components/DateTime/DateTime.js.map +1 -0
- package/lib-es/components/DateTime/index.js +3 -0
- package/lib-es/components/DateTime/index.js.map +1 -0
- package/lib-es/components/index.js +1 -0
- package/lib-es/components/index.js.map +1 -1
- package/lib-es/hooks/helpers/buildPBComponents.js +6 -6
- package/lib-es/hooks/helpers/buildPBComponents.js.map +1 -1
- package/lib-es/hooks/helpers/get-components-to-insert-by-type.js +27 -0
- package/lib-es/hooks/helpers/get-components-to-insert-by-type.js.map +1 -0
- package/lib-es/hooks/helpers/inject-element-components.js +59 -0
- package/lib-es/hooks/helpers/inject-element-components.js.map +1 -0
- package/lib-es/hooks/helpers/inject-textblock-banners.js +4 -2
- package/lib-es/hooks/helpers/inject-textblock-banners.js.map +1 -1
- package/package.json +2 -2
- package/src/components/DateTime/DateTime.js +34 -0
- package/src/components/DateTime/index.js +3 -0
- package/src/components/index.js +1 -0
- package/src/hooks/helpers/buildPBComponents.js +13 -6
- package/src/hooks/helpers/get-components-to-insert-by-type.js +34 -0
- package/src/hooks/helpers/inject-element-components.js +56 -0
- package/src/hooks/helpers/inject-textblock-banners.js +3 -2
- package/tests/unit/src/components/DateTime/DateTime.test.js +105 -0
- package/tests/unit/src/components/__snapshots__/index.test.js.snap +4 -0
- package/tests/unit/src/hooks/helpers/{get-banners-by-type.test.js → get-components-to-insert-by-type.test.js} +5 -5
- package/tests/unit/src/hooks/helpers/{inject-element-banners.test.js → inject-element-components.test.js} +34 -17
- package/tests/unit/src/hooks/helpers/inject-textblock-banners.test.js +2 -1
- package/lib/hooks/helpers/get-banners-by-type.js +0 -38
- package/lib/hooks/helpers/get-banners-by-type.js.map +0 -1
- package/lib/hooks/helpers/inject-element-banners.js +0 -65
- package/lib/hooks/helpers/inject-element-banners.js.map +0 -1
- package/lib-es/hooks/helpers/get-banners-by-type.js +0 -27
- package/lib-es/hooks/helpers/get-banners-by-type.js.map +0 -1
- package/lib-es/hooks/helpers/inject-element-banners.js +0 -55
- package/lib-es/hooks/helpers/inject-element-banners.js.map +0 -1
- package/src/hooks/helpers/get-banners-by-type.js +0 -27
- package/src/hooks/helpers/inject-element-banners.js +0 -47
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildPBComponents.js","names":["React","cloneDeep","GlobalLightbox","RenderComponent","
|
|
1
|
+
{"version":3,"file":"buildPBComponents.js","names":["React","cloneDeep","GlobalLightbox","RenderComponent","getComponentsToInsertByType","injectElementComponents","StoreImages","getLightboxImages","insertBanners","checkBannerInsertionSet","getBannerIndex","ELEMENT","PB_TYPE_TEXTBLOCK","renderChildComponents","options","items","length","BuildPBComponents","components","rootLevel","isArray","Array","metaTitle","lightboxImages","toggleModal","open","selectedImage","setSelectedImage","parent","name","parentName","resetImages","addImages","concat","setHandlers","imageProps","handleSelectedImage","images","map","image","_objectSpread","createElement","Fragment","onClose","component","hasElementInsertionComponents","elementInsertionComponents","hasTextBlockBanners","textBlockBanners","updatedChildren","filter","settings","insertionType","bannerToInject","bannerIndex","hasComponentItems","childComponents","siblings","key","id"],"sources":["../../../src/hooks/helpers/buildPBComponents.js"],"sourcesContent":["import React from 'react';\nimport cloneDeep from 'lodash.clonedeep';\nimport GlobalLightbox from '../../components/Image/GlobalLightbox';\nimport RenderComponent from './RenderComponent';\nimport getComponentsToInsertByType from './get-components-to-insert-by-type';\nimport injectElementComponents from './inject-element-components';\nimport StoreImages from './StoreImages';\nimport getLightboxImages from './get-lightbox-images';\nimport insertBanners from './insert-banners';\nimport checkBannerInsertionSet from './check-banner-insertion-set';\nimport getBannerIndex from './get-banner-index';\nimport { ELEMENT } from '../../constants';\nimport { PB_TYPE_TEXTBLOCK } from './constants';\n\nfunction renderChildComponents(options, items = []) {\n return items && items.length ? BuildPBComponents(items, options) : [];\n}\n\nfunction BuildPBComponents(components, options = {}, rootLevel = false) {\n const isArray = Array.isArray(components);\n if (!isArray) return [];\n\n const {\n metaTitle,\n lightboxImages = [],\n toggleModal,\n open,\n selectedImage,\n setSelectedImage,\n parent,\n name: parentName\n } = options;\n\n if (rootLevel && !open) StoreImages.resetImages();\n\n StoreImages.addImages(getLightboxImages(components).concat(lightboxImages), options);\n StoreImages.setHandlers({ toggleModal, setSelectedImage });\n\n const imageProps = {\n toggleModal: StoreImages.toggleModal,\n handleSelectedImage: StoreImages.handleSelectedImage\n };\n\n const images = StoreImages.images.map(image => ({ ...image, ...imageProps }));\n\n return (\n <>\n {open && (\n <GlobalLightbox\n images={images}\n onClose={StoreImages.toggleModal}\n selectedImage={selectedImage}\n metaTitle={metaTitle}\n parentName={parentName}\n parent={parent}\n />\n )}\n {components.map(component => {\n const { items = [] } = component;\n const [\n hasElementInsertionComponents,\n elementInsertionComponents\n ] = getComponentsToInsertByType(items, ELEMENT);\n\n const [hasTextBlockBanners, textBlockBanners] = getComponentsToInsertByType(\n items,\n PB_TYPE_TEXTBLOCK\n );\n let updatedChildren =\n items &&\n cloneDeep(items).filter(\n ({ settings: { insertionType } = {} }) => insertionType !== PB_TYPE_TEXTBLOCK\n );\n\n if (hasElementInsertionComponents) {\n updatedChildren = injectElementComponents(elementInsertionComponents, updatedChildren);\n } else {\n // TODO: this block is for banner retrocompatibility, once completly migrated remove it as well as all related helpers\n const bannerToInject = checkBannerInsertionSet(updatedChildren);\n const bannerIndex = getBannerIndex(updatedChildren, bannerToInject);\n const hasComponentItems = !!(updatedChildren && updatedChildren.length);\n\n if (hasComponentItems && bannerIndex > -1) {\n updatedChildren = insertBanners(updatedChildren, bannerIndex, bannerToInject);\n }\n }\n\n const childComponents = renderChildComponents(options, updatedChildren);\n\n return (\n <RenderComponent\n component={component}\n siblings={updatedChildren}\n childComponents={childComponents}\n imageProps={imageProps}\n options={{ ...options }}\n images={images}\n key={`${component.id}`}\n hasTextBlockBanners={hasTextBlockBanners}\n textBlockBanners={textBlockBanners}\n />\n );\n })}\n </>\n );\n}\n\nexport default BuildPBComponents;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { PB_TYPE_TEXTBLOCK } from './constants';
|
|
2
|
+
import { ELEMENT } from '../../constants';
|
|
3
|
+
const getComponentsToInsertByType = (items, insertionType) => {
|
|
4
|
+
if (!items || !items.length) return [false, []];
|
|
5
|
+
if (insertionType === ELEMENT) {
|
|
6
|
+
const componentsToInject = items.filter(({
|
|
7
|
+
settings: {
|
|
8
|
+
insertionType: insertionTypeSetting,
|
|
9
|
+
startingPoint,
|
|
10
|
+
repeatEvery,
|
|
11
|
+
maxRepetitions
|
|
12
|
+
}
|
|
13
|
+
}) => insertionTypeSetting === insertionType && startingPoint !== 0 && repeatEvery !== 0 && maxRepetitions !== 0);
|
|
14
|
+
return [!!componentsToInject.length, componentsToInject];
|
|
15
|
+
}
|
|
16
|
+
if (insertionType === PB_TYPE_TEXTBLOCK) {
|
|
17
|
+
const textBlockBanners = items.filter(({
|
|
18
|
+
settings: {
|
|
19
|
+
insertionType: insertionTypeSetting
|
|
20
|
+
}
|
|
21
|
+
}) => insertionTypeSetting === PB_TYPE_TEXTBLOCK);
|
|
22
|
+
return [!!textBlockBanners.length, textBlockBanners];
|
|
23
|
+
}
|
|
24
|
+
return [false, []];
|
|
25
|
+
};
|
|
26
|
+
export default getComponentsToInsertByType;
|
|
27
|
+
//# sourceMappingURL=get-components-to-insert-by-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-components-to-insert-by-type.js","names":["PB_TYPE_TEXTBLOCK","ELEMENT","getComponentsToInsertByType","items","insertionType","length","componentsToInject","filter","settings","insertionTypeSetting","startingPoint","repeatEvery","maxRepetitions","textBlockBanners"],"sources":["../../../src/hooks/helpers/get-components-to-insert-by-type.js"],"sourcesContent":["import { PB_TYPE_TEXTBLOCK } from './constants';\nimport { ELEMENT } from '../../constants';\n\nconst getComponentsToInsertByType = (items, insertionType) => {\n if (!items || !items.length) return [false, []];\n\n if (insertionType === ELEMENT) {\n const componentsToInject = items.filter(\n ({\n settings: {\n insertionType: insertionTypeSetting,\n startingPoint,\n repeatEvery,\n maxRepetitions\n }\n }) =>\n insertionTypeSetting === insertionType &&\n (startingPoint !== 0 && repeatEvery !== 0 && maxRepetitions !== 0)\n );\n return [!!componentsToInject.length, componentsToInject];\n }\n if (insertionType === PB_TYPE_TEXTBLOCK) {\n const textBlockBanners = items.filter(\n ({ settings: { insertionType: insertionTypeSetting } }) =>\n insertionTypeSetting === PB_TYPE_TEXTBLOCK\n );\n\n return [!!textBlockBanners.length, textBlockBanners];\n }\n\n return [false, []];\n};\n\nexport default getComponentsToInsertByType;\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,aAAa;AAC/C,SAASC,OAAO,QAAQ,iBAAiB;AAEzC,MAAMC,2BAA2B,GAAGA,CAACC,KAAK,EAAEC,aAAa,KAAK;EAC5D,IAAI,CAACD,KAAK,IAAI,CAACA,KAAK,CAACE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EAE/C,IAAID,aAAa,KAAKH,OAAO,EAAE;IAC7B,MAAMK,kBAAkB,GAAGH,KAAK,CAACI,MAAM,CACrC,CAAC;MACCC,QAAQ,EAAE;QACRJ,aAAa,EAAEK,oBAAoB;QACnCC,aAAa;QACbC,WAAW;QACXC;MACF;IACF,CAAC,KACCH,oBAAoB,KAAKL,aAAa,IACrCM,aAAa,KAAK,CAAC,IAAIC,WAAW,KAAK,CAAC,IAAIC,cAAc,KAAK,CACpE,CAAC;IACD,OAAO,CAAC,CAAC,CAACN,kBAAkB,CAACD,MAAM,EAAEC,kBAAkB,CAAC;EAC1D;EACA,IAAIF,aAAa,KAAKJ,iBAAiB,EAAE;IACvC,MAAMa,gBAAgB,GAAGV,KAAK,CAACI,MAAM,CACnC,CAAC;MAAEC,QAAQ,EAAE;QAAEJ,aAAa,EAAEK;MAAqB;IAAE,CAAC,KACpDA,oBAAoB,KAAKT,iBAC7B,CAAC;IAED,OAAO,CAAC,CAAC,CAACa,gBAAgB,CAACR,MAAM,EAAEQ,gBAAgB,CAAC;EACtD;EAEA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACpB,CAAC;AAED,eAAeX,2BAA2B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
import updateTargetings from './update-targetings';
|
|
5
|
+
import { IMAGE } from '../../constants';
|
|
6
|
+
import { PB_TYPE_BANNER } from './constants';
|
|
7
|
+
const checkCollision = (typeToCheck, currentType) => {
|
|
8
|
+
if (currentType === IMAGE) return true;
|
|
9
|
+
return typeToCheck === IMAGE;
|
|
10
|
+
};
|
|
11
|
+
const injectElementComponents = (componentsToInject, children) => {
|
|
12
|
+
if (!componentsToInject.length) return children;
|
|
13
|
+
const updatedChildren = [];
|
|
14
|
+
componentsToInject.forEach(componentToInject => {
|
|
15
|
+
const {
|
|
16
|
+
type: componentsToInjectType,
|
|
17
|
+
settings: {
|
|
18
|
+
repeatEvery,
|
|
19
|
+
startingPoint,
|
|
20
|
+
maxRepetitions
|
|
21
|
+
}
|
|
22
|
+
} = componentToInject;
|
|
23
|
+
let repetitionTotal = 0;
|
|
24
|
+
let currentPosition = startingPoint;
|
|
25
|
+
children.forEach((child, i) => {
|
|
26
|
+
const isComponentMatch = componentToInject.name !== child.name;
|
|
27
|
+
const {
|
|
28
|
+
type
|
|
29
|
+
} = child;
|
|
30
|
+
const {
|
|
31
|
+
type: previousComponentType
|
|
32
|
+
} = children[i - 1] || {};
|
|
33
|
+
const {
|
|
34
|
+
type: nextComponentType
|
|
35
|
+
} = children[i + 1] || {};
|
|
36
|
+
const collidedBefore = checkCollision(previousComponentType, type);
|
|
37
|
+
const collidedAfter = checkCollision(nextComponentType, type);
|
|
38
|
+
if (collidedBefore || i === 0 && collidedAfter) {
|
|
39
|
+
if (currentPosition <= i) currentPosition += 1;
|
|
40
|
+
if (isComponentMatch) updatedChildren.push(child);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const hasReachedMax = maxRepetitions && repetitionTotal >= maxRepetitions;
|
|
44
|
+
if (!hasReachedMax && i === currentPosition) {
|
|
45
|
+
const updatedComponentToInject = repeatEvery && componentsToInjectType === PB_TYPE_BANNER ? updateTargetings(componentToInject, repetitionTotal) : componentToInject;
|
|
46
|
+
const updatedSettings = _objectSpread({}, updatedComponentToInject.settings);
|
|
47
|
+
updatedChildren.push(_objectSpread(_objectSpread({}, updatedComponentToInject), {}, {
|
|
48
|
+
settings: updatedSettings
|
|
49
|
+
}));
|
|
50
|
+
repetitionTotal += 1;
|
|
51
|
+
currentPosition += repeatEvery;
|
|
52
|
+
}
|
|
53
|
+
if (isComponentMatch) updatedChildren.push(child);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
return updatedChildren;
|
|
57
|
+
};
|
|
58
|
+
export default injectElementComponents;
|
|
59
|
+
//# sourceMappingURL=inject-element-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject-element-components.js","names":["updateTargetings","IMAGE","PB_TYPE_BANNER","checkCollision","typeToCheck","currentType","injectElementComponents","componentsToInject","children","length","updatedChildren","forEach","componentToInject","type","componentsToInjectType","settings","repeatEvery","startingPoint","maxRepetitions","repetitionTotal","currentPosition","child","i","isComponentMatch","name","previousComponentType","nextComponentType","collidedBefore","collidedAfter","push","hasReachedMax","updatedComponentToInject","updatedSettings","_objectSpread"],"sources":["../../../src/hooks/helpers/inject-element-components.js"],"sourcesContent":["import updateTargetings from './update-targetings';\nimport { IMAGE } from '../../constants';\nimport { PB_TYPE_BANNER } from './constants';\n\nconst checkCollision = (typeToCheck, currentType) => {\n if (currentType === IMAGE) return true;\n return typeToCheck === IMAGE;\n};\n\nconst injectElementComponents = (componentsToInject, children) => {\n if (!componentsToInject.length) return children;\n const updatedChildren = [];\n\n componentsToInject.forEach(componentToInject => {\n const {\n type: componentsToInjectType,\n settings: { repeatEvery, startingPoint, maxRepetitions }\n } = componentToInject;\n\n let repetitionTotal = 0;\n let currentPosition = startingPoint;\n\n children.forEach((child, i) => {\n const isComponentMatch = componentToInject.name !== child.name;\n const { type } = child;\n const { type: previousComponentType } = children[i - 1] || {};\n const { type: nextComponentType } = children[i + 1] || {};\n const collidedBefore = checkCollision(previousComponentType, type);\n const collidedAfter = checkCollision(nextComponentType, type);\n\n if (collidedBefore || (i === 0 && collidedAfter)) {\n if (currentPosition <= i) currentPosition += 1;\n if (isComponentMatch) updatedChildren.push(child);\n return;\n }\n\n const hasReachedMax = maxRepetitions && repetitionTotal >= maxRepetitions;\n if (!hasReachedMax && i === currentPosition) {\n const updatedComponentToInject =\n repeatEvery && componentsToInjectType === PB_TYPE_BANNER\n ? updateTargetings(componentToInject, repetitionTotal)\n : componentToInject;\n const updatedSettings = { ...updatedComponentToInject.settings };\n updatedChildren.push({ ...updatedComponentToInject, settings: updatedSettings });\n repetitionTotal += 1;\n currentPosition += repeatEvery;\n }\n\n if (isComponentMatch) updatedChildren.push(child);\n });\n });\n\n return updatedChildren;\n};\n\nexport default injectElementComponents;\n"],"mappings":";;;AAAA,OAAOA,gBAAgB,MAAM,qBAAqB;AAClD,SAASC,KAAK,QAAQ,iBAAiB;AACvC,SAASC,cAAc,QAAQ,aAAa;AAE5C,MAAMC,cAAc,GAAGA,CAACC,WAAW,EAAEC,WAAW,KAAK;EACnD,IAAIA,WAAW,KAAKJ,KAAK,EAAE,OAAO,IAAI;EACtC,OAAOG,WAAW,KAAKH,KAAK;AAC9B,CAAC;AAED,MAAMK,uBAAuB,GAAGA,CAACC,kBAAkB,EAAEC,QAAQ,KAAK;EAChE,IAAI,CAACD,kBAAkB,CAACE,MAAM,EAAE,OAAOD,QAAQ;EAC/C,MAAME,eAAe,GAAG,EAAE;EAE1BH,kBAAkB,CAACI,OAAO,CAACC,iBAAiB,IAAI;IAC9C,MAAM;MACJC,IAAI,EAAEC,sBAAsB;MAC5BC,QAAQ,EAAE;QAAEC,WAAW;QAAEC,aAAa;QAAEC;MAAe;IACzD,CAAC,GAAGN,iBAAiB;IAErB,IAAIO,eAAe,GAAG,CAAC;IACvB,IAAIC,eAAe,GAAGH,aAAa;IAEnCT,QAAQ,CAACG,OAAO,CAAC,CAACU,KAAK,EAAEC,CAAC,KAAK;MAC7B,MAAMC,gBAAgB,GAAGX,iBAAiB,CAACY,IAAI,KAAKH,KAAK,CAACG,IAAI;MAC9D,MAAM;QAAEX;MAAK,CAAC,GAAGQ,KAAK;MACtB,MAAM;QAAER,IAAI,EAAEY;MAAsB,CAAC,GAAGjB,QAAQ,CAACc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;MAC7D,MAAM;QAAET,IAAI,EAAEa;MAAkB,CAAC,GAAGlB,QAAQ,CAACc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;MACzD,MAAMK,cAAc,GAAGxB,cAAc,CAACsB,qBAAqB,EAAEZ,IAAI,CAAC;MAClE,MAAMe,aAAa,GAAGzB,cAAc,CAACuB,iBAAiB,EAAEb,IAAI,CAAC;MAE7D,IAAIc,cAAc,IAAKL,CAAC,KAAK,CAAC,IAAIM,aAAc,EAAE;QAChD,IAAIR,eAAe,IAAIE,CAAC,EAAEF,eAAe,IAAI,CAAC;QAC9C,IAAIG,gBAAgB,EAAEb,eAAe,CAACmB,IAAI,CAACR,KAAK,CAAC;QACjD;MACF;MAEA,MAAMS,aAAa,GAAGZ,cAAc,IAAIC,eAAe,IAAID,cAAc;MACzE,IAAI,CAACY,aAAa,IAAIR,CAAC,KAAKF,eAAe,EAAE;QAC3C,MAAMW,wBAAwB,GAC5Bf,WAAW,IAAIF,sBAAsB,KAAKZ,cAAc,GACpDF,gBAAgB,CAACY,iBAAiB,EAAEO,eAAe,CAAC,GACpDP,iBAAiB;QACvB,MAAMoB,eAAe,GAAAC,aAAA,KAAQF,wBAAwB,CAAChB,QAAQ,CAAE;QAChEL,eAAe,CAACmB,IAAI,CAAAI,aAAA,CAAAA,aAAA,KAAMF,wBAAwB;UAAEhB,QAAQ,EAAEiB;QAAe,EAAE,CAAC;QAChFb,eAAe,IAAI,CAAC;QACpBC,eAAe,IAAIJ,WAAW;MAChC;MAEA,IAAIO,gBAAgB,EAAEb,eAAe,CAACmB,IAAI,CAACR,KAAK,CAAC;IACnD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,OAAOX,eAAe;AACxB,CAAC;AAED,eAAeJ,uBAAuB"}
|
|
@@ -7,6 +7,7 @@ import Banner from '../../components/Banner';
|
|
|
7
7
|
import { getCollisions, checkIfHasCollided } from './check-collisions';
|
|
8
8
|
import updateTargetings from './update-targetings';
|
|
9
9
|
import { ALLOWED_BLOCK_TYPES } from '../../constants';
|
|
10
|
+
import { PB_TYPE_BANNER } from './constants';
|
|
10
11
|
const checkCanInjectBanner = (maxRepetitions, total) => {
|
|
11
12
|
if (!maxRepetitions) return true;
|
|
12
13
|
return total < maxRepetitions;
|
|
@@ -44,7 +45,8 @@ const injectTextblockBanners = ({
|
|
|
44
45
|
banners.forEach(banner => {
|
|
45
46
|
const {
|
|
46
47
|
name,
|
|
47
|
-
settings
|
|
48
|
+
settings,
|
|
49
|
+
type: typeToCheck
|
|
48
50
|
} = banner;
|
|
49
51
|
const {
|
|
50
52
|
repeatEvery,
|
|
@@ -75,7 +77,7 @@ const injectTextblockBanners = ({
|
|
|
75
77
|
bannerCounters[name].insertionPoint += repeatEvery;
|
|
76
78
|
bannerCounters[name].total += 1;
|
|
77
79
|
hasBanner = true;
|
|
78
|
-
if (repeatEvery) bannerPositionCounter.counter += 1;
|
|
80
|
+
if (repeatEvery && typeToCheck === PB_TYPE_BANNER) bannerPositionCounter.counter += 1;
|
|
79
81
|
}
|
|
80
82
|
bannerCounters[name].paragraphCounter += shouldCount ? 1 : 0;
|
|
81
83
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inject-textblock-banners.js","names":["React","Banner","getCollisions","checkIfHasCollided","updateTargetings","ALLOWED_BLOCK_TYPES","checkCanInjectBanner","maxRepetitions","total","injectTextblockBanners","componentName","parsedTextBlock","bannerContext","bannerCounters","banners","siblings","pbOptions","bannerPositionCounter","blockTracker","collidedWithPrevious","collidedWithNext","updatedBlock","length","blocksLength","forEach","block","blockIndex","type","props","children","paragraphContent","hasBanner","shouldCount","includes","addBlock","banner","name","settings","repeatEvery","paragraphCounter","insertionPoint","canInsertAfterPreviousBlock","lastBlockType","hasCollided","canInjectBanner","bannerWithTargetings","counter","bannerKey","targetings","updatedBanner","_objectSpread","push","createElement","_extends","key"],"sources":["../../../src/hooks/helpers/inject-textblock-banners.js"],"sourcesContent":["import React from 'react';\nimport Banner from '../../components/Banner';\nimport { getCollisions, checkIfHasCollided } from './check-collisions';\nimport updateTargetings from './update-targetings';\nimport { ALLOWED_BLOCK_TYPES } from '../../constants';\n\nconst checkCanInjectBanner = (maxRepetitions, total) => {\n if (!maxRepetitions) return true;\n return total < maxRepetitions;\n};\n\nconst injectTextblockBanners = ({ componentName, parsedTextBlock, bannerContext }) => {\n const {\n bannerCounters,\n banners,\n siblings,\n pbOptions,\n bannerPositionCounter,\n blockTracker\n } = bannerContext;\n const [collidedWithPrevious, collidedWithNext] = getCollisions(componentName, siblings);\n const updatedBlock = [];\n const { length: blocksLength } = parsedTextBlock;\n\n parsedTextBlock.forEach((block, blockIndex) => {\n const { type, props: { children: paragraphContent } = {} } = block;\n let hasBanner = false;\n const shouldCount = ALLOWED_BLOCK_TYPES.includes(type);\n if (!paragraphContent || typeof type !== 'string') {\n return addBlock(block, blockTracker, updatedBlock);\n }\n\n banners.forEach(banner => {\n const { name, settings } = banner;\n const { repeatEvery, maxRepetitions } = settings;\n\n const { total, paragraphCounter, insertionPoint } = bannerCounters[name];\n const canInsertAfterPreviousBlock =\n !blockTracker.lastBlockType || ALLOWED_BLOCK_TYPES.includes(blockTracker.lastBlockType);\n\n const hasCollided =\n !canInsertAfterPreviousBlock ||\n checkIfHasCollided(blockIndex, blocksLength, collidedWithPrevious, collidedWithNext);\n const canInjectBanner = checkCanInjectBanner(maxRepetitions, total);\n\n if (canInjectBanner && paragraphCounter === insertionPoint) {\n if (hasBanner || hasCollided) {\n bannerCounters[name].insertionPoint += 1;\n bannerCounters[name].paragraphCounter += 1;\n return;\n }\n\n const bannerWithTargetings = repeatEvery\n ? updateTargetings(banner, bannerPositionCounter.counter)\n : banner;\n const bannerKey = `${bannerWithTargetings.settings.targetings}-${paragraphCounter}`;\n const updatedBanner = {\n ...pbOptions,\n ...bannerWithTargetings.settings,\n name\n };\n updatedBlock.push(<Banner key={bannerKey} {...updatedBanner} />);\n bannerCounters[name].insertionPoint += repeatEvery;\n bannerCounters[name].total += 1;\n hasBanner = true;\n if (repeatEvery) bannerPositionCounter.counter += 1;\n }\n\n bannerCounters[name].paragraphCounter += shouldCount ? 1 : 0;\n });\n\n return addBlock(block, blockTracker, updatedBlock);\n });\n\n return updatedBlock;\n};\n\nconst addBlock = (block, blockTracker, updatedBlock) => {\n // eslint-disable-next-line no-param-reassign\n if (block.type) blockTracker.lastBlockType = block.type;\n return updatedBlock.push(block);\n};\n\nexport default injectTextblockBanners;\n"],"mappings":";;;;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,MAAM,MAAM,yBAAyB;AAC5C,SAASC,aAAa,EAAEC,kBAAkB,QAAQ,oBAAoB;AACtE,OAAOC,gBAAgB,MAAM,qBAAqB;AAClD,SAASC,mBAAmB,QAAQ,iBAAiB;
|
|
1
|
+
{"version":3,"file":"inject-textblock-banners.js","names":["React","Banner","getCollisions","checkIfHasCollided","updateTargetings","ALLOWED_BLOCK_TYPES","PB_TYPE_BANNER","checkCanInjectBanner","maxRepetitions","total","injectTextblockBanners","componentName","parsedTextBlock","bannerContext","bannerCounters","banners","siblings","pbOptions","bannerPositionCounter","blockTracker","collidedWithPrevious","collidedWithNext","updatedBlock","length","blocksLength","forEach","block","blockIndex","type","props","children","paragraphContent","hasBanner","shouldCount","includes","addBlock","banner","name","settings","typeToCheck","repeatEvery","paragraphCounter","insertionPoint","canInsertAfterPreviousBlock","lastBlockType","hasCollided","canInjectBanner","bannerWithTargetings","counter","bannerKey","targetings","updatedBanner","_objectSpread","push","createElement","_extends","key"],"sources":["../../../src/hooks/helpers/inject-textblock-banners.js"],"sourcesContent":["import React from 'react';\nimport Banner from '../../components/Banner';\nimport { getCollisions, checkIfHasCollided } from './check-collisions';\nimport updateTargetings from './update-targetings';\nimport { ALLOWED_BLOCK_TYPES } from '../../constants';\nimport { PB_TYPE_BANNER } from './constants';\n\nconst checkCanInjectBanner = (maxRepetitions, total) => {\n if (!maxRepetitions) return true;\n return total < maxRepetitions;\n};\n\nconst injectTextblockBanners = ({ componentName, parsedTextBlock, bannerContext }) => {\n const {\n bannerCounters,\n banners,\n siblings,\n pbOptions,\n bannerPositionCounter,\n blockTracker\n } = bannerContext;\n const [collidedWithPrevious, collidedWithNext] = getCollisions(componentName, siblings);\n const updatedBlock = [];\n const { length: blocksLength } = parsedTextBlock;\n\n parsedTextBlock.forEach((block, blockIndex) => {\n const { type, props: { children: paragraphContent } = {} } = block;\n let hasBanner = false;\n const shouldCount = ALLOWED_BLOCK_TYPES.includes(type);\n if (!paragraphContent || typeof type !== 'string') {\n return addBlock(block, blockTracker, updatedBlock);\n }\n\n banners.forEach(banner => {\n const { name, settings, type: typeToCheck } = banner;\n const { repeatEvery, maxRepetitions } = settings;\n\n const { total, paragraphCounter, insertionPoint } = bannerCounters[name];\n const canInsertAfterPreviousBlock =\n !blockTracker.lastBlockType || ALLOWED_BLOCK_TYPES.includes(blockTracker.lastBlockType);\n\n const hasCollided =\n !canInsertAfterPreviousBlock ||\n checkIfHasCollided(blockIndex, blocksLength, collidedWithPrevious, collidedWithNext);\n const canInjectBanner = checkCanInjectBanner(maxRepetitions, total);\n\n if (canInjectBanner && paragraphCounter === insertionPoint) {\n if (hasBanner || hasCollided) {\n bannerCounters[name].insertionPoint += 1;\n bannerCounters[name].paragraphCounter += 1;\n return;\n }\n\n const bannerWithTargetings = repeatEvery\n ? updateTargetings(banner, bannerPositionCounter.counter)\n : banner;\n const bannerKey = `${bannerWithTargetings.settings.targetings}-${paragraphCounter}`;\n const updatedBanner = {\n ...pbOptions,\n ...bannerWithTargetings.settings,\n name\n };\n updatedBlock.push(<Banner key={bannerKey} {...updatedBanner} />);\n bannerCounters[name].insertionPoint += repeatEvery;\n bannerCounters[name].total += 1;\n hasBanner = true;\n if (repeatEvery && typeToCheck === PB_TYPE_BANNER) bannerPositionCounter.counter += 1;\n }\n\n bannerCounters[name].paragraphCounter += shouldCount ? 1 : 0;\n });\n\n return addBlock(block, blockTracker, updatedBlock);\n });\n\n return updatedBlock;\n};\n\nconst addBlock = (block, blockTracker, updatedBlock) => {\n // eslint-disable-next-line no-param-reassign\n if (block.type) blockTracker.lastBlockType = block.type;\n return updatedBlock.push(block);\n};\n\nexport default injectTextblockBanners;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blaze-cms/react-page-builder",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.142.0-alpha.0",
|
|
4
4
|
"description": "Blaze react page builder",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib-es/index.js",
|
|
@@ -89,5 +89,5 @@
|
|
|
89
89
|
"lib/*",
|
|
90
90
|
"lib-es/*"
|
|
91
91
|
],
|
|
92
|
-
"gitHead": "
|
|
92
|
+
"gitHead": "a8c8a5250ea81ce37cbb8864089c2cc157586135"
|
|
93
93
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import dayjs from 'dayjs';
|
|
4
|
+
import LocalizedFormat from 'dayjs/plugin/localizedFormat';
|
|
5
|
+
import Wrapper from '../Wrapper';
|
|
6
|
+
|
|
7
|
+
dayjs.extend(LocalizedFormat);
|
|
8
|
+
|
|
9
|
+
const DateTime = ({ format, customFormat, modifier }) => {
|
|
10
|
+
const dateFormat = customFormat ? customFormat.toUpperCase() : format;
|
|
11
|
+
|
|
12
|
+
if (!dateFormat) return null;
|
|
13
|
+
|
|
14
|
+
const formatedDate = dayjs().format(dateFormat);
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<Wrapper className="date" modifiers={modifier}>
|
|
18
|
+
{formatedDate}
|
|
19
|
+
</Wrapper>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
DateTime.propTypes = {
|
|
24
|
+
format: PropTypes.string.isRequired,
|
|
25
|
+
customFormat: PropTypes.string,
|
|
26
|
+
modifier: PropTypes.string
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
DateTime.defaultProps = {
|
|
30
|
+
modifier: null,
|
|
31
|
+
customFormat: ''
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export default DateTime;
|
package/src/components/index.js
CHANGED
|
@@ -27,6 +27,7 @@ export default {
|
|
|
27
27
|
import(/* webpackChunkName: "blazePbSearchFilteSort" */ './SearchFilterSort')
|
|
28
28
|
),
|
|
29
29
|
modal: dynamic(() => import(/* webpackChunkName: "blazePbModal" */ './Modal')),
|
|
30
|
+
datetime: dynamic(() => import(/* webpackChunkName: "blazePbDateTime" */ './DateTime')),
|
|
30
31
|
code: dynamic(() => import(/* webpackChunkName: "blazePbCode" */ './Code')),
|
|
31
32
|
menu: dynamic(() => import(/* webpackChunkName: "blazePbMenu" */ './Menu')),
|
|
32
33
|
menuitem: dynamic(() => import(/* webpackChunkName: "blazePbMenuItem" */ './MenuItem')),
|
|
@@ -2,8 +2,8 @@ import React from 'react';
|
|
|
2
2
|
import cloneDeep from 'lodash.clonedeep';
|
|
3
3
|
import GlobalLightbox from '../../components/Image/GlobalLightbox';
|
|
4
4
|
import RenderComponent from './RenderComponent';
|
|
5
|
-
import
|
|
6
|
-
import
|
|
5
|
+
import getComponentsToInsertByType from './get-components-to-insert-by-type';
|
|
6
|
+
import injectElementComponents from './inject-element-components';
|
|
7
7
|
import StoreImages from './StoreImages';
|
|
8
8
|
import getLightboxImages from './get-lightbox-images';
|
|
9
9
|
import insertBanners from './insert-banners';
|
|
@@ -57,16 +57,23 @@ function BuildPBComponents(components, options = {}, rootLevel = false) {
|
|
|
57
57
|
)}
|
|
58
58
|
{components.map(component => {
|
|
59
59
|
const { items = [] } = component;
|
|
60
|
-
const [
|
|
61
|
-
|
|
60
|
+
const [
|
|
61
|
+
hasElementInsertionComponents,
|
|
62
|
+
elementInsertionComponents
|
|
63
|
+
] = getComponentsToInsertByType(items, ELEMENT);
|
|
64
|
+
|
|
65
|
+
const [hasTextBlockBanners, textBlockBanners] = getComponentsToInsertByType(
|
|
66
|
+
items,
|
|
67
|
+
PB_TYPE_TEXTBLOCK
|
|
68
|
+
);
|
|
62
69
|
let updatedChildren =
|
|
63
70
|
items &&
|
|
64
71
|
cloneDeep(items).filter(
|
|
65
72
|
({ settings: { insertionType } = {} }) => insertionType !== PB_TYPE_TEXTBLOCK
|
|
66
73
|
);
|
|
67
74
|
|
|
68
|
-
if (
|
|
69
|
-
updatedChildren =
|
|
75
|
+
if (hasElementInsertionComponents) {
|
|
76
|
+
updatedChildren = injectElementComponents(elementInsertionComponents, updatedChildren);
|
|
70
77
|
} else {
|
|
71
78
|
// TODO: this block is for banner retrocompatibility, once completly migrated remove it as well as all related helpers
|
|
72
79
|
const bannerToInject = checkBannerInsertionSet(updatedChildren);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { PB_TYPE_TEXTBLOCK } from './constants';
|
|
2
|
+
import { ELEMENT } from '../../constants';
|
|
3
|
+
|
|
4
|
+
const getComponentsToInsertByType = (items, insertionType) => {
|
|
5
|
+
if (!items || !items.length) return [false, []];
|
|
6
|
+
|
|
7
|
+
if (insertionType === ELEMENT) {
|
|
8
|
+
const componentsToInject = items.filter(
|
|
9
|
+
({
|
|
10
|
+
settings: {
|
|
11
|
+
insertionType: insertionTypeSetting,
|
|
12
|
+
startingPoint,
|
|
13
|
+
repeatEvery,
|
|
14
|
+
maxRepetitions
|
|
15
|
+
}
|
|
16
|
+
}) =>
|
|
17
|
+
insertionTypeSetting === insertionType &&
|
|
18
|
+
(startingPoint !== 0 && repeatEvery !== 0 && maxRepetitions !== 0)
|
|
19
|
+
);
|
|
20
|
+
return [!!componentsToInject.length, componentsToInject];
|
|
21
|
+
}
|
|
22
|
+
if (insertionType === PB_TYPE_TEXTBLOCK) {
|
|
23
|
+
const textBlockBanners = items.filter(
|
|
24
|
+
({ settings: { insertionType: insertionTypeSetting } }) =>
|
|
25
|
+
insertionTypeSetting === PB_TYPE_TEXTBLOCK
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
return [!!textBlockBanners.length, textBlockBanners];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return [false, []];
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export default getComponentsToInsertByType;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import updateTargetings from './update-targetings';
|
|
2
|
+
import { IMAGE } from '../../constants';
|
|
3
|
+
import { PB_TYPE_BANNER } from './constants';
|
|
4
|
+
|
|
5
|
+
const checkCollision = (typeToCheck, currentType) => {
|
|
6
|
+
if (currentType === IMAGE) return true;
|
|
7
|
+
return typeToCheck === IMAGE;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const injectElementComponents = (componentsToInject, children) => {
|
|
11
|
+
if (!componentsToInject.length) return children;
|
|
12
|
+
const updatedChildren = [];
|
|
13
|
+
|
|
14
|
+
componentsToInject.forEach(componentToInject => {
|
|
15
|
+
const {
|
|
16
|
+
type: componentsToInjectType,
|
|
17
|
+
settings: { repeatEvery, startingPoint, maxRepetitions }
|
|
18
|
+
} = componentToInject;
|
|
19
|
+
|
|
20
|
+
let repetitionTotal = 0;
|
|
21
|
+
let currentPosition = startingPoint;
|
|
22
|
+
|
|
23
|
+
children.forEach((child, i) => {
|
|
24
|
+
const isComponentMatch = componentToInject.name !== child.name;
|
|
25
|
+
const { type } = child;
|
|
26
|
+
const { type: previousComponentType } = children[i - 1] || {};
|
|
27
|
+
const { type: nextComponentType } = children[i + 1] || {};
|
|
28
|
+
const collidedBefore = checkCollision(previousComponentType, type);
|
|
29
|
+
const collidedAfter = checkCollision(nextComponentType, type);
|
|
30
|
+
|
|
31
|
+
if (collidedBefore || (i === 0 && collidedAfter)) {
|
|
32
|
+
if (currentPosition <= i) currentPosition += 1;
|
|
33
|
+
if (isComponentMatch) updatedChildren.push(child);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const hasReachedMax = maxRepetitions && repetitionTotal >= maxRepetitions;
|
|
38
|
+
if (!hasReachedMax && i === currentPosition) {
|
|
39
|
+
const updatedComponentToInject =
|
|
40
|
+
repeatEvery && componentsToInjectType === PB_TYPE_BANNER
|
|
41
|
+
? updateTargetings(componentToInject, repetitionTotal)
|
|
42
|
+
: componentToInject;
|
|
43
|
+
const updatedSettings = { ...updatedComponentToInject.settings };
|
|
44
|
+
updatedChildren.push({ ...updatedComponentToInject, settings: updatedSettings });
|
|
45
|
+
repetitionTotal += 1;
|
|
46
|
+
currentPosition += repeatEvery;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (isComponentMatch) updatedChildren.push(child);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return updatedChildren;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export default injectElementComponents;
|
|
@@ -3,6 +3,7 @@ import Banner from '../../components/Banner';
|
|
|
3
3
|
import { getCollisions, checkIfHasCollided } from './check-collisions';
|
|
4
4
|
import updateTargetings from './update-targetings';
|
|
5
5
|
import { ALLOWED_BLOCK_TYPES } from '../../constants';
|
|
6
|
+
import { PB_TYPE_BANNER } from './constants';
|
|
6
7
|
|
|
7
8
|
const checkCanInjectBanner = (maxRepetitions, total) => {
|
|
8
9
|
if (!maxRepetitions) return true;
|
|
@@ -31,7 +32,7 @@ const injectTextblockBanners = ({ componentName, parsedTextBlock, bannerContext
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
banners.forEach(banner => {
|
|
34
|
-
const { name, settings } = banner;
|
|
35
|
+
const { name, settings, type: typeToCheck } = banner;
|
|
35
36
|
const { repeatEvery, maxRepetitions } = settings;
|
|
36
37
|
|
|
37
38
|
const { total, paragraphCounter, insertionPoint } = bannerCounters[name];
|
|
@@ -63,7 +64,7 @@ const injectTextblockBanners = ({ componentName, parsedTextBlock, bannerContext
|
|
|
63
64
|
bannerCounters[name].insertionPoint += repeatEvery;
|
|
64
65
|
bannerCounters[name].total += 1;
|
|
65
66
|
hasBanner = true;
|
|
66
|
-
if (repeatEvery) bannerPositionCounter.counter += 1;
|
|
67
|
+
if (repeatEvery && typeToCheck === PB_TYPE_BANNER) bannerPositionCounter.counter += 1;
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
bannerCounters[name].paragraphCounter += shouldCount ? 1 : 0;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { render } from '@testing-library/react';
|
|
6
|
+
import '@testing-library/jest-dom/extend-expect';
|
|
7
|
+
import DateTime from '../../../../../src/components/DateTime';
|
|
8
|
+
|
|
9
|
+
describe('DateTime component', () => {
|
|
10
|
+
it('renders null if both format and customFormat are not provided', () => {
|
|
11
|
+
const { container } = render(<DateTime />);
|
|
12
|
+
expect(container.firstChild).toBeNull();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('renders correctly with LT format', () => {
|
|
16
|
+
const { getByText } = render(<DateTime format="LT" />);
|
|
17
|
+
expect(getByText(/\d{1,2}:\d{2} [AP]M/)).toBeInTheDocument();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('renders correctly with LTS format', () => {
|
|
21
|
+
const { getByText } = render(<DateTime format="LTS" />);
|
|
22
|
+
expect(getByText(/\d{1,2}:\d{2}:\d{2} [AP]M/)).toBeInTheDocument();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('renders correctly with L format', () => {
|
|
26
|
+
const { getByText } = render(<DateTime format="L" />);
|
|
27
|
+
expect(getByText(/\d{2}\/\d{2}\/\d{4}/)).toBeInTheDocument();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('renders correctly with LL format', () => {
|
|
31
|
+
const { getByText } = render(<DateTime format="LL" />);
|
|
32
|
+
expect(
|
|
33
|
+
getByText(
|
|
34
|
+
/(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}/
|
|
35
|
+
)
|
|
36
|
+
).toBeInTheDocument();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('renders correctly with LLL format', () => {
|
|
40
|
+
const { getByText } = render(<DateTime format="LLL" />);
|
|
41
|
+
expect(
|
|
42
|
+
getByText(
|
|
43
|
+
/(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4} \d{1,2}:\d{2} [AP]M/
|
|
44
|
+
)
|
|
45
|
+
).toBeInTheDocument();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// sonarignore:start
|
|
49
|
+
it('renders correctly with LLLL format', () => {
|
|
50
|
+
const { getByText } = render(<DateTime format="LLLL" />);
|
|
51
|
+
expect(
|
|
52
|
+
getByText(
|
|
53
|
+
/(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday), (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4} \d{1,2}:\d{2} [AP]M/
|
|
54
|
+
)
|
|
55
|
+
).toBeInTheDocument();
|
|
56
|
+
});
|
|
57
|
+
// sonarignore:end
|
|
58
|
+
|
|
59
|
+
it('renders correctly with l format', () => {
|
|
60
|
+
const { getByText } = render(<DateTime format="l" />);
|
|
61
|
+
expect(getByText(/\d{1,2}\/\d{1,2}\/\d{4}/)).toBeInTheDocument();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('renders correctly with ll format', () => {
|
|
65
|
+
const { getByText } = render(<DateTime format="ll" />);
|
|
66
|
+
expect(
|
|
67
|
+
getByText(/(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, \d{4}/)
|
|
68
|
+
).toBeInTheDocument();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('renders correctly with lll format', () => {
|
|
72
|
+
const { getByText } = render(<DateTime format="lll" />);
|
|
73
|
+
expect(
|
|
74
|
+
getByText(
|
|
75
|
+
/(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, \d{4} \d{1,2}:\d{2} [AP]M/
|
|
76
|
+
)
|
|
77
|
+
).toBeInTheDocument();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('renders correctly with llll format', () => {
|
|
81
|
+
const { getByText } = render(<DateTime format="llll" />);
|
|
82
|
+
expect(
|
|
83
|
+
getByText(
|
|
84
|
+
/(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat), (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, \d{4} \d{1,2}:\d{2} [AP]M/
|
|
85
|
+
)
|
|
86
|
+
).toBeInTheDocument();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('renders correctly with customFormat', () => {
|
|
90
|
+
const customFormat = 'YYYY-MM-DD';
|
|
91
|
+
const { getByText } = render(<DateTime format="L" customFormat={customFormat} />);
|
|
92
|
+
expect(getByText(/\d{4}-\d{2}-\d{2}/)).toBeInTheDocument();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('renders correctly with customFormat and modifier', () => {
|
|
96
|
+
const customFormat = 'MM-DD-YYYY';
|
|
97
|
+
const modifier = 'bold';
|
|
98
|
+
const { getByText } = render(
|
|
99
|
+
<DateTime format="L" customFormat={customFormat} modifier={modifier} />
|
|
100
|
+
);
|
|
101
|
+
const dateElement = getByText(/\d{2}-\d{2}-\d{4}/);
|
|
102
|
+
expect(dateElement).toBeInTheDocument();
|
|
103
|
+
expect(dateElement).toHaveClass('bold');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -46,6 +46,10 @@ Object {
|
|
|
46
46
|
"$$typeof": Symbol(react.forward_ref),
|
|
47
47
|
"render": [Function],
|
|
48
48
|
},
|
|
49
|
+
"datetime": Object {
|
|
50
|
+
"$$typeof": Symbol(react.forward_ref),
|
|
51
|
+
"render": [Function],
|
|
52
|
+
},
|
|
49
53
|
"emailconfirm": Object {
|
|
50
54
|
"$$typeof": Symbol(react.forward_ref),
|
|
51
55
|
"render": [Function],
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import '@testing-library/jest-dom/extend-expect';
|
|
2
|
-
import
|
|
2
|
+
import getComponentsToInsertByType from '../../../../../src/hooks/helpers/get-components-to-insert-by-type';
|
|
3
3
|
|
|
4
4
|
const id = 'ID';
|
|
5
5
|
const mockBanner = {
|
|
@@ -17,21 +17,21 @@ const items = [
|
|
|
17
17
|
{ type: 'textblock', id, settings: {} }
|
|
18
18
|
];
|
|
19
19
|
|
|
20
|
-
describe('
|
|
20
|
+
describe('getComponentsToInsertByType function', () => {
|
|
21
21
|
it('should return false and empty array when there are no items', () => {
|
|
22
|
-
const [noChildren, banner] =
|
|
22
|
+
const [noChildren, banner] = getComponentsToInsertByType();
|
|
23
23
|
expect(noChildren).toEqual(false);
|
|
24
24
|
expect(banner).toEqual([]);
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
it('should return false and empty array when there is no banner', () => {
|
|
28
|
-
const [hasBanner, banner] =
|
|
28
|
+
const [hasBanner, banner] = getComponentsToInsertByType(items, 'element');
|
|
29
29
|
expect(hasBanner).toEqual(false);
|
|
30
30
|
expect(banner).toEqual([]);
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
it('should return banner element when there is a banner of specified type', () => {
|
|
34
|
-
const [hasBanner, banner] =
|
|
34
|
+
const [hasBanner, banner] = getComponentsToInsertByType([...items, mockBanner], 'element');
|
|
35
35
|
expect(hasBanner).toEqual(true);
|
|
36
36
|
expect(banner).toEqual(banner);
|
|
37
37
|
});
|