Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
54ba83d
added button custom field
Armanul46 Nov 25, 2025
1967ea5
Merge pull request #2695 from sovware/development
Armanul46 Feb 9, 2026
fb866ca
sync
Armanul46 Feb 18, 2026
83cf31b
work on button feature
Armanul46 Feb 18, 2026
c9c2f1d
fix: improve button custom field design consistency and UX
RabbiIslamRony Feb 18, 2026
306ed91
style: update button and listing detail SCSS for design consistency
RabbiIslamRony Feb 18, 2026
187cc30
feat: introduce Action section for single listing header and all list…
RabbiIslamRony Feb 19, 2026
0f720d3
refactor: switch card action section to standard vertical list rendering
RabbiIslamRony Feb 19, 2026
c694207
Improve button field styles and action section visibility logic
RabbiIslamRony Feb 19, 2026
a9f9842
update all codes
RabbiIslamRony Feb 19, 2026
14b6fe5
fix builder actions badge styles
RabbiIslamRony Feb 22, 2026
a69dd92
fixed builder styles
RabbiIslamRony Feb 22, 2026
fec423d
Add action section widgets for single listing header (phone, email, b…
RabbiIslamRony Feb 23, 2026
cf813a1
sync
Armanul46 Feb 24, 2026
8964862
Merge branch 'sovware:trunk' into feature/action-section-widgets
RabbiIslamRony Feb 24, 2026
8791beb
conflict fixed
RabbiIslamRony Feb 24, 2026
06f45c5
Merge branch 'feature/action-section-widgets' of https://github.com/R…
RabbiIslamRony Feb 24, 2026
81c8d4d
Merge pull request #16 from RabbiIslamRony/feature/action-section-wid…
Armanul46 Feb 24, 2026
2736e61
added conditional logic on button field
Armanul46 Feb 24, 2026
43b2146
fixed conflict issue
Armanul46 Feb 24, 2026
74970f7
fixed conflict issue
Armanul46 Feb 24, 2026
058ce2d
fixed card action issue
Armanul46 Feb 25, 2026
d80d306
fixed card action issue
Armanul46 Feb 25, 2026
136f4de
optmise button
Armanul46 Feb 25, 2026
4d5291a
fixed security issue
Armanul46 Feb 25, 2026
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
49,243 changes: 49,236 additions & 7 deletions assets/css/admin-main.css

Large diffs are not rendered by default.

49,241 changes: 49,234 additions & 7 deletions assets/css/admin-main.rtl.css

Large diffs are not rendered by default.

24,020 changes: 24,018 additions & 2 deletions assets/css/all-listings.css

Large diffs are not rendered by default.

24,017 changes: 24,015 additions & 2 deletions assets/css/all-listings.rtl.css

Large diffs are not rendered by default.

1,820 changes: 1,818 additions & 2 deletions assets/css/formgent-integration.css

Large diffs are not rendered by default.

1,818 changes: 1,816 additions & 2 deletions assets/css/formgent-integration.rtl.css

Large diffs are not rendered by default.

24,020 changes: 24,018 additions & 2 deletions assets/css/public-main.css

Large diffs are not rendered by default.

24,017 changes: 24,015 additions & 2 deletions assets/css/public-main.rtl.css

Large diffs are not rendered by default.

497 changes: 408 additions & 89 deletions assets/js/admin-multi-directory-builder.js

Large diffs are not rendered by default.

497 changes: 408 additions & 89 deletions assets/js/admin-settings-manager.js

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions assets/src/js/admin/vue/modules/Card_Widget_Placeholder.vue
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@
:fields="getWidgetFields(widget)"
:disabled="readOnly && !isWidgetSelected(widget)"
:readOnly="readOnly"
:disableEdit="disableWidgetEdit"
:activeWidgets="activeWidgets"
:selectedWidgets="selectedWidgets"
:availableWidgets="availableWidgets"
Expand Down Expand Up @@ -203,6 +204,7 @@
:fields="getWidgetFields(widget)"
:disabled="readOnly && !isWidgetSelected(widget)"
:readOnly="readOnly"
:disableEdit="disableWidgetEdit"
:activeWidgets="activeWidgets"
:selectedWidgets="selectedWidgets"
:availableWidgets="availableWidgets"
Expand Down Expand Up @@ -287,6 +289,7 @@ export default {
default: "Up to __DATA__ item{s} can be added",
},
readOnly: { type: Boolean, default: false },
disableWidgetEdit: { type: Boolean, default: false },
canDragAndDrop: { type: Boolean, default: false },
dragAxis: {
type: String,
Expand Down Expand Up @@ -414,6 +417,8 @@ export default {
},

editWidget(widgetKey) {
if (this.disableWidgetEdit) return;

// Check if click target is inside modal
if (event?.target?.closest(".cptm-options-area")) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ export default {
type: Boolean,
default: false,
},

disableEdit: {
type: Boolean,
default: false,
},
},

data() {
Expand Down Expand Up @@ -104,11 +109,10 @@ export default {
},

methods: {
// Check if the widget is editable
isEditable(widgetOptions) {
if (this.disableEdit) return false;
if (!widgetOptions || typeof widgetOptions !== "object") return false;

// Add more custom checks if needed
return true;
},

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@

<card-widget-placeholder
id="thumbnail_body_top"
containerClass="cptm-listing-card-preview-top-placeholder cptm-mb-12 cptm-align-left"
containerClass="cptm-listing-card-preview-top-placeholder cptm-align-left"
:label="local_layout.body.top.label"
:availableWidgets="theAvailableWidgets"
:activeWidgets="active_widgets"
Expand Down Expand Up @@ -321,7 +321,7 @@
id="thumbnail_body_bottom"
:containerClass="{
'cptm-listing-card-preview-body-placeholder': true,
'cptm-mb-12': hasExcerptWidget,
'': hasExcerptWidget,
}"
:label="local_layout.body.bottom.label"
:availableWidgets="theAvailableWidgets"
Expand Down Expand Up @@ -392,6 +392,47 @@
@activate-widget-options="toggleActivateWidgetOptions"
v-if="hasExcerptWidget"
/>

<card-widget-placeholder
id="thumbnail_body_action"
:containerClass="{
'cptm-listing-card-preview-action-placeholder': true,
'': hasActionWidget,
}"
:label="local_layout.body.action.label"
:availableWidgets="theAvailableWidgets"
:activeWidgets="active_widgets"
:acceptedWidgets="actionAcceptedWidgets"
:selectedWidgets="local_layout.body.action.selectedWidgets"
:maxWidget="local_layout.body.action.maxWidget"
:showWidgetsPickerWindow="
getActiveInsertWindowStatus('thumbnail_body_action')
"
:showWidgetsOptionWindow="
getActiveOptionWindowStatus('thumbnail_body_action')
"
:widgetOptionsWindow="widgetOptionsWindow"
:canOpenSettings="false"
:disableWidgetEdit="true"
@insert-widget="insertWidget($event, local_layout.body.action)"
@edit-widget="editWidget($event)"
@trash-widget="trashWidget($event, local_layout.body.action)"
@open-widgets-picker-window="
toggleInsertWindow('thumbnail_body_action')
"
@open-widgets-option-window="
toggleOptionWindow('thumbnail_body_action')
"
@close-widgets-picker-window="closeInsertWindow()"
@close-widgets-option-window="closeOptionWindow()"
@close-option-window="closeWidgetOptionsWindow()"
@update="
handleUpdateSelectedWidgets($event, 'local_layout.body.action')
"
@update-active-widget="handleActiveWidgetUpdate"
@activate-widget-options="toggleActivateWidgetOptions"
v-if="hasActionWidget"
/>
</div>

<!-- cptm-listing-card-preview-footer -->
Expand Down Expand Up @@ -714,6 +755,21 @@ export default {
hasExcerptWidget() {
return !!this.theAvailableWidgets?.excerpt;
},
actionAcceptedWidgets() {
const accepted = this.local_layout.body.action.acceptedWidgets;
if (!accepted?.length) return [];
const acceptedSet = new Set(accepted);
return Object.keys(this.theAvailableWidgets).filter((widgetKey) => {
const widget = this.theAvailableWidgets[widgetKey];
return (
acceptedSet.has(widgetKey) ||
(widget && widget.widget_name && acceptedSet.has(widget.widget_name))
);
});
},
hasActionWidget() {
return this.actionAcceptedWidgets.length > 0;
},
},

data() {
Expand Down Expand Up @@ -782,6 +838,10 @@ export default {
label: "Body Excerpt",
selectedWidgets: [],
},
action: {
label: "Action",
selectedWidgets: [],
},
},

footer: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,47 @@
v-if="hasExcerptWidget"
/>

<card-widget-placeholder
id="no_thumbnail_body_action"
:containerClass="{
'cptm-listing-card-preview-action-placeholder': true,
'': hasActionWidget,
}"
:label="local_layout.body.action.label"
:availableWidgets="theAvailableWidgets"
:activeWidgets="active_widgets"
:acceptedWidgets="actionAcceptedWidgets"
:selectedWidgets="local_layout.body.action.selectedWidgets"
:maxWidget="local_layout.body.action.maxWidget"
:showWidgetsPickerWindow="
getActiveInsertWindowStatus('no_thumbnail_body_action')
"
:showWidgetsOptionWindow="
getActiveOptionWindowStatus('no_thumbnail_body_action')
"
:widgetOptionsWindow="widgetOptionsWindow"
:canOpenSettings="false"
:disableWidgetEdit="true"
@insert-widget="insertWidget($event, local_layout.body.action)"
@edit-widget="editWidget($event)"
@trash-widget="trashWidget($event, local_layout.body.action)"
@open-widgets-picker-window="
toggleInsertWindow('no_thumbnail_body_action')
"
@open-widgets-option-window="
toggleOptionWindow('no_thumbnail_body_action')
"
@close-widgets-picker-window="closeInsertWindow()"
@close-widgets-option-window="closeOptionWindow()"
@close-option-window="closeWidgetOptionsWindow()"
@update="
handleUpdateSelectedWidgets($event, 'local_layout.body.action')
"
@update-active-widget="handleActiveWidgetUpdate"
@activate-widget-options="toggleActivateWidgetOptions"
v-if="hasActionWidget"
/>

<!-- cptm-listing-card-preview-footer -->
<div class="cptm-listing-card-preview-footer">
<!-- cptm-listing-card-preview-footer-left-placeholder -->
Expand Down Expand Up @@ -571,6 +612,22 @@ export default {
hasExcerptWidget() {
return !!this.theAvailableWidgets?.excerpt;
},

actionAcceptedWidgets() {
const accepted = this.local_layout.body.action.acceptedWidgets;
if (!accepted?.length) return [];
const acceptedSet = new Set(accepted);
return Object.keys(this.theAvailableWidgets).filter((widgetKey) => {
const widget = this.theAvailableWidgets[widgetKey];
return (
acceptedSet.has(widgetKey) ||
(widget && widget.widget_name && acceptedSet.has(widget.widget_name))
);
});
},
hasActionWidget() {
return this.actionAcceptedWidgets.length > 0;
},
},

data() {
Expand Down Expand Up @@ -624,6 +681,10 @@ export default {
label: "Body Excerpt",
selectedWidgets: [],
},
action: {
label: "Action",
selectedWidgets: [],
},
},

footer: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
<div class="cptm-card-placeholder-top-left">
<card-widget-placeholder
id="thumbnail_body_top"
containerClass="cptm-listing-card-quick-actions-placeholder cptm-mb-20"
containerClass="cptm-listing-card-quick-actions-placeholder"
:label="local_layout.body.top.label"
:availableWidgets="theAvailableWidgets"
:activeWidgets="active_widgets"
Expand Down Expand Up @@ -130,7 +130,7 @@
<div class="cptm-card-placeholder-top-right">
<card-widget-placeholder
id="thumbnail_body_right"
containerClass="cptm-listing-card-quick-info-placeholder cptm-mb-20 cptm-text-right"
containerClass="cptm-listing-card-quick-info-placeholder cptm-text-right"
:label="local_layout.body.right.label"
:availableWidgets="theAvailableWidgets"
:activeWidgets="active_widgets"
Expand Down Expand Up @@ -176,7 +176,7 @@
id="thumbnail_body_bottom"
:containerClass="{
'cptm-listing-card-preview-body-placeholder': true,
'cptm-mb-12': hasExcerptWidget,
'': hasExcerptWidget,
}"
:label="local_layout.body.bottom.label"
:availableWidgets="theAvailableWidgets"
Expand Down Expand Up @@ -247,6 +247,47 @@
@activate-widget-options="toggleActivateWidgetOptions"
v-if="hasExcerptWidget"
/>

<card-widget-placeholder
id="thumbnail_body_action"
:containerClass="{
'cptm-listing-card-preview-action-placeholder': true,
'': hasActionWidget,
}"
:label="local_layout.body.action.label"
:availableWidgets="theAvailableWidgets"
:activeWidgets="active_widgets"
:acceptedWidgets="actionAcceptedWidgets"
:selectedWidgets="local_layout.body.action.selectedWidgets"
:maxWidget="local_layout.body.action.maxWidget"
:showWidgetsPickerWindow="
getActiveInsertWindowStatus('thumbnail_body_action')
"
:showWidgetsOptionWindow="
getActiveOptionWindowStatus('thumbnail_body_action')
"
:widgetOptionsWindow="widgetOptionsWindow"
:canOpenSettings="false"
:disableWidgetEdit="true"
@insert-widget="insertWidget($event, local_layout.body.action)"
@edit-widget="editWidget($event)"
@trash-widget="trashWidget($event, local_layout.body.action)"
@open-widgets-picker-window="
toggleInsertWindow('thumbnail_body_action')
"
@open-widgets-option-window="
toggleOptionWindow('thumbnail_body_action')
"
@close-widgets-picker-window="closeInsertWindow()"
@close-widgets-option-window="closeOptionWindow()"
@close-option-window="closeWidgetOptionsWindow()"
@update="
handleUpdateSelectedWidgets($event, 'local_layout.body.action')
"
@update-active-widget="handleActiveWidgetUpdate"
@activate-widget-options="toggleActivateWidgetOptions"
v-if="hasActionWidget"
/>
</div>

<!-- cptm-listing-card-preview-footer -->
Expand Down Expand Up @@ -383,6 +424,22 @@ export default {
hasExcerptWidget() {
return !!this.theAvailableWidgets?.excerpt;
},

actionAcceptedWidgets() {
const accepted = this.local_layout.body.action.acceptedWidgets;
if (!accepted?.length) return [];
const acceptedSet = new Set(accepted);
return Object.keys(this.theAvailableWidgets).filter((widgetKey) => {
const widget = this.theAvailableWidgets[widgetKey];
return (
acceptedSet.has(widgetKey) ||
(widget && widget.widget_name && acceptedSet.has(widget.widget_name))
);
});
},
hasActionWidget() {
return this.actionAcceptedWidgets.length > 0;
},
// Output Data
output_data() {
let output = {};
Expand Down Expand Up @@ -573,6 +630,10 @@ export default {
label: "Body Excerpt",
selectedWidgets: [],
},
action: {
label: "Action",
selectedWidgets: [],
},
},

footer: {
Expand Down
Loading