templates/organization/package/details.html.twig
{% extends 'base.html.twig' %}
{% block header %}
<a href="{{ path('organization_packages', {"organization":organization.alias}) }}"
class="btn btn-secondary px-1 mr-1" title="Package List">
<span class="text-muted mr-1">«</span>
{% include 'svg/package.svg' %}
</a>
{{ package.name }} details
{% endblock %}
{% block header_btn %}
{% include 'component/packageActions.html.twig' %}
{% endblock %}
{% block content %}
{% if package.name %}
{% if package.isAbandoned %}
<div class="row">
<div class="col-12">
<div class="alert alert-danger">
{% if package.replacementPackage is not empty %}
This package is <b>abandoned</b> and no longer maintained. The author suggests using the <b>{{ package.replacementPackage }}</b> package instead.
{% else %}
This package is <b>abandoned</b> and no longer maintained. No replacement package was suggested.
{% endif %}
</div>
</div>
</div>
{% endif %}
<div class="row">
<div class="col-3">
<h4>Package name</h4>
<p>{{ package.name }}</p>
</div>
<div class="col-3">
<h4>Repository URL</h4>
<p><a href="{{ package.url }}" target="_blank" rel="nofollow noopener noreferrer">{{ package.url }}</a></p>
</div>
<div class="col-6">
<h4>Description</h4>
<p>{{ package.description }}</p>
</div>
</div>
<div class="row">
<div class="col-3">
<h4>Total Installs</h4>
<p>
<a href="{{ path('organization_package_stats', {organization: organization.alias, package: package.id}) }}"
class="number-format">
{{ installs.total }}
</a>
</p>
</div>
<div class="col-3">
<h4>Dependant Packages</h4>
<p>
<a href="{{ path('organization_packages', {organization: organization.alias, search: "depends:"~package.name}) }}" class="number-format">
{{ dependantCount }}
</a>
</p>
</div>
<div class="col-6">
<h4>Security</h4>
<p>
{% if package.isEnabledSecurityScan %}
<a
href="{{ path('organization_package_scan_results', {organization: organization.alias, package: package.id}) }}"
data-content="{% apply escape %}{% include 'organization/package/scanResultContent.html.twig' with {'result': package.lastScanResultContent, 'simple': true} %}{% endapply %}"
data-data-toggle="tooltip" title="{{ package.scanResultDate|date_time|time_diff }}"
data-toggle="scan-result-popover"
>
{% if package.isScanResultOk %}
<span class="badge badge-success">{{ package.scanResultStatus }}</span>
{% elseif package.isScanResultPending or package.isScanResultNotAvailable %}
<span class="badge badge-warning">{{ package.scanResultStatus }}</span>
{% else %}
<span class="badge badge-danger">{{ package.scanResultStatus }}</span>
{% endif %}
</a>
{% else %}
<span class="badge badge-info">Disabled</span>
{% endif %}
</p>
</div>
</div>
{% if package.latestReleaseDate %}
<div class="row">
<div class="col-6">
<h4>Latest version</h4>
<p>
{{ package.latestReleasedVersion }} (released:
<span data-toggle="tooltip"
title="{{ package.latestReleaseDate|date_time_utc }} ({{ gmt_offset() }})">
{{ package.latestReleaseDate|date_time_utc|time_diff }}</span>)
</p>
</div>
<div class="col-6">
<h4>Composer require command</h4>
<div class="row">
<div class="input-group col-11">
<input id="composer-require" class="form-control" readonly value="composer require {{ package.name }}"/>
<span class="input-group-append">
<button data-clipboard-target="#composer-require" class="copy-to-clipboard btn btn-primary p-2" type="button" data-toggle="tooltip" data-placement="top" title="Copy to clipboard">
{% include 'svg/clipboard.svg' %}
</button>
</span>
</div>
</div>
</div>
</div>
{% endif %}
<hr />
<h3>Available versions {% if package.keepLastReleases > 0 %}(limited to: {{ package.keepLastReleases }}){% endif %}</h3>
{% if count == 0 %}
<p>
To see available versions of the package, please perform synchronization again.
</p>
<a
data-target="confirmation"
data-action="{{ path('organization_package_update', {organization: organization.alias, package: package.id }) }}"
data-method="POST"
href="#"
class="btn btn-success">
{% include 'svg/refresh.svg' %} Sync now
</a>
{% else %}
<table class="table">
<thead>
<tr>
<th>Version</th>
<th>Released</th>
<th>Reference</th>
<th>Size</th>
<th></th>
</tr>
</thead>
<tbody>
{% for version in versions %}
<tr>
<td>{{ version.version }}</td>
<td>
<span data-toggle="tooltip" title="{{ version.date|date_time_utc }} ({{ gmt_offset() }})">
{{ version.date|date_time_utc|time_diff }}
</span>
</td>
<td>{{ version.reference }}</td>
<td>{{ version.size | format_bytes }}</td>
<td>
<div class="input-group">
<input id="version-{{ version.reference }}" class="form-control" readonly value="composer require {{ package.name }}:{{ version.version }}"/>
<span class="input-group-append">
<button data-clipboard-target="#version-{{ version.reference }}" class="copy-to-clipboard btn btn-primary p-2" type="button" data-toggle="tooltip" data-placement="top"
title="Copy to clipboard">
{% include 'svg/clipboard.svg' %}
</button>
</span>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% include 'component/pagination.html.twig' with {'path_name': 'organization_package_details', 'path_params': {'organization': organization.alias, 'package': package.id}} %}
{% endif %}
{% else %}
<div class="alert alert-warning">
This package is not synced yet!
</div>
{% endif %}
{% if packageLinks|length > 0 %}
<hr />
<div class="row">
{% set types = {
'requires': 'Requirements',
'devRequires': 'Dev Requirements',
'suggests': 'Suggestions',
'provides': 'Provides',
'conflicts': 'Conflicts',
'replaces': 'Replaces',
} %}
{% for type,label in types %}
<div class="col-4">
<h4>{{ label }}</h4>
{% if packageLinks[type] is defined and packageLinks[type]|length > 0 %}
<ul>
{% for link in packageLinks[type] %}
<li>
{% if link.targetPackageId %}
<a href="{{ path('organization_package_details', {organization: organization.alias, package: link.targetPackageId}) }}">{{ link.target }}</a>: {{ link.constraint }}
{% else %}
{{ link.target }}: {{ link.constraint }}
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<em>None</em>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
{% if package.readme() %}
<hr />
<h3>README</h3>
<div class="row">
<div class="col">
{{ package.readme()|raw }}
</div>
</div>
{% endif %}
{% endblock %}