restrictAccess(Auth::isModerator()) ->setPageTitle(WT_I18N::translate('Pending changes')) ->pageHeader() ->addInlineJavascript(" function show_diff(diffurl) { window.opener.location = diffurl; return false; } "); $action = WT_Filter::get('action'); $change_id = WT_Filter::getInteger('change_id'); $index = WT_Filter::get('index'); $ged = WT_Filter::getInteger('ged'); echo '

', WT_I18N::translate('Pending changes'), '

'; switch ($action) { case 'undo': $gedcom_id = WT_DB::prepare("SELECT gedcom_id FROM `##change` WHERE change_id=?")->execute(array($change_id))->fetchOne(); $xref = WT_DB::prepare("SELECT xref FROM `##change` WHERE change_id=?")->execute(array($change_id))->fetchOne(); // Undo a change, and subsequent changes to the same record WT_DB::prepare( "UPDATE `##change`" . " SET status = 'rejected'" . " WHERE status = 'pending'" . " AND gedcom_id = ?" . " AND xref = ?" . " AND change_id >= ?" )->execute(array($gedcom_id, $xref, $change_id)); break; case 'accept': $gedcom_id = WT_DB::prepare("SELECT gedcom_id FROM `##change` WHERE change_id=?")->execute(array($change_id))->fetchOne(); $xref = WT_DB::prepare("SELECT xref FROM `##change` WHERE change_id=?")->execute(array($change_id))->fetchOne(); // Accept a change, and all previous changes to the same record $changes = WT_DB::prepare( "SELECT change_id, gedcom_id, gedcom_name, xref, old_gedcom, new_gedcom" . " FROM `##change` c" . " JOIN `##gedcom` g USING (gedcom_id)" . " WHERE c.status = 'pending'" . " AND gedcom_id = ?" . " AND xref = ?" . " AND change_id <= ?" . " ORDER BY change_id" )->execute(array($gedcom_id, $xref, $change_id))->fetchAll(); foreach ($changes as $change) { if (empty($change->new_gedcom)) { // delete update_record($change->old_gedcom, $gedcom_id, true); } else { // add/update update_record($change->new_gedcom, $gedcom_id, false); } WT_DB::prepare("UPDATE `##change` SET status='accepted' WHERE change_id=?")->execute(array($change->change_id)); Log::addEditLog("Accepted change {$change->change_id} for {$change->xref} / {$change->gedcom_name} into database"); } break; case 'undoall': WT_DB::prepare( "UPDATE `##change`" . " SET status='rejected'" . " WHERE status='pending' AND gedcom_id=?" )->execute(array(WT_GED_ID)); break; case 'acceptall': $changes = WT_DB::prepare( "SELECT change_id, gedcom_id, gedcom_name, xref, old_gedcom, new_gedcom" . " FROM `##change` c" . " JOIN `##gedcom` g USING (gedcom_id)" . " WHERE c.status='pending' AND gedcom_id=?" . " ORDER BY change_id" )->execute(array(WT_GED_ID))->fetchAll(); foreach ($changes as $change) { if (empty($change->new_gedcom)) { // delete update_record($change->old_gedcom, $change->gedcom_id, true); } else { // add/update update_record($change->new_gedcom, $change->gedcom_id, false); } WT_DB::prepare("UPDATE `##change` SET status='accepted' WHERE change_id=?")->execute(array($change->change_id)); Log::addEditLog("Accepted change {$change->change_id} for {$change->xref} / {$change->gedcom_name} into database"); } break; } $changed_gedcoms = WT_DB::prepare( "SELECT g.gedcom_name" . " FROM `##change` c" . " JOIN `##gedcom` g USING (gedcom_id)" . " WHERE c.status='pending'" . " GROUP BY g.gedcom_name" )->fetchOneColumn(); if ($changed_gedcoms) { $changes = WT_DB::prepare( "SELECT c.*, u.user_name, u.real_name, g.gedcom_name, new_gedcom, old_gedcom" . " FROM `##change` c" . " JOIN `##user` u USING (user_id)" . " JOIN `##gedcom` g USING (gedcom_id)" . " WHERE c.status='pending'" . " ORDER BY gedcom_id, c.xref, c.change_id" )->fetchAll(); $output = '

'; $prev_xref = null; $prev_gedcom_id = null; foreach ($changes as $change) { preg_match('/^0 @' . WT_REGEX_XREF . '@ (' . WT_REGEX_TAG . ')/', $change->old_gedcom . $change->new_gedcom, $match); switch ($match[1]) { case 'INDI': $record = new WT_Individual($change->xref, $change->old_gedcom, $change->new_gedcom, $change->gedcom_id); break; case 'FAM': $record = new WT_Family($change->xref, $change->old_gedcom, $change->new_gedcom, $change->gedcom_id); break; case 'SOUR': $record = new WT_Source($change->xref, $change->old_gedcom, $change->new_gedcom, $change->gedcom_id); break; case 'REPO': $record = new WT_Repository($change->xref, $change->old_gedcom, $change->new_gedcom, $change->gedcom_id); break; case 'OBJE': $record = new WT_Media($change->xref, $change->old_gedcom, $change->new_gedcom, $change->gedcom_id); break; case 'NOTE': $record = new WT_Note($change->xref, $change->old_gedcom, $change->new_gedcom, $change->gedcom_id); break; default: $record = new WT_GedcomRecord($change->xref, $change->old_gedcom, $change->new_gedcom, $change->gedcom_id); break; } if ($change->xref != $prev_xref || $change->gedcom_id != $prev_gedcom_id) { if ($prev_xref) { $output .= '
'; } $prev_xref = $change->xref; $prev_gedcom_id = $change->gedcom_id; $output .= ''; $output .= ' ' . $record->getFullName() . ''; $output .= '
'; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; } $output .= ''; $output .= ''; $output .= "'; $output .= ''; $output .= ''; $output .= ''; $output .= ''; } $output .= '
' . WT_I18N::translate('Accept') . '' . WT_I18N::translate('Changes') . '' . WT_I18N::translate('User') . '' . WT_I18N::translate('Date') . '' . WT_I18N::translate('Family tree') . '' . WT_I18N::translate('Undo') . '
' . WT_I18N::translate('Accept') . ''; foreach ($record->getFacts() as $fact) { if ($fact->getTag() != 'CHAN') { if ($fact->isPendingAddition()) { $output .= '
' . $fact->getLabel() . '
'; } elseif ($fact->isPendingDeletion()) { $output .= '
' . $fact->getLabel() . '
'; } } } echo '
user_name . "', '" . WT_I18N::translate('Moderate pending changes') . "')\" alt=\"" . WT_I18N::translate('Send a message') . "\">"; $output .= WT_Filter::escapeHtml($change->real_name); $output .= ' - ' . WT_Filter::escapeHtml($change->user_name) . '' . $change->change_time . '' . $change->gedcom_name . '' . WT_I18N::translate('Undo') . '
'; //-- Now for the global Action bar: $output2 = '
'; // Row 1 column 1: title "Accept all" $output2 .= ''; // Row 1 column 2: title "Undo all" $output2 .= ''; // Row 2 column 1: action "Accept all" $output2 .= ''; // Row 2 column 2: action "Undo all" $output2 .= '
' . WT_I18N::translate('Approve all changes') . '' . WT_I18N::translate('Undo all changes') . '
'; $count = 0; foreach ($changed_gedcoms as $gedcom_name) { if ($count != 0) { $output2 .= '
'; } $output2 .= '' . $gedcom_name . ' - ' . WT_I18N::translate('Approve all changes') . ''; $count++; } $output2 .= '
'; $count = 0; foreach ($changed_gedcoms as $gedcom_name) { if ($count != 0) { $output2 .= '
'; } $output2 .= '$gedcom_name - " . WT_I18N::translate('Undo all changes') . ''; $count++; } $output2 .= '
'; echo $output2, $output, $output2, '



', // TODO use margin-bottom instead of this '

', '', '

'; } else { // No pending changes - refresh the parent window and close this one $controller->addInlineJavascript('closePopupAndReloadParent();'); } echo '
';