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

Fix: error when source is deleted #396

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
6 changes: 4 additions & 2 deletions src/assetbundles/src/js/OrderDetails.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,10 @@
if (haveDifferences(originalSourceSite, site.split(","))) return true;

// Validate Entries
$originalElementIds = $('#originalElementIds').val().split(',');
var currentElementIds = getEntryIds(false, true);
$originalElementIds = $('#originalElementIds').val();
// Check to prevent an array with empty string as value
$originalElementIds = $originalElementIds != '' ? $originalElementIds.split(',') : [];
var currentElementIds = getEntryIds(false, true);

if (haveDifferences($originalElementIds, currentElementIds)) return true;

Expand Down
10 changes: 10 additions & 0 deletions src/elements/Order.php
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,16 @@ public function getElements()
return $this->_elements;
}

/**
* Returns array of element ids for an order. Ignores elements that are deleted
*
* @return array
*/
public function getElementsId()
{
return array_keys($this->getElements());
}

/**
* User in order details settings tab entry table
*/
Expand Down
2 changes: 1 addition & 1 deletion src/services/repository/OrderRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ public function getIsSourceChanged($order): ?array
$element = Craft::$app->getElements()->getElementById($file->elementId, null, $file->sourceSite);

/** Skip in case the source entry is deleted */
if (! $element) throw new Exception('Source entry not found');
if (! $element) continue;

$wordCount = Translations::$plugin->elementTranslator->getWordCount($element);
$converter = Translations::$plugin->elementToFileConverter;
Expand Down
2 changes: 1 addition & 1 deletion src/templates/_components/_forms/order-entries-table.twig
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@
<div class="field {{ isEditable }}" data-position="left" data-colspan="1">
<div class="buttons flex">
<div class="submit">
<input type="hidden" id="originalElementIds" value="{{ order.elementIds|json_decode()|join(',') }}">
<input type="hidden" id="originalElementIds" value="{{ order.elementsId|join(',') }}">
<button type="button" class="btn add icon dashed addEntries">{{ 'Add an entry'|t }}</button>
</div>
</div>
Expand Down
246 changes: 124 additions & 122 deletions src/templates/_components/_forms/order-files-table.twig
Original file line number Diff line number Diff line change
Expand Up @@ -20,145 +20,147 @@
{% set registerDeltas = true %}
{% for file in order.files %}
{% set element = file.element(false) %}
<tr data-word-count="{{ elementWordCounts[file.elementId] }}" data-element-id="{{ file.elementId }}" class="diff-clone" data-file-id="{{ file.id }}">
{% if element is not null %}
<tr data-word-count="{{ elementWordCounts[file.elementId] }}" data-element-id="{{ file.elementId }}" class="diff-clone" data-file-id="{{ file.id }}">

<td class="thin checkbox-cell translations-checkbox-cell file">
{% if file.isInProgress or file.isComplete or file.isReviewReady or file.isPublished %}
<input class="checkbox hidden" data-element="{{ file.elementId }}" id="file-{{ file.id }}" type="checkbox" name="files[]" value="{{ file.id }}"/>
{% else %}
<input class="checkbox hidden" data-element="{{ file.elementId }}" id="file-{{ file.id }}" type="checkbox" name="files[]" value="{{ file.id }}" disabled="disabled"/>
{% endif %}
<label class="checkbox" for="file-{{ file.id }}"></label>
</td>
<td class="thin checkbox-cell translations-checkbox-cell file">
{% if file.isInProgress or file.isComplete or file.isReviewReady or file.isPublished %}
<input class="checkbox hidden" data-element="{{ file.elementId }}" id="file-{{ file.id }}" type="checkbox" name="files[]" value="{{ file.id }}"/>
{% else %}
<input class="checkbox hidden" data-element="{{ file.elementId }}" id="file-{{ file.id }}" type="checkbox" name="files[]" value="{{ file.id }}" disabled="disabled"/>
{% endif %}
<label class="checkbox" for="file-{{ file.id }}"></label>
</td>

<td>
{% if not file.hasPreview and file.isComplete %}
<table>
<tr>
<td>
<a href="{{ file.cpEditUrl }}">
{{ file.uiLabel }}
</a>
{% set sourceUpdated = file.elementId in isSourceChanged %}
{% set targetUpdated = order.trackTargetChanges and file.hasTmMisalignments and not file.isNew and not file.isModified %}
{% if canUpdateFiles and not file.isPublished and (sourceUpdated or targetUpdated) %}
<span class="warning order-warning font-size-15" data-icon="alert">
{% if sourceUpdated %}
<li> {{ 'Source entry content has been modified since order was created.' }} </li>
{% endif %}
<td>
{% if not file.hasPreview and file.isComplete %}
<table>
<tr>
<td>
<a href="{{ file.cpEditUrl }}">
{{ file.uiLabel }}
</a>
{% set sourceUpdated = file.elementId in isSourceChanged %}
{% set targetUpdated = order.trackTargetChanges and file.hasTmMisalignments and not file.isNew and not file.isModified %}
{% if canUpdateFiles and not file.isPublished and (sourceUpdated or targetUpdated) %}
<span class="warning order-warning font-size-15" data-icon="alert">
{% if sourceUpdated %}
<li> {{ 'Source entry content has been modified since order was created.' }} </li>
{% endif %}

{% if targetUpdated %}
<li> {{ 'Target entry content has been modified since order was created.' }} </li>
{% endif %}
</span>
{% endif %}
</td>
</tr>
</table>
{% else %}
<div id="{{ "filePreview-"~ file.id }}">
<div class="elements">
<div class="element small" title="{{ file.uiLabel ~" - " ~siteObjects[file.targetSite].name }}">
<div class="label" data-id="{{ file.elementId }}" data-editable="" data-site-id={{ file.targetSite }} {% if file.isComplete or element.isDraft %} data-draft-id={{ file.isComplete ? file.draftId : element.draftId }} {% endif %}>
<span class="title text-link">{{ file.uiLabel }}</span>
</div>
{% set sourceUpdated = file.elementId in isSourceChanged %}
{% set targetUpdated = order.trackTargetChanges and file.hasTmMisAlignments and not file.isNew and not file.isModified %}
{% if targetUpdated %}
<li> {{ 'Target entry content has been modified since order was created.' }} </li>
{% endif %}
</span>
{% endif %}
</td>
</tr>
</table>
{% else %}
<div id="{{ "filePreview-"~ file.id }}">
<div class="elements">
<div class="element small" title="{{ file.uiLabel ~" - " ~siteObjects[file.targetSite].name }}">
<div class="label" data-id="{{ file.elementId }}" data-editable="" data-site-id={{ file.targetSite }} {% if file.isComplete or element.isDraft %} data-draft-id={{ file.isComplete ? file.draftId : element.draftId }} {% endif %}>
<span class="title text-link">{{ file.uiLabel }}</span>
</div>
{% set sourceUpdated = file.elementId in isSourceChanged %}
{% set targetUpdated = order.trackTargetChanges and file.hasTmMisAlignments and not file.isNew and not file.isModified %}

{# Ignore target changes for api order that are completed #}
{% if not order.hasDefaultTranslator and (order.isReviewReady or order.isComplete or order.isPublished) %}
{% set targetUpdated = false %}
{% endif %}
{# Ignore target changes for api order that are completed #}
{% if not order.hasDefaultTranslator and (order.isReviewReady or order.isComplete or order.isPublished) %}
{% set targetUpdated = false %}
{% endif %}

{# Create Preview for each target entry #}
{% if file.hasPreview %}
{% set fileId = 'file_' ~ file.id %}
{# Create Preview for each target entry #}
{% if file.hasPreview %}
{% set fileId = 'file_' ~ file.id %}

<a id="{{ fileId }}" data-icon="world" title="{{ 'Visit webpage'|t }}"></a>
<a id="{{ fileId }}" data-icon="world" title="{{ 'Visit webpage'|t }}"></a>


{% js %}
new Craft.Translations.FilePreview($('#{{fileId}}'), {{ file.filePreviewSettings|json_encode|raw }});
{% endjs %}
{% endif %}
{% js %}
new Craft.Translations.FilePreview($('#{{fileId}}'), {{ file.filePreviewSettings|json_encode|raw }});
{% endjs %}
{% endif %}

{% if canUpdateFiles and not file.isPublished and (sourceUpdated or targetUpdated) %}
<span class="warning order-warning font-size-15" data-icon="alert">
{% if sourceUpdated %}
<li> {{ 'Source entry content has been modified since order was created.' }} </li>
{% endif %}
{% if canUpdateFiles and not file.isPublished and (sourceUpdated or targetUpdated) %}
<span class="warning order-warning font-size-15" data-icon="alert">
{% if sourceUpdated %}
<li> {{ 'Source entry content has been modified since order was created.' }} </li>
{% endif %}

{% if targetUpdated %}
<li> {{ 'Target entry content has been modified since order was created.' }} </li>
{% endif %}
</span>
{% endif %}
{% if targetUpdated %}
<li> {{ 'Target entry content has been modified since order was created.' }} </li>
{% endif %}
</span>
{% endif %}
</div>
</div>
</div>
</div>
{% js %}
new Craft.Translations.EntryPreview({{ file.entryPreviewSettings|json_encode|raw }});
{% endjs %}
{% endif %}
</td>
{% js %}
new Craft.Translations.EntryPreview({{ file.entryPreviewSettings|json_encode|raw }});
{% endjs %}
{% endif %}
</td>

<td>
<table>
<tr>
{% if siteObjects[file.targetSite] is defined %}
<td>
{{siteObjects[file.targetSite].name}} ({{ siteObjects[file.targetSite].language }})
</td>
{% else %}
<td style="color:red;">
{{ "Deleted" }}
</td>
{% endif %}
</tr>
</table>
</td>
<td>
<table>
<tr>
{% if siteObjects[file.targetSite] is defined %}
<td>
{{siteObjects[file.targetSite].name}} ({{ siteObjects[file.targetSite].language }})
</td>
{% else %}
<td style="color:red;">
{{ "Deleted" }}
</td>
{% endif %}
</tr>
</table>
</td>

<td>
{% if element.className == constant('acclaro\\translations\\Constants::CLASS_GLOBAL_SET') %}
{{ 'Globals' }}
{% elseif element.className == constant('acclaro\\translations\\Constants::CLASS_CATEGORY') %}
{{ 'Category' }}
{% elseif element.className == constant('acclaro\\translations\\Constants::CLASS_ASSET') %}
{{ 'Asset' }}
{% else %}
{{ element.section.name }}
{% endif %}
<td>
{% if element.className == constant('acclaro\\translations\\Constants::CLASS_GLOBAL_SET') %}
{{ 'Globals' }}
{% elseif element.className == constant('acclaro\\translations\\Constants::CLASS_CATEGORY') %}
{{ 'Category' }}
{% elseif element.className == constant('acclaro\\translations\\Constants::CLASS_ASSET') %}
{{ 'Asset' }}
{% else %}
{{ element.section.name }}
{% endif %}

</td>
</td>

<td>
<table>
<tr>
<td>
{% if file.isReviewReady or file.isComplete or file.isPublished %}
{{ file.dateDelivered ? file.dateDelivered|date('M j, Y g:i a') : '--' }}
{% else %}
{{ '--' }}
{% endif %}
</td>
</tr>
</table>
</td>
<td>
<table>
<tr>
<td>
{% if file.isReviewReady or file.isComplete or file.isPublished %}
{{ file.dateDelivered ? file.dateDelivered|date('M j, Y g:i a') : '--' }}
{% else %}
{{ '--' }}
{% endif %}
</td>
</tr>
</table>
</td>

<td>
<table>
<tr>
<td class="inline-flex align-center">
<span class="status {{ file.statusColor }}"
style="position: absolute;left: -10px;"
data-status="{{ file.hasSourceTargetDiff }}">
</span>{{ file.statusLabel }}
</td>
</tr>
</table>
</td>
<td><table><thead><th class="bg-none icon ordered desc orderable hidden"><button type="button"></button></th></thead></table></td>
</tr>
<td>
<table>
<tr>
<td class="inline-flex align-center">
<span class="status {{ file.statusColor }}"
style="position: absolute;left: -10px;"
data-status="{{ file.hasSourceTargetDiff }}">
</span>{{ file.statusLabel }}
</td>
</tr>
</table>
</td>
<td><table><thead><th class="bg-none icon ordered desc orderable hidden"><button type="button"></button></th></thead></table></td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>