← back to drewrydz1__Rydz-app

Function bodies 134 total

All specs Real LLM only Function bodies
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':'')+'>Operat
createAccount 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)' : 'va
setCatField 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.styl
renderDashboard 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">&#9733;</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="openD
openDrvPN 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().tr
openPlaceEditor 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_active
markPromoDirty 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>'+e
openRdrPN 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)">Investi
openTicketPN 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.phon
updateTicketStatus 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 + ',' + destLn
Citation: 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'){sta
startGPS 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 for
page 1 / 3next ›