Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
8d58f50
add card slider component
bap-dunghh Apr 27, 2025
181d4a6
Merge pull request #1 from Huynhdung295/component/card-slider
Huynhdung295 Apr 27, 2025
3849da9
Update UI/UX Card Slider
Huynhdung295 Apr 28, 2025
094152d
Merge pull request #2 from Huynhdung295/component/card-slider
Huynhdung295 Apr 28, 2025
5827caf
Create Plugin Preview mode - Export code html - Change styles of cards
Huynhdung295 Apr 29, 2025
7755b81
Fix confuse code preview
Huynhdung295 Apr 29, 2025
521a945
Merge pull request #3 from Huynhdung295/component/card-slider
Huynhdung295 Apr 29, 2025
e9d7463
Sync data between Mobile with Desktop
Huynhdung295 Apr 29, 2025
f8ca93b
Merge pull request #4 from Huynhdung295/component/card-slider
Huynhdung295 Apr 29, 2025
08e41d9
Remove ExportHTML - i18 for label Card slider
Huynhdung295 Apr 29, 2025
a907475
Merge pull request #5 from Huynhdung295/component/card-slider
Huynhdung295 Apr 29, 2025
9d0cb7d
Remove default js
Huynhdung295 Apr 29, 2025
32ee068
Merge pull request #6 from Huynhdung295/component/card-slider
Huynhdung295 Apr 29, 2025
97da52c
Change icon previewHtml - filename genHtml
Huynhdung295 Apr 29, 2025
315f19b
Merge pull request #7 from Huynhdung295/component/card-slider
Huynhdung295 Apr 29, 2025
978074e
Remove PreviewLiveider - Update methods/index.js
Huynhdung295 Apr 29, 2025
bb88006
Merge pull request #8 from Huynhdung295/component/card-slider
Huynhdung295 Apr 29, 2025
68f699d
Clean usage func generatePageFullHtml
Huynhdung295 Apr 29, 2025
bcd2caf
Merge pull request #9 from Huynhdung295/component/card-slider
Huynhdung295 Apr 29, 2025
f652eef
Merge https://github.com/youngmonkeys/ezygrapes into dev
Huynhdung295 May 3, 2025
8ca57f8
Fix bug card slider
Huynhdung295 May 4, 2025
ec1f0cd
Merge pull request #10 from Huynhdung295/fix/card-slider
Huynhdung295 May 4, 2025
1161059
Merge branch 'youngmonkeys:dev' into dev
Huynhdung295 May 5, 2025
972d7cd
Implement component postcards
Huynhdung295 May 6, 2025
42daefd
Re-open card slider
Huynhdung295 May 6, 2025
f4d3f24
Merge pull request #11 from Huynhdung295/component/postcards
Huynhdung295 May 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
173 changes: 105 additions & 68 deletions plugins/preset-webpage/src/components/card-slider/components.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,6 @@ export default (editor) => {
extend: 'image',
model: {
defaults: {
// copyable: false,
// pastable: false,
draggable: false,
droppable: false,
traits: [
Expand All @@ -133,130 +131,157 @@ export default (editor) => {
},
});

const originalDeleteCommand = editor.Commands.get('core:component-delete');

editor.Commands.add('core:component-delete', {
run(editor, sender, options) {
const selected = editor.getSelected();
if (!selected) return;

if (!selected) {
return;
};

let target = selected;

if (selected.is('image')) {
const parent = selected.parent();
if (target.is('image')) {
const parent = target.parent();
if (parent && parent.is('card-slider-slide')) {
target = parent;
}
}

let containerToDelete = target;

if (!target.is('card-slider-slide')) {
originalDeleteCommand.run(editor, sender, options);
return;
}

const parent = target.parent();
if (!parent) return;

if (!parent) {
return;
};

const isDesktop = !!parent.closest('.slider-wrapper-desktop');
const isMobile = !!parent.closest('.swiper-wrapper');

if (isMobile) {
alert('Please switch to desktop view to delete slides.');
alert(editor.I18n.t("errors.card_slider.mobile_delete"))
return;
}

let slides = [];

if (isDesktop) {
slides = parent.components().filter((comp) => comp.is('card-slider-slide'));
}

if (slides.length <= 3) {
alert('You must keep at least 3 slides.');
alert(editor.I18n.t("errors.card_slider.item_min"));
return;
}

const idx = slides.indexOf(containerToDelete);
containerToDelete.remove();

const idx = slides.indexOf(target);
target.remove();

const mobileWrapper = editor.getWrapper().find('.card-swiper-custom .swiper-wrapper')[0];
if (mobileWrapper) {
const mobileSlides = mobileWrapper.components().filter((comp) => comp.getClasses().includes('swiper-slide'));
const mobileSlides = mobileWrapper.components().filter((comp) =>
comp.getClasses().includes('swiper-slide')
);
const targetMobileSlide = mobileSlides[idx];
if (targetMobileSlide) {
targetMobileSlide.remove();
}
}
},
}
});

const originalPasteCommand = editor.Commands.get('core:paste');

editor.Commands.add('core:paste', {
run(editor) {
const selected = editor.getSelected();
if (!selected) return;

if (!selected) {
return;
};

let target = selected;

if (selected.is('image')) {
const parent = selected.parent();
if (target.is('image')) {
const parent = target.parent();
if (parent && parent.is('card-slider-slide')) {
target = parent;
}
}


if (!target.is('card-slider-slide')) {
originalPasteCommand.run(editor);
return;
}

const parent = target.parent();
if (!parent) return;

if (!parent) {
return;
};

const isDesktop = !!parent.closest('.slider-wrapper-desktop');
const isMobile = !!parent.closest('.swiper-wrapper');

if (isMobile) {
alert('Please switch to desktop view to add slides.');
alert(editor.I18n.t("errors.card_slider.mobile_add"))
return;
}

let slides = [];

if (isDesktop) {
slides = parent.components().filter((comp) => comp.is('card-slider-slide'));
}

if (slides.length >= 5) {
alert('You cannot add more than 5 slides.');
alert(editor.I18n.t("errors.card_slider.item_max"));
return;
}

if (target.is('card-slider-slide')) {
const cloned = target.clone();
parent.append(cloned);
editor.select(cloned);

const mobileWrapper = editor.getWrapper().find('.card-swiper-custom .swiper-wrapper')[0];
if (mobileWrapper) {
mobileWrapper.append({
tagName: 'div',
attributes: { class: 'swiper-slide' },
components: [
{
type: 'card-slider-slide',
attributes: cloned.getAttributes(),
components: cloned.components().map((child) => child.toJSON()),
},
],
});
}
} else {
alert('Only card-slides or images inside slides can be pasted.');

const cloned = target.clone();
parent.append(cloned);
editor.select(cloned);

const mobileWrapper = editor.getWrapper().find('.card-swiper-custom .swiper-wrapper')[0];
if (mobileWrapper) {
mobileWrapper.append({
tagName: 'div',
attributes: { class: 'swiper-slide' },
components: [
{
type: 'card-slider-slide',
attributes: cloned.getAttributes(),
components: cloned.components().map((child) => child.toJSON()),
},
],
});
}
},
}
});

function syncDesktopToMobile(editor) {
const desktopWrapper = editor.getWrapper().find('.slider-wrapper-desktop')[0];
const mobileWrapper = editor.getWrapper().find('.card-swiper-custom .swiper-wrapper')[0];
if (!desktopWrapper || !mobileWrapper) return;
if (!desktopWrapper || !mobileWrapper) {
return;
};

const desktopSlides = desktopWrapper.components().filter((comp) => comp.is('card-slider-slide'));
const mobileSlides = mobileWrapper.components().filter((comp) => comp.getClasses().includes('swiper-slide'));

desktopSlides.forEach((desktopSlide, idx) => {
const mobileSlide = mobileSlides[idx];
if (!mobileSlide) return;
if (!mobileSlide) {
return;
};

const mobileLink = mobileSlide.components().filter((comp) => comp.is('card-slider-slide'))[0];
if (!mobileLink) return;
if (!mobileLink) {
return;
};

const href = desktopSlide.get('href') || '';
const target = desktopSlide.get('target') || '_self';
Expand All @@ -281,17 +306,23 @@ export default (editor) => {
function syncMobileToDesktop(editor) {
const mobileWrapper = editor.getWrapper().find('.card-swiper-custom .swiper-wrapper')[0];
const desktopWrapper = editor.getWrapper().find('.slider-wrapper-desktop')[0];
if (!mobileWrapper || !desktopWrapper) return;
if (!mobileWrapper || !desktopWrapper) {
return;
};

const mobileSlides = mobileWrapper.components().filter((comp) => comp.getClasses().includes('swiper-slide'));
const desktopSlides = desktopWrapper.components().filter((comp) => comp.is('card-slider-slide'));

mobileSlides.forEach((mobileSlide, idx) => {
const desktopSlide = desktopSlides[idx];
if (!desktopSlide) return;
if (!desktopSlide) {
return;
};

const mobileLink = mobileSlide.components().filter((comp) => comp.is('card-slider-slide'))[0];
if (!mobileLink) return;
if (!mobileLink) {
return;
};

const href = mobileLink.get('href') || '';
const target = mobileLink.get('target') || '_self';
Expand All @@ -314,11 +345,17 @@ export default (editor) => {
});
}
editor.on('component:update:attributes', (model) => {
if (!model) return;
if (!model.is('card-slider-slide') && !model.is('image')) return;
if (!model) {
return;
};
if (!model.is('card-slider-slide') && !model.is('image')) {
return;
};

const parent = model.parent();
if (!parent) return;
if (!parent) {
return;
};

const isDesktop = !!parent.closest('.slider-wrapper-desktop');
const isMobile = !!parent.closest('.swiper-wrapper');
Expand Down
31 changes: 31 additions & 0 deletions plugins/preset-webpage/src/components/postcards/blocks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import C from './consts';
import styles from './styles';

export default (editor) => {
const bm = editor.BlockManager;
editor.addStyle(styles);

bm.add(C.ref, {
label: editor.I18n.t(C.label),
category: editor.I18n.t(C.category),
attributes: { class: 'fa fa-th' },
content: `
<a class="portcards" href="#" target="_self" data-gjs-type="portcards">
<div class="media-thumb-wrapper">
<img class="media-thumb" src="https://placehold.co/400x200" alt="Ảnh đại diện" data-gjs-type="image" />
<div class="media-play-icon" style="display: none;">
<i class="fa fa-play"></i>
</div>
</div>
<h3 class="media-title">Tiêu đề bài viết</h3>
<p class="media-desc">Mô tả ngắn gọn...</p>
<div class="meta">
<span class="meta-category">
<i class="fa fa-folder"></i>
Chuyên mục
</span> Sáng tác • <span class="meta-author">Tác giả</span>
</div>
</a>
`,
});
};
Loading