This commit is contained in:
riz081 2025-06-10 13:24:32 +07:00
parent b0ee2e8ee6
commit da8bcf17cc
2 changed files with 261 additions and 22 deletions

View File

@ -9,6 +9,7 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.widget.TextView;
@ -42,6 +43,9 @@ import java.util.Set;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Calendar;
import android.app.DatePickerDialog;
import android.widget.DatePicker;
public class TransactionActivity extends AppCompatActivity implements TransactionAdapter.OnPrintClickListener {
private RecyclerView recyclerView;
@ -65,6 +69,11 @@ public class TransactionActivity extends AppCompatActivity implements Transactio
private Set<String> processedReferences = new HashSet<>();
private SharedPreferences prefs;
// DATE FILTER VARIABLES
private String fromDate = "";
private String toDate = "";
private TextView filterButtonText;
// UPDATED PAGINATION VARIABLES
private int currentPage = 1; // Start from page 1 instead of 0
private final int itemsPerPage = 15; // 15 items per page as requested
@ -131,10 +140,16 @@ public class TransactionActivity extends AppCompatActivity implements Transactio
private void setupToolbar() {
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Hide default title since we're using custom layout
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
// Setup custom back button
ImageView backButton = findViewById(R.id.backButton);
backButton.setOnClickListener(v -> finish());
}
private void setupRecyclerView() {
@ -171,8 +186,20 @@ public class TransactionActivity extends AppCompatActivity implements Transactio
});
// Filter button click
findViewById(R.id.filterButton).setOnClickListener(v -> {
Toast.makeText(this, "Filter clicked", Toast.LENGTH_SHORT).show();
LinearLayout filterButton = findViewById(R.id.filterButton);
filterButtonText = (TextView) filterButton.findViewById(R.id.filterButtonText);
filterButton.setOnClickListener(v -> {
showDateRangePickerDialog();
});
// Long press to clear filter
filterButton.setOnLongClickListener(v -> {
if (!fromDate.isEmpty() || !toDate.isEmpty()) {
clearDateFilter();
Toast.makeText(this, "Date filter cleared", Toast.LENGTH_SHORT).show();
}
return true;
});
}
@ -203,7 +230,145 @@ public class TransactionActivity extends AppCompatActivity implements Transactio
});
}
// NEW METHOD: Navigate to specific page
// NEW METHOD: Show date range picker dialog
private void showDateRangePickerDialog() {
Calendar calendar = Calendar.getInstance();
// First, pick FROM date
DatePickerDialog fromDatePicker = new DatePickerDialog(this,
(view, year, month, dayOfMonth) -> {
Calendar fromCal = Calendar.getInstance();
fromCal.set(year, month, dayOfMonth);
// Format for API (yyyy-MM-dd)
SimpleDateFormat apiFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
fromDate = apiFormat.format(fromCal.getTime());
// Now pick TO date
showToDatePicker(fromCal);
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH)
);
fromDatePicker.setTitle("Select From Date");
fromDatePicker.show();
}
// NEW METHOD: Show TO date picker
private void showToDatePicker(Calendar fromCal) {
Calendar calendar = Calendar.getInstance();
DatePickerDialog toDatePicker = new DatePickerDialog(this,
(view, year, month, dayOfMonth) -> {
Calendar toCal = Calendar.getInstance();
toCal.set(year, month, dayOfMonth);
// Validate date range
if (toCal.before(fromCal)) {
Toast.makeText(this, "To date cannot be before from date", Toast.LENGTH_SHORT).show();
return;
}
// Format for API (yyyy-MM-dd)
SimpleDateFormat apiFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
toDate = apiFormat.format(toCal.getTime());
// Format for display (compact format)
SimpleDateFormat displayFormat = new SimpleDateFormat("dd/MM", Locale.getDefault());
String fromDisplay = displayFormat.format(fromCal.getTime());
String toDisplay = displayFormat.format(toCal.getTime());
// Add year if different years
SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy", Locale.getDefault());
String fromYear = yearFormat.format(fromCal.getTime());
String toYear = yearFormat.format(toCal.getTime());
String dateRangeText;
if (fromYear.equals(toYear)) {
// Same year: "01/04 - 30/04"
dateRangeText = fromDisplay + " - " + toDisplay;
} else {
// Different years: "01/04/24 - 30/04/25"
SimpleDateFormat shortYearFormat = new SimpleDateFormat("dd/MM/yy", Locale.getDefault());
String fromDisplayWithYear = shortYearFormat.format(fromCal.getTime());
String toDisplayWithYear = shortYearFormat.format(toCal.getTime());
dateRangeText = fromDisplayWithYear + " - " + toDisplayWithYear;
}
// Update filter button text
updateFilterButtonText(dateRangeText);
// Apply filter
applyDateFilter();
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH)
);
// Set minimum date to fromDate
toDatePicker.getDatePicker().setMinDate(fromCal.getTimeInMillis());
toDatePicker.setTitle("Select To Date");
toDatePicker.show();
}
// NEW METHOD: Update filter button text with smart formatting
private void updateFilterButtonText(String dateRangeText) {
if (filterButtonText != null) {
// Smart text formatting for better display
String displayText;
if (dateRangeText.length() > 15) {
// For long date ranges, use compact format
String[] dates = dateRangeText.split(" - ");
if (dates.length == 2) {
// Convert "01/04/2025 - 30/04/2025" to "01/04\n30/04"
String fromShort = dates[0].substring(0, 5); // Get "01/04"
String toShort = dates[1].substring(0, 5); // Get "30/04"
displayText = fromShort + "\n" + toShort;
} else {
displayText = dateRangeText;
}
} else {
displayText = dateRangeText;
}
filterButtonText.setText(displayText);
filterButtonText.setTextColor(getResources().getColor(android.R.color.holo_blue_dark));
filterButtonText.setTextSize(12); // Smaller text when filter is active
Log.d("TransactionActivity", "🎨 Filter button updated: " + displayText);
}
}
// NEW METHOD: Apply date filter
private void applyDateFilter() {
Log.d("TransactionActivity", "🗓️ Applying date filter: " + fromDate + " to " + toDate);
// Reset to first page and reload data
currentPage = 1;
refreshTransactions();
}
// NEW METHOD: Clear date filter
private void clearDateFilter() {
fromDate = "";
toDate = "";
if (filterButtonText != null) {
filterButtonText.setText("Filter");
filterButtonText.setTextColor(getResources().getColor(android.R.color.darker_gray));
filterButtonText.setTextSize(14); // Reset to normal size
}
Log.d("TransactionActivity", "🗓️ Date filter cleared");
// Reload data without date filter
currentPage = 1;
refreshTransactions();
}
private void goToPage(int page) {
if (page < 1 || page > totalPages || page == currentPage || isLoading) {
return;
@ -439,14 +604,15 @@ public class TransactionActivity extends AppCompatActivity implements Transactio
protected List<Transaction> doInBackground(Void... voids) {
List<Transaction> result = new ArrayList<>();
try {
// PAGINATION API CALL: Use page-based API call
// PAGINATION API CALL: Use page-based API call with date filter
int apiPage = pageToLoad - 1; // API uses 0-based indexing
String urlString = "https://be-edc.msvc.app/transactions?page=" + apiPage +
"&limit=" + itemsPerPage + "&sortOrder=DESC&from_date=&to_date=&location_id=0&merchant_id=0&tid=73001500&mid=71000026521&sortColumn=created_at";
"&limit=" + itemsPerPage + "&sortOrder=DESC&from_date=" + fromDate + "&to_date=" + toDate + "&location_id=0&merchant_id=0&tid=73001500&mid=71000026521&sortColumn=created_at";
Log.d("TransactionActivity", "🔍 Fetching transactions page " + pageToLoad +
" (API page " + apiPage + ") with limit " + itemsPerPage + " - SORT: DESC by created_at");
" (API page " + apiPage + ") with limit " + itemsPerPage + " - SORT: DESC by created_at" +
" - Date Filter: " + fromDate + " to " + toDate);
URI uri = new URI(urlString);
URL url = uri.toURL();

View File

@ -6,16 +6,84 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:elevation="0dp"
app:elevation="0dp">
<!-- Status Bar Background -->
<View
android:layout_width="match_parent"
android:layout_height="24dp"
android:background="#F44336" />
<!-- Main Toolbar -->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_height="56dp"
android:background="#F44336"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="CETAK ULANG STRUK" />
app:contentInsetStart="0dp"
app:contentInsetLeft="0dp">
<!-- Custom toolbar content -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<!-- Back Button -->
<ImageView
android:id="@+id/backButton"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@android:drawable/ic_menu_revert"
android:layout_marginEnd="16dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:padding="4dp"
android:clickable="true"
android:focusable="true"
android:rotation="180" />
<!-- Title -->
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cetak Ulang Struk"
android:textColor="@android:color/white"
android:textSize="18sp"
android:textStyle="normal"
android:fontFamily="sans-serif-medium" />
</LinearLayout>
</androidx.appcompat.widget.Toolbar>
<!-- Title Section (outside toolbar) -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cetak Ulang Struk"
android:textColor="#333333"
android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
</LinearLayout>
</com.google.android.material.appbar.AppBarLayout>
@ -31,7 +99,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="20dp"
android:padding="16dp"
android:background="@android:color/white"
android:gravity="center_vertical">
@ -45,7 +113,7 @@
android:gravity="center_vertical"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:layout_marginEnd="16dp">
android:layout_marginEnd="12dp">
<ImageView
android:layout_width="24dp"
@ -76,24 +144,29 @@
android:layout_height="56dp"
android:orientation="horizontal"
android:gravity="center"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:clickable="true"
android:focusable="true">
android:focusable="true"
android:minWidth="120dp">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@android:drawable/ic_menu_sort_by_size"
android:layout_marginEnd="8dp"
android:layout_width="18dp"
android:layout_height="18dp"
android:src="@android:drawable/ic_menu_my_calendar"
android:layout_marginEnd="6dp"
android:alpha="0.5" />
<TextView
android:id="@+id/filterButtonText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Filter"
android:textSize="16sp"
android:textColor="#666666" />
android:textSize="14sp"
android:textColor="#666666"
android:maxLines="2"
android:ellipsize="end"
android:gravity="center" />
</LinearLayout>