Function bodies 134 total
doLogin function · javascript · L3-L6 (4 LOC)js/admin/auth.js
async function doLogin(){var u=document.getElementById('l-user').value.trim(),p=document.getElementById('l-pass').value,e=document.getElementById('l-err');e.style.display='none';if(!u||!p){e.textContent='Enter credentials';e.style.display='block';return}
try{var r=await api('GET','admin_users','?username=eq.'+encodeURIComponent(u)+'&password=eq.'+encodeURIComponent(p));if(r&&r.length){admin=r[0];localStorage.setItem('rydz-adm',JSON.stringify(admin));await api('PATCH','admin_users','?id=eq.'+admin.id,{last_login:new Date().toISOString(),is_online:true});showApp();return}}catch(ex){}
if(u==='admin'&&p==='rydz'){admin={id:'local',username:'admin',role:'super_admin',name:'Super Admin'};localStorage.setItem('rydz-adm',JSON.stringify(admin));showApp();return}
e.textContent='Invalid credentials';e.style.display='block'}exportCSV function · javascript · L6-L10 (5 LOC)js/admin/helpers.js
function exportCSV(type){var rows=[];if(type==='riders'){rows.push(['Name','Email','Phone','Rides','Completed','Cancelled','Status']);users.filter(function(u){return u.role!=='driver'&&u.role!=='admin'}).forEach(function(u){var ur=rides.filter(function(r){return r.rider_id===u.id});var c=ur.filter(function(r){return r.status==='completed'}).length;var x=ur.filter(function(r){return r.status==='cancelled'}).length;rows.push([u.name,u.email,u.phone,ur.length,c,x,u.disabled?'Disabled':'Active'])})}else{rows.push(['Name','Email','Phone','Vehicle','Plate','Username','Rides','Rating','Status']);users.filter(function(u){return u.role==='driver'}).forEach(function(d){var dr=rides.filter(function(r){return r.driver_id===d.id});var c=dr.filter(function(r){return r.status==='completed'}).length;var rated=dr.filter(function(r){return r.rating});var avg=rated.length?(rated.reduce(function(a,r){return a+r.rating},0)/rated.length).toFixed(1):'--';rows.push([d.name,d.email,d.phone,d.vehicle,d.plate,d.renderAccessAccounts function · javascript · L4-L12 (9 LOC)js/admin/pages/access.js
function renderAccessAccounts(){var tb=document.getElementById('a-tbody');if(!tb)return;
tb.innerHTML=adminAccts.map(function(a){
var isOnline=a.last_seen&&(Date.now()-new Date(a.last_seen).getTime()<120000);
var dot='<span class="online-dot '+(isOnline?'on':'off')+'"></span>'+(isOnline?'Online':'Offline');
var roleBadge=a.role==='super_admin'?'<span class="badge sa">Super Admin</span>':a.role==='admin'?'<span class="badge act">Admin</span>':'<span class="badge off">Operations</span>';
var lastLogin=a.last_login?ago(new Date(a.last_login)):'Never';
var actions='';
if(isSuperAdmin&&a.role!=='super_admin'){actions='<select style="padding:4px 8px;background:var(--bg3);border:1px solid var(--bdr);border-radius:var(--r);color:var(--tx);font-size:11px;font-family:var(--font)" data-xid="'+a.id+'" onchange="changeRole(this.dataset.xid,this.value)"><option value="admin"'+(a.role==='admin'?' selected':'')+'>Admin</option><option value="operations"'+(a.role==='operations'?' selected':'')+'>OperatcreateAccount function · javascript · L13-L16 (4 LOC)js/admin/pages/access.js
async function createAccount(){var nm=document.getElementById('ca-name').value.trim(),em=document.getElementById('ca-email').value.trim(),ph=document.getElementById('ca-phone').value.trim(),un=document.getElementById('ca-user').value.trim(),pw=document.getElementById('ca-pass').value,rl=document.getElementById('ca-role').value;
if(!un){alert('Username required');return}if(!pw){alert('Password required');return}
var existing=await api('GET','admin_users','?username=eq.'+encodeURIComponent(un));if(existing&&existing.length){alert('Username already taken');return}
await api('POST','admin_users','',{username:un,password:pw,name:nm||un,email:em,phone:ph,role:rl});await logAct('create_account',un);closeMod('ca');['ca-name','ca-email','ca-phone','ca-user','ca-pass'].forEach(function(x){document.getElementById(x).value=''});loadAccessAccounts()}loadCategories function · javascript · L28-L37 (10 LOC)js/admin/pages/categories.js
async function loadCategories() {
var data = await api('GET', 'categories', '?order=priority.asc,created_at.asc');
if (data && data.length) {
_cats = data;
} else {
_cats = [];
}
_catDirty = false;
renderCategories();
}_iconSvg function · javascript · L40-L44 (5 LOC)js/admin/pages/categories.js
function _iconSvg(key, size) {
size = size || 22;
var inner = ICON_LIB[key] || ICON_LIB.star;
return '<svg width="' + size + '" height="' + size + '" fill="none" stroke="#fff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">' + inner + '</svg>';
}_iconPreview function · javascript · L46-L48 (3 LOC)js/admin/pages/categories.js
function _iconPreview(key) {
return '<div style="width:44px;height:44px;border-radius:11px;background:linear-gradient(135deg,#007AFF,#0098ff);display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 3px 10px rgba(0,122,255,.18)">' + _iconSvg(key, 22) + '</div>';
}Generated by Repobility's multi-pass static-analysis pipeline (https://repobility.com)
_iconPicker function · javascript · L51-L64 (14 LOC)js/admin/pages/categories.js
function _iconPicker(catIdx) {
var html = '<div style="display:flex;flex-wrap:wrap;gap:6px;margin-top:6px">';
ICON_KEYS.forEach(function(k) {
var sel = _cats[catIdx].icon_key === k;
html += '<div onclick="pickCatIcon(' + catIdx + ',\'' + k + '\')" style="width:36px;height:36px;border-radius:9px;background:' +
(sel ? 'linear-gradient(135deg,#007AFF,#0098ff)' : 'var(--bg3)') +
';display:flex;align-items:center;justify-content:center;cursor:pointer;border:2px solid ' +
(sel ? '#007AFF' : 'transparent') + ';transition:all .15s">' +
'<svg width="18" height="18" fill="none" stroke="' + (sel ? '#fff' : 'var(--tx2)') + '" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">' +
(ICON_LIB[k] || '') + '</svg></div>';
});
html += '</div>';
return html;
}pickCatIcon function · javascript · L66-L70 (5 LOC)js/admin/pages/categories.js
function pickCatIcon(idx, key) {
_cats[idx].icon_key = key;
_catDirty = true;
renderCategories();
}renderCategories function · javascript · L73-L134 (62 LOC)js/admin/pages/categories.js
function renderCategories() {
var el = document.getElementById('cat-list');
if (!el) return;
var enabledCount = _cats.filter(function(c) { return c.enabled; }).length;
// Header
var html = '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">' +
'<div>' +
'<span style="font-size:13px;color:var(--tx3)">Manage categories shown on the rider app. Max 5 enabled.</span>' +
'<div style="margin-top:4px;font-size:12px;font-weight:700;color:' + (enabledCount > 5 ? 'var(--rd)' : 'var(--gn)') + '">' + enabledCount + ' / 5 enabled</div>' +
'</div>' +
'<div style="display:flex;gap:8px">' +
'<button onclick="addCategory()" style="padding:8px 18px;background:var(--bl);color:#fff;border:none;border-radius:var(--r);font-size:12px;font-weight:700;font-family:var(--font);cursor:pointer">+ Add Category</button>' +
'<button onclick="saveCategories()" style="padding:8px 18px;background:' + (_catDirty ? 'var(--gn)' : 'vasetCatField function · javascript · L137-L143 (7 LOC)js/admin/pages/categories.js
function setCatField(idx, field, val) {
_cats[idx][field] = val;
_catDirty = true;
// Only update save button, not full re-render (preserves focus)
var btn = document.getElementById('cat-save-btn');
if (btn) { btn.textContent = 'Save Changes'; btn.style.background = 'var(--gn)'; btn.style.color = '#fff'; }
}toggleCatEnabled function · javascript · L145-L155 (11 LOC)js/admin/pages/categories.js
function toggleCatEnabled(idx, val) {
var enabledCount = _cats.filter(function(c) { return c.enabled; }).length;
if (val && enabledCount >= 5) {
alert('Maximum 5 categories can be enabled. Disable one first.');
renderCategories();
return;
}
_cats[idx].enabled = val;
_catDirty = true;
renderCategories();
}moveCatUp function · javascript · L157-L168 (12 LOC)js/admin/pages/categories.js
function moveCatUp(idx) {
if (idx === 0) return;
// Swap priorities
var cur = _cats[idx].priority;
var prev = _cats[idx - 1].priority;
_cats[idx].priority = prev;
_cats[idx - 1].priority = cur;
// Re-sort
_cats.sort(function(a, b) { return a.priority - b.priority; });
_catDirty = true;
renderCategories();
}moveCatDown function · javascript · L170-L179 (10 LOC)js/admin/pages/categories.js
function moveCatDown(idx) {
if (idx >= _cats.length - 1) return;
var cur = _cats[idx].priority;
var nxt = _cats[idx + 1].priority;
_cats[idx].priority = nxt;
_cats[idx + 1].priority = cur;
_cats.sort(function(a, b) { return a.priority - b.priority; });
_catDirty = true;
renderCategories();
}addCategory function · javascript · L181-L192 (12 LOC)js/admin/pages/categories.js
function addCategory() {
_cats.push({
id: null,
label: 'New Category',
icon_key: 'star',
priority: 5,
enabled: false,
created_at: new Date().toISOString()
});
_catDirty = true;
renderCategories();
}Citation: Repobility (2026). State of AI-Generated Code. https://repobility.com/research/
deleteCategory function · javascript · L194-L206 (13 LOC)js/admin/pages/categories.js
function deleteCategory(idx) {
if (!confirm('Delete "' + _cats[idx].label + '"? This also removes it from all places.')) return;
var cat = _cats[idx];
_cats.splice(idx, 1);
_catDirty = true;
renderCategories();
// Delete from DB if it has an ID
if (cat.id) {
api('DELETE', 'place_categories', '?category_id=eq.' + cat.id);
api('DELETE', 'categories', '?id=eq.' + cat.id);
}
}saveCategories function · javascript · L209-L243 (35 LOC)js/admin/pages/categories.js
async function saveCategories() {
if (!_catDirty) return;
var btn = document.getElementById('cat-save-btn');
if (btn) { btn.textContent = 'Saving...'; btn.style.background = 'var(--bg3)'; btn.style.color = 'var(--tx3)'; }
// Reassign clean priorities 0-N based on current order
_cats.forEach(function(c, i) { c.priority = i; });
for (var i = 0; i < _cats.length; i++) {
var cat = _cats[i];
var payload = {
label: cat.label,
icon_key: cat.icon_key,
priority: cat.priority,
enabled: cat.enabled,
updated_at: new Date().toISOString()
};
if (cat.id) {
// Update existing
await api('PATCH', 'categories', '?id=eq.' + cat.id, payload);
} else {
// Insert new
var result = await api('POST', 'categories', '', payload);
if (result && result.length) {
_cats[i].id = result[0].id;
}
}
}
_catDirty = false;
if (btn) { btn.textContent = 'Saved!'; btn.style.background = 'var(--gn)'; btn.stylrenderDashboard function · javascript · L3-L9 (7 LOC)js/admin/pages/dashboard.js
function renderDashboard(){var drvs=users.filter(function(u){return u.role==='driver'});var rdrs=users.filter(function(u){return u.role!=='driver'&&u.role!=='admin'});var ds=getDayStart();var tR=rides.filter(function(r){return r.created_at&&new Date(r.created_at).getTime()>=ds});var tC=tR.filter(function(r){return r.status==='completed'});var tX=tR.filter(function(r){return r.status==='cancelled'});var allC=rides.filter(function(r){return r.status==='completed'});
document.getElementById('dash-sys').innerHTML=dss('Total Drivers',drvs.length)+dss('Total Riders',rdrs.length)+dss('Total Rides',rides.length)+dss('Completed',allC.length);
document.getElementById('dash-today').innerHTML=dss('Requested',tR.length)+dss('Completed',tC.length)+dss('Cancelled',tX.length)+dss('Rate',tR.length?Math.round(tC.length/tR.length*100)+'%':'--');
var topD=drvs.map(function(d){var c=rides.filter(function(r){return r.driver_id===d.id&&r.status==='completed'}).length;return{n:d.name,c:c}}).sort(function(a,b)renderDrivers function · javascript · L3-L5 (3 LOC)js/admin/pages/drivers.js
function renderDrivers(){var tb=document.getElementById('d-tbody');var q=(document.getElementById('d-search').value||'').toLowerCase();var dl=users.filter(function(u){return u.role==='driver'});if(q)dl=dl.filter(function(d){return(d.name||'').toLowerCase().indexOf(q)>=0||(d.vehicle||'').toLowerCase().indexOf(q)>=0||(d.email||'').toLowerCase().indexOf(q)>=0});
tb.innerHTML=dl.map(function(d){var dr=rides.filter(function(r){return r.driver_id===d.id});var c=dr.filter(function(r){return r.status==='completed'}).length;var rated=dr.filter(function(r){return r.rating});var avgR=rated.length?Math.round(rated.reduce(function(a,r){return a+r.rating},0)/rated.length*10)/10:0;var stars=avgR?avgR.toFixed(1)+' <span class="star">★</span>':'--';var st=d.status==='online'?'<span class="badge on">Online</span>':'<span class="badge off">Offline</span>';var ac=d.disabled?'<span class="badge dis">Disabled</span>':'<span class="badge on">Active</span>';
return'<tr data-xid="'+d.id+'" onclick="openDopenDrvPN function · javascript · L6-L14 (9 LOC)js/admin/pages/drivers.js
async function openDrvPN(did){var d=users.find(function(x){return x.id===did});if(!d)return;var dr=rides.filter(function(r){return r.driver_id===did});var c=dr.filter(function(r){return r.status==='completed'}).length;var x=dr.filter(function(r){return r.status==='cancelled'}).length;var rated=dr.filter(function(r){return r.rating});var avgR=rated.length?(rated.reduce(function(a,r){return a+r.rating},0)/rated.length).toFixed(1):'--';var AS=['accepted','en_route','arrived','picked_up'];var ar=rides.find(function(r){return r.driver_id===did&&AS.indexOf(r.status)>=0});
var notes=await api('GET','admin_notes','?user_id=eq.'+encodeURIComponent(did)+'&order=created_at.desc');
document.getElementById('pn-title').textContent=d.name||'Driver';
var profileRows=row('Name',d.name)+row('Email',d.email)+row('Phone',d.phone)+row('Vehicle',d.vehicle)+row('Plate',d.plate);
if(isSuperAdmin)profileRows+=row('Username',d.username)+row('Password',d.password);
profileRows+=row('Status',d.status==='online'?'updateMetrics function · javascript · L3-L8 (6 LOC)js/admin/pages/home.js
function updateMetrics(){var drvs=users.filter(function(u){return u.role==='driver'});var on=drvs.filter(function(d){return d.status==='online'});var AS=['accepted','en_route','arrived','picked_up'];var act=rides.filter(function(r){return AS.indexOf(r.status)>=0});var pnd=rides.filter(function(r){return r.status==='requested'});var ds=getDayStart();var tR=rides.filter(function(r){return r.created_at&&new Date(r.created_at).getTime()>=ds});var tC=tR.filter(function(r){return r.status==='completed'});var tX=tR.filter(function(r){return r.status==='cancelled'});var pendingTix=tickets.filter(function(t){return!t.status||t.status==='pending'});
document.getElementById('mc-on').textContent=on.length;document.getElementById('mc-on-s').textContent='of '+drvs.length+' total';
document.getElementById('mc-act').textContent=act.length;document.getElementById('mc-pnd').textContent=pnd.length;
document.getElementById('mc-tix').textContent=pendingTix.length;
document.getElementById('mc-tod').textCont_placeInArea function · javascript · L9-L21 (13 LOC)js/admin/pages/places.js
function _placeInArea(lat, lng) {
if (!lat || !lng) return false;
if (lat < 26.087 || lat > 26.178 || lng < -81.823 || lng > -81.774) return false;
if (typeof google !== 'undefined' && google.maps && google.maps.geometry) {
try {
return google.maps.geometry.poly.containsLocation(
new google.maps.LatLng(lat, lng),
new google.maps.Polygon({ paths: SVC })
);
} catch (e) {}
}
return true;
}loadPlaces function · javascript · L24-L31 (8 LOC)js/admin/pages/places.js
async function loadPlaces() {
var p = await api('GET', 'places', '?order=name.asc');
var pc = await api('GET', 'place_categories', '');
if (p) _places = p;
if (pc) _placeCats = pc;
_editPlace = null;
renderPlaces();
}Repobility (the analyzer behind this table) · https://repobility.com
_getCatsForPlace function · javascript · L34-L38 (5 LOC)js/admin/pages/places.js
function _getCatsForPlace(placeId) {
return _placeCats
.filter(function(pc) { return pc.place_id === placeId; })
.map(function(pc) { return pc.category_id; });
}_getCatLabel function · javascript · L40-L43 (4 LOC)js/admin/pages/places.js
function _getCatLabel(catId) {
var c = _cats.find(function(cat) { return cat.id === catId; });
return c ? c.label : '';
}renderPlaces function · javascript · L46-L101 (56 LOC)js/admin/pages/places.js
function renderPlaces() {
var el = document.getElementById('places-list');
if (!el) return;
var html = '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">' +
'<div><span style="font-size:13px;color:var(--tx3)">' + _places.length + ' places total</span></div>' +
'<div style="display:flex;gap:8px">' +
'<input id="place-search" placeholder="Search places..." oninput="renderPlaces()" style="padding:8px 12px;background:var(--bg3);border:1px solid var(--bdr);border-radius:var(--r);color:var(--tx);font-size:12px;font-family:var(--font);width:200px">' +
'<button onclick="openPlaceEditor(null)" style="padding:8px 18px;background:var(--bl);color:#fff;border:none;border-radius:var(--r);font-size:12px;font-weight:700;font-family:var(--font);cursor:pointer">+ Add Place</button>' +
'</div>' +
'</div>';
// Filter
var searchEl = document.getElementById('place-search');
var q = searchEl ? searchEl.value.toLowerCase().tropenPlaceEditor function · javascript · L104-L115 (12 LOC)js/admin/pages/places.js
function openPlaceEditor(id) {
if (id) {
var existing = _places.find(function(p) { return p.id === id; });
if (existing) {
_editPlace = JSON.parse(JSON.stringify(existing));
_editPlace._catIds = _getCatsForPlace(id);
}
} else {
_editPlace = { id: null, name: '', address: '', lat: null, lng: null, in_service_area: false, priority: 50, rating: 3, featured: false, image_url: '', active: true, _catIds: [] };
}
renderPlaceEditor();
}closePlaceEditor function · javascript · L117-L121 (5 LOC)js/admin/pages/places.js
function closePlaceEditor() {
_editPlace = null;
var el = document.getElementById('place-editor');
if (el) el.innerHTML = '';
}renderPlaceEditor function · javascript · L123-L203 (81 LOC)js/admin/pages/places.js
function renderPlaceEditor() {
var el = document.getElementById('place-editor');
if (!el) return;
if (!_editPlace) { el.innerHTML = ''; return; }
var p = _editPlace;
var isNew = !p.id;
// Category checkboxes
var catChecks = '';
_cats.forEach(function(c) {
if (!c.id) return;
var checked = p._catIds && p._catIds.indexOf(c.id) > -1;
catChecks += '<label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:12px;color:var(--tx);padding:4px 0">' +
'<input type="checkbox" ' + (checked ? 'checked' : '') + ' onchange="togglePlaceCat(\'' + c.id + '\',this.checked)" style="accent-color:var(--bl)">' +
esc(c.label) + '</label>';
});
// Rating select
var ratingOpts = '';
for (var r = 1; r <= 5; r++) {
ratingOpts += '<option value="' + r + '" ' + (p.rating === r ? 'selected' : '') + '>' + r + ' Star' + (r > 1 ? 's' : '') + '</option>';
}
var html = '<div style="position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:1000;geocodePlace function · javascript · L206-L226 (21 LOC)js/admin/pages/places.js
function geocodePlace() {
var addr = document.getElementById('pe-addr');
if (!addr || !addr.value.trim()) return;
if (!window._geoAdmin) window._geoAdmin = new google.maps.Geocoder();
var coordsEl = document.getElementById('pe-coords');
if (coordsEl) coordsEl.textContent = 'Geocoding...';
window._geoAdmin.geocode({ address: addr.value.trim() }, function(results, status) {
if (status === 'OK' && results[0]) {
var loc = results[0].geometry.location;
_editPlace.lat = loc.lat();
_editPlace.lng = loc.lng();
_editPlace.in_service_area = _placeInArea(loc.lat(), loc.lng());
_editPlace.address = results[0].formatted_address || addr.value.trim();
renderPlaceEditor();
} else {
if (coordsEl) coordsEl.innerHTML = '<span style="color:var(--rd)">Geocode failed. Check the address.</span>';
}
});
}togglePlaceCat function · javascript · L229-L236 (8 LOC)js/admin/pages/places.js
function togglePlaceCat(catId, checked) {
if (!_editPlace._catIds) _editPlace._catIds = [];
if (checked) {
if (_editPlace._catIds.indexOf(catId) === -1) _editPlace._catIds.push(catId);
} else {
_editPlace._catIds = _editPlace._catIds.filter(function(id) { return id !== catId; });
}
}Repobility — same analyzer, your code, free for public repos · /scan/
savePlace function · javascript · L239-L285 (47 LOC)js/admin/pages/places.js
async function savePlace() {
if (!_editPlace) return;
if (!_editPlace.name.trim()) { alert('Name is required.'); return; }
var btn = document.getElementById('pe-save');
if (btn) btn.textContent = 'Saving...';
var payload = {
name: _editPlace.name.trim(),
address: _editPlace.address || '',
lat: _editPlace.lat || null,
lng: _editPlace.lng || null,
in_service_area: _placeInArea(_editPlace.lat, _editPlace.lng),
priority: _editPlace.priority || 50,
rating: _editPlace.rating || 3,
featured: !!_editPlace.featured,
image_url: _editPlace.image_url || '',
active: _editPlace.active !== false,
updated_at: new Date().toISOString()
};
var placeId = _editPlace.id;
if (placeId) {
// Update existing
await api('PATCH', 'places', '?id=eq.' + placeId, payload);
} else {
// Insert new
var result = await api('POST', 'places', '', payload);
if (result && result.length) placeId = result[0].id;
}
if (!placeId) {
if (deletePlace function · javascript · L288-L294 (7 LOC)js/admin/pages/places.js
async function deletePlace(id) {
var p = _places.find(function(pl) { return pl.id === id; });
if (!p || !confirm('Delete "' + p.name + '"?')) return;
await api('DELETE', 'place_categories', '?place_id=eq.' + id);
await api('DELETE', 'places', '?id=eq.' + id);
await loadPlaces();
}loadPromos function · javascript · L6-L18 (13 LOC)js/admin/pages/promos.js
async function loadPromos() {
var data = await api('GET', 'promotions', '?order=slot_index.asc');
if (data && data.length) {
_promoSlots = data;
} else {
_promoSlots = [];
for (var i = 1; i <= 10; i++) {
_promoSlots.push({ slot_index: i, title: '', description: '', image_url: '', destination_address: '', color: '#007AFF', is_active: false });
}
}
_promoDirty = {};
renderPromos();
}renderPromos function · javascript · L20-L81 (62 LOC)js/admin/pages/promos.js
function renderPromos() {
var el = document.getElementById('promo-list');
if (!el) return;
var hasDirty = Object.keys(_promoDirty).length > 0;
var header = '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;grid-column:1/-1">' +
'<div><span style="font-size:13px;color:var(--tx3)">Edit slots below. Changes push to the Rider app on save.</span></div>' +
'<button onclick="saveAllPromos()" style="padding:10px 24px;background:' + (hasDirty ? 'var(--gn)' : 'var(--bg3)') + ';color:' + (hasDirty ? '#fff' : 'var(--tx3)') + ';border:none;border-radius:var(--r);font-size:13px;font-weight:700;font-family:var(--font);cursor:pointer;transition:all .2s">' +
'<span id="promo-save-label">' + (hasDirty ? 'Save & Publish (' + Object.keys(_promoDirty).length + ')' : 'All Saved') + '</span>' +
'</button>' +
'</div>';
var html = header;
_promoSlots.forEach(function(slot) {
var i = slot.slot_index;
var isOn = slot.is_activemarkPromoDirty function · javascript · L83-L98 (16 LOC)js/admin/pages/promos.js
function markPromoDirty(slotIdx, field, val) {
// Update local state
var slot = _promoSlots.find(function(s) { return s.slot_index === slotIdx; });
if (slot) slot[field] = val;
// Track dirty
if (!_promoDirty[slotIdx]) _promoDirty[slotIdx] = {};
_promoDirty[slotIdx][field] = val;
// Update save button label
var btn = document.getElementById('promo-save-label');
if (btn) btn.textContent = 'Save & Publish (' + Object.keys(_promoDirty).length + ')';
// Re-render for toggle/image changes
if (field === 'is_active' || field === 'image_url') renderPromos();
}saveAllPromos function · javascript · L100-L127 (28 LOC)js/admin/pages/promos.js
async function saveAllPromos() {
var keys = Object.keys(_promoDirty);
if (!keys.length) return;
var btn = document.getElementById('promo-save-label');
if (btn) btn.textContent = 'Saving...';
for (var k = 0; k < keys.length; k++) {
var slotIdx = parseInt(keys[k]);
var slot = _promoSlots.find(function(s) { return s.slot_index === slotIdx; });
if (!slot) continue;
await api('PATCH', 'promotions', '?slot_index=eq.' + slotIdx, {
title: slot.title || '',
description: slot.description || '',
image_url: slot.image_url || '',
destination_address: slot.destination_address || '',
color: slot.color || '#007AFF',
is_active: !!slot.is_active,
updated_at: new Date().toISOString()
});
}
_promoDirty = {};
if (btn) btn.textContent = 'Published!';
setTimeout(function() { renderPromos(); }, 1500);
await logAct('update_promotions', keys.length + ' slots');
}renderRiders function · javascript · L3-L5 (3 LOC)js/admin/pages/riders.js
function renderRiders(){var tb=document.getElementById('r-tbody');var q=(document.getElementById('r-search').value||'').toLowerCase();var rl=users.filter(function(u){return u.role!=='driver'&&u.role!=='admin'});if(q)rl=rl.filter(function(u){return(u.name||'').toLowerCase().indexOf(q)>=0||(u.email||'').toLowerCase().indexOf(q)>=0||(u.phone||'').indexOf(q)>=0});
tb.innerHTML=rl.map(function(u){var ur=rides.filter(function(r){return r.rider_id===u.id});var c=ur.filter(function(r){return r.status==='completed'}).length;var x=ur.filter(function(r){return r.status==='cancelled'}).length;var joined=u.signup_date?new Date(u.signup_date).toLocaleDateString():(u.created_at?new Date(u.created_at).toLocaleDateString():'--');var st=u.disabled?'<span class="badge dis">Disabled</span>':'<span class="badge on">Active</span>';
return'<tr data-xid="'+u.id+'" onclick="openRdrPN(this.dataset.xid)"><td><strong>'+esc(u.name||'--')+'</strong></td><td style="color:var(--tx3)">'+esc(u.email||'-')+'</td><td>'+eopenRdrPN function · javascript · L6-L11 (6 LOC)js/admin/pages/riders.js
async function openRdrPN(uid){var u=users.find(function(x){return x.id===uid});if(!u)return;var ur=rides.filter(function(r){return r.rider_id===uid});var c=ur.filter(function(r){return r.status==='completed'}).length;var x=ur.filter(function(r){return r.status==='cancelled'}).length;var joined=u.signup_date?new Date(u.signup_date).toLocaleDateString():(u.created_at?new Date(u.created_at).toLocaleDateString():'--');
var notes=await api('GET','admin_notes','?user_id=eq.'+encodeURIComponent(uid)+'&order=created_at.desc');
document.getElementById('pn-title').textContent=u.name||'Rider';
document.getElementById('pn-body').innerHTML=sect('Profile',row('Name',u.name)+row('Email',u.email)+row('Phone',u.phone)+row('Joined',joined)+row('Account',u.disabled?'<span class="badge dis">Disabled</span>':'<span class="badge on">Active</span>'))+sect('Ride Stats',row('Total Rides',ur.length)+row('Completed','<span style="color:var(--gn)">'+c+'</span>')+row('Cancelled','<span style="color:var(--rd)">'+x+Generated by Repobility's multi-pass static-analysis pipeline (https://repobility.com)
renderTickets function · javascript · L3-L26 (24 LOC)js/admin/pages/tickets.js
function renderTickets(){
var tb=document.getElementById('tix-tbody');if(!tb)return;
var filter=document.getElementById('tix-filter').value;
var search=(document.getElementById('tix-search').value||'').toLowerCase();
var list=tickets.slice();
if(filter!=='all')list=list.filter(function(t){return(t.status||'pending')===filter});
if(search)list=list.filter(function(t){return(t.user_name||'').toLowerCase().indexOf(search)>=0||(t.message||'').toLowerCase().indexOf(search)>=0||(t.type||'').toLowerCase().indexOf(search)>=0});
var stats={pending:0,investigate:0,replied:0,resolved:0};
tickets.forEach(function(t){var s=t.status||'pending';if(stats[s]!==undefined)stats[s]++});
document.getElementById('tix-stats').innerHTML='<div style="padding:6px 14px;border-radius:20px;font-size:11px;font-weight:700;background:var(--orl);color:var(--or)">Pending: '+stats.pending+'</div><div style="padding:6px 14px;border-radius:20px;font-size:11px;font-weight:700;background:var(--bld);color:var(--bl)">InvestiopenTicketPN function · javascript · L27-L44 (18 LOC)js/admin/pages/tickets.js
async function openTicketPN(tid){
var t=tickets.find(function(x){return x.id===tid});if(!t)return;
var rider=users.find(function(u){return u.id===t.user_id});
var st=t.status||'pending';
var badge=st==='pending'?'<span class="badge wrn">Pending</span>':st==='investigate'?'<span class="badge act">Investigate</span>':st==='replied'?'<span class="badge sa">Replied</span>':'<span class="badge on">Resolved</span>';
var typeBadge=t.type==='bug'?'Bug Report':t.type==='suggestion'?'Suggestion':t.type==='lost'?'Lost & Found':'General Inquiry';
var submitted=t.created_at?new Date(t.created_at).toLocaleString():'--';
document.getElementById('pn-title').textContent='Ticket #'+t.id.slice(-6);
document.getElementById('pn-body').innerHTML=
sect('Status',row('Current Status',badge)+row('Type',typeBadge)+row('Submitted',submitted))+
sect('Rider Info',row('Name',rider?rider.name:t.user_name||'Unknown')+row('Email',rider?rider.email||'-':'-')+row('Phone',rider&&rider.phone?'<a href="tel:'+esc(rider.phonupdateTicketStatus function · javascript · L45-L52 (8 LOC)js/admin/pages/tickets.js
async function updateTicketStatus(tid,status){
await api('PATCH','tickets','?id=eq.'+encodeURIComponent(tid),{status:status});
await logAct('ticket_'+status,tid);
var t=tickets.find(function(x){return x.id===tid});
if(t)t.status=status;
renderTickets();
updateMetrics();
}updateTicketFromPanel function · javascript · L53-L58 (6 LOC)js/admin/pages/tickets.js
async function updateTicketFromPanel(tid){
var sel=document.getElementById('tix-status-sel');
if(!sel)return;
await updateTicketStatus(tid,sel.value);
closePN();
}deleteTicket function · javascript · L59-L67 (9 LOC)js/admin/pages/tickets.js
async function deleteTicket(tid){
if(!confirm('Delete this ticket permanently?'))return;
await api('DELETE','tickets','?id=eq.'+encodeURIComponent(tid));
await logAct('delete_ticket',tid);
tickets=tickets.filter(function(t){return t.id!==tid});
renderTickets();
updateMetrics();
closePN();
}openRidePN function · javascript · L8-L11 (4 LOC)js/admin/panels.js
function openRidePN(rid){var r=rides.find(function(x){return x.id===rid});if(!r)return;var rider=users.find(function(u){return u.id===r.rider_id});var driver=r.driver_id?users.find(function(u){return u.id===r.driver_id}):null;var sc=r.status==='completed'?'var(--gn)':r.status==='cancelled'?'var(--rd)':r.status==='requested'?'var(--or)':'var(--bl)';
document.getElementById('pn-title').textContent='Ride Details';
document.getElementById('pn-body').innerHTML=sect('Ride Info',row('Status','<span class="badge" style="background:'+sc+'22;color:'+sc+'">'+r.status+'</span>')+row('Pickup',r.pickup)+row('Drop-off',r.dropoff)+row('Passengers',r.passengers||1))+(rider?sect('Rider',row('Name',rider.name)+row('Email',rider.email)+row('Phone',rider.phone)):sect('Rider','<span style="color:var(--tx3)">Unknown</span>'))+(driver?sect('Driver',row('Name',driver.name)+row('Vehicle',driver.vehicle)):'');
document.getElementById('pn-acts').innerHTML='';openPN()}doLogin function · javascript · L4-L11 (8 LOC)js/driver/auth.js
async function doLogin(){var u=document.getElementById('dl-user').value.trim(),p=document.getElementById('dl-pass').value;var err=document.getElementById('dl-err');if(!u||!p){err.textContent='Enter username and password.';err.classList.add('show');return}
err.classList.remove('show');
try{var res=await supaFetch('GET','users','?username=eq.'+encodeURIComponent(u)+'&password=eq.'+encodeURIComponent(p)+'&role=eq.driver');
if(res&&res.length){var user=res[0];
if(user.disabled){err.textContent='Your account has been disabled. Please contact your administrator to enable it.';err.classList.add('show');return}
selUser=user;DID=user.id;localStorage.setItem('rydz-drv-id',user.id);localStorage.setItem('rydz-drv-name',user.name);supaSync();go('vehicle');return}}catch(e){}
if(u==='test'&&p==='1'){DID='d1';localStorage.setItem('rydz-drv-id','d1');go('vehicle');return}
err.textContent='Invalid username or password.';err.classList.add('show')}openDirections function · javascript · L14-L44 (31 LOC)js/driver/helpers.js
function openDirections() {
var mr = typeof gMR === 'function' ? gMR() : null;
if (!mr) { showToast('No active ride'); return; }
var destLat, destLng, destLabel;
if (mr.status === 'picked_up') {
// Heading to drop-off
destLat = parseFloat(mr.doX);
destLng = parseFloat(mr.doY);
destLabel = mr.dropoff || 'Drop-off';
} else {
// Heading to pickup
destLat = parseFloat(mr.puX);
destLng = parseFloat(mr.puY);
destLabel = mr.pickup || 'Pickup';
}
if (!destLat || !destLng) { showToast('No destination coordinates'); return; }
// Detect iOS (iPhone/iPad)
var isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent);
if (isIOS) {
// Apple Maps - uses current location automatically as origin
window.open('maps://maps.apple.com/?daddr=' + destLat + ',' + destLng + '&dirflg=d', '_blank');
} else {
// Google Maps - works on Android and desktop
window.open('https://www.google.com/maps/dir/?api=1&destination=' + destLat + ',' + destLnCitation: Repobility (2026). State of AI-Generated Code. https://repobility.com/research/
poll function · javascript · L4-L14 (11 LOC)js/driver/init.js
async function poll(){
var f=await ld();
if(f){
db=f;
var isOn=localStorage.getItem('rydz-drv-online')==='true';
var dd=gD();if(dd)dd.status=isOn?'online':'offline';
if(cur==='main')ren()
}
}init function · javascript · L15-L24 (10 LOC)js/driver/init.js
async function init(){
db=await ld();
if(!db){db=ddb();await sv()}
if(db&&db.rides){db.rides=db.rides.filter(function(r){return r.status!=='completed'&&r.status!=='cancelled'});try{localStorage.setItem('rydz-db',JSON.stringify(db))}catch(e){}}
if(!localStorage.getItem('rydz-drv-online')){localStorage.setItem('rydz-drv-online','false')}
var _sid=localStorage.getItem('rydz-drv-id');if(_sid){DID=_sid;if(db){var _sd=gD();if(_sd&&!_sd.disabled){document.getElementById('h-nm').textContent=_sd.name;document.getElementById('h-av').textContent=(_sd.name||'D')[0];document.getElementById('h-vc').textContent=_sd.vehicle||'';setInterval(poll,5000);setTimeout(supaSync,2000);setInterval(supaSync,5000);go('main');ren();return}}else{setInterval(poll,5000);setTimeout(supaSync,2000);setInterval(supaSync,5000);go('main');supaSync();setTimeout(ren,2000);return}}go('login');
setInterval(poll,5000);
setTimeout(supaSync,2000);
setInterval(supaSync,5000);if(localStorage.getItem('rydz-drv-online')==='true'){stastartGPS function · javascript · L7-L35 (29 LOC)js/driver/location.js
function startGPS(){
if(!navigator.geolocation){if(typeof showToast==='function')showToast('Location services not available.');return}
if(_watchId!==null)return;
navigator.geolocation.getCurrentPosition(
function(firstPos){
var lat=firstPos.coords.latitude;
var lng=firstPos.coords.longitude;
var d=gD();if(d){d.lat=lat;d.lng=lng;sv()}
supaFetch('PATCH','users','?id=eq.'+encodeURIComponent(DID),{lat:lat,lng:lng});
_watchId=navigator.geolocation.watchPosition(function(pos){
var now=Date.now();
if(now-_lastGPS<5000)return;
_lastGPS=now;
var la=pos.coords.latitude;
var ln=pos.coords.longitude;
var dd=gD();if(dd){dd.lat=la;dd.lng=ln;sv()}
supaFetch('PATCH','users','?id=eq.'+encodeURIComponent(DID),{lat:la,lng:ln});
},function(err){console.log('Watch error:',err.message)},{enableHighAccuracy:true,maximumAge:5000,timeout:10000});
},
function(err){
if(err.code===1){
if(typeof showToast==='function')showToast('Location permission denied. Please enable Location Services in your phone Settings forpage 1 / 3next ›