Skip to content

Commit

Permalink
Bp/524/verbb navigation plugin support (#506)
Browse files Browse the repository at this point in the history
  • Loading branch information
bhupeshappfoster authored Jun 12, 2024
1 parent dbec8db commit fa1665d
Show file tree
Hide file tree
Showing 19 changed files with 1,006 additions and 4 deletions.
4 changes: 4 additions & 0 deletions src/Constants.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class Constants
const CLASS_ENTRY = 'craft\\elements\\Entry';

const CLASS_COMMERCE_PRODUCT = 'craft\commerce\elements\Product';
const CLASS_NAVIGATION = 'verbb\navigation\elements\Node';

// Urls
const URL_ORDER_DETAIL = 'translations/orders/detail/';
Expand Down Expand Up @@ -170,6 +171,7 @@ class Constants
const TABLE_ASSET_DRAFT = '{{%translations_assetdrafts}}';
const TABLE_COMMERCE_DRAFT = '{{%translations_commercedrafts}}';
const TABLE_ACTIVITY_LOG = '{{%translations_activitylogs}}';
const TABLE_NAVIGATION_DRAFT = '{{%translations_navigationdrafts}}';

// Job Descriptions
const JOB_ACCLARO_UPDATING_REVIEW_URL = 'Updating Acclaro review urls';
Expand All @@ -185,6 +187,7 @@ class Constants
'craft\fields\Matrix',
'craft\fields\Assets',
'verbb\vizy\fields\VizyField',
'verbb\navigation\fields\NavigationField',
'verbb\supertable\fields\SuperTableField',
'benf\neo\Field'
];
Expand Down Expand Up @@ -286,6 +289,7 @@ class Constants
'verbb\hyper\fields\HyperField',
'luwes\codemirror\fields\CodeMirrorField',
'verbb\supertable\fields\SuperTableField',
'verbb\navigation\fields\NavigationField',
'nystudio107\seomatic\fields\SeoSettings',
'lenz\linkfield\fields\LinkField',
'newism\fields\fields\Telephone',
Expand Down
26 changes: 26 additions & 0 deletions src/Translations.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
use acclaro\translations\assetbundles\CommerceAssets;
use acclaro\translations\assetbundles\UniversalAssets;
use acclaro\translations\assetbundles\GlobalSetAssets;
use acclaro\translations\assetbundles\NavigationAssets;
use acclaro\translations\base\AlertsTrait;
use acclaro\translations\services\job\DeleteDrafts;

Expand Down Expand Up @@ -403,6 +404,10 @@ private function _includeResources($path)
$this->_includeCommerceResources();
}

if (preg_match('#^navigation/navs/build/([^/]+)$#', $path, $match)) {
$this->_includeNavigationResources($match[1]);
}

if (preg_match('#^categories(/|$)#', $path, $match)) {
$this->_includeCategoryResources();
}
Expand Down Expand Up @@ -483,6 +488,27 @@ private function _includeCommerceResources()
self::$view->registerJs("$(function(){ Craft.Translations.AddTranslationsToCommerce.init({$data}); });");
}

/**
* Register translations functionality into verbb navigation
*/
private function _includeNavigationResources($navId)
{
$orders = array();

foreach (self::$plugin->orderRepository->getDraftOrders() as $order) {
$orders[] = array(
'id' => $order->id,
'title' => $order->title,
);
}

$data = json_encode($orders);

self::$view->registerAssetBundle(NavigationAssets::class);

self::$view->registerJs("$(function(){ Craft.Translations.AddTranslationsToNavigation.init({$data}, {$navId}); });");
}

private function _includeEntryResources()
{
$orders = array();
Expand Down
38 changes: 38 additions & 0 deletions src/assetbundles/NavigationAssets.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

/**
* Translations for Craft plugin for Craft CMS 4.x
*
* Translations for Craft eliminates error prone and costly copy/paste workflows for launching human translated Craft CMS web content.
*
* @link http://www.acclaro.com/
* @copyright Copyright (c) 2018 Acclaro
*/

namespace acclaro\translations\assetbundles;

use craft\web\AssetBundle;
use craft\web\assets\cp\CpAsset;
use verbb\base\assetbundles\CpAsset as VerbbCpAsset;
use acclaro\translations\Constants;

class NavigationAssets extends AssetBundle
{
public function init()
{
$this->sourcePath = Constants::URL_BASE_ASSETS;

$this->depends = [
VerbbCpAsset::class,
CpAsset::class,
];

$this->js = [
'js/AddTranslationsToNavigation.js',
];

$this->css = [];

parent::init();
}
}
254 changes: 254 additions & 0 deletions src/assetbundles/src/js/AddTranslationsToNavigation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
(function ($) {
if (typeof Craft.Translations === "undefined") {
Craft.Translations = {};
}

function unique(array) {
return $.grep(array, function (el, index) {
return index === $.inArray(el, array);
});
}

Craft.Translations.AddTranslationsToNavigation = {
assets: [],
$btn: null,

init: function (orders, navId) {
this.addTranslationOrderButton(orders, navId);
},

updateSelectedAssets: function () {
var entries = [];

$(".elements table.data tbody tr.sel[data-id]").each(function () {
entries.push($(this).data("id"));
});

this.assets = unique(entries);

$(this.$btn[0]).toggleClass("link-disabled", this.assets.length === 0);
$(this.$menubtn[0]).toggleClass(
"link-disabled",
this.assets.length === 0
);

this.updateCreateNewLink();
},

updateCreateNewLink: function () {
var href = this.$btn.attr("href").split("?")[0];

href += "?sourceSite=" + this.getSourceSite();

for (var i = 0; i < this.assets.length; i++) {
href += "&elements[]=" + this.assets[i];
}

this.$btn.attr("href", href);
},

getSourceSite: function () {
var localeMenu = $(".sitemenubtn").data("menubtn").menu;

// Figure out the initial locale
var $option = localeMenu.$options.filter(".sel:first");

if ($option.length === 0) {
$option = localeMenu.$options.first();
}

var siteId = $option.data("site-id").toString();

return siteId;
},

addTranslationOrderButton: function (orders, assetId) {
var self = this;

var $btncontainer = document.createElement("div");
$btncontainer.id = "translations-field";
$btncontainer.className = "field";

var $btngroup = $("<div>", { class: "btngroup translations-dropdown" });

$btngroup.prependTo("header#header > div:last");

this.$btn = $("<a>", {
class: "btn icon",
href: "#",
"data-icon": "language",
});

this.$btn.html(
"<span class='btn-text'>" +
Craft.t("app", "New Translation") +
"</span>"
);

this.$menubtn = $("<div>", {
class: "btn menubtn",
});

this.$btn.addClass("link-disabled");
this.$menubtn.addClass("link-disabled");

this.$btn.appendTo($btngroup);

this.$menubtn.appendTo($btngroup);

this.$menubtn.on("click", function (e) {
e.preventDefault();
});

var $menu = $("<div>", { class: "menu" });

$menu.appendTo($btngroup);

var $dropdown = $("<ul>", { class: "" });

$dropdown.appendTo($menu);

if (orders.length == "0") {
var $item = $("<li>");

$item.appendTo($dropdown);

var $link = $("<a>", {
class: "link-disabled",
text: "No saved orders available for this site...",
});

$link.appendTo($item);
}

for (var i = 0; i < orders.length; i++) {
var order = orders[i];

var $item = $("<li>");

$item.appendTo($dropdown);

var $link = $("<a>", {
href: "#",
text: "Add to " + order.title,
});

$link.appendTo($item);

$link.data("order", order);

$link.on("click", function (e) {
e.preventDefault();

var order = $(this).data("order");

var $form = $("<form>", {
method: "POST",
});

$form.hide();

$form.appendTo("body");

$form.append(Craft.getCsrfInput());

var $hiddenAction = $("<input>", {
type: "hidden",
name: "action",
value: "translations/base/add-elements-to-order",
});

$hiddenAction.appendTo($form);

var $hiddenOrderId = $("<input>", {
type: "hidden",
name: "id",
value: order.id,
});

$hiddenOrderId.appendTo($form);

var $hiddenSourceSite = $("<input>", {
type: "hidden",
name: "sourceSite",
value: self.getSourceSite(),
});

$hiddenSourceSite.appendTo($form);

for (var j = 0; j < self.assets.length; j++) {
$("<input>", {
type: "hidden",
name: "elements[]",
value: self.assets[j],
}).appendTo($form);
}

var $submit = $("<input>", {
type: "submit",
});

$submit.appendTo($form);

$form.submit();
});
}

var $link = Craft.getUrl("translations/orders/create", {
"elements[]": assetId,
sourceSite: self.getSourceSite(),
});

this.$btn.attr("href", $link);

this.$menubtn.menubtn();

$(document).on(
"click",
".elements .checkbox, table[data-name=Nodes]",
function () {
self.updateSelectedAssets();
}
);

this.$btn.on("click", function (e) {
e.preventDefault();

var $form = $("<form>", {
method: "POST",
action: Craft.getUrl("translations/orders/create"),
});

$form.hide();

$form.appendTo("body");

$form.append(Craft.getCsrfInput());

var $hiddenSourceSite = $("<input>", {
type: "hidden",
name: "sourceSite",
value: self.getSourceSite(),
});

$hiddenSourceSite.appendTo($form);

for (var j = 0; j < self.assets.length; j++) {
$("<input>", {
type: "hidden",
name: "elements[]",
value: self.assets[j],
}).appendTo($form);
}

var $submit = $("<input>", {
type: "submit",
});

$submit.appendTo($form);

$form.submit();
});
},
};
})(jQuery);
19 changes: 19 additions & 0 deletions src/migrations/Install.php
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,25 @@ protected function createTables()
);
}

$tableSchema = Craft::$app->db->schema->getTableSchema(Constants::TABLE_NAVIGATION_DRAFT);
if ($tableSchema === null) {
$tablesCreated = true;
$this->createTable(
Constants::TABLE_NAVIGATION_DRAFT,
[
'id' => $this->primaryKey(),
'name' => $this->string()->notNull(),
'title' => $this->string()->notNull(),
'navId' => $this->integer()->notNull(),
'site' => $this->integer()->notNull(),
'data' => $this->mediumText()->notNull(),
'dateCreated' => $this->dateTime()->notNull(),
'dateUpdated' => $this->dateTime()->notNull(),
'uid' => $this->uid()
]
);
}

$tableSchema = Craft::$app->db->schema->getTableSchema(Constants::TABLE_ACTIVITY_LOG);
if ($tableSchema === null) {
$tablesCreated = true;
Expand Down
Loading

0 comments on commit fa1665d

Please sign in to comment.