332 lines
11 KiB
PHP
332 lines
11 KiB
PHP
@use(App\Ldap\Entry)
|
|
|
|
@extends('layouts.dn')
|
|
|
|
@section('page_title')
|
|
@include('fragment.dn.header',[
|
|
'o'=>($o ?? $o=$server->fetch($dn)),
|
|
'langtags'=>($langtags=$o->getLangTags()
|
|
->flatMap(fn($item)=>$item->values())
|
|
->unique()
|
|
->sort())
|
|
])
|
|
@endsection
|
|
|
|
@section('page_actions')
|
|
<div class="row">
|
|
<div class="col">
|
|
<div class="action-buttons float-end">
|
|
<ul class="nav">
|
|
@if(isset($page_actions) && $page_actions->get('create'))
|
|
<li>
|
|
<button class="btn btn-outline-dark p-1 m-1" id="entry-copy-move" data-bs-toggle="tooltip" data-bs-placement="bottom" title="@lang('New Child')" disabled><i class="fas fa-fw fa-diagram-project fs-5"></i></button>
|
|
</li>
|
|
@endif
|
|
@if(isset($page_actions) && $page_actions->get('export'))
|
|
<li>
|
|
<span id="entry-export" data-bs-toggle="modal" data-bs-target="#page-modal">
|
|
<button class="btn btn-outline-dark p-1 m-1" data-bs-toggle="tooltip" data-bs-placement="bottom" title="@lang('Export')"><i class="fas fa-fw fa-download fs-5"></i></button>
|
|
</span>
|
|
</li>
|
|
@endif
|
|
@if(isset($page_actions) && $page_actions->get('copy'))
|
|
<li>
|
|
<button class="btn btn-outline-dark p-1 m-1" id="entry-copy-move" data-bs-toggle="tooltip" data-bs-placement="bottom" title="@lang('Copy/Move')" disabled><i class="fas fa-fw fa-copy fs-5"></i></button>
|
|
</li>
|
|
@endif
|
|
@if(isset($page_actions) && $page_actions->get('edit'))
|
|
<li>
|
|
<button class="btn btn-outline-dark p-1 m-1" id="entry-edit" data-bs-toggle="tooltip" data-bs-placement="bottom" title="@lang('Edit Entry')"><i class="fas fa-fw fa-edit fs-5"></i></button>
|
|
</li>
|
|
@endif
|
|
<!-- @todo Dont offer the delete button for an entry with children -->
|
|
@if(isset($page_actions) && $page_actions->get('delete'))
|
|
<li>
|
|
<span id="entry-delete" data-bs-toggle="modal" data-bs-target="#page-modal">
|
|
<button class="btn btn-outline-danger p-1 m-1" data-bs-custom-class="custom-tooltip-danger" data-bs-toggle="tooltip" data-bs-placement="bottom" title="@lang('Delete Entry')"><i class="fas fa-fw fa-trash-can fs-5"></i></button>
|
|
</span>
|
|
</li>
|
|
@endif
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col">
|
|
@if(($x=$o->getOtherTags())->count())
|
|
<div class="ms-4 mt-4 alert alert-danger p-2" style="max-width: 30em; font-size: 0.80em;">
|
|
This entry has [<strong>{!! $x->flatten()->join('</strong>, <strong>') !!}</strong>] tags used by [<strong>{!! $x->keys()->join('</strong>, <strong>') !!}</strong>] that cant be managed by PLA. You can though manage those tags with an LDIF import.
|
|
</div>
|
|
@elseif(($x=$o->getLangMultiTags())->count())
|
|
<div class="ms-4 mt-4 alert alert-danger p-2" style="max-width: 30em; font-size: 0.80em;">
|
|
This entry has multi-language tags used by [<strong>{!! $x->keys()->join('</strong>, <strong>') !!}</strong>] that cant be managed by PLA. You can though manage those lang tags with an LDIF import.
|
|
</div>
|
|
@elseif(($x=$o->getLangTags())->count())
|
|
<div class="ms-4 mt-4 alert alert-warning p-2" style="max-width: 30em; font-size: 0.80em;">
|
|
This entry has language tags used by [<strong>{!! $x->keys()->join('</strong>, <strong>') !!}</strong>] that cant be managed by PLA yet. You can though manage those lang tags with an LDIF import.
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@endsection
|
|
|
|
@section('main-content')
|
|
<x-note/>
|
|
<x-updated/>
|
|
<x-error/>
|
|
|
|
<div class="main-card mb-3 card">
|
|
<div class="card-body">
|
|
<div class="card-header-tabs">
|
|
<ul class="nav nav-tabs mb-0">
|
|
<li class="nav-item"><a data-bs-toggle="tab" href="#attributes" class="nav-link active">@lang('Attributes')</a></li>
|
|
<li class="nav-item"><a data-bs-toggle="tab" href="#internal" class="nav-link">@lang('Internal')</a></li>
|
|
</ul>
|
|
|
|
<div class="tab-content">
|
|
<!-- All Attributes -->
|
|
<div class="tab-pane active" id="attributes" role="tabpanel">
|
|
<form id="dn-edit" method="POST" class="needs-validation" action="{{ url('entry/update/pending') }}" novalidate readonly>
|
|
@csrf
|
|
|
|
<input type="hidden" name="dn" value="">
|
|
<div class="card-header border-bottom-0">
|
|
<div class="btn-actions-pane-right">
|
|
<div role="group" class="btn-group-sm nav btn-group">
|
|
@foreach($langtags->prepend(Entry::TAG_NOTAG)->push('+') as $tag)
|
|
<a data-bs-toggle="tab" href="#tab-lang-{{ $tag ?: '_default' }}" class="btn btn-outline-light border-dark-subtle @if(! $loop->index) active @endif @if($loop->last)ndisabled @endif">
|
|
@switch($tag)
|
|
@case(Entry::TAG_NOTAG)
|
|
<i class="fas fa-fw fa-border-none" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" title="@lang('No Lang Tag')"></i>
|
|
@break
|
|
|
|
@case('+')
|
|
<!-- @todo To implement -->
|
|
<i class="fas fa-fw fa-plus text-dark" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" title="@lang('Add Lang Tag')"></i>
|
|
@break
|
|
|
|
@default
|
|
<span class="f16" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" title="{{ strtoupper($tag) }}"><i class="flag {{ $tag }}"></i></span>
|
|
@endswitch
|
|
</a>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card-body">
|
|
<div class="tab-content">
|
|
@foreach($langtags as $tag)
|
|
<div class="tab-pane @if(! $loop->index) active @endif" id="tab-lang-{{ $tag ?: '_default' }}" role="tabpanel">
|
|
@switch($tag)
|
|
@case(Entry::TAG_NOTAG)
|
|
@foreach ($o->getVisibleAttributes($tag) as $ao)
|
|
<x-attribute-type :edit="true" :o="$ao" :langtag="$tag"/>
|
|
@endforeach
|
|
@break
|
|
|
|
@case('+')
|
|
<div class="ms-auto mt-4 alert alert-warning p-2" style="max-width: 30em; font-size: 0.80em;">
|
|
It is not possible to create new language tags at the moment. This functionality should come soon.<br>
|
|
You can create them with an LDIF import though.
|
|
</div>
|
|
@break
|
|
|
|
@default
|
|
@foreach ($o->getVisibleAttributes($langtag=sprintf('lang-%s',$tag)) as $ao)
|
|
<x-attribute-type :edit="true" :o="$ao" :langtag="$langtag"/>
|
|
@endforeach
|
|
@endswitch
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
|
|
@include('fragment.dn.add_attr')
|
|
</form>
|
|
|
|
<div class="row d-none pt-3">
|
|
<div class="col-12 offset-sm-2 col-sm-4 col-lg-2">
|
|
<x-form.reset form="dn-edit"/>
|
|
<x-form.submit action="Update" form="dn-edit"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Internal Attributes -->
|
|
<div class="tab-pane mt-3" id="internal" role="tabpanel">
|
|
@foreach ($o->getInternalAttributes() as $ao)
|
|
<x-attribute-type :o="$ao"/>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endsection
|
|
|
|
@section('page-modals')
|
|
<!-- Frame Modals -->
|
|
<div class="modal fade" id="page-modal" tabindex="-1" aria-labelledby="label" aria-hidden="true">
|
|
<div class="modal-dialog modal-lg modal-fullscreen-lg-down">
|
|
<div class="modal-content"></div>
|
|
</div>
|
|
</div>
|
|
@endsection
|
|
|
|
@section('page-scripts')
|
|
<script type="text/javascript">
|
|
var dn = '{{ $o->getDNSecure() }}';
|
|
var oc = {!! $o->getObject('objectclass')->values !!};
|
|
|
|
function editmode() {
|
|
$('#dn-edit input[name="dn"]').val(dn);
|
|
|
|
$('form#dn-edit').attr('readonly',false);
|
|
$('button[id=entry-edit]')
|
|
.removeClass('btn-outline-dark')
|
|
.addClass('btn-dark')
|
|
.addClass('opacity-100')
|
|
.attr('disabled',true);
|
|
|
|
// Find all input items and turn off readonly
|
|
$('input.form-control').each(function() {
|
|
// Except for objectClass - @todo show an "X" instead
|
|
if ($(this)[0].name.match(/^objectclass/))
|
|
return;
|
|
|
|
$(this).attr('readonly',false);
|
|
});
|
|
|
|
// Our password type
|
|
$('attribute#userPassword .form-select').each(function() {
|
|
$(this).prop('disabled',false);
|
|
})
|
|
|
|
$('.row.d-none').removeClass('d-none');
|
|
$('span.addable.d-none').removeClass('d-none');
|
|
$('span.deletable.d-none').removeClass('d-none');
|
|
|
|
@if($o->getMissingAttributes()->count())
|
|
$('#newattr-select.d-none').removeClass('d-none');
|
|
@endif
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
$('#newattr').on('change',function(item) {
|
|
$.ajax({
|
|
type: 'POST',
|
|
beforeSend: function() {},
|
|
success: function(data) {
|
|
$('#newattrs').append(data);
|
|
},
|
|
error: function(e) {
|
|
if (e.status !== 412)
|
|
alert('That didnt work? Please try again....');
|
|
},
|
|
url: '{{ url('entry/attr/add') }}/'+item.target.value,
|
|
data: {
|
|
objectclasses: oc,
|
|
},
|
|
cache: false
|
|
});
|
|
|
|
// Remove the option from the list
|
|
$(this).find('[value="'+item.target.value+'"]').remove()
|
|
|
|
// If there are no more options
|
|
if ($(this).find("option").length === 1)
|
|
$('#newattr-select').remove();
|
|
});
|
|
|
|
$('#page-modal').on('shown.bs.modal',function(item) {
|
|
var that = $(this).find('.modal-content');
|
|
|
|
switch ($(item.relatedTarget).attr('id')) {
|
|
case 'entry-delete':
|
|
$.ajax({
|
|
method: 'GET',
|
|
url: '{{ url('modal/delete') }}/'+dn,
|
|
dataType: 'html',
|
|
cache: false,
|
|
beforeSend: function() {
|
|
that.empty().append('<span class="p-3"><i class="fas fa-3x fa-spinner fa-pulse"></i></span>');
|
|
},
|
|
success: function(data) {
|
|
that.empty().html(data);
|
|
},
|
|
error: function(e) {
|
|
if (e.status !== 412)
|
|
alert('That didnt work? Please try again....');
|
|
},
|
|
})
|
|
break;
|
|
|
|
case 'entry-export':
|
|
$.ajax({
|
|
method: 'GET',
|
|
url: '{{ url('modal/export') }}/'+dn,
|
|
dataType: 'html',
|
|
cache: false,
|
|
beforeSend: function() {
|
|
that.empty().append('<span class="p-3"><i class="fas fa-3x fa-spinner fa-pulse"></i></span>');
|
|
},
|
|
success: function(data) {
|
|
that.empty().html(data);
|
|
|
|
that = $('#entry_export');
|
|
|
|
$.ajax({
|
|
method: 'GET',
|
|
url: '{{ url('entry/export') }}/'+dn,
|
|
cache: false,
|
|
beforeSend: function() {
|
|
that.empty().append('<span class="p-3"><i class="fas fa-3x fa-spinner fa-pulse"></i></span>');
|
|
},
|
|
success: function(data) {
|
|
that.empty().append(data);
|
|
},
|
|
error: function(e) {
|
|
if (e.status !== 412)
|
|
alert('That didnt work? Please try again....');
|
|
},
|
|
})
|
|
},
|
|
error: function(e) {
|
|
if (e.status !== 412)
|
|
alert('That didnt work? Please try again....');
|
|
},
|
|
})
|
|
break;
|
|
|
|
case 'entry-userpassword-check':
|
|
$.ajax({
|
|
method: 'GET',
|
|
url: '{{ url('modal/userpassword-check') }}/'+dn,
|
|
dataType: 'html',
|
|
cache: false,
|
|
beforeSend: function() {
|
|
that.empty().append('<span class="p-3"><i class="fas fa-3x fa-spinner fa-pulse"></i></span>');
|
|
},
|
|
success: function(data) {
|
|
that.empty().html(data);
|
|
},
|
|
error: function(e) {
|
|
if (e.status !== 412)
|
|
alert('That didnt work? Please try again....');
|
|
},
|
|
})
|
|
break;
|
|
|
|
default:
|
|
console.log('No action for button:'+$(item.relatedTarget).attr('id'));
|
|
}
|
|
});
|
|
|
|
@if(old())
|
|
editmode();
|
|
@endif
|
|
});
|
|
</script>
|
|
@append |