first commit

This commit is contained in:
sujan
2024-08-06 18:06:00 +05:45
commit a2fa49071a
2745 changed files with 391199 additions and 0 deletions

View File

@ -0,0 +1,30 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="float-end"><a href="{{ add }}" data-bs-toggle="tooltip" title="{{ button_add }}" class="btn btn-primary"><i class="fa-solid fa-plus"></i></a>
<button type="submit" form="form-custom-field" formaction="{{ delete }}" data-bs-toggle="tooltip" title="{{ button_delete }}" onclick="return confirm('{{ text_confirm }}');" class="btn btn-danger"><i class="fa-regular fa-trash-can"></i></button>
</div>
<h1>{{ heading_title }}</h1>
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ol>
</div>
</div>
<div class="container-fluid">
<div class="card">
<div class="card-header"><i class="fa-solid fa-list"></i> {{ text_list }}</div>
<div id="custom-field" class="card-body">{{ list }}</div>
</div>
</div>
</div>
<script type="text/javascript"><!--
$('#custom-field').on('click', 'thead a, .pagination a', function (e) {
e.preventDefault();
$('#custom-field').load(this.href);
});
//--></script>
{{ footer }}

View File

@ -0,0 +1,218 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="float-end">
<button type="submit" form="form-custom-field" formaction="{{ save }}" data-bs-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa-solid fa-floppy-disk"></i></button>
<a href="{{ back }}" data-bs-toggle="tooltip" title="{{ button_back }}" class="btn btn-light"><i class="fa-solid fa-reply"></i></a></div>
<h1>{{ heading_title }}</h1>
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ol>
</div>
</div>
<div class="container-fluid">
<div class="card">
<div class="card-header"><i class="fa-solid fa-pencil"></i> {{ text_form }}</div>
<div class="card-body">
<form id="form-custom-field" action="{{ save }}" method="post" data-oc-toggle="ajax">
<fieldset>
<legend>{{ text_custom_field }}</legend>
<div class="row mb-3 required">
<label class="col-sm-2 col-form-label">{{ entry_name }}</label>
<div class="col-sm-10">
{% for language in languages %}
<div class="input-group">
<div class="input-group-text"><img src="{{ language.image }}" title="{{ language.name }}"/></div>
<input type="text" name="custom_field_description[{{ language.language_id }}][name]" value="{{ custom_field_description[language.language_id] ? custom_field_description[language.language_id].name }}" placeholder="{{ entry_name }}" id="input-name-{{ language.language_id }}" class="form-control"/>
</div>
<div id="error-name-{{ language.language_id }}" class="invalid-feedback"></div>
{% endfor %}
</div>
</div>
<div class="row mb-3">
<label for="input-location" class="col-sm-2 col-form-label">{{ entry_location }}</label>
<div class="col-sm-10">
<select name="location" id="input-location" class="form-select">
<option value="account"{% if location == 'account' %} selected{% endif %}>{{ text_account }}</option>
<option value="address"{% if location == 'address' %} selected{% endif %}>{{ text_address }}</option>
<option value="affiliate"{% if location == 'affiliate' %} selected{% endif %}>{{ text_affiliate }}</option>
</select>
</div>
</div>
<div class="row mb-3">
<label for="input-type" class="col-sm-2 col-form-label">{{ entry_type }}</label>
<div class="col-sm-10">
<select name="type" id="input-type" class="form-select">
<optgroup label="{{ text_choose }}">
<option value="select"{% if type == 'select' %} selected{% endif %}>{{ text_select }}</option>
<option value="radio"{% if type == 'radio' %} selected{% endif %}>{{ text_radio }}</option>
<option value="checkbox"{% if type == 'checkbox' %} selected{% endif %}>{{ text_checkbox }}</option>
</optgroup>
<optgroup label="{{ text_input }}">
<option value="text"{% if type == 'text' %} selected{% endif %}>{{ text_text }}</option>
<option value="textarea"{% if type == 'textarea' %} selected{% endif %}>{{ text_textarea }}</option>
</optgroup>
<optgroup label="{{ text_file }}">
<option value="file"{% if type == 'file' %} selected{% endif %}>{{ text_file }}</option>
</optgroup>
<optgroup label="{{ text_date }}">
<option value="date"{% if type == 'date' %} selected{% endif %}>{{ text_date }}</option>
<option value="time"{% if type == 'time' %} selected{% endif %}>{{ text_time }}</option>
<option value="datetime"{% if type == 'datetime' %} selected{% endif %}>{{ text_datetime }}</option>
</optgroup>
</select>
</div>
</div>
<div class="row mb-3" id="display-value">
<label for="input-value" class="col-sm-2 col-form-label">{{ entry_value }}</label>
<div class="col-sm-10">
<input type="text" name="value" value="{{ value }}" placeholder="{{ entry_value }}" id="input-value" class="form-control"/>
</div>
</div>
<div class="row mb-3" id="display-validation">
<label for="input-validation" class="col-sm-2 col-form-label">{{ entry_validation }}</label>
<div class="col-sm-10">
<input type="text" name="validation" id="input-validation" value="{{ validation }}" placeholder="{{ text_regex }}" class="form-control"/>
<div class="form-text">{{ help_regex }}</div>
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label">{{ entry_customer_group }}</label>
<div class="col-sm-10">
<div class="form-control" style="height: 150px; overflow: auto;">
{% set customer_group_row = 0 %}
{% for customer_group in customer_groups %}
<div class="form-check">
<input type="checkbox" name="custom_field_customer_group[{{ customer_group_row }}][customer_group_id]" value="{{ customer_group.customer_group_id }}" id="input-customer-group-{{ customer_group.customer_group_id }}" class="form-check-input"{% if customer_group.customer_group_id in custom_field_customer_group %} checked{% endif %}/> <label for="input-customer-group-{{ customer_group.customer_group_id }}" class="form-check-label">{{ customer_group.name }}</label>
</div>
{% set customer_group_row = customer_group_row + 1 %}
{% endfor %}</div>
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label">{{ entry_required }}</label>
<div class="col-sm-10">
<div class="form-control" style="height: 150px; overflow: auto;">
{% set customer_group_row = 0 %}
{% for customer_group in customer_groups %}
<div class="form-check">
<input type="checkbox" name="custom_field_customer_group[{{ customer_group_row }}][required]" value="{{ customer_group.customer_group_id }}" id="input-required-{{ customer_group.customer_group_id }}" class="form-check-input"{% if customer_group.customer_group_id in custom_field_required %} checked{% endif %}/> <label for="input-required-{{ customer_group.customer_group_id }}" class="form-check-label">{{ customer_group.name }}</label>
</div>
{% set customer_group_row = customer_group_row + 1 %}
{% endfor %}
</div>
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label">{{ entry_status }}</label>
<div class="col-sm-10">
<div class="form-check form-switch form-switch-lg">
<input type="hidden" name="status" value="0"/>
<input type="checkbox" name="status" value="1" id="input-status" class="form-check-input"{% if status %} checked{% endif %}/>
</div>
</div>
</div>
<div class="row mb-3">
<label for="input-sort-order" class="col-sm-2 col-form-label">{{ entry_sort_order }}</label>
<div class="col-sm-10">
<input type="text" name="sort_order" value="{{ sort_order }}" placeholder="{{ entry_sort_order }}" id="input-sort-order" class="form-control"/>
<div class="form-text">{{ help_sort_order }}</div>
</div>
</div>
</fieldset>
<br/>
<div id="custom-field-value">
<fieldset>
<legend>{{ text_value }}</legend>
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-start required">{{ entry_custom_value }}</td>
<td class="text-end">{{ entry_sort_order }}</td>
<td></td>
</tr>
</thead>
<tbody>
{% set custom_field_value_row = 0 %}
{% for custom_field_value in custom_field_values %}
<tr id="custom-field-value-row-{{ custom_field_value_row }}">
<td class="text-start" style="width: 70%;"><input type="hidden" name="custom_field_value[{{ custom_field_value_row }}][custom_field_value_id]" value="{{ custom_field_value.custom_field_value_id }}"/>
{% for language in languages %}
<div class="input-group">
<div class="input-group-text"><img src="{{ language.image }}" title="{{ language.name }}"/></div>
<input type="text" name="custom_field_value[{{ custom_field_value_row }}][custom_field_value_description][{{ language.language_id }}][name]" value="{{ custom_field_value.custom_field_value_description[language.language_id] ? custom_field_value.custom_field_value_description[language.language_id].name }}" id="input-custom-field-{{ custom_field_value_row }}-{{ language.language_id }}" placeholder="{{ entry_custom_value }}" class="form-control"/>
</div>
<div id="error-custom-field-{{ custom_field_value_row }}-{{ language.language_id }}" class="invalid-feedback"></div>
{% endfor %}</td>
<td class="text-end"><input type="text" name="custom_field_value[{{ custom_field_value_row }}][sort_order]" value="{{ custom_field_value.sort_order }}" placeholder="{{ entry_sort_order }}" class="form-control"/></td>
<td class="text-end"><button type="button" onclick="$('#custom-field-value-row-{{ custom_field_value_row }}').remove();" data-bs-toggle="tooltip" title="{{ button_remove }}" class="btn btn-danger"><i class="fa-solid fa-minus-circle"></i></button></td>
</tr>
{% set custom_field_value_row = custom_field_value_row + 1 %}
{% endfor %}
</tbody>
<tfoot>
<tr>
<td colspan="2"></td>
<td class="text-end"><button type="button" onclick="addCustomFieldValue();" data-bs-toggle="tooltip" title="{{ button_custom_field_value_add }}" class="btn btn-primary"><i class="fa-solid fa-plus-circle"></i></button></td>
</tr>
</tfoot>
</table>
</fieldset>
</div>
<input type="hidden" name="custom_field_id" value="{{ custom_field_id }}" id="input-custom-field-id"/>
</form>
</div>
</div>
</div>
</div>
<script type="text/javascript"><!--
$('#input-type').on('change', function () {
if (this.value == 'select' || this.value == 'radio' || this.value == 'checkbox') {
$('#custom-field-value').show();
$('#display-value, #display-validation').hide();
} else {
$('#custom-field-value').hide();
$('#display-value, #display-validation').show();
}
if (this.value == 'date') {
$('#display-value > div').html('<div class="input-group"><input type="text" name="value" value="' + $('#input-value').val() + '" placeholder="{{ entry_value|escape('js') }}" id="input-value" class="form-control date"/><div class="input-group-text"><i class="fa-regular fa-calendar"></i></div></div>');
} else if (this.value == 'time') {
$('#display-value > div').html('<div class="input-group"><input type="text" name="value" value="' + $('#input-value').val() + '" placeholder="{{ entry_value|escape('js') }}" id="input-value" class="form-control time"/><div class="input-group-text"><i class="fa-regular fa-calendar"></i></div></div>');
} else if (this.value == 'datetime') {
$('#display-value > div').html('<div class="input-group"><input type="text" name="value" value="' + $('#input-value').val() + '" placeholder="{{ entry_value|escape('js') }}" id="input-value" class="form-control datetime"/><div class="input-group-text"><i class="fa-regular fa-calendar"></i></div></div>');
} else if (this.value == 'textarea') {
$('#display-value > div').html('<textarea name="value" placeholder="{{ entry_value|escape('js') }}" id="input-value" class="form-control">' + $('#input-value').val() + '</textarea>');
} else {
$('#display-value > div').html('<input type="text" name="value" value="' + $('#input-value').val() + '" placeholder="{{ entry_value|escape('js') }}" id="input-value" class="form-control"/>');
}
});
$('#input-type').trigger('change');
var custom_field_value_row = {{ custom_field_value_row }};
function addCustomFieldValue() {
html = '<tr id="custom-field-value-row-' + custom_field_value_row + '">';
html += ' <td class="text-start" style="width: 70%;"><input type="hidden" name="custom_field_value[' + custom_field_value_row + '][custom_field_value_id]" value="" />';
{% for language in languages %}
html += ' <div class="input-group">';
html += ' <div class="input-group-text"><img src="{{ language.image|escape('js') }}" title="{{ language.name|escape('js') }}" /></div>';
html += ' <input type="text" name="custom_field_value[' + custom_field_value_row + '][custom_field_value_description][{{ language.language_id }}][name]" value="" placeholder="{{ entry_custom_value|escape('js') }}" id="input-custom-field-{{ custom_field_value_row }}-{{ language.language_id }}" class="form-control"/>';
html += ' </div>';
html += ' <div id="error-custom-field-value-{{ custom_field_value_row }}-{{ language.language_id }}" class="invalid-feedback"></div>';
{% endfor %}
html += ' </td>';
html += ' <td class="text-end"><input type="text" name="custom_field_value[' + custom_field_value_row + '][sort_order]" value="" placeholder="{{ entry_sort_order|escape('js') }}" class="form-control"/></td>';
html += ' <td class="text-end"><button type="button" onclick="$(\'#custom-field-value-row-' + custom_field_value_row + '\').remove();" data-bs-toggle="tooltip" title="{{ button_remove|escape('js') }}" class="btn btn-danger"><i class="fa-solid fa-minus-circle"></i></button></td>';
html += '</tr>';
$('#custom-field-value tbody').append(html);
custom_field_value_row++;
}
//--></script>
{{ footer }}

View File

@ -0,0 +1,45 @@
<form id="form-custom-field" method="post" data-oc-toggle="ajax" data-oc-load="{{ action }}" data-oc-target="#custom-field">
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-center" style="width: 1px;"><input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', $(this).prop('checked'));" class="form-check-input"/></td>
<td class="text-start"><a href="{{ sort_name }}"{% if sort == 'cfd.name' %} class="{{ order|lower }}"{% endif %}>{{ column_name }}</a></td>
<td class="text-start"><a href="{{ sort_location }}"{% if sort == 'cf.location' %} class="{{ order|lower }}"{% endif %}>{{ column_location }}</a></td>
<td class="text-start"><a href="{{ sort_type }}"{% if sort == 'cf.type' %} class="{{ order|lower }}"{% endif %}>{{ column_type }}</a></td>
<td class="text-end d-none d-lg-table-cell"><a href="{{ sort_sort_order }}"{% if sort == 'cf.sort_order' %} class="{{ order|lower }}"{% endif %}>{{ column_sort_order }}</a></td>
<td class="text-end">{{ column_action }}</td>
</tr>
</thead>
<tbody>
{% if custom_fields %}
{% for custom_field in custom_fields %}
<tr>
<td class="text-center"><input type="checkbox" name="selected[]" value="{{ custom_field.custom_field_id }}" class="form-check-input"/></td>
<td class="text-start">{{ custom_field.name }}
<br/>
{% if custom_field.status %}
<small class="text-success">{{ text_enabled }}</small>
{% else %}
<small class="text-danger">{{ text_disabled }}</small>
{% endif %}
</td>
<td class="text-start">{{ custom_field.location }}</td>
<td class="text-start">{{ custom_field.type }}</td>
<td class="text-end d-none d-lg-table-cell">{{ custom_field.sort_order }}</td>
<td class="text-end"><a href="{{ custom_field.edit }}" data-bs-toggle="tooltip" title="{{ button_edit }}" class="btn btn-primary"><i class="fa-solid fa-pencil"></i></a></td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="6">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>
</form>

View File

@ -0,0 +1,178 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="float-end">
<button type="button" data-bs-toggle="tooltip" title="{{ button_filter }}" onclick="$('#filter-customer').toggleClass('d-none');" class="btn btn-light d-md-none d-lg-none"><i class="fa-solid fa-filter"></i></button>
<a href="{{ add }}" data-bs-toggle="tooltip" title="{{ button_add }}" class="btn btn-primary"><i class="fa-solid fa-plus"></i></a>
<button type="submit" form="form-customer" formaction="{{ delete }}" data-bs-toggle="tooltip" title="{{ button_delete }}" onclick="return confirm('{{ text_confirm }}');" class="btn btn-danger"><i class="fa-regular fa-trash-can"></i></button>
</div>
<h1>{{ heading_title }}</h1>
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ol>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div id="filter-customer" class="col-lg-3 col-md-12 order-lg-last d-none d-lg-block mb-3">
<div class="card">
<div class="card-header"><i class="fa-solid fa-filter"></i> {{ text_filter }}</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">{{ entry_name }}</label>
<input type="text" name="filter_name" value="{{ filter_name }}" placeholder="{{ entry_name }}" id="input-name" data-oc-target="autocomplete-name" class="form-control" autocomplete="off"/>
<ul id="autocomplete-name" class="dropdown-menu"></ul>
</div>
<div class="mb-3">
<label class="form-label">{{ entry_email }}</label>
<input type="text" name="filter_email" value="{{ filter_email }}" placeholder="{{ entry_email }}" id="input-email" data-oc-target="autocomplete-email" class="form-control" autocomplete="off"/>
<ul id="autocomplete-email" class="dropdown-menu"></ul>
</div>
<div class="mb-3">
<label for="input-customer-group" class="form-label">{{ entry_customer_group }}</label> <select name="filter_customer_group_id" id="input-customer-group" class="form-select">
<option value=""></option>
{% for customer_group in customer_groups %}
<option value="{{ customer_group.customer_group_id }}"{% if customer_group.customer_group_id == filter_customer_group_id %} selected{% endif %}>{{ customer_group.name }}</option>
{% endfor %}
</select>
</div>
<div class="mb-3">
<label for="input-status" class="form-label">{{ entry_status }}</label> <select name="filter_status" id="input-status" class="form-select">
<option value=""></option>
<option value="1"{% if filter_status == '1' %} selected{% endif %}>{{ text_enabled }}</option>
<option value="0" {% if filter_status == '0' %} selected{% endif %}>{{ text_disabled }}</option>
</select>
</div>
<div class="mb-3">
<label for="input-ip" class="form-label">{{ entry_ip }}</label> <input type="text" name="filter_ip" value="{{ filter_ip }}" placeholder="{{ entry_ip }}" id="input-ip" class="form-control"/>
</div>
<div class="mb-3">
<label for="input-date-from" class="form-label">{{ entry_date_from }}</label>
<div class="input-group">
<input type="text" name="filter_date_from" value="{{ filter_date_from }}" placeholder="{{ entry_date_from }}" id="input-date-from" class="form-control date"/>
<div class="input-group-text"><i class="fa-regular fa-calendar"></i></div>
</div>
</div>
<div class="mb-3">
<label for="input-date-to" class="form-label">{{ entry_date_to }}</label>
<div class="input-group">
<input type="text" name="filter_date_to" value="{{ filter_date_to }}" placeholder="{{ entry_date_to }}" id="input-date-to" class="form-control date"/>
<div class="input-group-text"><i class="fa-regular fa-calendar"></i></div>
</div>
</div>
<div class="text-end">
<button type="button" id="button-filter" class="btn btn-light"><i class="fa-solid fa-filter"></i> {{ button_filter }}</button>
</div>
</div>
</div>
</div>
<div class="col-lg-9 col-md-12">
<div class="card">
<div class="card-header"><i class="fa-solid fa-list"></i> {{ text_list }}</div>
<div id="customer" class="card-body">{{ list }}</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript"><!--
$('#customer').on('click', 'thead a, .pagination a', function (e) {
e.preventDefault();
$('#customer').load(this.href);
});
$('#button-filter').on('click', function () {
url = '';
var filter_name = $('#input-name').val();
if (filter_name) {
url += '&filter_name=' + encodeURIComponent(filter_name);
}
var filter_email = $('#input-email').val();
if (filter_email) {
url += '&filter_email=' + encodeURIComponent(filter_email);
}
var filter_customer_group_id = $('#input-customer-group').val();
if (filter_customer_group_id !== '') {
url += '&filter_customer_group_id=' + filter_customer_group_id;
}
var filter_status = $('#input-status').val();
if (filter_status !== '') {
url += '&filter_status=' + filter_status;
}
var filter_ip = $('#input-ip').val();
if (filter_ip) {
url += '&filter_ip=' + encodeURIComponent(filter_ip);
}
var filter_date_from = $('#input-date-from').val();
if (filter_date_from) {
url += '&filter_date_from=' + encodeURIComponent(filter_date_from);
}
var filter_date_to = $('#input-date-to').val();
if (filter_date_to) {
url += '&filter_date_to=' + encodeURIComponent(filter_date_to);
}
window.history.pushState({}, null, 'index.php?route=customer/customer&user_token={{ user_token }}' + url);
$('#customer').load('index.php?route=customer/customer.list&user_token={{ user_token }}' + url);
});
$('#input-name').autocomplete({
'source': function (request, response) {
$.ajax({
url: 'index.php?route=customer/customer.autocomplete&user_token={{ user_token }}&filter_name=' + encodeURIComponent(request),
dataType: 'json',
success: function (json) {
response($.map(json, function (item) {
return {
label: item['name'],
value: item['customer_id']
}
}));
}
});
},
'select': function (item) {
$('#input-name').val(item['label']);
}
});
$('#input-email').autocomplete({
'source': function (request, response) {
$.ajax({
url: 'index.php?route=customer/customer.autocomplete&user_token={{ user_token }}&filter_email=' + encodeURIComponent(request),
dataType: 'json',
success: function (json) {
response($.map(json, function (item) {
return {
label: item['email'],
value: item['customer_id']
}
}));
}
});
},
'select': function (item) {
$('#input-email').val(item['label']);
}
});
//--></script>
{{ footer }}

View File

@ -0,0 +1,204 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="float-end">
<button type="button" data-bs-toggle="tooltip" title="{{ button_filter }}" onclick="$('#filter-customer').toggleClass('d-none');" class="btn btn-light d-md-none d-lg-none"><i class="fa-solid fa-filter"></i></button>
<button type="submit" form="form-customer-approval" formaction="{{ approve }}" data-bs-toggle="tooltip" title="{{ text_approve }}" class="btn btn-success"><i class="fa-solid fa-check"></i></button>
<button type="submit" form="form-customer-approval" formaction="{{ deny }}" data-bs-toggle="tooltip" title="{{ text_deny }}" class="btn btn-warning"><i class="fa-solid fa-circle-xmark"></i></button>
</div>
<h1>{{ heading_title }}</h1>
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ol>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div id="filter-customer" class="col-lg-3 col-md-12 order-lg-last d-none d-lg-block mb-3">
<div class="card">
<div class="card-header"><i class="fa-solid fa-filter"></i> {{ text_filter }}</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">{{ entry_customer }}</label>
<input type="text" name="filter_customer" value="" placeholder="{{ entry_customer }}" id="input-customer" data-oc-target="autocomplete-customer" class="form-control" autocomplete="off"/>
<ul id="autocomplete-customer" class="dropdown-menu"></ul>
</div>
<div class="mb-3">
<label class="form-label">{{ entry_email }}</label>
<input type="text" name="filter_email" value="" placeholder="{{ entry_email }}" id="input-email" data-oc-target="autocomplete-email" class="form-control" autocomplete="off"/>
<ul id="autocomplete-email" class="dropdown-menu"></ul>
</div>
<div class="mb-3">
<label for="input-customer-group" class="form-label">{{ entry_customer_group }}</label> <select name="filter_customer_group_id" id="input-customer-group" class="form-select">
<option value=""></option>
{% for customer_group in customer_groups %}
<option value="{{ customer_group.customer_group_id }}">{{ customer_group.name }}</option>
{% endfor %}
</select>
</div>
<div class="mb-3">
<label for="input-type" class="form-label">{{ entry_type }}</label> <select name="filter_type" id="input-type" class="form-select">
<option value=""></option>
<option value="customer">{{ text_customer }}</option>
<option value="affiliate">{{ text_affiliate }}</option>
</select>
</div>
<div class="mb-3">
<label for="input-date-from" class="form-label">{{ entry_date_from }}</label>
<div class="input-group">
<input type="text" name="filter_date_from" value="{{ filter_date_from }}" placeholder="{{ entry_date_from }}" id="input-date-from" class="form-control date"/>
<div class="input-group-text"><i class="fa-regular fa-calendar"></i></div>
</div>
</div>
<div class="mb-3">
<label for="input-date-to" class="form-label">{{ entry_date_to }}</label>
<div class="input-group">
<input type="text" name="filter_date_to" value="{{ filter_date_to }}" placeholder="{{ entry_date_to }}" id="input-date-to" class="form-control date"/>
<div class="input-group-text"><i class="fa-regular fa-calendar"></i></div>
</div>
</div>
<div class="text-end">
<button type="button" id="button-filter" class="btn btn-light"><i class="fa-solid fa-filter"></i> {{ button_filter }}</button>
</div>
</div>
</div>
</div>
<div class="col-lg-9 col-md-12">
<div class="card">
<div class="card-header"><i class="fa-solid fa-list"></i> {{ text_list }}</div>
<div class="card-body">
<div id="customer-approval">{{ list }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript"><!--
$('#customer-approval').on('click', '.pagination a', function (e) {
e.preventDefault();
$('#customer-approval').load(this.href);
});
$('#customer-approval').on('click', '.btn-success, .btn-danger', function (e) {
e.preventDefault();
var element = this;
$.ajax({
url: $(element).val(),
dataType: 'json',
beforeSend: function () {
$(element).button('loading');
},
complete: function () {
$(element).button('reset');
},
success: function (json) {
$('.alert-dismissible').remove();
if (json['error']) {
$('#alert').prepend('<div class="alert alert-danger alert-dismissible"><i class="fa-solid fa-circle-exclamation"></i> ' + json['error'] + ' <button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>');
}
if (json['success']) {
$('#alert').prepend('<div class="alert alert-success alert-dismissible"><i class="fa-solid fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>');
$('#customer-approval').load($('#form-customer-approval').attr('data-oc-load'));
}
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
});
$('#button-filter').on('click', function () {
var url = '';
var filter_customer = $('#input-customer').val();
if (filter_customer) {
url += '&filter_customer=' + encodeURIComponent(filter_customer);
}
var filter_email = $('#input-email').val();
if (filter_email) {
url += '&filter_email=' + encodeURIComponent(filter_email);
}
var filter_customer_group_id = $('#input-customer-group').val();
if (filter_customer_group_id !== '') {
url += '&filter_customer_group_id=' + filter_customer_group_id;
}
var filter_type = $('#input-type').val();
if (filter_type !== '') {
url += '&filter_type=' + filter_type;
}
var filter_date_from = $('#input-date-from').val();
if (filter_date_from) {
url += '&filter_date_from=' + encodeURIComponent(filter_date_from);
}
var filter_date_to = $('#input-date-to').val();
if (filter_date_to) {
url += '&filter_date_to=' + encodeURIComponent(filter_date_to);
}
window.history.pushState({}, null, 'index.php?route=customer/customer_approval&user_token={{ user_token }}' + url);
$('#customer-approval').load('index.php?route=customer/customer_approval.list&user_token={{ user_token }}' + url);
});
$('#input-customer').autocomplete({
'source': function (request, response) {
$.ajax({
url: 'index.php?route=customer/customer.autocomplete&user_token={{ user_token }}&filter_name=' + encodeURIComponent(request),
dataType: 'json',
success: function (json) {
response($.map(json, function (item) {
return {
label: item['name'],
value: item['customer_id']
}
}));
}
});
},
'select': function (item) {
$('#input-customer').val(item['label']);
}
});
$('#input-email').autocomplete({
'source': function (request, response) {
$.ajax({
url: 'index.php?route=customer/customer.autocomplete&user_token={{ user_token }}&filter_email=' + encodeURIComponent(request),
dataType: 'json',
success: function (json) {
response($.map(json, function (item) {
return {
label: item['email'],
value: item['customer_id']
}
}));
}
});
},
'select': function (item) {
$('#input-email').val(item['label']);
}
});
//--></script>
{{ footer }}

View File

@ -0,0 +1,41 @@
<form id="form-customer-approval" method="post" data-oc-toggle="ajax" data-oc-load="{{ action }}" data-oc-target="#customer-approval">
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-center" style="width: 1px;"><input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', $(this).prop('checked'));" class="form-check-input"/></td>
<td class="text-start">{{ column_customer }}</td>
<td class="text-start">{{ column_email }}</td>
<td class="text-start">{{ column_customer_group }}</td>
<td class="text-start">{{ column_type }}</td>
<td class="text-start">{{ column_date_added }}</td>
<td class="text-end">{{ column_action }}</td>
</tr>
</thead>
<tbody>
{% if customer_approvals %}
{% for customer_approval in customer_approvals %}
<tr>
<td class="text-center"><input type="checkbox" name="selected[]" value="{{ customer_approval.customer_approval_id }}" class="form-check-input"/></td>
<td class="text-start"><a href="{{ customer_approval.edit }}">{{ customer_approval.customer }}</a></td>
<td class="text-start">{{ customer_approval.email }}</td>
<td class="text-start">{{ customer_approval.customer_group }}</td>
<td class="text-start">{{ customer_approval.type }}</td>
<td class="text-start">{{ customer_approval.date_added }}</td>
<td class="text-end text-nowrap"><button type="button" value="{{ customer_approval.approve }}" data-bs-toggle="tooltip" title="{{ button_approve }}" class="btn btn-success"><i class="fa-solid fa-thumbs-up"></i></button>
<button type="button" value="{{ customer_approval.deny }}" data-bs-toggle="tooltip" title="{{ button_deny }}" class="btn btn-danger"><i class="fa-solid fa-thumbs-down"></i></button></td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="7">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>
</form>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,23 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="float-end"><a href="{{ add }}" data-bs-toggle="tooltip" title="{{ button_add }}" class="btn btn-primary"><i class="fa-solid fa-plus"></i></a>
<button type="submit" form="form-customer-group" formaction="{{ delete }}" data-bs-toggle="tooltip" title="{{ button_delete }}" onclick="return confirm('{{ text_confirm }}');" class="btn btn-danger"><i class="fa-regular fa-trash-can"></i></button>
</div>
<h1>{{ heading_title }}</h1>
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ol>
</div>
</div>
<div class="container-fluid">
<div class="card">
<div class="card-header"><i class="fa-solid fa-list"></i> {{ text_list }}</div>
<div id="customer-group" class="card-body">{{ list }}</div>
</div>
</div>
</div>
{{ footer }}

View File

@ -0,0 +1,68 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="float-end">
<button type="submit" form="form-customer-group" data-bs-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa-solid fa-floppy-disk"></i></button>
<a href="{{ back }}" data-bs-toggle="tooltip" title="{{ button_back }}" class="btn btn-light"><i class="fa-solid fa-reply"></i></a></div>
<h1>{{ heading_title }}</h1>
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ol>
</div>
</div>
<div class="container-fluid">
<div class="card">
<div class="card-header"><i class="fa-solid fa-pencil"></i> {{ text_form }}</div>
<div class="card-body">
<form id="form-customer-group" action="{{ save }}" method="post" data-oc-toggle="ajax">
<div class="row mb-3 required">
<label class="col-sm-2 col-form-label">{{ entry_name }}</label>
<div class="col-sm-10">
{% for language in languages %}
<div class="input-group">
<div class="input-group-text"><img src="{{ language.image }}" title="{{ language.name }}"/></div>
<input type="text" name="customer_group_description[{{ language.language_id }}][name]" value="{{ customer_group_description[language.language_id] ? customer_group_description[language.language_id].name }}" placeholder="{{ entry_name }}" id="input-name-{{ language.language_id }}" class="form-control"/>
<div id="error-name-{{ language.language_id }}" class="invalid-feedback"></div>
</div>
{% endfor %}
</div>
</div>
{% for language in languages %}
<div class="row mb-3">
<label for="input-description-{{ language.language_id }}" class="col-sm-2 col-form-label">{{ entry_description }}</label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-text"><img src="{{ language.image }}" title="{{ language.name }}"/></div>
<textarea name="customer_group_description[{{ language.language_id }}][description]" rows="5" placeholder="{{ entry_description }}" id="input-description-{{ language.language_id }}" class="form-control">{{ customer_group_description[language.language_id] ? customer_group_description[language.language_id].description }}</textarea>
</div>
</div>
</div>
{% endfor %}
<div class="row mb-3">
<label class="col-sm-2 col-form-label">{{ entry_approval }}</label>
<div class="col-sm-10">
<div class="form-check form-switch form-switch-lg">
<input type="hidden" name="approval" value="0"/>
<input type="checkbox" name="approval" value="1" id="input-approval" class="form-check-input"{% if approval %} checked{% endif %}/>
</div>
<div class="form-text">{{ help_approval }}</div>
</div>
</div>
<div class="row mb-3">
<label for="input-sort-order" class="col-sm-2 col-form-label">{{ entry_sort_order }}</label>
<div class="col-sm-10">
<input type="text" name="sort_order" value="{{ sort_order }}" placeholder="{{ entry_sort_order }}" id="input-sort-order" class="form-control"/>
</div>
</div>
<input type="hidden" name="customer_group_id" value="{{ customer_group_id }}" id="input-customer-group-id"/>
</form>
</div>
</div>
</div>
</div>
{{ footer }}

View File

@ -0,0 +1,34 @@
<form id="form-customer-group" method="post" data-oc-toggle="ajax" data-oc-load="{{ action }}" data-oc-target="#customer-group">
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-center" style="width: 1px;"><input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', $(this).prop('checked'));" class="form-check-input"/></td>
<td class="text-start"><a href="{{ sort_name }}"{% if sort == 'cgd.name' %} class="{{ order|lower }}"{% endif %}>{{ column_name }}</a></td>
<td class="text-end"><a href="{{ sort_sort_order }}"{% if sort == 'cg.sort_order' %} class="{{ order|lower }}"{% endif %}>{{ column_sort_order }}</a></td>
<td class="text-end">{{ column_action }}</td>
</tr>
</thead>
<tbody>
{% if customer_groups %}
{% for customer_group in customer_groups %}
<tr>
<td class="text-center"><input type="checkbox" name="selected[]" value="{{ customer_group.customer_group_id }}" class="form-check-input"/></td>
<td class="text-start">{{ customer_group.name }}</td>
<td class="text-end">{{ customer_group.sort_order }}</td>
<td class="text-end"><a href="{{ customer_group.edit }}" data-bs-toggle="tooltip" title="{{ button_edit }}" class="btn btn-primary"><i class="fa-solid fa-pencil"></i></a></td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="4">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>
</form>

View File

@ -0,0 +1,28 @@
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<td class="text-start">{{ column_date_added }}</td>
<td class="text-start">{{ column_comment }}</td>
</tr>
</thead>
<tbody>
{% if histories %}
{% for history in histories %}
<tr>
<td class="text-start">{{ history.date_added }}</td>
<td class="text-start">{{ history.comment }}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="2">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>

View File

@ -0,0 +1,34 @@
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-start">{{ column_ip }}</td>
<td class="text-end">{{ column_account }}</td>
<td class="text-start">{{ column_store }}</td>
<td class="text-start">{{ column_country }}</td>
<td class="text-start">{{ column_date_added }}</td>
</tr>
</thead>
<tbody>
{% if ips %}
{% for ip in ips %}
<tr>
<td class="text-start"><a href="https://whatismyipaddress.com/ip/{{ ip.ip }}" target="_blank">{{ ip.ip }}</a></td>
<td class="text-end"><a href="{{ ip.filter_ip }}" target="_blank">{{ ip.account }}</a></td>
<td class="text-start">{{ ip.store }}</td>
<td class="text-start">{{ ip.country }}</td>
<td class="text-start">{{ ip.date_added }}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="5">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>

View File

@ -0,0 +1,65 @@
<form id="form-customer" method="post" data-oc-toggle="ajax" data-oc-load="{{ action }}" data-oc-target="#customer">
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-center" style="width: 1px;"><input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', $(this).prop('checked'));" class="form-check-input"/></td>
<td class="text-start"><a href="{{ sort_name }}"{% if sort == 'name' %} class="{{ order|lower }}"{% endif %}>{{ column_name }}</a></td>
<td class="text-start"><a href="{{ sort_email }}"{% if sort == 'c.email' %} class="{{ order|lower }}"{% endif %}>{{ column_email }}</a></td>
<td class="text-start"><a href="{{ sort_customer_group }}"{% if sort == 'customer_group' %} class="{{ order|lower }}"{% endif %}>{{ column_customer_group }}</a></td>
<td class="text-start d-none d-lg-table-cell"><a href="{{ sort_date_added }}"{% if sort == 'c.date_added' %} class="{{ order|lower }}"{% endif %}>{{ column_date_added }}</a></td>
<td class="text-end">{{ column_action }}</td>
</tr>
</thead>
<tbody>
{% if customers %}
{% for customer in customers %}
<tr>
<td class="text-center"><input type="checkbox" name="selected[]" value="{{ customer.customer_id }}" class="form-check-input"/></td>
<td class="text-start">{{ customer.name }}
<br/>
{% if customer.status %}
<small class="text-success">{{ text_enabled }}</small>
{% else %}
<small class="text-danger">{{ text_disabled }}</small>
{% endif %}
</td>
<td class="text-start">{{ customer.email }}</td>
<td class="text-start">{{ customer.customer_group }}</td>
<td class="text-start d-none d-lg-table-cell">{{ customer.date_added }}</td>
<td class="text-end">
<div class="btn-group dropdown">
<a href="{{ customer.edit }}" data-bs-toggle="tooltip" title="{{ button_edit }}" class="btn btn-primary"><i class="fa-solid fa-pencil"></i></a>
<button type="button" data-bs-toggle="dropdown" class="btn btn-primary dropdown-toggle dropdown-toggle-split"><span class="fa-solid fa-caret-down"></span></button>
<ul class="dropdown-menu dropdown-menu-end">
<li><h6 class="dropdown-header">{{ text_option }}</h6></li>
{% if customer.unlock %}
<li><a href="{{ customer.unlock }}" class="dropdown-item"><i class="fa-solid fa-unlock"></i> {{ text_unlock }}</a></li>
{% else %}
<li><a href="#" class="dropdown-item disabled"><i class="fa-solid fa-unlock"></i> {{ text_unlock }}</a></li>
{% endif %}
<li>
<hr class="dropdown-divider">
</li>
<li><h6 class="dropdown-header">{{ text_login }}</h6></li>
{% for store in customer.store %}
<li><a href="{{ store.href }}" target="_blank" class="dropdown-item"><i class="fa-solid fa-lock"></i> {{ store.name }}</a></li>
{% endfor %}
</ul>
</div>
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="7">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>
</form>

View File

@ -0,0 +1,35 @@
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<td class="text-start">{{ column_payment_method }}</td>
<td class="text-start">{{ column_image }}</td>
<td class="text-start">{{ column_type }}</td>
<td class="text-start">{{ column_status }}</td>
<td class="text-start">{{ column_date_expire }}</td>
<td class="text-end">{{ column_action }}</td>
</tr>
</thead>
<tbody>
{% if payment_methods %}
{% for payment_method in payment_methods %}
<tr>
<td class="text-start">{{ payment_method.name }}</td>
<td class="text-start">{% if payment_method.image %}<img src="{{ payment_method.image }}" alt=""/>{% endif %}</td>
<td class="text-start">{{ payment_method.type }}</td>
<td class="text-start">{{ payment_method.date_expire }}</td>
<td class="text-end"><button type="button" value="{{ payment_method.delete }}" data-bs-toggle="tooltip" title="{{ button_remove }}" class="btn btn-danger"><i class="fa-solid fa-minus-circle"></i></button></td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="6">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>

View File

@ -0,0 +1,35 @@
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-start">{{ column_date_added }}</td>
<td class="text-start">{{ column_description }}</td>
<td class="text-end">{{ column_points }}</td>
</tr>
</thead>
<tbody>
{% if rewards %}
{% for reward in rewards %}
<tr>
<td class="text-start">{{ reward.date_added }}</td>
<td class="text-start">{{ reward.description }}</td>
<td class="text-end">{{ reward.points }}</td>
</tr>
{% endfor %}
<tr>
<td></td>
<td class="text-end"><b>{{ text_balance }}</b></td>
<td class="text-end">{{ balance }}</td>
</tr>
{% else %}
<tr>
<td class="text-center" colspan="3">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>

View File

@ -0,0 +1,35 @@
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-start">{{ column_date_added }}</td>
<td class="text-start">{{ column_description }}</td>
<td class="text-end">{{ column_amount }}</td>
</tr>
</thead>
<tbody>
{% if transactions %}
{% for transaction in transactions %}
<tr>
<td class="text-start">{{ transaction.date_added }}</td>
<td class="text-start">{{ transaction.description }}</td>
<td class="text-end">{{ transaction.amount }}</td>
</tr>
{% endfor %}
<tr>
<td>&nbsp;</td>
<td class="text-end"><b>{{ text_balance }}</b></td>
<td class="text-end">{{ balance }}</td>
</tr>
{% else %}
<tr>
<td class="text-center" colspan="3">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>

View File

@ -0,0 +1,179 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="float-end">
<button type="button" data-bs-toggle="tooltip" title="{{ button_filter }}" onclick="$('#filter-gdpr').toggleClass('d-none');" class="btn btn-light d-md-none d-lg-none"><i class="fa-solid fa-filter"></i></button>
<button type="submit" form="form-gdpr" formaction="{{ approve }}" data-bs-toggle="tooltip" title="{{ text_approve }}" class="btn btn-success"><i class="fa-solid fa-check"></i></button>
<button type="submit" form="form-gdpr" formaction="{{ deny }}" data-bs-toggle="tooltip" title="{{ text_deny }}" class="btn btn-warning"><i class="fa-solid fa-circle-xmark"></i></button>
<button type="submit" form="form-gdpr" formaction="{{ delete }}" data-bs-toggle="tooltip" title="{{ text_delete }}" onclick="return confirm('{{ text_confirm }}');" class="btn btn-danger"><i class="fa-regular fa-trash-can"></i></button>
</div>
<h1>{{ heading_title }}</h1>
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item"><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ol>
</div>
</div>
<div class="container-fluid">
<div class="alert alert-warning"><i class="fa-solid fa-info-circle"></i> {{ text_info }}</div>
<div class="row">
<div id="filter-gdpr" class="col-lg-3 col-md-12 order-lg-last d-none d-lg-block mb-3">
<div class="card">
<div class="card-header"><i class="fa-solid fa-filter"></i> {{ text_filter }}</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">{{ entry_email }}</label>
<input type="text" name="filter_email" value="" placeholder="{{ entry_email }}" id="input-email" data-oc-target="autocomplete-email" class="form-control" autocomplete="off"/>
<ul id="autocomplete-email" class="dropdown-menu"></ul>
</div>
<div class="mb-3">
<label for="input-action" class="col-form-label">{{ entry_action }}</label>
<select name="filter_action" id="input-action" class="form-select">
<option value=""></option>
<option value="export">{{ text_export }}</option>
<option value="remove">{{ text_remove }}</option>
</select>
</div>
<div class="mb-3">
<label for="input-status" class="form-label">{{ entry_status }}</label>
<select name="filter_status" id="input-status" class="form-select">
<option value=""></option>
<option value="0">{{ text_unverified }}</option>
<option value="1">{{ text_pending }}</option>
<option value="2">{{ text_processing }}</option>
<option value="3">{{ text_complete }}</option>
<option value="-1">{{ text_denied }}</option>
</select>
</div>
<div class="mb-3">
<label for="input-date-from" class="form-label">{{ entry_date_from }}</label>
<div class="input-group">
<input type="text" name="filter_date_from" value="{{ filter_date_from }}" placeholder="{{ entry_date_from }}" id="input-date-from" class="form-control date"/>
<div class="input-group-text"><i class="fa-regular fa-calendar"></i></div>
</div>
</div>
<div class="mb-3">
<label for="input-date-to" class="form-label">{{ entry_date_to }}</label>
<div class="input-group">
<input type="text" name="filter_date_to" value="{{ filter_date_to }}" placeholder="{{ entry_date_to }}" id="input-date-to" class="form-control date"/>
<div class="input-group-text"><i class="fa-regular fa-calendar"></i></div>
</div>
</div>
<div class="text-end">
<button type="button" id="button-filter" class="btn btn-light"><i class="fa-solid fa-filter"></i> {{ button_filter }}</button>
</div>
</div>
</div>
</div>
<div class="col-lg-9 col-md-12">
<div class="card">
<div class="card-header"><i class="fa-solid fa-list"></i> {{ text_list }}</div>
<div class="card-body">
<div id="gdpr">{{ list }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript"><!--
$('#gdpr').on('click', '.pagination a', function (e) {
e.preventDefault();
$('#gdpr').load(this.href);
});
$('#gdpr').on('click', '.btn-success, .btn-warning, .btn-danger', function (e) {
e.preventDefault();
var element = this;
$.ajax({
url: $(element).val(),
dataType: 'json',
beforeSend: function () {
$(element).button('loading');
},
complete: function () {
$(element).button('reset');
},
success: function (json) {
$('.alert-dismissible').remove();
if (json['error']) {
$('#alert').prepend('<div class="alert alert-danger alert-dismissible"><i class="fa-solid fa-circle-exclamation"></i> ' + json['error'] + ' <button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>');
}
if (json['success']) {
$('#alert').prepend('<div class="alert alert-success alert-dismissible"><i class="fa-solid fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>');
$('#gdpr').load($('#form-gdpr').attr('data-oc-load'));
}
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
});
$('#button-filter').on('click', function () {
var url = '';
var filter_email = $('#input-email').val();
if (filter_email) {
url += '&filter_email=' + encodeURIComponent(filter_email);
}
var filter_action = $('#input-action').val();
if (filter_action !== '') {
url += '&filter_action=' + filter_action;
}
var filter_status = $('#input-status').val();
if (filter_status !== '') {
url += '&filter_status=' + filter_status;
}
var filter_date_from = $('#input-date-from').val();
if (filter_date_from) {
url += '&filter_date_from=' + encodeURIComponent(filter_date_from);
}
var filter_date_to = $('#input-date-to').val();
if (filter_date_to) {
url += '&filter_date_to=' + encodeURIComponent(filter_date_to);
}
window.history.pushState({}, null, 'index.php?route=customer/gdpr&user_token={{ user_token }}' + url);
$('#gdpr').load('index.php?route=customer/gdpr.list&user_token={{ user_token }}' + url);
});
$('#input-email').autocomplete({
'source': function (request, response) {
$.ajax({
url: 'index.php?route=customer/customer.autocomplete&user_token={{ user_token }}&filter_email=' + encodeURIComponent(request),
dataType: 'json',
success: function (json) {
response($.map(json, function (item) {
return {
label: item['email'],
value: item['customer_id']
}
}));
}
});
},
'select': function (item) {
$('#input-email').val(item['label']);
}
});
//--></script>
{{ footer }}

View File

@ -0,0 +1,57 @@
<form id="form-gdpr" method="post" data-oc-toggle="ajax" data-oc-load="{{ action }}" data-oc-target="#gdpr">
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td class="text-center" style="width: 1px;"><input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', $(this).prop('checked'));" class="form-check-input"/></td>
<td class="text-start">{{ column_email }}</td>
<td class="text-start">{{ column_request }}</td>
<td class="text-start">{{ column_status }}</td>
<td class="text-start d-none d-lg-table-cell">{{ column_date_added }}</td>
<td class="text-end">{{ column_action }}</td>
</tr>
</thead>
<tbody>
{% if gdprs %}
{% for gdpr in gdprs %}
<tr>
<td class="text-center"><input type="checkbox" name="selected[]" value="{{ gdpr.gdpr_id }}" class="form-check-input"/></td>
<td class="text-start">
{% if gdpr.edit %}
<a href="{{ gdpr.edit }}">{{ gdpr.email }}</a>
{% else %}
{{ gdpr.email }}
{% endif %}
</td>
<td class="text-start">{{ gdpr.action }}</td>
<td class="text-start">
{% if gdpr.status == '-1' %}
<span class="badge bg-danger">{{ text_denied }}</span>
{% elseif gdpr.status == '0' %}
<span class="badge bg-secondary">{{ text_unverified }}</span>
{% elseif gdpr.status == '1' %}
<span class="badge bg-warning">{{ text_pending }}</span>
{% elseif gdpr.status == '2' %}
<span class="badge bg-info">{{ text_processing }}</span>
{% elseif gdpr.status == '3' %}
<span class="badge bg-success">{{ text_complete }}</span>
{% endif %}</td>
<td class="text-start d-none d-lg-table-cell">{{ gdpr.date_added }}</td>
<td class="text-end text-nowrap"><button type="button" value="{{ gdpr.approve }}" data-bs-toggle="tooltip" title="{{ text_approve }}" class="btn btn-success"><i class="fa-solid fa-check"></i></button>
<button type="button" value="{{ gdpr.deny }}" data-bs-toggle="tooltip" title="{{ text_deny }}" class="btn btn-warning"><i class="fa-solid fa-circle-xmark"></i></button>
<button type="button" value="{{ gdpr.delete }}" data-bs-toggle="tooltip" title="{{ text_delete }}" class="btn btn-danger"><i class="fa-regular fa-trash-can"></i></button></td>
</tr>
{% endfor %}
{% else %}
<tr>
<td class="text-center" colspan="6">{{ text_no_results }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-6 text-start">{{ pagination }}</div>
<div class="col-sm-6 text-end">{{ results }}</div>
</div>
</form>