/home/edulekha/crm.edulekha.com/modules/appointly/views/services/service.php
<?php defined('BASEPATH') or exit('No direct script access allowed'); ?>
<?php init_head(); ?>
<div id="wrapper">
<div class="content">
<div class="row">
<div class="col-md-12">
<div class="tw-mb-2 sm:tw-mb-4">
<a href="<?php echo admin_url('appointly/services'); ?>" class="btn btn-primary">
<i class="fa fa-arrow-left tw-mr-1"></i>
<?php echo _l('appointly_service_back_to_list'); ?>
</a>
</div>
<div class="panel_s">
<div class="panel-body">
<h4 class="tw-mt-0 tw-font-semibold tw-text-lg tw-text-neutral-700">
<?php echo $title; ?>
</h4>
<hr class="tw-mt-4" />
<?php echo form_open($this->uri->uri_string(), ['id' => 'service-form']); ?>
<!-- Active and Name in one line -->
<div class="row">
<div class="col-md-12">
<?php if (isset($is_service_in_use) && $is_service_in_use): ?>
<div class="alert alert-warning" style="padding: 8px; margin-bottom: 15px;">
<i class="fa fa-exclamation-triangle"></i>
<?php echo _l('appointly_service_in_use_warning'); ?>
</div>
<?php endif; ?>
<div class="form-group pull-left" style="width: calc(100% - 100px);">
<label class="control-label"><?php echo _l('appointly_service_name'); ?></label>
<input type="text" class="form-control" name="name" value="<?php echo isset($service) && isset($service->name) ? $service->name : ''; ?>" required>
</div>
<div class="checkbox checkbox-primary pull-right" style="background: #f8f9fa; padding: 6px 22px; border: 1px solid #e0e3e7; border-radius: 6px; margin-top: 24px;">
<!-- Hidden fallback input (ensures value is sent even if checkbox is disabled) -->
<input type="hidden" name="active" value="<?php echo (isset($service) && isset($service->active) && $service->active == 1) ? '1' : '0'; ?>">
<?php if (!isset($service_is_active_checked)) { ?>
<input type="checkbox" name="active" id="active" value="1" checked>
<?php } else { ?>
<input type="checkbox" name="active" id="active" value="1"
<?php echo (isset($service) && $service && $service->active == 1 ? 'checked' : ''); ?>
<?php echo $is_service_in_use ? 'disabled' : ''; ?>>
<?php } ?>
<label style="margin-right: -13px;margin-left: 8px;" for="active"><?php echo _l('appointly_service_active'); ?></label>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-3">
<!-- Staff Selection -->
<div class="form-group">
<label for="staff_members" class="control-label">
<span class="text-danger">*</span>
<?php echo _l('appointly_service_staff'); ?>
</label>
<select name="staff_members[]" id="staff_members" class="selectpicker"
data-width="100%"
data-live-search="true"
multiple
required>
<?php
$selected_staff_ids = [];
if (isset($service) && isset($service->staff_members) && !empty($service->staff_members)) {
// Handle different formats
if (is_array($service->staff_members)) {
// If it's already an array of staff members with details
foreach ($service->staff_members as $staff_member) {
if (is_array($staff_member) && isset($staff_member['staff_id'])) {
$selected_staff_ids[] = (int)$staff_member['staff_id'];
} else if (!is_array($staff_member)) {
$selected_staff_ids[] = (int)$staff_member;
}
}
} else if (is_string($service->staff_members)) {
// If it's a JSON string
$decoded = json_decode($service->staff_members, true);
if (is_array($decoded)) {
$selected_staff_ids = array_map('intval', $decoded);
}
}
}
foreach ($staff_members as $staff) { ?>
<option value="<?php echo $staff['staffid']; ?>"
<?php echo in_array($staff['staffid'], $selected_staff_ids) ? 'selected' : ''; ?>>
<?php echo $staff['firstname'] . ' ' . $staff['lastname']; ?>
</option>
<?php } ?>
</select>
</div>
</div>
<div class="col-md-2">
<!-- Directly render the price field instead of using the helper -->
<div class="form-group">
<label for="price" class="control-label"><?php echo _l('appointly_service_price'); ?></label>
<input type="number" id="price" name="price" class="form-control" value="<?php echo isset($service) && isset($service->price) ? $service->price : '0'; ?>" min="0" step="0.01" required>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="duration" class="control-label"><?php echo _l('appointly_service_duration'); ?></label>
<div class="input-group">
<input type="number" class="form-control" id="duration" name="duration" value="<?php echo isset($service) && isset($service->duration) ? $service->duration : '60'; ?>" min="15" step="15" required>
<span class="input-group-addon"><?php echo _l('minutes'); ?></span>
</div>
</div>
</div>
<div class="col-md-3">
<?php echo render_color_picker('color', _l('appointly_service_color'), (isset($service) && isset($service->color) ? $service->color : '#28B8DA')); ?>
</div>
</div>
<hr>
<!-- Buffer Times -->
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="buffer_before"><?php echo _l('appointly_buffer_before'); ?></label>
<div class="input-group">
<input type="number" class="form-control" name="buffer_before" id="buffer_before"
value="<?php echo isset($service) && isset($service->buffer_before) ? $service->buffer_before : '0'; ?>" min="0">
<span class="input-group-addon"><?php echo _l('minutes'); ?></span>
</div>
<small class="text-muted" id="buffer_before_help"><?php echo _l('appointly_buffer_before_help'); ?>
<?php if (isset($service) && isset($service->buffer_before) && $service->buffer_before > 0): ?>
(<?php echo $service->buffer_before; ?> <?php echo _l('appointly_duration_minutes'); ?>)
<?php endif; ?>
</small>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="buffer_after"><?php echo _l('appointly_buffer_after'); ?></label>
<div class="input-group">
<input type="number" class="form-control" name="buffer_after" id="buffer_after"
value="<?php echo isset($service) && isset($service->buffer_after) ? $service->buffer_after : '0'; ?>" min="0">
<span class="input-group-addon"><?php echo _l('minutes'); ?></span>
</div>
<small class="text-muted" id="buffer_after_help"><?php echo _l('appointly_buffer_after_help'); ?>
<?php if (isset($service) && isset($service->buffer_after) && $service->buffer_after > 0): ?>
(<?php echo $service->buffer_after; ?> <?php echo _l('appointly_duration_minutes'); ?>)
<?php endif; ?>
</small>
</div>
</div>
</div>
<hr>
<!-- Description -->
<?php echo render_textarea('description', 'appointly_service_description', isset($service) && isset($service->description) ? $service->description : ''); ?>
<hr>
<!-- Primary Provider Selection -->
<div class="form-group" id="primary_provider_wrapper">
<label for="primary_provider" class="control-label">
<?php echo _l('appointly_service_primary_provider'); ?>
</label>
<select name="primary_provider" id="primary_provider" class="selectpicker"
data-width="100%"
data-live-search="true">
<option value=""><?php echo _l('dropdown_non_selected_tex'); ?></option>
<?php
// Primary provider will be populated dynamically based on selected staff members
$primary_provider_id = (isset($service) && $service && isset($service->primary_provider)) ? $service->primary_provider : null;
foreach ($staff_members as $staff) {
if (in_array($staff['staffid'], $selected_staff_ids)) {
$is_primary = false;
if (isset($service) && $service && isset($service->staff_members) && is_array($service->staff_members)) {
foreach ($service->staff_members as $member) {
if (
isset($member['staff_id'], $member['is_primary']) && is_array($member) && $member['staff_id'] == $staff['staffid'] && $member['is_primary']
) {
$is_primary = true;
break;
}
}
}
// Use the is_primary flag or fall back to primary_provider_id
$selected = $is_primary || $staff['staffid'] == $primary_provider_id ? 'selected' : '';
echo '<option value="' . $staff['staffid'] . '" ' . $selected . '>' .
$staff['firstname'] . ' ' . $staff['lastname'] . '</option>';
}
}
?>
</select>
</div>
<div class="btn-bottom-toolbar text-right">
<button type="submit" class="btn btn-primary"><?php echo _l('submit'); ?></button>
</div>
<?php echo form_close(); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php init_tail(); ?>
<script>
// Pass PHP translations to JavaScript
var appointlyLang = {
selectProvider: "<?php echo addslashes(_l('appointly_select_provider')); ?>",
durationMinutes: "<?php echo addslashes(_l('appointly_duration_minutes')); ?>",
appointly_service_in_use_warning: "<?php echo addslashes(_l('appointly_service_in_use_warning')); ?>",
submit: "<?php echo addslashes(_l('submit')); ?>",
// Validation messages
serviceNameRequired: "<?php echo addslashes(_l('service_name_required')); ?>",
staffMembersRequired: "<?php echo addslashes(_l('appointly_service_providers_required')); ?>",
priceRequired: "<?php echo addslashes(_l('service_price_required')); ?>",
priceInvalid: "<?php echo addslashes(_l('appointly_service_price_invalid')); ?>",
durationRequired: "<?php echo addslashes(_l('service_duration_required')); ?>",
durationInvalid: "<?php echo addslashes(_l('appointly_service_duration_invalid')); ?>"
};
// Set primary provider data attribute for JavaScript to use
<?php if (isset($service->primary_provider) && $service): ?>
$('#primary_provider').data('current', '<?php echo $service->primary_provider; ?>');
<?php endif; ?>
</script>
<script src="<?php echo module_dir_url('appointly') ?>assets/js/services.js?v=<?= time(); ?>"></script>