Førkalenderfargeendring

This commit is contained in:
ErolHaagenrud 2025-12-17 08:58:58 +01:00
parent 3b2d19bd0b
commit 71bfb191bc
6 changed files with 1379 additions and 420 deletions

View file

@ -54,6 +54,9 @@ public class AuthRepository {
// Lagre utvidet info i UserManager
UserManager.getInstance().setExtendedUserInfo(fName, lName, stilling, mobil);
// Lagre listen over skrivbare kalendere
UserManager.getInstance().setWriteableCalendars(response.body().writeableCalendars);
callback.onSuccess(role);
} else {

View file

@ -82,6 +82,12 @@ public class CreateEventFragment extends Fragment {
btnSave = view.findViewById(R.id.btn_save_event);
// Initialiser tid (neste hele time)
startCal.add(Calendar.HOUR_OF_DAY, 1);
startCal.set(Calendar.MINUTE, 0);
endCal.setTime(startCal.getTime());
endCal.add(Calendar.HOUR_OF_DAY, 1);
setupCalendarSpinner();
setupReminderChips();
@ -90,12 +96,6 @@ public class CreateEventFragment extends Fragment {
eventToEdit = (CalendarEvent) getArguments().getSerializable("edit_event");
prefillForm(eventToEdit);
btnSave.setText("Oppdater Hendelse");
} else {
// Ny event: Standard tid (neste time)
startCal.add(Calendar.HOUR_OF_DAY, 1);
startCal.set(Calendar.MINUTE, 0);
endCal.setTime(startCal.getTime());
endCal.add(Calendar.HOUR_OF_DAY, 1);
}
updateRecurrenceSpinner();
@ -115,8 +115,8 @@ public class CreateEventFragment extends Fragment {
spinnerRecurrence.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// Unngå å overskrive ved innlasting
if (eventToEdit != null && position == 0) return;
// Unngå å overskrive ved innlasting hvis vi allerede har satt en verdi
if (eventToEdit != null && position == 0 && selectedRRule != null) return;
String selected = parent.getItemAtPosition(position).toString();
if (selected.equals("Egendefinert...")) {
@ -152,10 +152,8 @@ public class CreateEventFragment extends Fragment {
Date d = simpleFormat.parse(start);
startCal.setTime(d);
// Sluttdato
if (event.getRawEndDate() != null) {
Date e = simpleFormat.parse(event.getRawEndDate());
// Google sender sluttdato eksklusiv (dagen etter). Vi trekker fra 1 dag for visning.
Calendar c = Calendar.getInstance();
c.setTime(e);
c.add(Calendar.DAY_OF_MONTH, -1);
@ -179,23 +177,15 @@ public class CreateEventFragment extends Fragment {
}
}
// Varsler - Finn tag i den beskrivelsen
if (event.getDescription() != null) {
Pattern p = Pattern.compile("#varsel:([\\d,]+)");
Matcher m = p.matcher(event.getDescription());
if (m.find()) {
String[] parts = m.group(1).split(",");
// Fjern alle sjekkmerker først
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) {
((Chip) chipGroupReminders.getChildAt(i)).setChecked(false);
}
// Sett nye
for (String part : parts) {
try {
int min = Integer.parseInt(part);
checkChipByMinutes(min);
} catch (NumberFormatException e) {}
}
// Varsler
List<Integer> existingReminders = event.getReminders();
if (!existingReminders.isEmpty()) {
// Fjern alle sjekkmerker først (15 min er default checked)
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) {
((Chip) chipGroupReminders.getChildAt(i)).setChecked(false);
}
for (int min : existingReminders) {
checkChipByMinutes(min);
}
}
@ -214,13 +204,11 @@ public class CreateEventFragment extends Fragment {
}
private void setupCalendarSpinner() {
String[] calendars = {
"Felles",
"Administrasjonen",
"Serviceavdelingen",
"Automasjonsavdelingen",
"Prosjektavdelingen"
};
// HENT DYNAMISK LISTE FRA USERMANAGER
List<String> calendars = UserManager.getInstance().getWriteableCalendars();
if (calendars.isEmpty()) calendars.add("Felles");
spinnerCalendar.setAdapter(new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, calendars));
}
@ -236,7 +224,6 @@ public class CreateEventFragment extends Fragment {
addChip("2 dager", 2880);
addChip("1 uke", 10080);
// Marker 15 min som standard KUN for ny event
if (eventToEdit == null) checkChipByMinutes(15);
}
@ -474,15 +461,12 @@ public class CreateEventFragment extends Fragment {
}
}
// NY: Henter navnet kalenderen direkte fra Spinneren
private String getCalendarSlug() {
int pos = spinnerCalendar.getSelectedItemPosition();
switch (pos) {
case 1: return "Administrasjonen";
case 2: return "Serviceavdelingen";
case 3: return "Automasjonsavdelingen";
case 4: return "Prosjektavdelingen";
default: return "Felles"; // case 0
if (spinnerCalendar.getSelectedItem() != null) {
return spinnerCalendar.getSelectedItem().toString();
}
return "Felles";
}
private void submitEvent() {
@ -508,14 +492,12 @@ public class CreateEventFragment extends Fragment {
selectedRRule
);
// HVIS VI REDIGERER, SETT ID
if (eventToEdit != null) {
req.id = eventToEdit.getId();
}
Toast.makeText(getContext(), eventToEdit != null ? "Oppdaterer..." : "Oppretter...", Toast.LENGTH_SHORT).show();
// Velg riktig API-kall (Create vs Update)
Call<JsonElement> call;
if (eventToEdit != null) {
call = RetrofitClient.getApiService().updateCalendarEvent(req);

View file

@ -3,13 +3,11 @@ package com.kbs.kbsintranett;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
@ -65,8 +63,11 @@ public class HomeFragment extends Fragment {
profileBtn.setOnClickListener(v -> Navigation.findNavController(view).navigate(R.id.navigation_profile));
}
// NY LOGIKK: Vis knapp hvis brukeren har tilgang til minst én kalender
Button btnCreateEvent = view.findViewById(R.id.btn_create_event);
if (UserManager.getInstance().isEditorOrAbove()) {
List<String> writeable = UserManager.getInstance().getWriteableCalendars();
if (writeable != null && !writeable.isEmpty()) {
btnCreateEvent.setVisibility(View.VISIBLE);
btnCreateEvent.setOnClickListener(v -> {
Navigation.findNavController(view).navigate(R.id.action_home_to_create_event);
@ -160,7 +161,6 @@ public class HomeFragment extends Fragment {
}));
} else {
List<CalendarEvent> errorList = new ArrayList<>();
// FIKSET HER: La til "" som 5. argument (location)
errorList.add(new CalendarEvent("Kunne ikke laste kalender", "Sjekk nettverk", "!", "OBS", ""));
recyclerView.setAdapter(new CalendarAdapter(errorList, null));
}
@ -212,5 +212,4 @@ public class HomeFragment extends Fragment {
.build();
WorkManager.getInstance(requireContext()).enqueue(notifRequest);
}
}

View file

@ -2,10 +2,10 @@
package com.kbs.kbsintranett;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class LoginResponse {
public boolean success;
@SerializedName("full_cookie")
public String fullCookie;
@ -14,19 +14,21 @@ public class LoginResponse {
@SerializedName("user_id")
public int userId;
// --- NYE FELTER ---
@SerializedName("first_name")
public String firstName;
@SerializedName("last_name")
public String lastName;
@SerializedName("stilling") // Sjekk at JSON-nøkkelen fra WP matcher dette
@SerializedName("stilling")
public String stilling;
@SerializedName("mobiltelefon") // Sjekk at JSON-nøkkelen fra WP matcher dette
@SerializedName("mobiltelefon")
public String mobiltelefon;
// ------------------
// NYTT FELT: Liste over kalendere brukeren kan skrive til
@SerializedName("writeable_calendars")
public List<String> writeableCalendars;
public String message;
}

View file

@ -2,13 +2,14 @@
package com.kbs.kbsintranett;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* UserManager fungerer som en global sesjon for appen.
* Den holder informasjon om innlogget bruker, rettigheter og autentiserings-cookie.
*/
public class UserManager {
private static UserManager instance;
// Google Data
@ -22,15 +23,16 @@ public class UserManager {
private String userRole;
private String currentCookie;
// --- NYE FELTER ---
// Extended Info
private String firstName;
private String lastName;
private String stilling;
private String mobiltelefon;
private UserManager() {
// Initielt er ingen logget inn
}
// NYTT:
private List<String> writeableCalendars = new ArrayList<>();
private UserManager() {}
public static synchronized UserManager getInstance() {
if (instance == null) {
@ -39,9 +41,6 @@ public class UserManager {
return instance;
}
/**
* Kalles når Google-innlogging er vellykket.
*/
public void setUserData(String name, String email, String token, @Nullable String photoUrl) {
this.userDisplayName = name;
this.userEmail = email;
@ -49,7 +48,6 @@ public class UserManager {
this.photoUrl = photoUrl;
}
// --- NY METODE FOR UTVIDET INFO ---
public void setExtendedUserInfo(String firstName, String lastName, String stilling, String mobiltelefon) {
this.firstName = firstName;
this.lastName = lastName;
@ -57,19 +55,17 @@ public class UserManager {
this.mobiltelefon = mobiltelefon;
}
public void setCookie(String cookie) {
this.currentCookie = cookie;
public void setWriteableCalendars(List<String> calendars) {
this.writeableCalendars = calendars != null ? calendars : new ArrayList<>();
}
public void setUserRole(String role) {
this.userRole = role;
public List<String> getWriteableCalendars() {
return writeableCalendars;
}
public void setUserId(int id) {
this.userId = id;
}
// ---------------- GETTERS ----------------
public void setCookie(String cookie) { this.currentCookie = cookie; }
public void setUserRole(String role) { this.userRole = role; }
public void setUserId(int id) { this.userId = id; }
public String getUserDisplayName() { return userDisplayName != null ? userDisplayName : ""; }
public String getUserEmail() { return userEmail != null ? userEmail : ""; }
@ -78,31 +74,17 @@ public class UserManager {
public String getCookie() { return currentCookie; }
public String getUserRole() { return userRole != null ? userRole : "subscriber"; }
public int getUserId() { return userId; }
// --- NYE GETTERS ---
public String getFirstName() { return firstName != null ? firstName : ""; }
public String getLastName() { return lastName != null ? lastName : ""; }
public String getStilling() { return stilling != null ? stilling : ""; }
public String getMobiltelefon() { return mobiltelefon != null ? mobiltelefon : ""; }
// ---------------- HJELPEMETODER ----------------
public boolean isLoggedIn() {
return userEmail != null && !userEmail.isEmpty();
}
public boolean isAdmin() {
return "administrator".equalsIgnoreCase(userRole);
}
public boolean isLoggedIn() { return userEmail != null && !userEmail.isEmpty(); }
public boolean isAdmin() { return "administrator".equalsIgnoreCase(userRole); }
public boolean isEditorOrAbove() {
if (userRole == null) return false;
return userRole.equalsIgnoreCase("administrator") || userRole.equalsIgnoreCase("editor");
return userRole != null && (userRole.equalsIgnoreCase("administrator") || userRole.equalsIgnoreCase("editor"));
}
/**
* Nullstiller alt. Kalles ved utlogging.
*/
public void logout() {
userDisplayName = null;
userEmail = null;
@ -111,11 +93,10 @@ public class UserManager {
userRole = null;
currentCookie = null;
userId = 0;
// Nullstill nye felter
firstName = null;
lastName = null;
stilling = null;
mobiltelefon = null;
writeableCalendars.clear();
}
}

File diff suppressed because it is too large Load diff