monorepo/native/wordpress/learndash-start-button/assets/js/block.js

566 lines
15 KiB
JavaScript

/**
* LearnDash Start Course Button - Gutenberg Blocks
*
* Registers custom Gutenberg blocks for Start Course and Start Group buttons
*/
(function (wp) {
"use strict";
// Destructure required WordPress packages
const { __ } = wp.i18n;
const { createElement: el } = wp.element;
const { registerBlockType } = wp.blocks;
const {
TextControl,
ToggleControl,
PanelBody,
PanelRow,
SelectControl,
Notice,
} = wp.components;
const { InspectorControls, BlockControls, AlignmentToolbar, useBlockProps } =
wp.blockEditor;
const { Fragment } = wp.element;
// SVG Arrow Icon
const arrowIcon = el(
"svg",
{
className: "ldsb-button-arrow",
width: "24",
height: "24",
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
},
el("path", {
d: "M5 12H19M19 12L12 5M19 12L12 19",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round",
}),
);
// Course block icon
const courseBlockIcon = el(
"svg",
{
width: "24",
height: "24",
viewBox: "0 0 24 24",
fill: "none",
},
el("path", {
d: "M13 7L18 12M18 12L13 17M18 12H6",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round",
}),
el("rect", {
x: "3",
y: "3",
width: "18",
height: "18",
rx: "2",
stroke: "currentColor",
strokeWidth: "2",
}),
);
// Group block icon
const groupBlockIcon = el(
"svg",
{
width: "24",
height: "24",
viewBox: "0 0 24 24",
fill: "none",
},
el("path", {
d: "M17 21V19C17 17.9391 16.5786 16.9217 15.8284 16.1716C15.0783 15.4214 14.0609 15 13 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round",
}),
el("circle", {
cx: "9",
cy: "7",
r: "4",
stroke: "currentColor",
strokeWidth: "2",
}),
el("path", {
d: "M23 21V19C22.9993 18.1137 22.7044 17.2528 22.1614 16.5523C21.6184 15.8519 20.8581 15.3516 20 15.13",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round",
}),
el("path", {
d: "M16 3.13C16.8604 3.35031 17.623 3.85071 18.1676 4.55232C18.7122 5.25392 19.0078 6.11683 19.0078 7.005C19.0078 7.89318 18.7122 8.75608 18.1676 9.45769C17.623 10.1593 16.8604 10.6597 16 10.88",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round",
}),
);
// Register the Course Start button block
registerBlockType("ldsb/start-button", {
title: __("LearnDash Start Course Button", "learndash-start-button"),
description: __(
"A prominent button to start LearnDash courses",
"learndash-start-button",
),
icon: courseBlockIcon,
category: "common",
keywords: [
__("learndash", "learndash-start-button"),
__("start", "learndash-start-button"),
__("course", "learndash-start-button"),
__("button", "learndash-start-button"),
],
attributes: {
courseId: {
type: "number",
default: 0,
},
buttonText: {
type: "string",
default: "Start Course",
},
newTab: {
type: "boolean",
default: false,
},
alignment: {
type: "string",
default: "left",
enum: ["left", "center", "right"],
},
},
supports: {
align: false, // We handle alignment internally
className: true,
html: false,
},
// Edit function - what you see in the editor
edit: function (props) {
const {
attributes: { courseId, buttonText, newTab, alignment },
setAttributes,
className,
} = props;
const blockProps = useBlockProps({
className: `align-${alignment} ${courseId === 0 ? "no-course" : ""}`,
});
// Update alignment
function onChangeAlignment(newAlignment) {
setAttributes({ alignment: newAlignment || "left" });
}
return el(
Fragment,
{},
// Block Controls (toolbar)
el(
BlockControls,
{},
el(AlignmentToolbar, {
value: alignment,
onChange: onChangeAlignment,
alignmentControls: [
{
icon: "editor-alignleft",
title: __("Align left", "learndash-start-button"),
align: "left",
},
{
icon: "editor-aligncenter",
title: __("Align center", "learndash-start-button"),
align: "center",
},
{
icon: "editor-alignright",
title: __("Align right", "learndash-start-button"),
align: "right",
},
],
}),
),
// Inspector Controls (sidebar)
el(
InspectorControls,
{},
el(
PanelBody,
{
title: __("Button Settings", "learndash-start-button"),
initialOpen: true,
},
el(
PanelRow,
{},
el(TextControl, {
label: __("Course ID", "learndash-start-button"),
help: __(
"Enter the LearnDash course ID. Leave empty to use current course.",
"learndash-start-button",
),
value: courseId || "",
onChange: function (value) {
var parsed = parseInt(value, 10);
setAttributes({ courseId: isNaN(parsed) || parsed < 0 ? 0 : parsed });
},
type: "number",
min: 0,
}),
),
el(
PanelRow,
{},
el(TextControl, {
label: __("Button Text", "learndash-start-button"),
help: __(
"The text to display on the button",
"learndash-start-button",
),
value: buttonText,
onChange: function (value) {
setAttributes({ buttonText: value || "Start Course" });
},
}),
),
el(
PanelRow,
{},
el(ToggleControl, {
label: __("Open in New Tab", "learndash-start-button"),
help: __(
"Open the course in a new browser tab",
"learndash-start-button",
),
checked: newTab,
onChange: function (value) {
setAttributes({ newTab: value });
},
}),
),
),
// Usage instructions panel
el(
PanelBody,
{
title: __("Usage Instructions", "learndash-start-button"),
initialOpen: false,
},
el(
"div",
{ className: "ldsb-help-text" },
el(
"p",
{},
__("This button will automatically:", "learndash-start-button"),
),
el(
"ul",
{},
el(
"li",
{},
__(
"• Link to the first lesson if available",
"learndash-start-button",
),
),
el(
"li",
{},
__(
'• Show "Login to Start" for logged-out users',
"learndash-start-button",
),
),
el(
"li",
{},
__(
'• Show "Enroll to Start" for non-enrolled users',
"learndash-start-button",
),
),
),
),
),
),
// Block Preview
el(
"div",
blockProps,
el(
"div",
{
className: `ldsb-button-wrapper align-${alignment}`,
style: { textAlign: alignment },
},
el(
"a",
{
className: "ldsb-start-button",
href: "#",
onClick: function (e) {
e.preventDefault();
},
},
el("span", { className: "ldsb-button-text" }, buttonText),
arrowIcon,
),
),
),
);
},
// Save function - null because this is a dynamic block
save: function () {
return null; // Dynamic block rendered by PHP
},
});
// Register the Group Start button block
registerBlockType("ldsb/start-group", {
title: __("LearnDash Start Group Work", "learndash-start-button"),
description: __(
"A button to start the first course in a LearnDash group",
"learndash-start-button",
),
icon: groupBlockIcon,
category: "common",
keywords: [
__("learndash", "learndash-start-button"),
__("group", "learndash-start-button"),
__("start", "learndash-start-button"),
__("button", "learndash-start-button"),
],
attributes: {
groupId: {
type: "number",
default: 0,
},
buttonText: {
type: "string",
default: "Start First Course",
},
newTab: {
type: "boolean",
default: false,
},
alignment: {
type: "string",
default: "left",
enum: ["left", "center", "right"],
},
},
supports: {
align: false,
className: true,
html: false,
},
// Edit function
edit: function (props) {
const {
attributes: { groupId, buttonText, newTab, alignment },
setAttributes,
className,
} = props;
const blockProps = useBlockProps({
className: `align-${alignment} ${groupId === 0 ? "no-group" : ""}`,
});
function onChangeAlignment(newAlignment) {
setAttributes({ alignment: newAlignment || "left" });
}
return el(
Fragment,
{},
// Block Controls
el(
BlockControls,
{},
el(AlignmentToolbar, {
value: alignment,
onChange: onChangeAlignment,
alignmentControls: [
{
icon: "editor-alignleft",
title: __("Align left", "learndash-start-button"),
align: "left",
},
{
icon: "editor-aligncenter",
title: __("Align center", "learndash-start-button"),
align: "center",
},
{
icon: "editor-alignright",
title: __("Align right", "learndash-start-button"),
align: "right",
},
],
}),
),
// Inspector Controls
el(
InspectorControls,
{},
el(
PanelBody,
{
title: __("Group Button Settings", "learndash-start-button"),
initialOpen: true,
},
el(
PanelRow,
{},
el(TextControl, {
label: __("Group ID", "learndash-start-button"),
help: __(
"Enter the LearnDash group ID. Leave empty to use current group.",
"learndash-start-button",
),
value: groupId || "",
onChange: function (value) {
var parsed = parseInt(value, 10);
setAttributes({ groupId: isNaN(parsed) || parsed < 0 ? 0 : parsed });
},
type: "number",
min: 0,
}),
),
el(
PanelRow,
{},
el(TextControl, {
label: __("Button Text", "learndash-start-button"),
help: __(
"The text to display on the button",
"learndash-start-button",
),
value: buttonText,
onChange: function (value) {
setAttributes({ buttonText: value || "Start First Course" });
},
}),
),
el(
PanelRow,
{},
el(ToggleControl, {
label: __("Open in New Tab", "learndash-start-button"),
help: __(
"Open the course in a new browser tab",
"learndash-start-button",
),
checked: newTab,
onChange: function (value) {
setAttributes({ newTab: value });
},
}),
),
),
el(
PanelBody,
{
title: __("How It Works", "learndash-start-button"),
initialOpen: false,
},
el(
"div",
{ className: "ldsb-help-text" },
el("p", {}, __("This button will:", "learndash-start-button")),
el(
"ul",
{},
el(
"li",
{},
__(
"• Link to the first course in the group",
"learndash-start-button",
),
),
el(
"li",
{},
__(
"• Go to the first lesson if available",
"learndash-start-button",
),
),
el(
"li",
{},
__(
'• Show "Login to Start" for logged-out users',
"learndash-start-button",
),
),
el(
"li",
{},
__(
'• Show "Join Group to Start" for non-members',
"learndash-start-button",
),
),
),
),
),
),
// Block Preview
el(
"div",
blockProps,
el(
"div",
{
className: `ldsb-button-wrapper align-${alignment}`,
style: { textAlign: alignment },
},
el(
"a",
{
className: "ldsb-start-button ldsb-group-button",
href: "#",
onClick: function (e) {
e.preventDefault();
},
},
el("span", { className: "ldsb-button-text" }, buttonText),
arrowIcon,
),
),
),
);
},
save: function () {
return null; // Dynamic block
},
});
})(window.wp);