CHANGE_User + Nhance Partner
This commit is contained in:
parent
9682865454
commit
33581a37a5
@ -73,6 +73,9 @@ $routes->group("/user", ["filter" => "authMVC"], function ($routes) {
|
|||||||
$routes->get("deactive/(:hash)", "UserController::deactive/$1");
|
$routes->get("deactive/(:hash)", "UserController::deactive/$1");
|
||||||
$routes->get("rolesandteams", "UserController::getRolesAndTeams");
|
$routes->get("rolesandteams", "UserController::getRolesAndTeams");
|
||||||
$routes->get("getUserActivityHistory", "UserController::getUserActivityHistory");
|
$routes->get("getUserActivityHistory", "UserController::getUserActivityHistory");
|
||||||
|
$routes->match(['get','post','put'], 'partner', 'UserController::partner');
|
||||||
|
$routes->match(['get','post','put'], 'partnerIncentive', 'UserController::partnerIncentive');
|
||||||
|
$routes->get("download-incentive-file/(:any)", "UserController::downloadIncentivesFile/$1");
|
||||||
});
|
});
|
||||||
|
|
||||||
$routes->group("/dashboard", ["filter" => "authMVC"], function ($routes) {
|
$routes->group("/dashboard", ["filter" => "authMVC"], function ($routes) {
|
||||||
|
|||||||
@ -18,6 +18,8 @@ use App\Models\UserTeamsModel;
|
|||||||
use App\Helpers\BookStackUserHelper;
|
use App\Helpers\BookStackUserHelper;
|
||||||
use App\Models\AuthHistoryModel;
|
use App\Models\AuthHistoryModel;
|
||||||
use App\Models\UserActivityHistoryModel;
|
use App\Models\UserActivityHistoryModel;
|
||||||
|
use App\Models\PartnerStaffModel;
|
||||||
|
use App\Models\PartnerManagerIncentiveFileModel;
|
||||||
|
|
||||||
|
|
||||||
class UserController extends AdminController
|
class UserController extends AdminController
|
||||||
@ -32,6 +34,8 @@ class UserController extends AdminController
|
|||||||
protected $bookStack;
|
protected $bookStack;
|
||||||
protected $authHistoryModel;
|
protected $authHistoryModel;
|
||||||
protected $userActivityHistoryModel;
|
protected $userActivityHistoryModel;
|
||||||
|
protected $partnerStaffModel;
|
||||||
|
protected $partnerManagerIncentiveFileModel;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -45,6 +49,8 @@ class UserController extends AdminController
|
|||||||
$this->bookStack = new BookStackUserHelper();
|
$this->bookStack = new BookStackUserHelper();
|
||||||
$this->authHistoryModel = new AuthHistoryModel();
|
$this->authHistoryModel = new AuthHistoryModel();
|
||||||
$this->userActivityHistoryModel = new UserActivityHistoryModel();
|
$this->userActivityHistoryModel = new UserActivityHistoryModel();
|
||||||
|
$this->partnerStaffModel = new PartnerStaffModel();
|
||||||
|
$this->partnerManagerIncentiveFileModel = new PartnerManagerIncentiveFileModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function list()
|
public function list()
|
||||||
@ -563,4 +569,211 @@ class UserController extends AdminController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function partner()
|
||||||
|
{
|
||||||
|
$method = $this->request->getMethod(); // get, post
|
||||||
|
try{
|
||||||
|
// Listing
|
||||||
|
if ($method === 'get') {
|
||||||
|
$types = $this->partnerStaffModel->findAll();
|
||||||
|
if (empty($types)) {
|
||||||
|
return $this->response->setJSON(['status' => 'error','message' => 'No Staff found'])->setStatusCode(404);
|
||||||
|
}
|
||||||
|
return $this->response->setJSON(['status' => 'success','data' => $types])->setStatusCode(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add/update
|
||||||
|
if ($method === 'post') {
|
||||||
|
|
||||||
|
$data = $this->request->getPost();
|
||||||
|
if (!empty($data['id'])) {
|
||||||
|
$text = "update";
|
||||||
|
$result = $this->partnerStaffModel->update($data['id'], $data);
|
||||||
|
$updateID = $data['id'];
|
||||||
|
} else {
|
||||||
|
$text = "create";
|
||||||
|
$data['role_id'] = 1;
|
||||||
|
$data['created_by'] = get_session_userid();
|
||||||
|
$insertID = $this->partnerStaffModel->insert($data);
|
||||||
|
$result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = isset($insertID) && !empty($insertID) ? $insertID : ($updateID ?? null);
|
||||||
|
|
||||||
|
return $this->response->setJSON([
|
||||||
|
'status' => $id ? 'success' : 'error',
|
||||||
|
'message' => $id ? "Staff {$text}d successfully" : "Unable to {$text} staff. Please try again.",
|
||||||
|
'id' => $id
|
||||||
|
])->setStatusCode($id ? 200 : 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete
|
||||||
|
if ($method === 'put') {
|
||||||
|
$data = $this->request->getRawInput();
|
||||||
|
$id = $data['id'] ?? null;
|
||||||
|
|
||||||
|
if (!$id) {
|
||||||
|
return $this->response->setJSON(['status' => 'error', 'message' => 'ID is required'])->setStatusCode(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$staff = $this->partnerStaffModel->find($id);
|
||||||
|
if (!$staff) {
|
||||||
|
return $this->response->setJSON(['status' => 'error','message' => 'Staff not found'])->setStatusCode(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($staff['is_active'] == 1) {
|
||||||
|
$result = $this->partnerStaffModel->update($id, ['is_active' => 0]);
|
||||||
|
$message = "Staff deleted successfully";
|
||||||
|
} else {
|
||||||
|
return $this->response->setJSON(['status' => 'error','message' => 'Staff already deleted'])->setStatusCode(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->response->setJSON([
|
||||||
|
'status' => $result ? 'success' : 'error',
|
||||||
|
'message' => $result ? $message : "Unable to delete staff. Please try again.",
|
||||||
|
'id' => $id
|
||||||
|
])->setStatusCode($result ? 200 : 400);
|
||||||
|
}
|
||||||
|
return $this->response->setJSON([ 'status' => 'error', 'message' => 'Invalid request method' ])->setStatusCode(405);
|
||||||
|
}
|
||||||
|
catch (\Throwable $e) {
|
||||||
|
$code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
|
||||||
|
|
||||||
|
$isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
|
||||||
|
|| $e instanceof \mysqli_sql_exception
|
||||||
|
|| $e instanceof \PDOException;
|
||||||
|
|
||||||
|
$context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
|
||||||
|
|
||||||
|
$this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
|
||||||
|
|
||||||
|
return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
|
||||||
|
'ref' => $isDbError ? 'database - ' : 'application - ' . $code . ' - ' . $e->getLine()
|
||||||
|
])->setStatusCode($code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function partnerIncentive()
|
||||||
|
{
|
||||||
|
$method = $this->request->getMethod(); // get, post
|
||||||
|
try{
|
||||||
|
// Listing
|
||||||
|
if ($method === 'get') {
|
||||||
|
$manager_id = $this->request->getGet('manager_id');
|
||||||
|
$files = $this->partnerManagerIncentiveFileModel->where('manager_id', $manager_id)->findAll();
|
||||||
|
if (empty($files)) {
|
||||||
|
return $this->response->setJSON(['status' => 'error','message' => 'No Records found'])->setStatusCode(404);
|
||||||
|
}
|
||||||
|
return $this->response->setJSON(['status' => 'success','data' => $files])->setStatusCode(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add/update
|
||||||
|
if ($method === 'post') {
|
||||||
|
|
||||||
|
$file = $this->request->getFile('incentive_file_name');
|
||||||
|
$month = $this->request->getPost('incentive_month');
|
||||||
|
$managerId = $this->request->getPost('manager_id');
|
||||||
|
$fileId = $this->request->getPost('id');
|
||||||
|
|
||||||
|
if ($file && $file->isValid() && !$file->hasMoved()) {
|
||||||
|
$fileName = $file->getName();
|
||||||
|
$path = WRITEPATH.'uploads/incentives';
|
||||||
|
$file->move($path, $fileName);
|
||||||
|
$data = [
|
||||||
|
'manager_id' => $managerId,
|
||||||
|
'incentive_month' => date('Y-m-d', strtotime($month)),
|
||||||
|
'incentive_file_name' => $fileName,
|
||||||
|
'created_by' => get_session_userid()
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($fileId) {
|
||||||
|
$text = "update";
|
||||||
|
$this->partnerManagerIncentiveFileModel->update($fileId, $data);
|
||||||
|
$updateID = $data['id'];
|
||||||
|
} else {
|
||||||
|
$text = "create";
|
||||||
|
$insertID = $this->partnerManagerIncentiveFileModel->insert($data);
|
||||||
|
$result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = isset($insertID) && !empty($insertID) ? $insertID : ($updateID ?? null);
|
||||||
|
|
||||||
|
return $this->response->setJSON([
|
||||||
|
'status' => $id ? 'success' : 'error',
|
||||||
|
'message' => $id ? "File {$text}d successfully" : "Unable to {$text} file. Please try again.",
|
||||||
|
'id' => $id
|
||||||
|
])->setStatusCode($id ? 200 : 400);
|
||||||
|
}
|
||||||
|
return $this->response->setJSON([
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => "Unable to Upload file. Please try again.",
|
||||||
|
'id' => ''
|
||||||
|
])->setStatusCode(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete
|
||||||
|
if ($method === 'put') {
|
||||||
|
$data = $this->request->getRawInput();
|
||||||
|
$id = $data['id'] ?? null;
|
||||||
|
|
||||||
|
if (!$id) {
|
||||||
|
return $this->response->setJSON(['status' => 'error', 'message' => 'ID is required'])->setStatusCode(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
$files = $this->partnerManagerIncentiveFileModel->find($id);
|
||||||
|
if (!$files) {
|
||||||
|
return $this->response->setJSON(['status' => 'error','message' => 'No Records found'])->setStatusCode(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($files['is_active'] == 1) {
|
||||||
|
$result = $this->partnerManagerIncentiveFileModel->update($id, ['is_active' => 0]);
|
||||||
|
$message = "Files deleted successfully";
|
||||||
|
} else {
|
||||||
|
return $this->response->setJSON(['status' => 'error','message' => 'files already deleted'])->setStatusCode(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->response->setJSON([
|
||||||
|
'status' => $result ? 'success' : 'error',
|
||||||
|
'message' => $result ? $message : "Unable to delete staff. Please try again.",
|
||||||
|
'id' => $id
|
||||||
|
])->setStatusCode($result ? 200 : 400);
|
||||||
|
}
|
||||||
|
return $this->response->setJSON([ 'status' => 'error', 'message' => 'Invalid request method' ])->setStatusCode(405);
|
||||||
|
}
|
||||||
|
catch (\Throwable $e) {
|
||||||
|
$code = ($e->getCode() && $e->getCode() >= 100 && $e->getCode() < 600) ? $e->getCode() : 500;
|
||||||
|
|
||||||
|
$isDbError = $e instanceof \CodeIgniter\Database\Exceptions\DatabaseException
|
||||||
|
|| $e instanceof \mysqli_sql_exception
|
||||||
|
|| $e instanceof \PDOException;
|
||||||
|
|
||||||
|
$context = ['title' => get_class($e),'type' => get_class($e),'code' => $code,'message' => $e->getMessage(),'file' => $e->getFile(),'line' => $e->getLine()];
|
||||||
|
|
||||||
|
$this->myLogger->logme('error', "Exception: {message} in {file} on line {line}", $context, 0);
|
||||||
|
|
||||||
|
return $this->response->setJSON([ 'status' => 'error', 'message' => $isDbError ? 'Data Access Error' : $e->getMessage(),
|
||||||
|
'ref' => $isDbError ? 'database - ' : 'application - ' . $code . ' - ' . $e->getLine()
|
||||||
|
])->setStatusCode($code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function downloadIncentivesFile($file_name)
|
||||||
|
{
|
||||||
|
$file_name = basename($file_name);
|
||||||
|
$filePath = WRITEPATH . 'uploads/incentives/' . $file_name;
|
||||||
|
try {
|
||||||
|
if (file_exists($filePath)) {
|
||||||
|
return $this->response->download($filePath, null);
|
||||||
|
} else {
|
||||||
|
$data['message'] = 'File Not Found';
|
||||||
|
echo view('errors/404', $data);
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// Handle any exceptions
|
||||||
|
$errorMessage = $e->getMessage();
|
||||||
|
$this->myLogger->logme('error', $errorMessage);
|
||||||
|
// You can return an error response here
|
||||||
|
echo $errorMessage;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
56
app/Models/PartnerManagerIncentiveFileModel.php
Executable file
56
app/Models/PartnerManagerIncentiveFileModel.php
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class PartnerManagerIncentiveFileModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'partner_manager_incentive_file';
|
||||||
|
protected $primaryKey = 'id';
|
||||||
|
protected $useAutoIncrement = true;
|
||||||
|
|
||||||
|
protected $returnType = 'array'; // or 'object'
|
||||||
|
protected $useSoftDeletes = false;
|
||||||
|
|
||||||
|
protected $allowedFields = [
|
||||||
|
'manager_id',
|
||||||
|
'incentive_month',
|
||||||
|
'incentive_file_name',
|
||||||
|
'is_active',
|
||||||
|
'created_by',
|
||||||
|
'created_on',
|
||||||
|
'updated_by',
|
||||||
|
'updated_on'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Timestamps
|
||||||
|
protected $useTimestamps = true;
|
||||||
|
protected $createdField = 'created_on';
|
||||||
|
protected $updatedField = 'updated_on';
|
||||||
|
protected $dateFormat = 'datetime'; // can be 'date' or 'int'
|
||||||
|
|
||||||
|
// Validation Rules (optional, can add more)
|
||||||
|
// protected $validationRules = [
|
||||||
|
// 'manager_id' => 'required|integer',
|
||||||
|
// 'incentive_month' => 'required|valid_date',
|
||||||
|
// 'incentive_file_name'=> 'required|string|max_length[150]',
|
||||||
|
// ];
|
||||||
|
|
||||||
|
// protected $validationMessages = [
|
||||||
|
// 'manager_id' => [
|
||||||
|
// 'required' => 'Manager ID is required',
|
||||||
|
// 'integer' => 'Manager ID must be a number',
|
||||||
|
// ],
|
||||||
|
// 'incentive_month' => [
|
||||||
|
// 'required' => 'Incentive Month is required',
|
||||||
|
// 'valid_date' => 'Incentive Month must be a valid date (Y-m-d)',
|
||||||
|
// ],
|
||||||
|
// 'incentive_file_name' => [
|
||||||
|
// 'required' => 'File name is required',
|
||||||
|
// 'max_length' => 'File name cannot exceed 150 characters',
|
||||||
|
// ],
|
||||||
|
// ];
|
||||||
|
|
||||||
|
// protected $skipValidation = false;
|
||||||
|
}
|
||||||
50
app/Models/PartnerStaffModel.php
Executable file
50
app/Models/PartnerStaffModel.php
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class PartnerStaffModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'partner_staff'; // table name
|
||||||
|
protected $primaryKey = 'id'; // primary key
|
||||||
|
|
||||||
|
protected $useAutoIncrement = true;
|
||||||
|
|
||||||
|
// return results as array
|
||||||
|
protected $returnType = 'array';
|
||||||
|
protected $useSoftDeletes = false;
|
||||||
|
|
||||||
|
// allowed fields for insert/update
|
||||||
|
protected $allowedFields = ['name','email','mobile','emp_id','role_id','email_otp','is_active','created_by','updated_by','manager_id'];
|
||||||
|
|
||||||
|
// automatic timestamps
|
||||||
|
protected $useTimestamps = true;
|
||||||
|
protected $createdField = 'created_on';
|
||||||
|
protected $updatedField = 'updated_on';
|
||||||
|
protected $dateFormat = 'datetime';
|
||||||
|
|
||||||
|
// validation rules
|
||||||
|
// protected $validationRules = [
|
||||||
|
// 'name' => 'required|min_length[2]|max_length[150]',
|
||||||
|
// 'email' => 'permit_empty|valid_email|max_length[150]',
|
||||||
|
// 'mobile' => 'permit_empty|regex_match[/^[0-9]{10,20}$/]',
|
||||||
|
// ];
|
||||||
|
|
||||||
|
// protected $validationMessages = [
|
||||||
|
// 'name' => [
|
||||||
|
// 'required' => 'Name is required',
|
||||||
|
// 'min_length' => 'Name must have at least 2 characters',
|
||||||
|
// 'max_length' => 'Name cannot exceed 150 characters'
|
||||||
|
// ],
|
||||||
|
// 'email' => [
|
||||||
|
// 'valid_email' => 'Please provide a valid email address',
|
||||||
|
// 'max_length' => 'Email cannot exceed 150 characters'
|
||||||
|
// ],
|
||||||
|
// 'mobile' => [
|
||||||
|
// 'regex_match' => 'Mobile number must be 10–20 digits only'
|
||||||
|
// ]
|
||||||
|
// ];
|
||||||
|
|
||||||
|
// protected $skipValidation = false;
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,25 +1,4 @@
|
|||||||
<style>
|
|
||||||
.input-icon {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-icon .form-control {
|
|
||||||
width: 100%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-icon .additional-icon {
|
|
||||||
position: absolute;
|
|
||||||
right: 10px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
pointer-events: none;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<!-- modal content -->
|
<!-- modal content -->
|
||||||
<div id="con-close-modal" class="modal fade app-font-family" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static">
|
<div id="con-close-modal" class="modal fade app-font-family" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static">
|
||||||
<div class="modal-dialog modal-dialog-centered modal-lg" <?= !isset($CD_Master_Data) ? 'style="max-width: 35% !important; margin:5px auto!important;"' : '' ?>>
|
<div class="modal-dialog modal-dialog-centered modal-lg" <?= !isset($CD_Master_Data) ? 'style="max-width: 35% !important; margin:5px auto!important;"' : '' ?>>
|
||||||
|
|||||||
@ -61,37 +61,6 @@ input:checked + .slider:before {
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style>
|
|
||||||
.form-input-icon {
|
|
||||||
position: relative;
|
|
||||||
width: 100%; /* match Bootstrap's width */
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-input-icon input[type="file"].form-control {
|
|
||||||
padding-right: 40px; /* space for the icon */
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-input-icon input[type="file"].form-control::file-selector-button {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-input-icon .form-additional-icon {
|
|
||||||
position: absolute;
|
|
||||||
right: 12px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
font-size: 18px;
|
|
||||||
color: #555;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type="radio"] {
|
|
||||||
accent-color: #40B2B6; /* sets the checked color */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div class="tab-pane fade active show" id="general-q-tab">
|
<div class="tab-pane fade active show" id="general-q-tab">
|
||||||
|
|
||||||
@ -190,10 +159,10 @@ input:checked + .slider:before {
|
|||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="insurer_logo" class="col-md-4 col-form-label">Insurer Logo</label>
|
<label for="insurer_logo" class="col-md-4 col-form-label">Insurer Logo</label>
|
||||||
<div class="col-md-5">
|
<div class="col-md-5">
|
||||||
<div class="form-input-icon">
|
<div class="input-icon">
|
||||||
<input type="file" class="form-control" id="insurer_logo" name="insurer_logo"
|
<input type="file" class="form-control" id="insurer_logo" name="insurer_logo"
|
||||||
accept="image/jpeg, image/jpg, image/png" onchange="PreviewImage();">
|
accept="image/jpeg, image/jpg, image/png" onchange="PreviewImage();">
|
||||||
<i class="mdi mdi-upload form-additional-icon"></i>
|
<i class="mdi mdi-upload additional-icon"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
|
|||||||
@ -1124,7 +1124,59 @@ a.app-badge-secondary:focus, a.app-badge-secondary.focus {
|
|||||||
padding-top: 0px;
|
padding-top: 0px;
|
||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.btn-custom {
|
||||||
|
font-weight: 500;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1;
|
||||||
|
letter-spacing: 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
<style>
|
||||||
|
|
||||||
|
/* Common wrapper (works for text/file inputs) */
|
||||||
|
.input-icon {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All form controls inside */
|
||||||
|
.input-icon .form-control {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding-right: 40px; /* always keep space for icon */
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide default file button */
|
||||||
|
.input-icon .form-control[type="file"]::file-selector-button {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-icon input[type="file"].form-control {
|
||||||
|
padding-right: 40px; /* space for the icon */
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Common icon class */
|
||||||
|
.input-icon .additional-icon {
|
||||||
|
position: absolute;
|
||||||
|
right: 12px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
font-size: 18px;
|
||||||
|
color: #555;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="radio"] {
|
||||||
|
accent-color: #40B2B6; /* sets the checked color */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|||||||
@ -32,21 +32,6 @@ table.dataTable td.wrap {
|
|||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.btn-custom {
|
|
||||||
font-weight: 500;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 1;
|
|
||||||
letter-spacing: 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user