diff --git a/src/Constants.php b/src/Constants.php index 44cda352..884e5570 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -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/'; @@ -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'; @@ -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' ]; @@ -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', diff --git a/src/Translations.php b/src/Translations.php index 83ef880a..bed38d6b 100644 --- a/src/Translations.php +++ b/src/Translations.php @@ -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; @@ -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(); } @@ -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(); diff --git a/src/assetbundles/NavigationAssets.php b/src/assetbundles/NavigationAssets.php new file mode 100644 index 00000000..04bf53b8 --- /dev/null +++ b/src/assetbundles/NavigationAssets.php @@ -0,0 +1,38 @@ +sourcePath = Constants::URL_BASE_ASSETS; + + $this->depends = [ + VerbbCpAsset::class, + CpAsset::class, + ]; + + $this->js = [ + 'js/AddTranslationsToNavigation.js', + ]; + + $this->css = []; + + parent::init(); + } +} diff --git a/src/assetbundles/src/js/AddTranslationsToNavigation.js b/src/assetbundles/src/js/AddTranslationsToNavigation.js new file mode 100644 index 00000000..4608003f --- /dev/null +++ b/src/assetbundles/src/js/AddTranslationsToNavigation.js @@ -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 = $("
", { class: "btngroup translations-dropdown" }); + + $btngroup.prependTo("header#header > div:last"); + + this.$btn = $("", { + class: "btn icon", + href: "#", + "data-icon": "language", + }); + + this.$btn.html( + "" + + Craft.t("app", "New Translation") + + "" + ); + + this.$menubtn = $("
", { + 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 = $("
", { class: "menu" }); + + $menu.appendTo($btngroup); + + var $dropdown = $("