/home/edulekha/crm.edulekha.com/application/views/admin/custom_fields/customfield.php
<?php defined('BASEPATH') or exit('No direct script access allowed'); ?>
<?php init_head(); ?>
<div id="wrapper">
<div class="content">
<div class="tw-max-w-4xl tw-mx-auto">
<div class="tw-flex tw-justify-between tw-items-center tw-mb-4">
<h4 class="tw-my-0 tw-font-bold tw-text-lg tw-text-neutral-700">
<?= e($title); ?>
</h4>
<?php if (isset($custom_field)) { ?>
<a href="<?= admin_url('custom_fields/field'); ?>"
class="btn btn-primary">
<?= _l('new_custom_field'); ?>
</a>
<?php } ?>
</div>
<?= form_open($this->uri->uri_string()); ?>
<div class="panel_s">
<div class="panel-body">
<div
class="company_field_info mbot25 alert alert-info<?= isset($custom_field) && $custom_field->fieldto != 'company' || ! isset($custom_field) ? ' hide' : ''; ?>">
<?= _l('custom_field_info_format_embed_info', [
_l('custom_field_company'),
'<a href="' . admin_url('settings?group=company#settings[company_info_format]') . '" class="alert-link" target="_blank">' . admin_url('settings?group=company') . '</a>',
]); ?>
</div>
<div
class="customers_field_info mbot25 alert alert-info<?= isset($custom_field) && $custom_field->fieldto != 'customers' || ! isset($custom_field) ? ' hide' : ''; ?>">
<?= _l('custom_field_info_format_embed_info', [
_l('clients'),
'<a href="' . admin_url('settings?group=clients#settings[customer_info_format]') . '" class="alert-link" target="_blank">' . admin_url('settings?group=clients') . '</a>',
]); ?>
</div>
<div
class="items_field_info mbot25 alert alert-warning<?= isset($custom_field) && $custom_field->fieldto != 'items' || ! isset($custom_field) ? ' hide' : ''; ?>">
Custom fields for items can't be included in calculation of totals.
</div>
<div
class="proposal_field_info mbot25 alert alert-info<?= isset($custom_field) && $custom_field->fieldto != 'proposal' || ! isset($custom_field) ? ' hide' : ''; ?>">
<?= _l('custom_field_info_format_embed_info', [
_l('proposals'),
'<a href="' . admin_url('settings?group=sales&tab=proposals#settings[proposal_info_format]') . '" class="alert-link" target="_blank">' . admin_url('settings?group=sales&tab=proposals') . '</a>',
]); ?>
</div>
<?php $disable = isset($custom_field) && total_rows(db_prefix() . 'customfieldsvalues', ['fieldid' => $custom_field->id, 'fieldto' => $custom_field->fieldto]) > 0 ? 'disabled' : ''; ?>
<div class="select-placeholder form-group">
<label
for="fieldto"><?= _l('custom_field_add_edit_belongs_top'); ?></label>
<select name="fieldto" id="fieldto" class="selectpicker" data-width="100%"
<?= e($disable); ?>
data-none-selected-text="<?= _l('dropdown_non_selected_tex'); ?>">
<option value=""></option>
<option value="company" <?= isset($custom_field) && $custom_field->fieldto == 'company' ? 'selected' : '' ?>>
<?= _l('custom_field_company'); ?>
</option>
<option value="leads" <?= isset($custom_field) && $custom_field->fieldto == 'leads' ? 'selected' : '' ?>>
<?= _l('custom_field_leads'); ?>
</option>
<option value="customers" <?= isset($custom_field) && $custom_field->fieldto == 'customers' ? 'selected' : '' ?>>
<?= _l('custom_field_customers'); ?>
</option>
<option value="contacts" <?= isset($custom_field) && $custom_field->fieldto == 'contacts' ? 'selected' : '' ?>>
<?= _l('custom_field_contacts'); ?>
</option>
<option value="staff" <?= isset($custom_field) && $custom_field->fieldto == 'staff' ? 'selected' : '' ?>>
<?= _l('custom_field_staff'); ?>
</option>
<option value="contracts" <?= isset($custom_field) && $custom_field->fieldto == 'contracts' ? 'selected' : '' ?>>
<?= _l('custom_field_contracts'); ?>
</option>
<option value="tasks" <?= isset($custom_field) && $custom_field->fieldto == 'tasks' ? 'selected' : '' ?>>
<?= _l('custom_field_tasks'); ?>
</option>
<option value="expenses" <?= isset($custom_field) && $custom_field->fieldto == 'expenses' ? 'selected' : '' ?>>
<?= _l('custom_field_expenses'); ?>
</option>
<option value="invoice" <?= isset($custom_field) && $custom_field->fieldto == 'invoice' ? 'selected' : '' ?>>
<?= _l('custom_field_invoice'); ?>
</option>
<option value="items" <?= isset($custom_field) && $custom_field->fieldto == 'items' ? 'selected' : '' ?>>
<?= _l('items'); ?>
</option>
<option value="credit_note" <?= isset($custom_field) && $custom_field->fieldto == 'credit_note' ? 'selected' : '' ?>>
<?= _l('credit_note'); ?>
</option>
<option value="estimate" <?= isset($custom_field) && $custom_field->fieldto == 'estimate' ? 'selected' : '' ?>>
<?= _l('custom_field_estimate'); ?>
</option>
<option value="proposal" <?= isset($custom_field) && $custom_field->fieldto == 'proposal' ? 'selected' : '' ?>>
<?= _l('proposal'); ?>
</option>
<option value="projects" <?= isset($custom_field) && $custom_field->fieldto == 'projects' ? 'selected' : '' ?>>
<?= _l('projects'); ?>
</option>
<option value="tickets" <?= isset($custom_field) && $custom_field->fieldto == 'tickets' ? 'selected' : '' ?>>
<?= _l('tickets'); ?>
</option>
<?php hooks()->do_action('after_custom_fields_select_options', $custom_field ?? null); ?>
</select>
</div>
<div class="clearfix"></div>
<?php $value = (isset($custom_field) ? $custom_field->name : ''); ?>
<?= render_input('name', 'custom_field_name', $value); ?>
<div class="select-placeholder form-group">
<label
for="type"><?= _l('custom_field_add_edit_type'); ?></label>
<select name="type" id="type" class="selectpicker"
<?= isset($custom_field) && total_rows(db_prefix() . 'customfieldsvalues', ['fieldid' => $custom_field->id, 'fieldto' => $custom_field->fieldto]) > 0 ? 'disabled' : ''; ?>
data-width="100%"
data-none-selected-text="<?= _l('dropdown_non_selected_tex'); ?>"
data-hide-disabled="true">
<option value=""></option>
<option value="input" <?= isset($custom_field) && $custom_field->type == 'input' ? 'selected' : '' ?>>Input
</option>
<option value="number" <?= isset($custom_field) && $custom_field->type == 'number' ? 'selected' : '' ?>>Number
</option>
<option value="textarea" <?= isset($custom_field) && $custom_field->type == 'textarea' ? 'selected' : '' ?>>Textarea
</option>
<option value="select" <?= isset($custom_field) && $custom_field->type == 'select' ? 'selected' : '' ?>>Select
</option>
<option value="multiselect" <?= isset($custom_field) && $custom_field->type == 'multiselect' ? 'selected' : '' ?>>Multi
Select</option>
<option value="checkbox" <?= isset($custom_field) && $custom_field->type == 'checkbox' ? 'selected' : '' ?>>Checkbox
</option>
<option value="date_picker" <?= isset($custom_field) && $custom_field->type == 'date_picker' ? 'selected' : '' ?>>Date
Picker</option>
<option value="date_picker_time" <?= isset($custom_field) && $custom_field->type == 'date_picker_time' ? 'selected' : '' ?>>Datetime
Picker</option>
<option value="colorpicker" <?= isset($custom_field) && $custom_field->type == 'colorpicker' ? 'selected' : '' ?>>Color
Picker</option>
<option value="link" <?= isset($custom_field) && $custom_field->type == 'link' ? 'selected' : '' ?>
<?= isset($custom_field) && $custom_field->fieldto == 'items' ? 'disabled' : '' ?>
>Hyperlink
</option>
</select>
</div>
<div class="clearfix"></div>
<div id="options_wrapper"
class="<?= ! isset($custom_field) || isset($custom_field) && $custom_field->type != 'select' && $custom_field->type != 'checkbox' && $custom_field->type != 'multiselect' ? 'hide' : ''; ?>">
<span class="pull-left fa-regular fa-circle-question" data-toggle="tooltip"
title="<?= _l('custom_field_add_edit_options_tooltip'); ?>"></span>
<?php $value = (isset($custom_field) ? $custom_field->options : ''); ?>
<?= render_textarea('options', 'custom_field_add_edit_options', $value, ['rows' => 3]); ?>
</div>
<div id="default-value-field">
<?php
$value = (isset($custom_field) ? $custom_field->default_value : '');
echo render_textarea(
isset($custom_field) && $custom_field->type === 'textarea' ? 'default_value' : '',
'custom_field_add_edit_default_value',
$value,
[],
[],
'default-value-textarea-input' . (isset($custom_field) && ($custom_field->type !== 'textarea' || $custom_field->type === 'link') ? ' hide' : ''),
'default-value'
);
echo render_input(
isset($custom_field) && ! in_array($custom_field->type, ['textarea', 'link']) ? 'default_value' : '',
'custom_field_add_edit_default_value',
$value,
'text',
[],
[],
'default-value-text-input' . (isset($custom_field) && ($custom_field->type == 'link' || $custom_field->type === 'textarea') ? ' hide' : ''),
'default-value'
);
?>
</div>
<div id="default-value-error" class="hide alert alert-danger"></div>
<?php $value = (isset($custom_field) ? $custom_field->field_order : ''); ?>
<?= render_input('field_order', 'custom_field_add_edit_order', $value, 'number'); ?>
<div class="form-group">
<label
for="bs_column"><?= _l('custom_field_column'); ?></label>
<div class="input-group">
<span class="input-group-addon">col-md-</span>
<input type="number" max="12" class="form-control" name="bs_column" id="bs_column"
value="<?= ! isset($custom_field) ? 12 : $custom_field->bs_column; ?>">
</div>
</div>
<div class="checkbox checkbox-primary">
<input type="checkbox" name="disabled" id="disabled"
<?= isset($custom_field) && $custom_field->active == 0 ? 'checked' : '' ?>>
<label
for="disabled"><?= _l('custom_field_add_edit_disabled'); ?></label>
</div>
<div
class="display-inline-checkbox checkbox checkbox-primary<?= ! isset($custom_field) || (isset($custom_field) && $custom_field->type != 'checkbox') ? ' hide' : '' ?>">
<input type="checkbox" value="1" name="display_inline" id="display_inline"
<?= isset($custom_field) && $custom_field->display_inline == 1 ? 'checked' : '' ?>>
<label
for="display_inline"><?= _l('display_inline'); ?></label>
</div>
<div class="checkbox checkbox-primary">
<input type="checkbox" name="only_admin" id="only_admin"
<?= isset($custom_field) && $custom_field->only_admin == 1 ? 'checked' : '' ?>
<?= isset($custom_field) && ($custom_field->fieldto == 'company' || $custom_field->fieldto == 'items') ? 'disabled' : '' ?>>
<label
for="only_admin"><?= _l('custom_field_only_admin'); ?></label>
</div>
<div
class="checkbox checkbox-primary disalow_client_to_edit <?= ! isset($custom_field) || (isset($custom_field) && ! in_array($custom_field->fieldto, $client_portal_fields)) || (isset($custom_field) && ! in_array($custom_field->fieldto, $client_editable_fields)) ? 'hide' : '' ?>">
<input type="checkbox" name="disalow_client_to_edit" id="disalow_client_to_edit"
<?= isset($custom_field) && $custom_field->disalow_client_to_edit == 1 ? 'checked' : '' ?>
<?= isset($custom_field) && ($custom_field->fieldto == 'company' || $custom_field->only_admin == '1') ? 'disabled' : '' ?>>
<label
for="disalow_client_to_edit"><?= _l('custom_field_disallow_customer_to_edit'); ?></label>
</div>
<div class="checkbox checkbox-primary" id="required_wrap">
<input type="checkbox" name="required" id="required"
<?= isset($custom_field) && $custom_field->required == 1 ? 'checked' : '' ?>
<?= isset($custom_field) && $custom_field->fieldto == 'company' ? 'disabled' : '' ?>>
<label
for="required"><?= _l('custom_field_required'); ?></label>
</div>
<p class="bold">
<?= _l('custom_field_visibility'); ?>
</p>
<div class="checkbox checkbox-primary">
<input type="checkbox" name="show_on_table" id="show_on_table"
<?= isset($custom_field) && $custom_field->show_on_table == 1 ? 'checked' : '' ?>
<?= isset($custom_field) && ($custom_field->fieldto == 'company' || $custom_field->fieldto == 'items') ? 'disabled' : '' ?>>
<label
for="show_on_table"><?= _l('custom_field_show_on_table'); ?></label>
</div>
<div
class="checkbox checkbox-primary show-on-pdf <?= ! isset($custom_field) || (isset($custom_field) && ! in_array($custom_field->fieldto, $pdf_fields)) ? 'hide' : '' ?>">
<input type="checkbox" name="show_on_pdf" id="show_on_pdf"
<?= isset($custom_field) && $custom_field->show_on_pdf == 1 ? 'checked' : '' ?>
<?= isset($custom_field) && ($custom_field->fieldto == 'company' || $custom_field->fieldto == 'items') ? 'disabled' : '' ?>>
<label for="show_on_pdf"><i class="fa-regular fa-circle-question" data-toggle="tooltip"
data-title="<?= _l('custom_field_pdf_html_help'); ?>"></i>
<?= _l('custom_field_show_on_pdf'); ?></label>
</div>
<div
class="checkbox checkbox-primary show-on-client-portal <?= ! isset($custom_field) || (isset($custom_field) && ! in_array($custom_field->fieldto, $client_portal_fields)) ? 'hide' : '' ?>">
<input type="checkbox" name="show_on_client_portal" id="show_on_client_portal"
<?= isset($custom_field) && $custom_field->show_on_client_portal == 1 ? 'checked' : '' ?>
<?= isset($custom_field) && ($custom_field->fieldto == 'company' || $custom_field->only_admin == '1') ? 'disabled' : '' ?>>
<label for="show_on_client_portal"><i class="fa-regular fa-circle-question"
data-toggle="tooltip"
data-title="<?= _l('custom_field_show_on_client_portal_help'); ?>"></i>
<?= _l('custom_field_show_on_client_portal'); ?></label>
</div>
<div
class="show-on-ticket-form checkbox checkbox-primary<?= ! isset($custom_field) || (isset($custom_field) && $custom_field->fieldto != 'tickets') ? ' hide' : '' ?>">
<input type="checkbox" value="1" name="show_on_ticket_form" id="show_on_ticket_form"
<?= isset($custom_field) && $custom_field->show_on_ticket_form == 1 ? 'checked' : '' ?>>
<label
for="show_on_ticket_form"><?= _l('show_on_ticket_form'); ?></label>
</div>
</div>
<div class="panel-footer text-right">
<button type="submit" class="btn btn-primary" id="submitForm">
<?= _l('submit'); ?>
</button>
</div>
</div>
<?= form_close(); ?>
</div>
</div>
</div>
<?php init_tail(); ?>
<script>
var pdf_fields = <?= json_encode($pdf_fields); ?> ;
var
client_portal_fields = <?= json_encode($client_portal_fields); ?> ;
var
client_editable_fields = <?= json_encode($client_editable_fields); ?> ;
$(function() {
appValidateForm($('form'), {
fieldto: 'required',
name: 'required',
type: 'required',
bs_column: 'required',
options: {
required: {
depends: function(element) {
return ['select', 'checkbox', 'multiselect'].indexOf($('#type').val()) > -1
}
}
}
}, function(form) {
validateDefaultValueField().then(function(validation) {
if (validation.valid) {
$('#fieldto,#type').prop('disabled', false);
$.post(form.action, $(form).serialize(), function(data) {
window.location.href = admin_url + 'custom_fields/field/' + data
.id;
}, 'json');
}
});
return false;
});
$('select[name="fieldto"]').on('change', function() {
var field = $(this).val();
$.inArray(field, pdf_fields) !== -1 ? $('.show-on-pdf').removeClass('hide') : $(
'.show-on-pdf')
.addClass('hide');
if ($.inArray(field, client_portal_fields) !== -1) {
$('.show-on-client-portal').removeClass('hide');
$('.disalow_client_to_edit').removeClass('hide');
if ($.inArray(field, client_editable_fields) !== -1) {
$('.disalow_client_to_edit').removeClass('hide');
} else {
$('.disalow_client_to_edit').addClass('hide');
$('.disalow_client_to_edit input').prop('checked', false);
}
} else {
$('.show-on-client-portal').addClass('hide');
$('.disalow_client_to_edit').addClass('hide');
}
if (field == 'tickets') {
$('.show-on-ticket-form').removeClass('hide');
} else {
$('.show-on-ticket-form').addClass('hide');
$('.show-on-ticket-form input').prop('checked', false);
}
field == 'customers' ? $('.customers_field_info').removeClass('hide') : $(
'.customers_field_info').addClass('hide');
field == 'items' ? $('.items_field_info').removeClass('hide') : $('.items_field_info')
.addClass(
'hide');
field == 'company' ? $('.company_field_info').removeClass('hide') : $('.company_field_info')
.addClass('hide');
field == 'proposal' ? $('.proposal_field_info').removeClass('hide') : $(
'.proposal_field_info')
.addClass('hide');
if (field == 'company') {
$('#only_admin').prop('disabled', true).prop('checked', false);
$('input[name="required"]').prop('disabled', true).prop('checked', false);
$('#show_on_table').prop('disabled', true).prop('checked', false);
$('#show_on_client_portal').prop('disabled', true).prop('checked', true);
} else if (field == 'items') {
$('#type option[value="link"]').prop('disabled', true);
$('#show_on_table').prop('disabled', true).prop('checked', true);
$('#show_on_pdf').prop('disabled', true).prop('checked', true);
$('#only_admin').prop('disabled', true).prop('checked', false);
} else {
$('#only_admin').prop('disabled', false).prop('checked', false);
$('input[name="required"]').prop('disabled', false).prop('checked', false);
$('#show_on_table').prop('disabled', false).prop('checked', false);
$('#show_on_client_portal').prop('disabled', false).prop('checked', false);
$('#show_on_pdf').prop('disabled', false).prop('checked', false);
$('#type option[value="link"]').prop('disabled', false);
}
$('#type').selectpicker('refresh');
});
$('select[name="type"]').on('change', function() {
var type = $(this).val();
var options_wrapper = $('#options_wrapper');
var display_inline = $('.display-inline-checkbox')
var default_value = $('#default-value-field');
$('textarea.default-value, input.default-value').val('');
if (type !== 'link' && type !== 'textarea') {
$('textarea.default-value').removeAttr('name');
$('input.default-value').attr('name', 'default_value');
$('.default-value-textarea-input').addClass('hide');
$('.default-value-text-input').removeClass('hide');
}
if (type == 'select' || type == 'checkbox' || type == 'multiselect') {
options_wrapper.removeClass('hide');
if (type == 'checkbox') {
display_inline.removeClass('hide');
} else {
display_inline.addClass('hide');
display_inline.find('input').prop('checked', false);
}
} else if (type === 'link') {
default_value.addClass('hide');
} else if (type === 'textarea') {
$('textarea.default-value').attr('name', 'default_value');
$('input.default-value').removeAttr('name');
$('.default-value-textarea-input').removeClass('hide');
$('.default-value-text-input').addClass('hide');
} else {
options_wrapper.addClass('hide');
display_inline.addClass('hide');
default_value.removeClass('hide')
display_inline.find('input').prop('checked', false);
}
validateDefaultValueField();
});
$('body').on('change', 'input[name="only_admin"]', function() {
$('#show_on_client_portal').prop('disabled', $(this).prop('checked')).prop('checked',
false);
$('#disalow_client_to_edit').prop('disabled', $(this).prop('checked')).prop('checked',
false);
});
$('body').on('blur', '[name="default_value"], #options', function() {
validateDefaultValueField();
});
});
function validateDefaultValueField() {
var value = $('[name="default_value"]').val();
var type = $('#type').val();
var message = '';
var valid = jQuery.Deferred();
var $error = $('#default-value-error');
var $label = $('label[for="default_value"]');
$label.find('.sample').remove();
if (type == '') {
$error.addClass('hide');
return;
}
if (value) {
value = value.trim();
}
switch (type) {
case 'input':
case 'link':
case 'textarea':
valid.resolve({
valid: true,
});
break;
case 'number':
valid.resolve({
valid: value === '' ? true : new RegExp(/^-?(?:\d+|\d*\.\d+)$/).test(value),
message: 'Enter a valid number.',
});
break;
case 'multiselect':
case 'checkbox':
case 'select':
if (value === '') {
valid.resolve({
valid: true,
});
} else {
var defaultOptions = value.split(',')
.map(function(option) {
return option.trim();
}).filter(function(option) {
return option !== ''
});
if (type === 'select' && defaultOptions.length > 1) {
valid.resolve({
valid: true,
message: 'You cannot have multiple options selected on "Select" field type.',
});
} else {
var availableOptions = $('#options').val().split(',')
.map(function(option) {
return option.trim();
}).filter(function(option) {
return option !== ''
});
var nonExistentOptions = defaultOptions.filter(function(i) {
return availableOptions.indexOf(i) < 0;
});
valid.resolve({
valid: nonExistentOptions.length === 0,
message: nonExistentOptions.join(',') +
' options are not available in the options field.',
});
}
}
break;
case 'date_picker':
case 'date_picker_time':
if (value !== '') {
$.post(admin_url + 'custom_fields/validate_default_date', {
date: value,
type: type,
}, function(data) {
valid.resolve({
valid: data.valid,
message: 'Enter date in ' + (type === 'date_picker' ? 'Y-m-d' :
'Y-m-d H:i') +
' format or English date format for the PHP "<a href=\'https://www.php.net/manual/en/function.strtotime.php\'" target="_blank">strtotime</a> function.',
});
if (data.valid) {
$label.append(' <small class="sample">Sample: ' + data.sample + '</small>');
}
}, 'json');
} else {
valid.resolve({
valid: true,
});
}
break;
case 'colorpicker':
valid.resolve({
valid: value === '' ? true : new RegExp(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/gm).test(value),
message: 'Enter color in HEX format, for example: #f2dede',
})
break;
}
valid.done(function(validation) {
$('#submitForm').prop('disabled', !validation.valid);
validation.valid ? $error.addClass('hide') : $error.removeClass('hide');
$error.html(validation.message);
});
return valid;
}
</script>
</body>
</html>