Før oppdateringer av fragment.home.xml, HomeAdapter.java og HomeFragment.java
This commit is contained in:
parent
93092f33d9
commit
3b89af6605
9 changed files with 993 additions and 329 deletions
|
|
@ -13,7 +13,7 @@ android {
|
|||
minSdk = 28
|
||||
targetSdk = 34
|
||||
versionCode = 4
|
||||
versionName = "1.5.0"
|
||||
versionName = "1.5.1"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,9 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
|
|||
private List<CalendarEvent> events;
|
||||
private final OnItemClickListener listener;
|
||||
|
||||
// Farge for individuelle/private hendelser (Deep Purple)
|
||||
private static final String PRIVATE_EVENT_COLOR = "#673AB7";
|
||||
|
||||
public interface OnItemClickListener {
|
||||
void onItemClick(CalendarEvent event);
|
||||
}
|
||||
|
|
@ -40,9 +43,18 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
|
|||
holder.time.setText(event.getTime());
|
||||
holder.title.setText(event.getTitle());
|
||||
|
||||
// NYTT: Sett farge på datoboksen
|
||||
// NYTT: Sjekk om hendelsen er "privat" (har deltakere)
|
||||
boolean isPrivate = event.getDescription() != null && event.getDescription().contains("#deltakere:");
|
||||
|
||||
try {
|
||||
int color = Color.parseColor(event.getCalendarColor());
|
||||
int color;
|
||||
if (isPrivate) {
|
||||
// Bruk privat farge
|
||||
color = Color.parseColor(PRIVATE_EVENT_COLOR);
|
||||
} else {
|
||||
// Bruk kalenderens standardfarge
|
||||
color = Color.parseColor(event.getCalendarColor());
|
||||
}
|
||||
holder.dateBox.setBackgroundTintList(ColorStateList.valueOf(color));
|
||||
} catch (Exception e) {
|
||||
// Fallback til standard blå hvis fargekoden er ugyldig
|
||||
|
|
@ -63,7 +75,7 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
|
|||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
TextView day, month, title, time;
|
||||
LinearLayout dateBox; // NYTT
|
||||
LinearLayout dateBox;
|
||||
|
||||
public ViewHolder(View view) {
|
||||
super(view);
|
||||
|
|
@ -71,7 +83,7 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
|
|||
month = view.findViewById(R.id.cal_month);
|
||||
title = view.findViewById(R.id.cal_title);
|
||||
time = view.findViewById(R.id.cal_time);
|
||||
dateBox = view.findViewById(R.id.date_box_background); // NYTT
|
||||
dateBox = view.findViewById(R.id.date_box_background);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -22,6 +22,8 @@ import androidx.navigation.fragment.NavHostFragment;
|
|||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||
import com.google.gson.JsonElement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
|
|
@ -30,7 +32,8 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
|
|||
private CalendarEvent event;
|
||||
private OnEventChangeListener changeListener;
|
||||
|
||||
// Interface for å varsle foreldre-fragmentet om endringer
|
||||
private static final String PRIVATE_EVENT_COLOR = "#673AB7";
|
||||
|
||||
public interface OnEventChangeListener {
|
||||
void onEventChanged();
|
||||
}
|
||||
|
|
@ -53,6 +56,8 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
|
|||
TextView desc = view.findViewById(R.id.sheet_desc);
|
||||
TextView loc = view.findViewById(R.id.sheet_location);
|
||||
TextView calName = view.findViewById(R.id.sheet_calendar_name);
|
||||
TextView participantsView = view.findViewById(R.id.sheet_participants);
|
||||
TextView organizerView = view.findViewById(R.id.sheet_organizer); // NYTT
|
||||
|
||||
LinearLayout adminLayout = view.findViewById(R.id.layout_admin_buttons);
|
||||
Button btnDelete = view.findViewById(R.id.btn_delete);
|
||||
|
|
@ -61,48 +66,62 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
|
|||
title.setText(event.getTitle());
|
||||
time.setText(event.getTime() + " (" + event.getDay() + ". " + event.getMonth() + ")");
|
||||
|
||||
calName.setText(event.getCalendarName().toUpperCase());
|
||||
try {
|
||||
int color = Color.parseColor(event.getCalendarColor());
|
||||
calName.setBackgroundTintList(ColorStateList.valueOf(color));
|
||||
} catch (Exception e) {}
|
||||
// Sjekk om privat
|
||||
boolean isPrivate = event.getDescription() != null && event.getDescription().contains("#deltakere:");
|
||||
|
||||
if (isPrivate) {
|
||||
calName.setText(event.getCalendarName().toUpperCase() + " (BEGRENSET INNSYN)");
|
||||
try {
|
||||
calName.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor(PRIVATE_EVENT_COLOR)));
|
||||
} catch (Exception e) {}
|
||||
|
||||
showParticipants(event.getDescription(), participantsView);
|
||||
|
||||
} else {
|
||||
calName.setText(event.getCalendarName().toUpperCase());
|
||||
try {
|
||||
int color = Color.parseColor(event.getCalendarColor());
|
||||
calName.setBackgroundTintList(ColorStateList.valueOf(color));
|
||||
} catch (Exception e) {}
|
||||
|
||||
participantsView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
// VIS ARRANGØR ALLTID
|
||||
showOrganizer(event.getDescription(), organizerView);
|
||||
|
||||
// --- BESKRIVELSE OG LENKER ---
|
||||
if (!event.getDescription().isEmpty()) {
|
||||
String cleanDesc = event.getDescription().replaceAll("#varsel:[\\d,]+", "").trim();
|
||||
String cleanDesc = event.getDescription()
|
||||
.replaceAll("#varsel:[\\d,]+", "")
|
||||
.replaceAll("#deltakere:[^\\s]+", "")
|
||||
.replaceAll("#arrangor:.+", "") // Fjern arrangør fra brødtekst
|
||||
.trim();
|
||||
|
||||
// Konverter HTML til Spannable
|
||||
desc.setText(Html.fromHtml(cleanDesc, Html.FROM_HTML_MODE_COMPACT));
|
||||
|
||||
// Sørg for at rene tekst-lenker (uten <a href>) også blir klikkbare
|
||||
Linkify.addLinks(desc, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
|
||||
|
||||
// Gjør at man kan klikke på lenkene
|
||||
desc.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
|
||||
desc.setVisibility(View.VISIBLE);
|
||||
if (!cleanDesc.isEmpty()) {
|
||||
desc.setText(Html.fromHtml(cleanDesc, Html.FROM_HTML_MODE_COMPACT));
|
||||
Linkify.addLinks(desc, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
|
||||
desc.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
desc.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
desc.setVisibility(View.GONE);
|
||||
}
|
||||
} else {
|
||||
desc.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
// --- ADRESSE OG KART ---
|
||||
if (!event.getLocation().isEmpty()) {
|
||||
loc.setText(event.getLocation()); // Viser kun teksten, ikonet ligger i XML
|
||||
loc.setText(event.getLocation());
|
||||
loc.setVisibility(View.VISIBLE);
|
||||
|
||||
// Gjør adressen klikkbar for å åpne kart
|
||||
loc.setOnClickListener(v -> {
|
||||
String location = event.getLocation();
|
||||
// Opprett en geo-URI. "q=" søker etter stedet.
|
||||
Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + Uri.encode(location));
|
||||
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
|
||||
// Sett pakke til Google Maps for å foretrekke det, men la systemet velge hvis ikke installert
|
||||
mapIntent.setPackage("com.google.android.apps.maps");
|
||||
|
||||
try {
|
||||
startActivity(mapIntent);
|
||||
} catch (Exception e) {
|
||||
// Fallback: Hvis Google Maps ikke finnes, prøv uten pakkenavn (hvilken som helst kart-app)
|
||||
mapIntent.setPackage(null);
|
||||
try {
|
||||
startActivity(mapIntent);
|
||||
|
|
@ -137,6 +156,35 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
|
|||
return view;
|
||||
}
|
||||
|
||||
private void showParticipants(String rawDescription, TextView view) {
|
||||
if (rawDescription == null) return;
|
||||
Matcher m = Pattern.compile("#deltakere:([^\\s]+)").matcher(rawDescription);
|
||||
if (m.find()) {
|
||||
String allEmails = m.group(1);
|
||||
String[] emails = allEmails.split(",");
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("<b>Synlig for:</b><br/>");
|
||||
for (String email : emails) {
|
||||
sb.append("• ").append(email.trim()).append("<br/>");
|
||||
}
|
||||
view.setText(Html.fromHtml(sb.toString(), Html.FROM_HTML_MODE_COMPACT));
|
||||
view.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
// NYTT: Vis arrangør
|
||||
private void showOrganizer(String rawDescription, TextView view) {
|
||||
if (rawDescription == null) return;
|
||||
Matcher m = Pattern.compile("#arrangor:(.+)").matcher(rawDescription);
|
||||
if (m.find()) {
|
||||
String organizer = m.group(1).trim();
|
||||
view.setText("Invitert av: " + organizer);
|
||||
view.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
view.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
private void confirmDelete() {
|
||||
new AlertDialog.Builder(getContext())
|
||||
.setTitle("Slett hendelse")
|
||||
|
|
@ -157,12 +205,9 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
|
|||
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
|
||||
if (response.isSuccessful()) {
|
||||
Toast.makeText(getContext(), "Slettet!", Toast.LENGTH_SHORT).show();
|
||||
|
||||
// VARSLE LISTEN OM AT NOE ER SLETTET
|
||||
if (changeListener != null) {
|
||||
changeListener.onEventChanged();
|
||||
}
|
||||
|
||||
dismiss();
|
||||
} else {
|
||||
Toast.makeText(getContext(), "Kunne ikke slette", Toast.LENGTH_LONG).show();
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import android.widget.AdapterView;
|
|||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.Switch;
|
||||
|
|
@ -31,9 +32,12 @@ import com.google.gson.JsonElement;
|
|||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
|
|
@ -43,8 +47,9 @@ public class CreateEventFragment extends Fragment {
|
|||
private Spinner spinnerCalendar, spinnerRecurrence;
|
||||
private ChipGroup chipGroupReminders;
|
||||
private Switch switchAllDay;
|
||||
private TextView txtPreview;
|
||||
private Button btnStartDate, btnStartTime, btnEndDate, btnEndTime, btnSave;
|
||||
private TextView txtPreview, txtSelectedParticipants;
|
||||
private Button btnStartDate, btnStartTime, btnEndDate, btnEndTime, btnSave, btnSelectParticipants;
|
||||
private RadioButton rbAll, rbSpecific;
|
||||
|
||||
private Calendar startCal = Calendar.getInstance();
|
||||
private Calendar endCal = Calendar.getInstance();
|
||||
|
|
@ -52,6 +57,13 @@ public class CreateEventFragment extends Fragment {
|
|||
private String selectedRRule = null;
|
||||
private boolean isCustomRecurrence = false;
|
||||
|
||||
// Deltakere
|
||||
private List<User> allUsers = new ArrayList<>();
|
||||
private List<User> filteredUsers = new ArrayList<>();
|
||||
|
||||
// Arrangør-sporing (for å ikke overskrive opprinnelig arrangør ved redigering)
|
||||
private String originalOrganizer = null;
|
||||
|
||||
// EDIT MODE
|
||||
private CalendarEvent eventToEdit = null;
|
||||
|
||||
|
|
@ -75,13 +87,17 @@ public class CreateEventFragment extends Fragment {
|
|||
chipGroupReminders = view.findViewById(R.id.chip_group_reminders);
|
||||
|
||||
txtPreview = view.findViewById(R.id.txt_time_preview);
|
||||
txtSelectedParticipants = view.findViewById(R.id.txt_selected_participants);
|
||||
|
||||
btnStartDate = view.findViewById(R.id.btn_start_date);
|
||||
btnStartTime = view.findViewById(R.id.btn_start_time);
|
||||
btnEndDate = view.findViewById(R.id.btn_end_date);
|
||||
btnEndTime = view.findViewById(R.id.btn_end_time);
|
||||
|
||||
btnSave = view.findViewById(R.id.btn_save_event);
|
||||
btnSelectParticipants = view.findViewById(R.id.btn_select_participants);
|
||||
|
||||
rbAll = view.findViewById(R.id.rb_visibility_all);
|
||||
rbSpecific = view.findViewById(R.id.rb_visibility_specific);
|
||||
|
||||
// Initialiser tid (neste hele time)
|
||||
startCal.add(Calendar.HOUR_OF_DAY, 1);
|
||||
|
|
@ -91,6 +107,7 @@ public class CreateEventFragment extends Fragment {
|
|||
|
||||
setupCalendarSpinner();
|
||||
setupReminderChips();
|
||||
fetchUsers();
|
||||
|
||||
// SJEKK OM VI ER I REDIGERINGS-MODUS
|
||||
if (getArguments() != null && getArguments().containsKey("edit_event")) {
|
||||
|
|
@ -113,6 +130,22 @@ public class CreateEventFragment extends Fragment {
|
|||
|
||||
btnSave.setOnClickListener(v -> submitEvent());
|
||||
|
||||
// Vis/Skjul deltaker-knapp
|
||||
rbAll.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
if (isChecked) {
|
||||
btnSelectParticipants.setVisibility(View.GONE);
|
||||
txtSelectedParticipants.setVisibility(View.GONE);
|
||||
}
|
||||
});
|
||||
rbSpecific.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
if (isChecked) {
|
||||
btnSelectParticipants.setVisibility(View.VISIBLE);
|
||||
txtSelectedParticipants.setVisibility(View.VISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
btnSelectParticipants.setOnClickListener(v -> showUserSelectionDialog());
|
||||
|
||||
spinnerRecurrence.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
|
|
@ -129,12 +162,148 @@ public class CreateEventFragment extends Fragment {
|
|||
}
|
||||
@Override public void onNothingSelected(AdapterView<?> parent) {}
|
||||
});
|
||||
|
||||
spinnerCalendar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
String calName = (String) parent.getItemAtPosition(position);
|
||||
updateFilteredUsers(calName);
|
||||
}
|
||||
@Override public void onNothingSelected(AdapterView<?> parent) {}
|
||||
});
|
||||
}
|
||||
|
||||
private void fetchUsers() {
|
||||
RetrofitClient.getApiService().getUsersList().enqueue(new Callback<List<User>>() {
|
||||
@Override
|
||||
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
|
||||
if (!isAdded()) return;
|
||||
if (response.isSuccessful() && response.body() != null) {
|
||||
allUsers = response.body();
|
||||
|
||||
if (spinnerCalendar.getSelectedItem() != null) {
|
||||
updateFilteredUsers(spinnerCalendar.getSelectedItem().toString());
|
||||
}
|
||||
|
||||
if (eventToEdit != null) {
|
||||
parseParticipantsFromDescription(eventToEdit.getDescription());
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Call<List<User>> call, Throwable t) {}
|
||||
});
|
||||
}
|
||||
|
||||
private void updateFilteredUsers(String calendarName) {
|
||||
if (allUsers == null || allUsers.isEmpty()) return;
|
||||
|
||||
filteredUsers.clear();
|
||||
|
||||
String requiredRole = "";
|
||||
|
||||
if (calendarName.equals("Serviceavdelingen")) requiredRole = "serviceavdelingen";
|
||||
else if (calendarName.equals("Automasjonsavdelingen")) requiredRole = "automasjonsavdelingen";
|
||||
else if (calendarName.equals("Prosjektavdelingen")) requiredRole = "prosjektavdelingen";
|
||||
else if (calendarName.equals("Administrasjonen")) requiredRole = "administrasjonen";
|
||||
else if (calendarName.equals("Felles")) requiredRole = "kbs_alle";
|
||||
|
||||
for (User user : allUsers) {
|
||||
List<String> rawRoles = user.getRoles();
|
||||
List<String> roles = new ArrayList<>();
|
||||
for (String r : rawRoles) roles.add(r.toLowerCase());
|
||||
|
||||
boolean hasAccess = false;
|
||||
|
||||
if (roles.contains("administrator")) {
|
||||
hasAccess = true;
|
||||
}
|
||||
else if (!requiredRole.isEmpty() && roles.contains(requiredRole.toLowerCase())) {
|
||||
hasAccess = true;
|
||||
}
|
||||
|
||||
if (hasAccess) {
|
||||
filteredUsers.add(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void showUserSelectionDialog() {
|
||||
if (filteredUsers.isEmpty()) {
|
||||
Toast.makeText(getContext(), "Ingen personer med riktig tilgang funnet.", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
|
||||
String[] userNames = new String[filteredUsers.size()];
|
||||
boolean[] checkedItems = new boolean[filteredUsers.size()];
|
||||
|
||||
for (int i = 0; i < filteredUsers.size(); i++) {
|
||||
userNames[i] = filteredUsers.get(i).getName();
|
||||
checkedItems[i] = filteredUsers.get(i).isSelected();
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(getContext())
|
||||
.setTitle("Velg deltakere")
|
||||
.setMultiChoiceItems(userNames, checkedItems, (dialog, which, isChecked) -> {
|
||||
filteredUsers.get(which).setSelected(isChecked);
|
||||
})
|
||||
.setPositiveButton("OK", (dialog, which) -> updateParticipantPreview())
|
||||
.setNegativeButton("Avbryt", null)
|
||||
.show();
|
||||
}
|
||||
|
||||
private void updateParticipantPreview() {
|
||||
StringBuilder sb = new StringBuilder("Valgte: ");
|
||||
int count = 0;
|
||||
for (User u : allUsers) {
|
||||
if (u.isSelected()) {
|
||||
if (count > 0) sb.append(", ");
|
||||
sb.append(u.getName());
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if (count == 0) txtSelectedParticipants.setText("Ingen valgt");
|
||||
else txtSelectedParticipants.setText(sb.toString());
|
||||
}
|
||||
|
||||
private void parseParticipantsFromDescription(String desc) {
|
||||
if (desc == null) return;
|
||||
Pattern p = Pattern.compile("#deltakere:([^\\s]+)");
|
||||
Matcher m = p.matcher(desc);
|
||||
|
||||
if (m.find()) {
|
||||
rbSpecific.setChecked(true);
|
||||
String[] emails = m.group(1).split(",");
|
||||
|
||||
for (String email : emails) {
|
||||
for (int i = 0; i < allUsers.size(); i++) {
|
||||
if (allUsers.get(i).getEmail().equalsIgnoreCase(email.trim())) {
|
||||
allUsers.get(i).setSelected(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
updateParticipantPreview();
|
||||
} else {
|
||||
rbAll.setChecked(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void prefillForm(CalendarEvent event) {
|
||||
etTitle.setText(event.getTitle());
|
||||
|
||||
String cleanDesc = event.getDescription().replaceAll("#varsel:[\\d,]+", "").trim();
|
||||
// Hent ut opprinnelig arrangør hvis den finnes
|
||||
if (event.getDescription() != null) {
|
||||
Matcher m = Pattern.compile("#arrangor:(.+)").matcher(event.getDescription());
|
||||
if (m.find()) {
|
||||
originalOrganizer = m.group(1).trim();
|
||||
}
|
||||
}
|
||||
|
||||
String cleanDesc = event.getDescription()
|
||||
.replaceAll("#varsel:[\\d,]+", "")
|
||||
.replaceAll("#deltakere:[^\\s]+", "")
|
||||
.replaceAll("#arrangor:.+", "") // Fjern også arrangør fra tekstfeltet
|
||||
.trim();
|
||||
etDesc.setText(cleanDesc);
|
||||
etLocation.setText(event.getLocation());
|
||||
|
||||
|
|
@ -523,6 +692,30 @@ public class CreateEventFragment extends Fragment {
|
|||
String description = etDesc.getText().toString();
|
||||
List<Integer> reminders = getSelectedReminders();
|
||||
|
||||
if (rbSpecific.isChecked() && allUsers != null) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
boolean first = true;
|
||||
for (User u : allUsers) {
|
||||
if (u.isSelected()) {
|
||||
if (!first) sb.append(",");
|
||||
sb.append(u.getEmail());
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
if (sb.length() > 0) {
|
||||
description += "\n\n#deltakere:" + sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
// NYTT: Legg til arrangør
|
||||
String organizerTag;
|
||||
if (originalOrganizer != null) {
|
||||
organizerTag = originalOrganizer; // Behold opprinnelig ved redigering
|
||||
} else {
|
||||
organizerTag = UserManager.getInstance().getUserDisplayName(); // Ny hendelse
|
||||
}
|
||||
description += "\n#arrangor:" + organizerTag;
|
||||
|
||||
CreateEventRequest req = new CreateEventRequest(
|
||||
title, description, location, startTimeStr, endTimeStr,
|
||||
getCalendarSlug(), reminders, isAllDay, selectedRRule
|
||||
|
|
@ -534,8 +727,6 @@ public class CreateEventFragment extends Fragment {
|
|||
|
||||
Toast.makeText(getContext(), eventToEdit != null ? "Oppdaterer..." : "Oppretter...", Toast.LENGTH_SHORT).show();
|
||||
|
||||
// **VIKTIG ENDRING:**
|
||||
// Vi henter context her (mens Fragmentet lever) for å bruke den i bakgrunnstråden
|
||||
final Context appContext = requireContext().getApplicationContext();
|
||||
|
||||
Call<JsonElement> call;
|
||||
|
|
@ -550,10 +741,7 @@ public class CreateEventFragment extends Fragment {
|
|||
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
|
||||
if (response.isSuccessful()) {
|
||||
Toast.makeText(getContext(), eventToEdit != null ? "Hendelse oppdatert!" : "Hendelse opprettet!", Toast.LENGTH_LONG).show();
|
||||
|
||||
// Start oppdatering av alarmer i bakgrunnen
|
||||
fetchCalendarAndSchedule(appContext);
|
||||
|
||||
Navigation.findNavController(getView()).navigateUp();
|
||||
} else {
|
||||
Toast.makeText(getContext(), "Feil (" + response.code() + ")", Toast.LENGTH_LONG).show();
|
||||
|
|
@ -567,16 +755,12 @@ public class CreateEventFragment extends Fragment {
|
|||
});
|
||||
}
|
||||
|
||||
// Oppdatert metode som tar imot context som parameter
|
||||
private void fetchCalendarAndSchedule(Context context) {
|
||||
new Thread(() -> {
|
||||
try {
|
||||
// Sjekk en ekstra gang for å være sikker
|
||||
if (context == null) return;
|
||||
|
||||
Response<List<CalendarEvent>> response = RetrofitClient.getApiService().getCalendarEvents().execute();
|
||||
if (response.isSuccessful() && response.body() != null) {
|
||||
// Bruk contexten vi fikk tilsendt, ikke getContext() som kan være null
|
||||
AlarmScheduler.scheduleAlarmsForEvents(context, response.body());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
|
|
|||
36
app/src/main/java/com/kbs/kbsintranett/User.java
Normal file
36
app/src/main/java/com/kbs/kbsintranett/User.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package com.kbs.kbsintranett;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class User implements Serializable {
|
||||
@SerializedName("id")
|
||||
private int id;
|
||||
|
||||
@SerializedName("name")
|
||||
private String name;
|
||||
|
||||
@SerializedName("email")
|
||||
private String email;
|
||||
|
||||
@SerializedName("roles")
|
||||
private List<String> roles; // NYTT: Liste over roller
|
||||
|
||||
// For bruk i UI (sjekkbokser)
|
||||
private boolean isSelected = false;
|
||||
|
||||
public int getId() { return id; }
|
||||
public String getName() { return name; }
|
||||
public String getEmail() { return email; }
|
||||
public List<String> getRoles() { return roles != null ? roles : new ArrayList<>(); }
|
||||
|
||||
public boolean isSelected() { return isSelected; }
|
||||
public void setSelected(boolean selected) { isSelected = selected; }
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
|
@ -45,6 +45,10 @@ public interface WordPressApiService {
|
|||
@POST("wp-json/kbs/v1/calendar/create")
|
||||
Call<JsonElement> createCalendarEvent(@Body CreateEventRequest request);
|
||||
|
||||
// NYTT ENDEPUNKT
|
||||
@GET("wp-json/kbs/v1/users")
|
||||
Call<List<User>> getUsersList();
|
||||
|
||||
@GET("wp-json/gf/v2/entries")
|
||||
Call<GravityEntryResponse> getEntries(
|
||||
@Query("form_ids") int formId,
|
||||
|
|
@ -73,7 +77,6 @@ public interface WordPressApiService {
|
|||
@POST("wp-json/kbs/v1/calendar/delete")
|
||||
Call<JsonElement> deleteCalendarEvent(@Body CreateEventRequest request);
|
||||
|
||||
// NYTT: Registrer enhet for push-varsler
|
||||
@POST("wp-json/kbs/v1/device/register")
|
||||
Call<JsonElement> registerDevice(@Body RegisterDeviceRequest request);
|
||||
}
|
||||
|
|
@ -42,10 +42,6 @@
|
|||
android:drawablePadding="8dp"
|
||||
app:drawableStartCompat="@android:drawable/ic_menu_recent_history"/>
|
||||
|
||||
<!--
|
||||
ENDRET: Lagt til kart-ikon, blå tekstfarge, og gjort den klikkbar visuelt
|
||||
med background="?attr/selectableItemBackground"
|
||||
-->
|
||||
<TextView
|
||||
android:id="@+id/sheet_location"
|
||||
android:layout_width="match_parent"
|
||||
|
|
@ -62,10 +58,32 @@
|
|||
android:paddingVertical="8dp"
|
||||
app:drawableStartCompat="@android:drawable/ic_dialog_map"/>
|
||||
|
||||
<!--
|
||||
ENDRET: Lagt til autoLink for web, email og phone
|
||||
Dette hjelper TextView å forstå linker automatisk
|
||||
-->
|
||||
<!-- NYTT: Arrangør -->
|
||||
<TextView
|
||||
android:id="@+id/sheet_organizer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Invitert av: ..."
|
||||
android:textSize="14sp"
|
||||
android:textColor="#333"
|
||||
android:background="#F5F5F5"
|
||||
android:padding="12dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<!-- Deltakere -->
|
||||
<TextView
|
||||
android:id="@+id/sheet_participants"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Synlig for: ..."
|
||||
android:textSize="14sp"
|
||||
android:textColor="#333"
|
||||
android:background="#F5F5F5"
|
||||
android:padding="12dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sheet_desc"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
|||
|
|
@ -71,6 +71,54 @@
|
|||
android:layout_marginBottom="16dp"
|
||||
android:padding="12dp"/>
|
||||
|
||||
<!-- SYNLIGHET / DELTAKERE (NYTT) -->
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Synlighet / Deltakere:"
|
||||
android:textSize="14sp"
|
||||
android:textColor="#666"
|
||||
android:layout_marginTop="8dp"/>
|
||||
|
||||
<RadioGroup
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginBottom="8dp">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_visibility_all"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Alle i kalenderen (Standard)"
|
||||
android:checked="true"/>
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rb_visibility_specific"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Begrens til valgte personer..."/>
|
||||
</RadioGroup>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_select_participants"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Velg personer"
|
||||
android:visibility="gone"
|
||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||
android:layout_marginBottom="16dp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txt_selected_participants"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Ingen valgt"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="italic"
|
||||
android:visibility="gone"
|
||||
android:layout_marginBottom="16dp"/>
|
||||
|
||||
<!-- HELE DAGEN -->
|
||||
<Switch
|
||||
android:id="@+id/switch_all_day"
|
||||
|
|
@ -151,7 +199,7 @@
|
|||
android:layout_marginBottom="16dp"
|
||||
android:padding="12dp"/>
|
||||
|
||||
<!-- NYTT: VARSLING MED CHIPS (MULTIVALG) -->
|
||||
<!-- VARSLING MED CHIPS -->
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
@ -172,7 +220,6 @@
|
|||
android:layout_height="wrap_content"
|
||||
app:singleLine="true"
|
||||
app:selectionRequired="false">
|
||||
<!-- Chips legges til programmatisk i Java -->
|
||||
</com.google.android.material.chip.ChipGroup>
|
||||
|
||||
</HorizontalScrollView>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue