Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bp/524/verbb navigation plugin support #506

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
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