initial commit 2

This commit is contained in:
equippedcoding-master
2025-09-17 15:19:57 -05:00
parent e2c98790b2
commit 1c59875b8a
55391 changed files with 15 additions and 0 deletions

21
portal/user/LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 David Hollingworth
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

5
portal/user/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Signup and Login with PHP and MySQL
Source code to accompany this video: https://youtu.be/5L9UhOnuos0
[![Signup and Login with PHP and MySQL](https://img.youtube.com/vi/5L9UhOnuos0/0.jpg)](https://youtu.be/5L9UhOnuos0)

View File

@@ -0,0 +1,14 @@
{
"plugins": [
"dashboard",
"cards",
"email"
],
"installed": [
"dashboard",
"cards",
"builder",
"paypal",
"email"
]
}

24
portal/user/database.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
require_once dirname( __DIR__ ) . "/admin/core/api/php/includes/include.php";
// /home/cradle2careertxxyz/websites/www10/portal/admin/core/api/php/init.php
$host = $GLOBALS['config']['mysql']['host'];
$dbname = $GLOBALS['config']['mysql']['db'];
$username = $GLOBALS['config']['mysql']['username'];
$password = $GLOBALS['config']['mysql']['password'];
// var_dump($GLOBALS['config']['mysql']);
$mysqli = new mysqli(hostname: $host,
username: $username,
password: $password,
database: $dbname);
if ($mysqli->connect_errno) {
die("Connection error: " . $mysqli->connect_error);
}
return $mysqli;

View File

@@ -0,0 +1,11 @@
<div class="card" style="min-height: 200px;">
<div class="card-body">
<h5 class="card-title">${sponsorship_level_name}</h5>
<!-- <h6 class="card-subtitle mb-2 text-body-secondary">Card subtitle</h6> -->
<p class="card-text mb-5">${description}</p>
${manage_button}
<!-- <a href="#" class="card-link">Another link</a> -->
</div>
</div>

View File

@@ -0,0 +1,18 @@
<div class="container-fluid">
<div class="row">
<div class="col-12 col-lg-3">
<div id="main_container1"></div>
</div>
</div>
</div>
<div class="spacer"></div>

View File

@@ -0,0 +1,233 @@
<div>
<h3>Level: ${sponsorship_level_name}</h3>
</div>
<div class="container-fluid mt-3">
<div class="row">
<div class="col-lg col-lg-3">
<div class="mb-3">
<div id="logo_images"></div>
<form>
<label for="formFileSm" class="form-label">Upload Image Logo</label>
<input class="form-control form-control-sm" id="image_logo_upload" type="file">
</form>
</div>
<div class="col-12">
<!-- <button type="submit" class="btn btn-primary">Update</button> -->
<button class="btn btn-primary" id="image_logo_upload_btn">Upload</button>
</div>
</div>
</div>
<div class="row">
<div class="col-lg col-lg-6">
<div class="accordion accordion-flush" id="accordionFlushExample">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseOne" aria-expanded="false" aria-controls="flush-collapseOne">
Account Details
</button>
</h2>
<div id="flush-collapseOne" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">
<form class="row g-3">
<div class="col-md-6">
<label for="inputEmail4" class="form-label">Email</label>
<input type="email" class="form-control" id="inputEmail4">
</div>
<div class="col-md-6">
<label for="inputPassword4" class="form-label">Password</label>
<input type="password" class="form-control" id="inputPassword4">
</div>
<div class="col-12">
<label for="inputAddress" class="form-label">Address</label>
<input type="text" class="form-control" id="inputAddress" placeholder="1234 Main St">
</div>
<div class="col-12">
<label for="inputAddress2" class="form-label">Address 2</label>
<input type="text" class="form-control" id="inputAddress2" placeholder="Apartment, studio, or floor">
</div>
<div class="col-md-6">
<label for="inputCity" class="form-label">City</label>
<input type="text" class="form-control" id="inputCity">
</div>
<div class="col-md-4">
<label for="inputState" class="form-label">State</label>
<select id="inputState" class="form-select">
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AZ">Arizona</option>
<option value="AR">Arkansas</option>
<option value="CA">California</option>
<option value="CO">Colorado</option>
<option value="CT">Connecticut</option>
<option value="DE">Delaware</option>
<option value="DC">District Of Columbia</option>
<option value="FL">Florida</option>
<option value="GA">Georgia</option>
<option value="HI">Hawaii</option>
<option value="ID">Idaho</option>
<option value="IL">Illinois</option>
<option value="IN">Indiana</option>
<option value="IA">Iowa</option>
<option value="KS">Kansas</option>
<option value="KY">Kentucky</option>
<option value="LA">Louisiana</option>
<option value="ME">Maine</option>
<option value="MD">Maryland</option>
<option value="MA">Massachusetts</option>
<option value="MI">Michigan</option>
<option value="MN">Minnesota</option>
<option value="MS">Mississippi</option>
<option value="MO">Missouri</option>
<option value="MT">Montana</option>
<option value="NE">Nebraska</option>
<option value="NV">Nevada</option>
<option value="NH">New Hampshire</option>
<option value="NJ">New Jersey</option>
<option value="NM">New Mexico</option>
<option value="NY">New York</option>
<option value="NC">North Carolina</option>
<option value="ND">North Dakota</option>
<option value="OH">Ohio</option>
<option value="OK">Oklahoma</option>
<option value="OR">Oregon</option>
<option value="PA">Pennsylvania</option>
<option value="RI">Rhode Island</option>
<option value="SC">South Carolina</option>
<option value="SD">South Dakota</option>
<option value="TN">Tennessee</option>
<option value="TX">Texas</option>
<option value="UT">Utah</option>
<option value="VT">Vermont</option>
<option value="VA">Virginia</option>
<option value="WA">Washington</option>
<option value="WV">West Virginia</option>
<option value="WI">Wisconsin</option>
<option value="WY">Wyoming</option>
</select>
</div>
<div class="col-md-2">
<label for="inputZip" class="form-label">Zip</label>
<input type="text" class="form-control" id="inputZip">
</div>
<div class="col-12">
<!-- <div class="form-check">
<input class="form-check-input" type="checkbox" id="gridCheck">
<label class="form-check-label" for="gridCheck">
Check me out
</label>
</div> -->
</div>
<div class="col-12">
<button type="submit" class="btn btn-primary">Update</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<!--
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseTwo" aria-expanded="false" aria-controls="flush-collapseTwo">
Accordion Item #2
</button>
</h2>
<div id="flush-collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the second item's accordion body. Let's imagine this being filled with some actual content.</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseThree" aria-expanded="false" aria-controls="flush-collapseThree">
Accordion Item #3
</button>
</h2>
<div id="flush-collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the third item's accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application.</div>
</div>
</div>
</div> -->
</div>

117
portal/user/index.php Normal file
View File

@@ -0,0 +1,117 @@
<?php
session_start();
date_default_timezone_set('America/Chicago');
require_once dirname( __DIR__, 2) . "/portal/admin/core/api/php/includes/include.php";
if (isset($_SESSION["user_id"])) {
$mysqli = require __DIR__ . "/database.php";
$sql = "SELECT * FROM member_users WHERE id = {$_SESSION["user_id"]}";
$result = $mysqli->query($sql);
$user = $result->fetch_assoc();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Appfactory Studio - Member Area</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="icon" type="image/x-icon" href="../../assets/favicon.ico">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/css/all.min.css"> -->
<!-- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap"> -->
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous"> -->
<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script> -->
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/core@1.0.0-beta17/dist/css/tabler.min.css"> -->
<link href="../admin/core/api/styles/tabler/tabler.min.css" rel="stylesheet"/>
<?php if (isset($user)): ?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.6/underscore-min.js" integrity="sha512-2V49R8ndaagCOnwmj8QnbT1Gz/rie17UouD9Re5WxbzRVUGoftCu5IuqqtAM9+UC3fwfHCSJR1hkzNQh/2wdtg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.4.1/backbone-min.js" integrity="sha512-TztyCWDNoN0YKl30gDCMKsiWs35juID+W7ZM2uvPeLLmiNvZg789SglgB/QeUbewqIF2Z4mVq3PyIEa+YXXADQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
<!-- <script src="../admin/core/api/js/libs/appfactory/libs/fetch-jsonp.js"></script>
<script src="../admin/core/api/js/libs/appfactory/appfactory2.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsform.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsplugin.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afscard.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afssponsorship.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afspayments.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsnotificationmanager.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsspinner.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsdonations.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsanalytics.js"></script> -->
<script src="../admin/core/api/js/libs/fetch-jsonp.js"></script>
<script src="../admin/core/api/js/libs/appfactory/appfactory2.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsform.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsplugin.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afscard.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afssponsorship.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afspayments.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsnotificationmanager.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsspinner.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsdonations.js"></script>
<script src="../admin/core/api/js/libs/appfactory/afsanalytics.js"></script>
<script src="../admin/core/api/js/libs/sameSize.js"></script>
<script src="../admin/core/api/js/default_schema.js"></script>
<script src="../admin/core/api/js/libs/tabler/tabler.js"></script>
<script src="../admin/core/api/js/default_schema.js"></script>
<!-- <?php //else: ?> -->
<?php endif; ?>
<link href='styles/styles.css' rel='stylesheet'>
<style> .spacer { width: 100%; height:550px;}</style>
</head>
<body data-bs-theme="<?php echo (Input::get("theme")!="") ? Input::get("theme") : "light"; ?>">
<?php
// if (true){
if (isset($user)){
require __DIR__ . "/index_content.php";
?>
<script>let mypage = "index";</script>
<script data-main="js/main" src="../admin/core/api/js/libs/require.js"></script>
<?php
}else{
header("Location: login.php");
?>
<!-- <p><a href="login.php">Log in</a> or <a href="signup.html">sign up</a></p> -->
<?php
}
?>
<!-- <script src="https://cdn.jsdelivr.net/npm/@tabler/core@1.0.0-beta17/dist/js/tabler.min.js"></script> -->
</body>
</html>

View File

@@ -0,0 +1,12 @@
<div class="container">
<div style="height: 400px;" class="row d-flex justify-content-center align-content-center">
<div class="col-3 d-flex justify-content-center">
<h3>Welcome</h3>
</div>
</div>
</div>

306
portal/user/js/main.js Normal file
View File

@@ -0,0 +1,306 @@
(function(){
let req = "../../core/php/request.php";
if(mypage=="index"){
req = "../../core/php/request.php";
}
const REQUEST_URL = req;
let data = { retrieve_data_for_update: true };
const LOADER_REMOVE_WAIT = 0;
const LOADER_ID = "afs-main-loader-screen";
document.body.insertAdjacentHTML("afterbegin", application_loader_screen_html());
$.post(REQUEST_URL,{
get_html_client_templates:true,
path: "portal/user/html"
},function(clientHtmlTemplatesStr){
$.post(REQUEST_URL, data, function(resp){
afsconfig = JSON.parse(resp);
let app = new ApplicationContextManager();
app.extra.config = AFS_SCHEMA_DESCRIPTION_INTEGRATION(afsconfig);
app.extra.config.html = JSON.parse(clientHtmlTemplatesStr);
app.extra.config.afsanalytics = new AFSAnalytics(REQUEST_URL, app);;
app.extra.pay = afsconfig.configurations.payments;
app.extra.payments = new AFSPayments(app);
app.extra.views = {};
app.extra.payments.service.createPaypalInstance();
app.extra.payments.service.paypal().setupLink({
params: "components=buttons,hosted-fields", // default
log: true,
callback: function(isPaypalLoaded){
console.log("isPaypalLoaded: " + isPaypalLoaded);
requirejs.config({ baseUrl: './js/pages/' });
let routes = [mypage];
require(routes, function(_route_func){
setTimeout(() => {
$("#"+LOADER_ID).remove();
_route_func(app);
run(app);
},LOADER_REMOVE_WAIT);
});
}
});
function run(app){
$('.log_out_link').on('click',function(e){
e.preventDefault();
window.location.href = app.extra.config.managed_domain.Address + "/portal/user/logout.php";
});
}
window.gl_process_payment_donation = gl_process_payment_donation;
function gl_process_payment_donation(paypalContainerId,amountId,app){
afspayments.service.paypal().setupCheckout({
container_id: paypalContainerId,
options: {
price: document.getElementById(amountId).innerHTML,
appendNow: true,
paypal_error_message: "Sorry, your transaction could not be processed, please try again.",
showPaypalButton: true,
showPaypalForm: true,
billingAddressEnabled: false,
billingAddressNameEnabled: false,
onSubmit: {
showButton: true,
id: "submit",
className: "paypal-donate-btn",
label: "Donate",
}
},
button_onApprove_callback: function(){
const myModalAlternative = new bootstrap.Modal('#myModal', {});
myModalAlternative.hide();
},
button_onClick_callback: function(){
// dollar-amount
let textObj = document.getElementById("dollar-amount");
let amount = app.utils.moneyFormat(textObj);
if(amount==undefined || amount==""){
amount = "5.00";
}
let floatAmount = parseFloat(amount);
if(floatAmount < 0.5){ amount = "1.00"; }
// card-name
let name_obj = document.getElementById("card-name");
let name = app.utils.moneyFormat(name_obj);
// card-name
let emailObj = document.getElementById("card-email");
let email = app.utils.moneyFormat(emailObj);
return {amount:amount,email:email,name:name};
},
/**
* Called when the order is created. You should retrieve amount
* then validate amount return. If the amount is validate
* successufully then return pass:true otherwise pass:false.
* The amount also needs to be passed.
*
*
* @returns
*/
validate_price_callback: function(){
let textObj = document.getElementById("dollar-amount");
let amount = app.utils.moneyFormat(textObj);
return {pass:true,value:amount};
},
/**
* Called right before submit. Validate any input then return object
* with any data that needs to be passed through with the required
* property pass = true|false.
* @returns
*/
validation_callback: function(){
var nameValue = document.getElementById('card-name').value;
var emailValue = document.getElementById('card-email').value;
var charge = document.getElementById(amountId).innerHTML;
if(nameValue=="" || emailValue==""){
alert("Please provide your name and email!");
return {pass: false};
}
return {
pass: true,
name: nameValue,
email: emailValue,
charge: charge,
amount: charge
};
},
/**
* Called when the transaction has been made successfully.
* @param {*} orderData
*/
success_callback: function(paypalObj){
// nnnnn
// AR2VfeqErRvgVHp6B9ZPRAtfLzEA4tTz__C1EU0F60lsq9GgCLYPAomMgxscP3xEA9qiptKgnEgbJiBQ
// EDJNEZ7HofqGyGkBaSbuQvdbhWfGrkTp6sqXfA1T5Ry-OKrcnq-cm__vCcGy8Wx2LYmrPNyK5PBTBQB2
app.config.configurations.donations[0].json.reference_num = app.config.configurations.donations[0].json.reference_abbr + app.utils.numberId(6);
app.config.configurations.donations[0].json.name = paypalObj.values.name;
app.config.configurations.donations[0].json.email = paypalObj.values.email;
app.config.configurations.donations[0].json.amount = paypalObj.values.amount;
app.config.configurations.donations[0].json.orderData = paypalObj.orderData;
app.config.configurations.donations[0].json.email_response.email = paypalObj.values.email;
app.config.configurations.donations[0].json.
variables.push({name: "email", value: paypalObj.values.email });
app.config.configurations.donations[0].json.
variables.push({name: "fullname", value: paypalObj.values.name });
app.config.configurations.donations[0].json.
variables.push({name: "amount", value: paypalObj.values.amount });
app.config.configurations.donations[0].json.
variables.push({name: "reference_num", value: app.config.configurations.donations[0].json.reference_num });
let mydata = {
"donation_apply_success": true,
"category": app.config.configurations.donations[0].json.category,
"reference_abbr": app.config.configurations.donations[0].json.reference_abbr,
"reference_num": app.config.configurations.donations[0].json.reference_num,
"reference_acct": app.config.configurations.donations[0].json.email,
"json": JSON.stringify(app.config.configurations.donations[0].json)
};
console.log(mydata);
console.log(paypalObj);
$.post(REQUEST_URL,mydata,function(resp){
console.log(resp);
});
},
error_callback: function(err){
console.log(err);
},
success_content: function(paypalObj){
console.log(paypalObj);
return `
<div>
<style>
.tmp-flex-container {
display: flex;
flex-direction: column;
}
</style>
<div class="tmp-flex-container">
<h4>Thank you for your donation!</h4>
<span>You will receive an email receipt to the email address you provided <strong>${paypalObj.values.email}</strong></span>
<span>Continue to follow us and keep up to date with current <a href="#" style="text-decoration: none;">events</a> & <a href="#" style="text-decoration: none;">news</a> and how you can be a Cradle2career <a href="#" style="text-decoration: none";>sponsor.</a></span>
<button style="margin-top:40px;" data-bs-dismiss="modal" class="btn btn-success">Close</button>
</div>
</div>
`},
});
}
function __initialize_paypal(paypalContainerId, self){
self.afspayments.service.paypal().setupCheckout({
container_id: paypalContainerId,
options: {
appendNow: false,
paypal_error_message: "Sorry, your transaction could not be processed, please try again.",
showPaypalButton: true,
showPaypalForm: true,
billingAddressEnabled: true,
billingAddressNameEnabled: true,
onSubmit: {
showButton: false,
id: "sponsorship_submit_button"
}
},
validation_callback: function(){ return {pass: true}; },
validate_price_callback: function(){
console.log(self.sponsorship.json.form.selected_level);
return {pass:true,value: self.sponsorship.json.form.selected_level.price};
},
success_callback: function(orderData){
console.log(orderData);
self.sponsorship.json.order_data = orderData.processor_data;
let acct_password = "";
let acct_name = "";
console.log(self.sponsorship.json.variables);
for(let i=0; i < self.sponsorship.json.variables.length; i++){
if(self.sponsorship.json.variables[i]['name'] == "response_password"){
acct_password = self.sponsorship.json.variables[i]['value'];
}
// if(self.sponsorship.json.variables[i]['name'] == "response_email"){
// acct_name = self.sponsorship.json.variables[i]['value'];
// }
}
acct_name = self.sponsorship.json.reference_acct;
removeFormDataObject(self);
addSystemNeededVariables(self);
variableReplacement(self);
let mydata = {
new_sponsorship: true,
category: self.sponsorship.json.category,
reference_num: self.sponsorship.json.reference_num,
reference_abbr: self.sponsorship.json.reference_abbr,
reference_acct: self.sponsorship.json.reference_acct,
acct_name: acct_name,
password_hash: acct_password,
acct_email: self.sponsorship.json.reference_acct,
quick_view_token: self.sponsorship.json.quick_view_token,
domain: JSON.stringify(self.domain),
json: JSON.stringify(self.sponsorship.json)
};
console.log(mydata);
console.log(self.sponsorship);
$.post('../../core/php/request.php',mydata,function(e){
console.log(e);
});
},
error_callback: function(err){
console.log(err);
},
success_content: function(orderData){
return self.variablesReplace(self.sponsorship.json.success_message,"hash");
}
});
}// end gl_process_payment_sponsorship
});
});// end post client html template
function application_loader_screen_html(){
return `
<div id="${LOADER_ID}">
<div class="page page-center">
<div class="container container-slim py-4">
<div class="text-center">
<div class="mb-3">
<a href="." class="navbar-brand navbar-brand-autodark"><img src="./static/logo-small.svg" height="36" alt=""></a>
</div>
<div class="text-secondary mb-3">Preparing dashboard</div>
<div class="progress progress-sm">
<div class="progress-bar progress-bar-indeterminate"></div>
</div>
</div>
</div>
</div>
</div>
`;
}
})();// END function

View File

@@ -0,0 +1,11 @@
define(["methods"], function(methods) {
return {
methods: methods
};
});

View File

@@ -0,0 +1,11 @@
define(['manager'], function(AppManager) {
function init(app,afsconfig,afspayments){
let appmanager = new AppManager(app,afsconfig,afspayments);
appmanager.init('content_container');
}
return init;
});

View File

@@ -0,0 +1,272 @@
define(["views","methods"], function(routeViews,routeMethods) {
// https://www15.cradle2careertx.xyz/portal/admin/
// https://www15.cradle2careertx.xyz/portal/sponsor/
// https://www15.cradle2careertx.xyz/portal/email/
// https://www15.cradle2careertx.xyz/portal/dashboard/
function AppManager(app,afsconfig,afspayments){
let self = this;
self._props_ = {};
self.container = {};
self.container.views = {};
self.routeViews = routeViews;
self.app = app;
self.afsconfig = afsconfig;
self.domain = afsconfig.managed_domain;
self.afspayments = afspayments;
let notif = [];
for(let i=0; i < afsconfig.notifications.length; i++){
// console.log(afsconfig.notifications[i].json.reference_acct + " | " + afsconfig.user.email)
if(afsconfig.notifications[i].json.reference_acct==afsconfig.user.email){
notif.push(afsconfig.notifications[i]);
}
}
self.sponsorships = notif;
self.sponsor = {};
}
// mmmmm
function ___add_request_object(self){
if(self.sponsor.afssponsorship.sponsorship.json["request"]==undefined){
self.sponsor.afssponsorship.sponsorship.json["request"] = {
"url":"core/php/request.php",
"onsubmit":"api_submit_form_become_a_member",
"dataupload":"api_upload_data",
"fileupload":"api_upload_file",
"savedirectory": "sponsors/files"
};
}
}
function __remove_file_input(self){
let $el = $("#image_logo_upload");
$el.wrap('<form>').closest(
'form').get(0).reset();
$el.unwrap();
}
AppManager.prototype = {
init: function(appendto){
let self = this;
self.container.views.rootview = routeViews.createRootView(self);
document.getElementById(appendto).appendChild(self.container.views.rootview.getHtml());
},
_root_view: {
createSponsorshipCards: function(self){
// console.log(self)
self.sponsor._tmp = {};
self.sponsor.afssponsorship = new AFSSponsorship(self.app, self.afsconfig, self.afspayments);
let cards = "";
let sponsorshipList = [];
self.sponsor.selected_sponsorship = null;
for(let i=0; i < self.sponsorships.length; i++){
// console.log(self.sponsor.afssponsorship.sponsorships[i]);
self.sponsor.afssponsorship.sponsorship = self.sponsorships[i];
cards = (cards=="") ? self.afsconfig.html.card_sponsor : (self.afsconfig.html.card_sponsor + cards);
console.log(cards)
console.log(self.afsconfig.html)
cards = self.sponsor.afssponsorship.variablesReplace(cards,"normal");
let id = "manage_sponsorship_btn"+i;
if(self.sponsor.afssponsorship.sponsorship.json.account.status==0){
cards = self.sponsor.afssponsorship.sanitizeReplace(cards, "description", "Pending", "normal");
cards = self.sponsor.afssponsorship.sanitizeReplace(cards, "manage_button", "", "normal");
}else if(self.sponsor.afssponsorship.sponsorship.json.account.status==1){
cards = self.sponsor.afssponsorship.sanitizeReplace(cards, "description", "Active", "normal");
cards = self.sponsor.afssponsorship.sanitizeReplace(cards, "manage_button", `<a href="#" id="${id}" class="card-link">manage</a>`, "normal");
sponsorshipList.push({id:id, sponsorship: self.sponsor.afssponsorship});
}else if(self.sponsor.afssponsorship.sponsorship.json.account.status==2){
cards = self.sponsor.afssponsorship.sanitizeReplace(cards, "description", "Denied", "normal");
cards = self.sponsor.afssponsorship.sanitizeReplace(cards, "manage_button", "", "normal");
sponsorshipList.push({id:id, sponsorship: self.sponsor.afssponsorship});
}
}
// console.log(self.afsconfig.html.index);
self.sponsor._tmp.sponsorshipList = sponsorshipList;
return self.app.factory.container({
body: self.afsconfig.html.index,
listener: function(e){
let cardhtml = self.app.utils.convertStringToHTMLNode(cards);
document.getElementById("main_container1").appendChild(cardhtml);
}
});
},
_listener_sponsorship_card: function(e,self){
let sponsorshipList = self.sponsor._tmp.sponsorshipList;
// console.log(sponsorshipList);
for (let index = 0; index < sponsorshipList.length; index++) {
const element = sponsorshipList[index];
$("#"+element.id).on('click',function(e){
e.preventDefault();
self.selected_sponsorship = element.sponsorship;
self.container.views.rootview.render('view2');
});
}
},
createSponsorshipView: function(self){
let x = self.sponsor.afssponsorship.variablesReplace(afsconfig.html.sponsorship_view,"normal");
return x;
},
_listener_sponsorship_sponsor_dashboard: function(e,self){
$('#image_logo_upload_btn').on('click',function(event){
event.preventDefault();
self.__upload();
});
self.__getimagesize("image_logo_upload");
self.__display_logo_image();
}
},
__display_logo_image: function(){
let self = this;
let userid = self.afsconfig.user.id;
console.log(self.selected_sponsorship.sponsorship)
let sponsorship = self.selected_sponsorship.sponsorship;
if(sponsorship.json.brand==undefined || sponsorship.json.brand.images==undefined){
return;
}
let filename = sponsorship.json.brand.images[0].new_name;
let systemuser = self.domain.SystemUser;
let savedirectory = self.sponsor.afssponsorship.sponsorship.json.request.savedirectory;
let urlparams = `api_download_file=true&userid=${userid}&file=${filename}&savedirectory=${savedirectory}&systemuser=${systemuser}`;
// mmmmm
let x = `
<div class="card logo_images_card mb-5" style="">
<img style="height:100%;" src="../../core/php/request.php?${urlparams}" class="card-img-top" alt="Cradle2Career">
<div class="card-body">
<p class="card-text"></p>
</div>
</div>
`;
$("#logo_images").empty();
$("#logo_images").append(x);
},
__getimagesize: function(id){
let self = this;
var _URL = window.URL || window.webkitURL;
$("#"+id).on("change",function(e) {
var file, img;
if ((file = this.files[0])) {
img = new Image();
img.onload = function(event) {
// console.log(this.width + " " + this.height);
self.__upload_file = file;
};
img.onerror = function() {
alert( "not a valid file: " + file.type + "- use only PNG,JPG,JPEG,SVG,GIF");
__remove_file_input(self);
};
img.src = _URL.createObjectURL(file);
}
});
},
__upload: function(){
let self = this;
___add_request_object(self);
let file = self.__upload_file;
if(file==undefined || file==null){
return;
}
// console.log(file);
// console.log(self.sponsor.afssponsorship.sponsorship.json);
let filedataobject = {
original_name: file.name,
new_name: self.sponsor.afssponsorship.sponsorship.json.reference_abbr + "_" + self.sponsor.afssponsorship.___filenameGenerator(32) + "." + file.name.split('.').pop(),
category: self.sponsor.afssponsorship.sponsorship.json.category,
savedirectory: self.sponsor.afssponsorship.sponsorship.json.request.savedirectory
}
if(self.sponsor.afssponsorship.sponsorship.json.brand==undefined){
self.sponsor.afssponsorship.sponsorship.json.brand = {};
self.sponsor.afssponsorship.sponsorship.json.brand.images = [];
}
let old_images = self.sponsor.afssponsorship.sponsorship.json.brand.images;
self.sponsor.afssponsorship.sponsorship.json.brand.images = [];
self.sponsor.afssponsorship.sponsorship.json.brand.images.push(filedataobject);
let formData = new FormData();
let datauploadUrl = self.sponsor.afssponsorship.sponsorship.json.request.dataupload;
let fileuploadUrl = self.sponsor.afssponsorship.sponsorship.json.request.fileupload;
let systemuser = self.domain.SystemUser;
formData.append(fileuploadUrl, file);
formData.append(datauploadUrl, JSON.stringify(filedataobject));
formData.append("systemuser", systemuser);
formData.append("savedirectory", self.sponsor.afssponsorship.sponsorship.json.request.savedirectory);
let req = new XMLHttpRequest();
req.addEventListener('progress', function(e) {
var done = e.position || e.loaded, total = e.totalSize || e.total;
// console.log(filedataobject.original_name + ' progress: ' + (Math.floor(done/total*1000)/10) + '%');
}, false);
if ( req.upload ) {
self.upload_in_progress = true;
req.upload.onprogress = function(e) {
var done = e.position || e.loaded, total = e.totalSize || e.total;
// console.log(filedataobject.original_name + ' req.upload progress: ' + done + ' / ' + total + ' = ' + (Math.floor(done/total*1000)/10) + '%');
};
}
req.onreadystatechange = function(e) {
if ( 4 == this.readyState ) {
console.log(this.responseText);
self.upload_in_progress = false;
let url = self.domain.Address + "/core/php/request.php";
$.post(url,{
update_notifications_json: true,
mysql_id: self.sponsor.afssponsorship.sponsorship.json.mysql_id,
data: JSON.stringify(self.sponsor.afssponsorship.sponsorship.json)
},function(resp){
// mmmmm
self.__display_logo_image();
for(let m=0; m < old_images.length; m++){
setTimeout(function(){
// do a marked for deletetest here
// console.log(old_images)
$.post(url,{
delete_file: true,
filename: old_images[m].new_name,
systemuser: systemuser,
savedirectory: "sponsors/files"
},function(resp){
// console.log(resp);
});
},500);
}
// console.log(resp);
});
__remove_file_input(self);
}
};
let requesturl = self.domain.Address + "/" + self.sponsor.afssponsorship.sponsorship.json.request.url
req.open("POST", requesturl);
// req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
req.send(formData);
}
};
return AppManager;
});

View File

@@ -0,0 +1,23 @@
define([], function() {
function init(myapp,afsconfig){
}
return init;
});

View File

@@ -0,0 +1,10 @@
define(["views/root_view"], function(root_view) {
return {
createRootView: function(appmanager){
return root_view(appmanager);
}
}
});

View File

@@ -0,0 +1,64 @@
define([], function() {
function root_view(appmanager){
let app = appmanager.app;
var view = app.factory.view();
let width = "260px";
let height = "200px";
view.newSubView({
id: "load",
init: true,
body: app.factory.container({
body: `<div class="row"><div class="col-12 col-lg-3"><div class="" style="" id="square"></div></div></div>`,
listener: function(e){
let spin = AFSSpinner.create({
type: "default",
id: "square",
width: width,
height: height,
opacity: ".0",
top: "0px",
left: "0px",
spin_color: "blue",
spin_color_bg: "#fff",
mt: "30%"
});
spin.show();
setTimeout(() => {
view.render('view1');
},2000);
}
})
});
view.newSubView({
id: "view1",
init: false,
body: app.factory.container({
body: appmanager._root_view.createSponsorshipCards(appmanager),
listener: function(e){
appmanager._root_view._listener_sponsorship_card(e,appmanager);
}
})
});
view.newSubView({
id: "view2",
init: false,
body: app.factory.container({
body: appmanager._root_view.createSponsorshipView(appmanager),
listener: function(e){
// console.log(13);
appmanager._root_view._listener_sponsorship_sponsor_dashboard(e,appmanager);
}
})
});
return view;
}
return root_view;
});

View File

@@ -0,0 +1,60 @@
const validation = new JustValidate("#signup");
validation
.addField("#name", [
{
rule: "required"
}
])
.addField("#email", [
{
rule: "required"
},
{
rule: "email"
},
{
validator: (value) => () => {
return fetch("validate-email.php?email=" + encodeURIComponent(value))
.then(function(response) {
return response.json();
})
.then(function(json) {
return json.available;
});
},
errorMessage: "email already taken"
}
])
.addField("#password", [
{
rule: "required"
},
{
rule: "password"
}
])
.addField("#password_confirmation", [
{
validator: (value, fields) => {
return value === fields["#password"].elem.value;
},
errorMessage: "Passwords should match"
}
])
.onSuccess((event) => {
document.getElementById("signup").submit();
});

136
portal/user/login.php Normal file
View File

@@ -0,0 +1,136 @@
<?php
$is_invalid = false;
require dirname( __DIR__, 2 ) . "/portal/admin/core/api/php/includes/include.php";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$mysqli = require __DIR__ . "/database.php";
$sql = sprintf("SELECT * FROM sponsor_users WHERE email = '%s'", $mysqli->real_escape_string($_POST["email"]));
$result = $mysqli->query($sql);
$user = $result->fetch_assoc();
if ($user) {
if ($_POST["password"]==$user["password_hash"]) {
// if (password_verify($_POST["password"], $user["password_hash"])) {
session_start();
session_regenerate_id();
$_SESSION["user_id"] = $user["id"];
header("Location: index.php");
exit;
}
}
$is_invalid = true;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cradle2Career - Sponsor Console</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="icon" type="image/x-icon" href="../../assets/favicon.ico">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/css/all.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
<link href='https://unpkg.com/boxicons@2.0.7/css/boxicons.min.css' rel='stylesheet'>
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/water.css"> -->
<script src="https://unpkg.com/just-validate@latest/dist/just-validate.production.min.js" defer></script>
<script src="/js/validation.js" defer></script>
</head>
<body>
<?php if ($is_invalid): ?>
<em>Invalid login</em>
<?php endif; ?>
<!-- <form method="post">
<label for="email">email</label>
<input type="email" name="email" id="email" value="<?= htmlspecialchars($_POST["email"] ?? "") ?>">
<label for="password">Password</label>
<input type="password" name="password" id="password">
<button>Log in</button>
</form> -->
<div class="container-fluid mt-4">
<div class="row d-flex justify-content-center mt-4">
<div class="col-12 col-lg-3 mt-5">
<!-- <h3 class="d-flex justify-content-center">Cradle2Careertx</h3> -->
<div class="d-flex justify-content-center"><img src="../../../assets/c2c_stckd_pos_PMS.svg" height="75" alt="Cradle2Career" class=""></div>
<h3 class="d-flex justify-content-center">Sponsor Login</h3>
<!-- Email input -->
<form class="p-3" method="post">
<div class="form-outline mb-4">
<input type="email" name="email" class="form-control" id="email" value="<?= htmlspecialchars($_POST["email"] ?? "") ?>">
<label class="form-label" for="form2Example1">Email address</label>
</div>
<!-- Password input -->
<div class="form-outline mb-4">
<input type="password" name="password" class="form-control" id="password">
<label class="form-label" for="form2Example2">Password</label>
</div>
<!-- 2 column grid layout for inline styling -->
<!-- <div class="row mb-4">
<div class="col d-flex justify-content-center">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="form2Example31" checked />
<label class="form-check-label" for="form2Example31"> Remember me </label>
</div>
</div>
<div class="col">
<a href="#!">Forgot password?</a>
</div>
</div> -->
<!-- Submit button -->
<button type="submit" class="btn btn-primary btn-block mb-4">Sign in</button>
</form>
</div>
</div>
</div>
<form>
</body>
</html>

8
portal/user/logout.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
session_start();
session_destroy();
header("Location: index.php");
exit;

View File

@@ -0,0 +1,61 @@
<?php
require_once "../include.php";
// /home/cradle2careertxxyz/portal/dashboard/core/api/php/init.php
// if (empty($_POST["name"])) {
// die("Name is required");
// }
if ( ! filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
die("Valid email is required");
}
if (strlen($_POST["password"]) < 8) {
die("Password must be at least 8 characters");
}
if ( ! preg_match("/[a-z]/i", $_POST["password"])) {
die("Password must contain at least one letter");
}
if ( ! preg_match("/[0-9]/", $_POST["password"])) {
die("Password must contain at least one number");
}
if ($_POST["password"] !== $_POST["password_confirmation"]) {
die("Passwords must match");
}
$password_hash = password_hash($_POST["password"], PASSWORD_DEFAULT);
$mysqli = func_get_database();
$sql = "INSERT INTO " . $GLOBALS["AUTH_USER_TABLE"] . " (name, email, username, password_hash) VALUES (?, ?, ?, ?)";
$stmt = $mysqli->stmt_init();
if ( ! $stmt->prepare($sql)) {
die("SQL error: " . $mysqli->error);
}
$stmt->bind_param("ssss",
$_POST["name"],
$_POST["email"],
$_POST["username"],
$password_hash);
if ($stmt->execute()) {
header("Location: signup-success.html");
exit;
} else {
if ($mysqli->errno === 1062) {
die("email already taken");
} else {
die($mysqli->error . " " . $mysqli->errno);
}
}

View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>Signup</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/water.css">
</head>
<body>
<h1>Signup</h1>
<p>Signup successful.
You can now <a href="login.php">log in</a>.</p>
</body>
</html>

50
portal/user/signup.html Normal file
View File

@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html>
<head>
<title>Signup</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/water.css">
<script src="https://unpkg.com/just-validate@latest/dist/just-validate.production.min.js" defer></script>
<script src="/js/validation.js" defer></script>
</head>
<body>
<!-- https://www15.cradle2careertx.xyz/portal/sponsor/signup.html -->
<h1>Signup</h1>
<form action="process-signup.php" method="post" id="signup" novalidate>
<div>
<label for="name">Name</label>
<input type="text" id="name" name="name">
</div>
<div>
<label for="email">email</label>
<input type="email" id="email" name="email">
</div>
<div>
<label for="password">Password</label>
<input type="password" id="password" name="password">
</div>
<div>
<label for="password_confirmation">Repeat password</label>
<input type="password" id="password_confirmation" name="password_confirmation">
</div>
<button>Sign up</button>
</form>
</body>
</html>

View File

@@ -0,0 +1,12 @@
.logo_images_card {
width: 200px;
height: 200px;
}

View File

@@ -0,0 +1,11 @@
<?php
$mysqli = require __DIR__ . "/database.php";
$sql = sprintf("SELECT * FROM user WHERE email = '%s'",$mysqli->real_escape_string($_GET["email"]));
$result = $mysqli->query($sql);
$is_available = $result->num_rows === 0;
header("Content-Type: application/json");
echo json_encode(["available" => $is_available]);