Før endringer av strømforbruket
This commit is contained in:
parent
ee198150c2
commit
f7eeba2037
4 changed files with 223 additions and 10111 deletions
|
|
@ -34,15 +34,13 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
private TextView txtSheetTitle, txtDatePreview, txtUsersPreview;
|
||||
|
||||
private Calendar dueDate = Calendar.getInstance();
|
||||
private List<User> allUsersFromApi = new ArrayList<>();
|
||||
private List<User> filteredUsers = new ArrayList<>();
|
||||
private List<User> selectedUsers = new ArrayList<>();
|
||||
|
||||
private TaskItem taskToEdit = null; // NYTT: Hold på oppgaven som skal endres
|
||||
private TaskItem taskToEdit = null;
|
||||
|
||||
public interface OnTaskAddedListener {
|
||||
void onTaskAdded(TaskItem task);
|
||||
void onTaskUpdated(TaskItem task); // NYTT
|
||||
void onTaskUpdated(TaskItem task);
|
||||
}
|
||||
|
||||
private OnTaskAddedListener listener;
|
||||
|
|
@ -51,7 +49,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
this.listener = listener;
|
||||
}
|
||||
|
||||
// NYTT: Metode for å sette oppgaven som skal redigeres
|
||||
public void setTaskToEdit(TaskItem task) {
|
||||
this.taskToEdit = task;
|
||||
}
|
||||
|
|
@ -76,7 +73,7 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
View v = inflater.inflate(R.layout.bottom_sheet_add_task, container, false);
|
||||
|
||||
txtSheetTitle = v.findViewById(R.id.txt_sheet_title); // Pass på at denne IDen finnes i XML
|
||||
txtSheetTitle = v.findViewById(R.id.txt_sheet_title);
|
||||
etTitle = v.findViewById(R.id.et_task_title);
|
||||
etDesc = v.findViewById(R.id.et_task_desc);
|
||||
btnDate = v.findViewById(R.id.btn_task_date);
|
||||
|
|
@ -107,24 +104,23 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
btnUsers.setOnClickListener(view -> showUserSelectionDialog());
|
||||
btnSave.setOnClickListener(view -> saveTask());
|
||||
|
||||
fetchUsers();
|
||||
fetchAndFilterUsers();
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
private void fetchUsers() {
|
||||
private void fetchAndFilterUsers() {
|
||||
RetrofitClient.getApiService().getUsersList().enqueue(new Callback<List<User>>() {
|
||||
@Override
|
||||
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
|
||||
if (response.isSuccessful() && response.body() != null) {
|
||||
allUsersFromApi = response.body();
|
||||
filterUsersByHierarchy();
|
||||
// BRUKER HJELPEKLASSEN HER:
|
||||
filteredUsers = UserFilterHelper.getFilteredUsers(response.body());
|
||||
|
||||
// Hvis vi redigerer, må vi mappe eksisterende deltakere til selectedUsers listen
|
||||
if (taskToEdit != null) {
|
||||
selectedUsers.clear();
|
||||
Map<String, Boolean> currentAssignees = taskToEdit.getAssigneeStatus();
|
||||
for (User u : allUsersFromApi) {
|
||||
for (User u : filteredUsers) {
|
||||
if (currentAssignees.containsKey(u.getEmail())) {
|
||||
selectedUsers.add(u);
|
||||
}
|
||||
|
|
@ -138,46 +134,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
});
|
||||
}
|
||||
|
||||
private void filterUsersByHierarchy() {
|
||||
filteredUsers.clear();
|
||||
UserManager me = UserManager.getInstance();
|
||||
List<String> myRoles = new ArrayList<>();
|
||||
User self = null;
|
||||
|
||||
for (User u : allUsersFromApi) {
|
||||
if (u.getEmail().equalsIgnoreCase(me.getUserEmail())) {
|
||||
self = u;
|
||||
for (String r : u.getRoles()) myRoles.add(r.toLowerCase());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (me.isEditorOrAbove()) {
|
||||
filteredUsers.addAll(allUsersFromApi);
|
||||
return;
|
||||
}
|
||||
|
||||
for (User u : allUsersFromApi) {
|
||||
if (u.getEmail().equalsIgnoreCase(me.getUserEmail())) {
|
||||
if (!filteredUsers.contains(u)) filteredUsers.add(u);
|
||||
continue;
|
||||
}
|
||||
boolean hasAccess = false;
|
||||
for (String role : u.getRoles()) {
|
||||
String r = role.toLowerCase();
|
||||
if ((r.equals("serviceavdelingen") && myRoles.contains("serviceavdelingen")) ||
|
||||
(r.equals("automasjonsavdelingen") && myRoles.contains("automasjonsavdelingen")) ||
|
||||
(r.equals("prosjektavdelingen") && myRoles.contains("prosjektavdelingen")) ||
|
||||
(r.equals("administrasjonen") && myRoles.contains("administrasjonen")) ||
|
||||
(r.equals("kbs_alle") && myRoles.contains("kbs_alle"))) {
|
||||
hasAccess = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasAccess && !filteredUsers.contains(u)) filteredUsers.add(u);
|
||||
}
|
||||
}
|
||||
|
||||
private void showUserSelectionDialog() {
|
||||
if (filteredUsers.isEmpty()) {
|
||||
Toast.makeText(getContext(), "Henter tilgjengelige personer...", Toast.LENGTH_SHORT).show();
|
||||
|
|
@ -187,7 +143,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
boolean[] checked = new boolean[filteredUsers.size()];
|
||||
for (int i = 0; i < filteredUsers.size(); i++) {
|
||||
names[i] = filteredUsers.get(i).getName();
|
||||
// Sjekk om e-posten finnes i de valgte brukernes liste
|
||||
boolean isSelected = false;
|
||||
for(User su : selectedUsers) {
|
||||
if(su.getEmail().equalsIgnoreCase(filteredUsers.get(i).getEmail())) {
|
||||
|
|
@ -202,13 +157,9 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
.setMultiChoiceItems(names, checked, (dialog, which, isChecked) -> {
|
||||
User user = filteredUsers.get(which);
|
||||
if (isChecked) {
|
||||
boolean alreadyIn = false;
|
||||
for(User su : selectedUsers) if(su.getEmail().equalsIgnoreCase(user.getEmail())) alreadyIn = true;
|
||||
if(!alreadyIn) selectedUsers.add(user);
|
||||
selectedUsers.add(user);
|
||||
} else {
|
||||
User toRemove = null;
|
||||
for(User su : selectedUsers) if(su.getEmail().equalsIgnoreCase(user.getEmail())) toRemove = su;
|
||||
if(toRemove != null) selectedUsers.remove(toRemove);
|
||||
selectedUsers.removeIf(u -> u.getEmail().equalsIgnoreCase(user.getEmail()));
|
||||
}
|
||||
})
|
||||
.setPositiveButton("OK", (dialog, which) -> updateUsersPreview())
|
||||
|
|
@ -234,12 +185,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
}
|
||||
|
||||
if (taskToEdit != null) {
|
||||
// REDIGER MODUS: Oppdater eksisterende objekt
|
||||
// Vi må beholde ID, Creator osv, men oppdatere innhold og deltakere
|
||||
// OBS: Hvis vi fjerner deltakere som allerede hadde gjort oppgaven, forsvinner deres status.
|
||||
// Dette er akseptabel oppførsel for enkelthets skyld.
|
||||
|
||||
// Lag en kopi av gamle statuser for å bevare "Fullført" for de som fortsatt er med
|
||||
Map<String, Boolean> oldStatus = taskToEdit.getAssigneeStatus();
|
||||
taskToEdit.getAssigneeStatus().clear();
|
||||
|
||||
|
|
@ -255,25 +200,11 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sjekk om tittelen eller beskrivelsen faktisk har endret seg for å sette titlene på nytt
|
||||
// (Vi bruker reflection her eller bare setter verdiene direkte siden de er private i TaskItem)
|
||||
// Siden jeg ikke endret TaskItem til å ha public settlere, antar jeg at du legger til disse
|
||||
// eller at vi bare lager en ny TaskItem med samme ID.
|
||||
|
||||
// Vi simulerer oppdatering av feltene (Sørg for at TaskItem har disse setterene!)
|
||||
// Hvis du ikke har setttere, legg dem til i TaskItem.java:
|
||||
// public void setTitle(String t) { this.title = t; }
|
||||
// public void setDescription(String d) { this.description = d; }
|
||||
// public void setDueDate(long d) { this.dueDate = d; }
|
||||
|
||||
// Jeg skriver logikken slik at den forventer setttere:
|
||||
updateTaskFields(taskToEdit, title, etDesc.getText().toString(), dueDate.getTimeInMillis());
|
||||
|
||||
taskToEdit.setTitle(title);
|
||||
taskToEdit.setDescription(etDesc.getText().toString());
|
||||
taskToEdit.setDueDate(dueDate.getTimeInMillis());
|
||||
if (listener != null) listener.onTaskUpdated(taskToEdit);
|
||||
|
||||
} else {
|
||||
// NY OPPGAVE MODUS
|
||||
TaskItem newTask = new TaskItem(title, etDesc.getText().toString(), dueDate.getTimeInMillis());
|
||||
if (selectedUsers.isEmpty()) {
|
||||
newTask.addAssignee(UserManager.getInstance().getUserEmail());
|
||||
|
|
@ -284,13 +215,4 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
|
|||
}
|
||||
dismiss();
|
||||
}
|
||||
|
||||
// Hjelpemetode (forutsetter at du legger til disse tre setterne i TaskItem.java)
|
||||
private void updateTaskFields(TaskItem t, String title, String desc, long date) {
|
||||
// Her kaller vi setterne vi nå legger til i TaskItem
|
||||
// Se punkt 5 nedenfor for oppdatert TaskItem.java
|
||||
t.setTitle(title);
|
||||
t.setDescription(desc);
|
||||
t.setDueDate(date);
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,6 @@ 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;
|
||||
|
|
@ -57,14 +56,10 @@ public class CreateEventFragment extends Fragment {
|
|||
private String selectedRRule = null;
|
||||
private boolean isCustomRecurrence = false;
|
||||
|
||||
// Deltakere
|
||||
private List<User> allUsers = new ArrayList<>();
|
||||
// BRUKERLISTER
|
||||
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;
|
||||
|
||||
@Nullable
|
||||
|
|
@ -77,29 +72,26 @@ public class CreateEventFragment extends Fragment {
|
|||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
// Initialisering av Views
|
||||
etTitle = view.findViewById(R.id.et_title);
|
||||
etDesc = view.findViewById(R.id.et_desc);
|
||||
etLocation = view.findViewById(R.id.et_location);
|
||||
switchAllDay = view.findViewById(R.id.switch_all_day);
|
||||
|
||||
spinnerCalendar = view.findViewById(R.id.spinner_calendar);
|
||||
spinnerRecurrence = view.findViewById(R.id.spinner_recurrence);
|
||||
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)
|
||||
// Standardtidspunkt (neste time)
|
||||
startCal.add(Calendar.HOUR_OF_DAY, 1);
|
||||
startCal.set(Calendar.MINUTE, 0);
|
||||
endCal.setTime(startCal.getTime());
|
||||
|
|
@ -109,7 +101,7 @@ public class CreateEventFragment extends Fragment {
|
|||
setupReminderChips();
|
||||
fetchUsers();
|
||||
|
||||
// SJEKK OM VI ER I REDIGERINGS-MODUS
|
||||
// Sjekk om vi redigerer en eksisterende hendelse
|
||||
if (getArguments() != null && getArguments().containsKey("edit_event")) {
|
||||
eventToEdit = (CalendarEvent) getArguments().getSerializable("edit_event");
|
||||
prefillForm(eventToEdit);
|
||||
|
|
@ -121,16 +113,12 @@ public class CreateEventFragment extends Fragment {
|
|||
|
||||
// Listeners
|
||||
switchAllDay.setOnCheckedChangeListener((btn, isChecked) -> updateUI());
|
||||
|
||||
btnStartDate.setOnClickListener(v -> pickDate(startCal, true));
|
||||
btnEndDate.setOnClickListener(v -> pickDate(endCal, false));
|
||||
|
||||
btnStartTime.setOnClickListener(v -> pickTime(startCal));
|
||||
btnEndTime.setOnClickListener(v -> pickTime(endCal));
|
||||
|
||||
btnSave.setOnClickListener(v -> submitEvent());
|
||||
|
||||
// Vis/Skjul deltaker-knapp
|
||||
rbAll.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
if (isChecked) {
|
||||
btnSelectParticipants.setVisibility(View.GONE);
|
||||
|
|
@ -150,7 +138,6 @@ public class CreateEventFragment extends Fragment {
|
|||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
if (eventToEdit != null && position == 0 && selectedRRule != null) return;
|
||||
|
||||
String selected = parent.getItemAtPosition(position).toString();
|
||||
if (selected.equals("Egendefinert...")) {
|
||||
showCustomRecurrenceDialog();
|
||||
|
|
@ -162,15 +149,6 @@ 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() {
|
||||
|
|
@ -179,11 +157,8 @@ public class CreateEventFragment extends Fragment {
|
|||
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());
|
||||
}
|
||||
// BRUKER DEN SENTRALE HJELPEKLASSEN FOR FILTRERING
|
||||
filteredUsers = UserFilterHelper.getFilteredUsers(response.body());
|
||||
|
||||
if (eventToEdit != null) {
|
||||
parseParticipantsFromDescription(eventToEdit.getDescription());
|
||||
|
|
@ -195,42 +170,9 @@ public class CreateEventFragment extends Fragment {
|
|||
});
|
||||
}
|
||||
|
||||
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();
|
||||
Toast.makeText(getContext(), "Ingen personer funnet.", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -255,7 +197,7 @@ public class CreateEventFragment extends Fragment {
|
|||
private void updateParticipantPreview() {
|
||||
StringBuilder sb = new StringBuilder("Valgte: ");
|
||||
int count = 0;
|
||||
for (User u : allUsers) {
|
||||
for (User u : filteredUsers) {
|
||||
if (u.isSelected()) {
|
||||
if (count > 0) sb.append(", ");
|
||||
sb.append(u.getName());
|
||||
|
|
@ -274,11 +216,10 @@ public class CreateEventFragment extends Fragment {
|
|||
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);
|
||||
for (User u : filteredUsers) {
|
||||
if (u.getEmail().equalsIgnoreCase(email.trim())) {
|
||||
u.setSelected(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -290,19 +231,15 @@ public class CreateEventFragment extends Fragment {
|
|||
|
||||
private void prefillForm(CalendarEvent event) {
|
||||
etTitle.setText(event.getTitle());
|
||||
|
||||
// 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();
|
||||
}
|
||||
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
|
||||
.replaceAll("#arrangor:.+", "")
|
||||
.trim();
|
||||
etDesc.setText(cleanDesc);
|
||||
etLocation.setText(event.getLocation());
|
||||
|
|
@ -310,36 +247,29 @@ public class CreateEventFragment extends Fragment {
|
|||
ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCalendar.getAdapter();
|
||||
if (adapter != null) {
|
||||
int position = adapter.getPosition(event.getCalendarName());
|
||||
if (position >= 0) {
|
||||
spinnerCalendar.setSelection(position);
|
||||
}
|
||||
if (position >= 0) spinnerCalendar.setSelection(position);
|
||||
}
|
||||
spinnerCalendar.setEnabled(false);
|
||||
|
||||
try {
|
||||
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());
|
||||
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
|
||||
|
||||
String start = event.getRawDate();
|
||||
if (start != null) {
|
||||
if (start.length() == 10) {
|
||||
switchAllDay.setChecked(true);
|
||||
Date d = simpleFormat.parse(start);
|
||||
startCal.setTime(d);
|
||||
|
||||
startCal.setTime(simpleFormat.parse(start));
|
||||
if (event.getRawEndDate() != null) {
|
||||
Date e = simpleFormat.parse(event.getRawEndDate());
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.setTime(e);
|
||||
c.setTime(simpleFormat.parse(event.getRawEndDate()));
|
||||
c.add(Calendar.DAY_OF_MONTH, -1);
|
||||
endCal.setTime(c.getTime());
|
||||
} else {
|
||||
endCal.setTime(d);
|
||||
endCal.setTime(startCal.getTime());
|
||||
}
|
||||
} else if (start.contains("T")) {
|
||||
if (start.length() > 19) start = start.substring(0, 19);
|
||||
startCal.setTime(isoFormat.parse(start));
|
||||
|
||||
String end = event.getRawEndDate();
|
||||
if (end != null && end.contains("T")) {
|
||||
if (end.length() > 19) end = end.substring(0, 19);
|
||||
|
|
@ -350,130 +280,96 @@ public class CreateEventFragment extends Fragment {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<Integer> existingReminders = event.getReminders();
|
||||
if (!existingReminders.isEmpty()) {
|
||||
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) {
|
||||
((Chip) chipGroupReminders.getChildAt(i)).setChecked(false);
|
||||
}
|
||||
for (int min : existingReminders) {
|
||||
checkChipByMinutes(min);
|
||||
Chip chip = (Chip) chipGroupReminders.getChildAt(i);
|
||||
chip.setChecked(existingReminders.contains((Integer) chip.getTag()));
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e("KBS_EDIT", "Feil ved prefill", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkChipByMinutes(int minutes) {
|
||||
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) {
|
||||
Chip chip = (Chip) chipGroupReminders.getChildAt(i);
|
||||
if ((int)chip.getTag() == minutes) {
|
||||
chip.setChecked(true);
|
||||
}
|
||||
private void setupCalendarSpinner() {
|
||||
List<String> calendars = UserManager.getInstance().getWriteableCalendars();
|
||||
if (calendars.isEmpty()) {
|
||||
calendars = new ArrayList<>();
|
||||
calendars.add("Felles");
|
||||
}
|
||||
|
||||
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, calendars) {
|
||||
@NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
|
||||
TextView view = (TextView) super.getView(position, convertView, parent);
|
||||
view.setBackgroundColor(Color.parseColor(getCalendarColor(getItem(position))));
|
||||
view.setTextColor(Color.WHITE);
|
||||
view.setTypeface(null, Typeface.BOLD);
|
||||
return view;
|
||||
}
|
||||
@Override public View getDropDownView(int position, View convertView, ViewGroup parent) {
|
||||
TextView view = (TextView) super.getDropDownView(position, convertView, parent);
|
||||
view.setTextColor(Color.parseColor(getCalendarColor(getItem(position))));
|
||||
view.setTypeface(null, Typeface.BOLD);
|
||||
return view;
|
||||
}
|
||||
};
|
||||
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
spinnerCalendar.setAdapter(adapter);
|
||||
}
|
||||
|
||||
private String getCalendarColor(String name) {
|
||||
if (name == null) return "#888888";
|
||||
switch (name) {
|
||||
case "Felles": return "#0069B3";
|
||||
case "Felles": return "#0069B3"; // KBS Blå
|
||||
case "AMU/HMS/Miljø": return "#2E7D32"; // Mørk grønn (Miljø-profil)
|
||||
case "Administrasjonen": return "#607D8B";
|
||||
case "Serviceavdelingen": return "#E65100";
|
||||
case "Automasjonsavdelingen": return "#2E7D32";
|
||||
case "Automasjonsavdelingen": return "#2E7D32"; // Merk: Denne er lik Miljø nå, du kan bytte til f.eks #1B5E20 hvis ønskelig
|
||||
case "Prosjektavdelingen": return "#7B1FA2";
|
||||
default: return "#888888";
|
||||
}
|
||||
}
|
||||
|
||||
private void setupCalendarSpinner() {
|
||||
List<String> calendars = UserManager.getInstance().getWriteableCalendars();
|
||||
if (calendars.isEmpty()) calendars.add("Felles");
|
||||
|
||||
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, calendars) {
|
||||
@NonNull
|
||||
@Override
|
||||
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
|
||||
TextView view = (TextView) super.getView(position, convertView, parent);
|
||||
String calName = getItem(position);
|
||||
String colorHex = getCalendarColor(calName);
|
||||
view.setBackgroundColor(Color.parseColor(colorHex));
|
||||
view.setTextColor(Color.WHITE);
|
||||
view.setTypeface(null, Typeface.BOLD);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getDropDownView(int position, View convertView, ViewGroup parent) {
|
||||
TextView view = (TextView) super.getDropDownView(position, convertView, parent);
|
||||
String calName = getItem(position);
|
||||
String colorHex = getCalendarColor(calName);
|
||||
view.setBackgroundColor(Color.WHITE);
|
||||
view.setTextColor(Color.parseColor(colorHex));
|
||||
view.setTypeface(null, Typeface.BOLD);
|
||||
return view;
|
||||
}
|
||||
};
|
||||
|
||||
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
spinnerCalendar.setAdapter(adapter);
|
||||
}
|
||||
|
||||
private void setupReminderChips() {
|
||||
addChip("Ved start", 0);
|
||||
addChip("5 min", 5);
|
||||
addChip("10 min", 10);
|
||||
addChip("15 min", 15);
|
||||
addChip("30 min", 30);
|
||||
addChip("1 time", 60);
|
||||
addChip("2 timer", 120);
|
||||
addChip("1 dag", 1440);
|
||||
addChip("2 dager", 2880);
|
||||
addChip("1 uke", 10080);
|
||||
chipGroupReminders.removeAllViews();
|
||||
addReminderChip("Ved start", 0);
|
||||
addReminderChip("5 min", 5);
|
||||
addReminderChip("10 min", 10);
|
||||
addReminderChip("15 min", 15);
|
||||
addReminderChip("30 min", 30);
|
||||
addReminderChip("1 t", 60);
|
||||
addReminderChip("2 t", 120);
|
||||
addReminderChip("1 d", 1440);
|
||||
addReminderChip("2 d", 2880);
|
||||
addReminderChip("1 u", 10080);
|
||||
|
||||
if (eventToEdit == null) checkChipByMinutes(15);
|
||||
if (eventToEdit == null) {
|
||||
for (int i=0; i<chipGroupReminders.getChildCount(); i++) {
|
||||
Chip c = (Chip) chipGroupReminders.getChildAt(i);
|
||||
if ((int)c.getTag() == 15) c.setChecked(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addChip(String text, int minutes) {
|
||||
private void addReminderChip(String text, int minutes) {
|
||||
Chip chip = new Chip(getContext());
|
||||
chip.setText(text);
|
||||
chip.setTag(minutes);
|
||||
chip.setCheckable(true);
|
||||
chip.setClickable(true);
|
||||
chipGroupReminders.addView(chip);
|
||||
}
|
||||
|
||||
private List<Integer> getSelectedReminders() {
|
||||
List<Integer> selected = new ArrayList<>();
|
||||
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) {
|
||||
Chip chip = (Chip) chipGroupReminders.getChildAt(i);
|
||||
if (chip.isChecked()) {
|
||||
selected.add((Integer) chip.getTag());
|
||||
}
|
||||
}
|
||||
return selected;
|
||||
}
|
||||
|
||||
private void updateRecurrenceSpinner() {
|
||||
String dayName = new SimpleDateFormat("EEEE", new Locale("no")).format(startCal.getTime());
|
||||
int dayOfMonth = startCal.get(Calendar.DAY_OF_MONTH);
|
||||
String monthName = new SimpleDateFormat("MMMM", new Locale("no")).format(startCal.getTime());
|
||||
|
||||
int weekNo = (startCal.get(Calendar.DAY_OF_MONTH) - 1) / 7 + 1;
|
||||
String nthDayString = "månedlig den " + weekNo + ". " + dayName + "en";
|
||||
|
||||
List<String> options = new ArrayList<>();
|
||||
options.add("Ikke gjenta");
|
||||
options.add("Daglig");
|
||||
options.add("Ukentlig på " + dayName);
|
||||
options.add("Månedlig den " + dayOfMonth + ".");
|
||||
options.add(capitalize(nthDayString));
|
||||
options.add("Årlig den " + dayOfMonth + ". " + monthName);
|
||||
options.add("Hver ukedag (man-fre)");
|
||||
options.add("Egendefinert...");
|
||||
|
||||
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, options);
|
||||
spinnerRecurrence.setAdapter(adapter);
|
||||
options.add("Ikke gjenta"); options.add("Daglig"); options.add("Ukentlig på " + dayName);
|
||||
options.add("Månedlig den " + dayOfMonth + "."); options.add("Månedlig den " + weekNo + ". " + dayName + "en");
|
||||
options.add("Årlig den " + dayOfMonth + ". " + monthName); options.add("Hver ukedag (man-fre)"); options.add("Egendefinert...");
|
||||
spinnerRecurrence.setAdapter(new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, options));
|
||||
}
|
||||
|
||||
private void generateStandardRRule(int position) {
|
||||
|
|
@ -481,112 +377,59 @@ public class CreateEventFragment extends Fragment {
|
|||
case 1: selectedRRule = "RRULE:FREQ=DAILY"; break;
|
||||
case 2: selectedRRule = "RRULE:FREQ=WEEKLY"; break;
|
||||
case 3: selectedRRule = "RRULE:FREQ=MONTHLY"; break;
|
||||
case 4:
|
||||
int weekNo = (startCal.get(Calendar.DAY_OF_MONTH) - 1) / 7 + 1;
|
||||
String dayCode = getDayCode(startCal.get(Calendar.DAY_OF_WEEK));
|
||||
selectedRRule = "RRULE:FREQ=MONTHLY;BYDAY=" + weekNo + dayCode;
|
||||
break;
|
||||
case 4: selectedRRule = "RRULE:FREQ=MONTHLY;BYDAY=" + ((startCal.get(Calendar.DAY_OF_MONTH)-1)/7+1) + getDayCode(startCal.get(Calendar.DAY_OF_WEEK)); break;
|
||||
case 5: selectedRRule = "RRULE:FREQ=YEARLY"; break;
|
||||
case 6: selectedRRule = "RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"; break;
|
||||
default: selectedRRule = null;
|
||||
}
|
||||
}
|
||||
|
||||
private String getDayCode(int calendarDay) {
|
||||
switch (calendarDay) {
|
||||
case Calendar.MONDAY: return "MO"; case Calendar.TUESDAY: return "TU"; case Calendar.WEDNESDAY: return "WE";
|
||||
case Calendar.THURSDAY: return "TH"; case Calendar.FRIDAY: return "FR"; case Calendar.SATURDAY: return "SA";
|
||||
case Calendar.SUNDAY: return "SU"; default: return "MO";
|
||||
}
|
||||
}
|
||||
|
||||
private void showCustomRecurrenceDialog() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
|
||||
View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_custom_recurrence, null);
|
||||
|
||||
EditText etInterval = view.findViewById(R.id.et_interval);
|
||||
EditText etInterval = view.findViewById(R.id.et_interval), etCount = view.findViewById(R.id.et_count);
|
||||
Spinner spinnerFreq = view.findViewById(R.id.spinner_freq);
|
||||
View layoutWeekdays = view.findViewById(R.id.layout_weekdays);
|
||||
|
||||
ToggleButton[] toggles = {
|
||||
view.findViewById(R.id.tg_mon), view.findViewById(R.id.tg_tue),
|
||||
view.findViewById(R.id.tg_wed), view.findViewById(R.id.tg_thu),
|
||||
view.findViewById(R.id.tg_fri), view.findViewById(R.id.tg_sat),
|
||||
view.findViewById(R.id.tg_sun)
|
||||
};
|
||||
ToggleButton[] toggles = {view.findViewById(R.id.tg_mon), view.findViewById(R.id.tg_tue), view.findViewById(R.id.tg_wed), view.findViewById(R.id.tg_thu), view.findViewById(R.id.tg_fri), view.findViewById(R.id.tg_sat), view.findViewById(R.id.tg_sun)};
|
||||
String[] labels = {"M", "T", "O", "T", "F", "L", "S"};
|
||||
for(int i=0; i<7; i++) { toggles[i].setText(labels[i]); toggles[i].setTextOn(labels[i]); toggles[i].setTextOff(labels[i]); }
|
||||
|
||||
RadioGroup rgEnd = view.findViewById(R.id.rg_end);
|
||||
Button btnEndDatePicker = view.findViewById(R.id.btn_end_date_picker);
|
||||
EditText etCount = view.findViewById(R.id.et_count);
|
||||
Calendar customEndCal = Calendar.getInstance();
|
||||
customEndCal.add(Calendar.MONTH, 1);
|
||||
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("d. MMM yyyy", Locale.getDefault());
|
||||
btnEndDatePicker.setText(sdf.format(customEndCal.getTime()));
|
||||
|
||||
RadioGroup rgEnd = view.findViewById(R.id.rg_end); Button btnEndDatePicker = view.findViewById(R.id.btn_end_date_picker);
|
||||
Calendar customEndCal = Calendar.getInstance(); customEndCal.add(Calendar.MONTH, 1);
|
||||
btnEndDatePicker.setText(new SimpleDateFormat("d. MMM yyyy", Locale.getDefault()).format(customEndCal.getTime()));
|
||||
btnEndDatePicker.setOnClickListener(v -> {
|
||||
rgEnd.check(R.id.rb_date);
|
||||
new DatePickerDialog(getContext(), (p, y, m, d) -> {
|
||||
customEndCal.set(y, m, d);
|
||||
btnEndDatePicker.setText(sdf.format(customEndCal.getTime()));
|
||||
}, customEndCal.get(Calendar.YEAR), customEndCal.get(Calendar.MONTH), customEndCal.get(Calendar.DAY_OF_MONTH)).show();
|
||||
new DatePickerDialog(getContext(), (p, y, m, d) -> { customEndCal.set(y, m, d); btnEndDatePicker.setText(new SimpleDateFormat("d. MMM yyyy", Locale.getDefault()).format(customEndCal.getTime())); }, customEndCal.get(Calendar.YEAR), customEndCal.get(Calendar.MONTH), customEndCal.get(Calendar.DAY_OF_MONTH)).show();
|
||||
});
|
||||
|
||||
spinnerFreq.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
layoutWeekdays.setVisibility(position == 1 ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
@Override public void onNothingSelected(AdapterView<?> parent) {}
|
||||
@Override public void onItemSelected(AdapterView<?> p, View v, int pos, long id) { layoutWeekdays.setVisibility(pos == 1 ? View.VISIBLE : View.GONE); }
|
||||
@Override public void onNothingSelected(AdapterView<?> p) {}
|
||||
});
|
||||
|
||||
builder.setView(view);
|
||||
AlertDialog dialog = builder.create();
|
||||
|
||||
view.findViewById(R.id.btn_cancel).setOnClickListener(v -> {
|
||||
dialog.dismiss();
|
||||
spinnerRecurrence.setSelection(0);
|
||||
});
|
||||
|
||||
builder.setView(view); AlertDialog dialog = builder.create();
|
||||
view.findViewById(R.id.btn_cancel).setOnClickListener(v -> { dialog.dismiss(); spinnerRecurrence.setSelection(0); });
|
||||
view.findViewById(R.id.btn_done).setOnClickListener(v -> {
|
||||
StringBuilder rrule = new StringBuilder("RRULE:");
|
||||
int freqPos = spinnerFreq.getSelectedItemPosition();
|
||||
String freq = "";
|
||||
switch (freqPos) {
|
||||
case 0: freq = "DAILY"; break;
|
||||
case 1: freq = "WEEKLY"; break;
|
||||
case 2: freq = "MONTHLY"; break;
|
||||
case 3: freq = "YEARLY"; break;
|
||||
StringBuilder rrule = new StringBuilder("RRULE:FREQ=");
|
||||
rrule.append(new String[]{"DAILY", "WEEKLY", "MONTHLY", "YEARLY"}[spinnerFreq.getSelectedItemPosition()]);
|
||||
if (!etInterval.getText().toString().isEmpty() && !etInterval.getText().toString().equals("1")) rrule.append(";INTERVAL=").append(etInterval.getText().toString());
|
||||
if (spinnerFreq.getSelectedItemPosition() == 1) {
|
||||
List<String> days = new ArrayList<>(); String[] codes = {"MO", "TU", "WE", "TH", "FR", "SA", "SU"};
|
||||
for (int i=0; i<7; i++) if (toggles[i].isChecked()) days.add(codes[i]);
|
||||
if (!days.isEmpty()) rrule.append(";BYDAY=").append(String.join(",", days));
|
||||
}
|
||||
rrule.append("FREQ=").append(freq);
|
||||
|
||||
String interval = etInterval.getText().toString();
|
||||
if (!interval.isEmpty() && !interval.equals("1")) {
|
||||
rrule.append(";INTERVAL=").append(interval);
|
||||
}
|
||||
|
||||
if (freq.equals("WEEKLY")) {
|
||||
List<String> days = new ArrayList<>();
|
||||
String[] codes = {"MO", "TU", "WE", "TH", "FR", "SA", "SU"};
|
||||
for (int i=0; i<7; i++) {
|
||||
if (toggles[i].isChecked()) days.add(codes[i]);
|
||||
}
|
||||
if (!days.isEmpty()) {
|
||||
rrule.append(";BYDAY=").append(String.join(",", days));
|
||||
}
|
||||
}
|
||||
|
||||
int checkedId = rgEnd.getCheckedRadioButtonId();
|
||||
if (checkedId == R.id.rb_date) {
|
||||
customEndCal.set(Calendar.HOUR_OF_DAY, 23);
|
||||
customEndCal.set(Calendar.MINUTE, 59);
|
||||
customEndCal.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
|
||||
SimpleDateFormat utc = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US);
|
||||
utc.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
|
||||
if (rgEnd.getCheckedRadioButtonId() == R.id.rb_date) {
|
||||
customEndCal.set(Calendar.HOUR_OF_DAY, 23); customEndCal.set(Calendar.MINUTE, 59);
|
||||
SimpleDateFormat utc = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US); utc.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
|
||||
rrule.append(";UNTIL=").append(utc.format(customEndCal.getTime()));
|
||||
} else if (checkedId == R.id.rb_count) {
|
||||
rrule.append(";COUNT=").append(etCount.getText().toString());
|
||||
}
|
||||
|
||||
selectedRRule = rrule.toString();
|
||||
isCustomRecurrence = true;
|
||||
dialog.dismiss();
|
||||
} else if (rgEnd.getCheckedRadioButtonId() == R.id.rb_count) rrule.append(";COUNT=").append(etCount.getText().toString());
|
||||
selectedRRule = rrule.toString(); isCustomRecurrence = true; dialog.dismiss();
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
|
|
@ -594,12 +437,8 @@ public class CreateEventFragment extends Fragment {
|
|||
new DatePickerDialog(getContext(), (view, y, m, d) -> {
|
||||
cal.set(y, m, d);
|
||||
if (isStart) {
|
||||
if (endCal.before(startCal)) {
|
||||
endCal.setTime(startCal.getTime());
|
||||
if (!switchAllDay.isChecked()) endCal.add(Calendar.HOUR_OF_DAY, 1);
|
||||
}
|
||||
updateRecurrenceSpinner();
|
||||
if (!isCustomRecurrence) spinnerRecurrence.setSelection(0);
|
||||
if (endCal.before(startCal)) { endCal.setTime(startCal.getTime()); if (!switchAllDay.isChecked()) endCal.add(Calendar.HOUR_OF_DAY, 1); }
|
||||
updateRecurrenceSpinner(); if (!isCustomRecurrence) spinnerRecurrence.setSelection(0);
|
||||
}
|
||||
updateUI();
|
||||
}, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)).show();
|
||||
|
|
@ -607,165 +446,57 @@ public class CreateEventFragment extends Fragment {
|
|||
|
||||
private void pickTime(Calendar cal) {
|
||||
new TimePickerDialog(getContext(), (view, h, m) -> {
|
||||
cal.set(Calendar.HOUR_OF_DAY, h);
|
||||
cal.set(Calendar.MINUTE, m);
|
||||
if (cal == startCal && endCal.before(startCal)) {
|
||||
endCal.setTime(startCal.getTime());
|
||||
endCal.add(Calendar.HOUR_OF_DAY, 1);
|
||||
}
|
||||
cal.set(Calendar.HOUR_OF_DAY, h); cal.set(Calendar.MINUTE, m);
|
||||
if (cal == startCal && endCal.before(startCal)) { endCal.setTime(startCal.getTime()); endCal.add(Calendar.HOUR_OF_DAY, 1); }
|
||||
updateUI();
|
||||
}, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show();
|
||||
}
|
||||
|
||||
private void updateUI() {
|
||||
boolean isAllDay = switchAllDay.isChecked();
|
||||
|
||||
btnStartTime.setVisibility(isAllDay ? View.GONE : View.VISIBLE);
|
||||
btnEndTime.setVisibility(isAllDay ? View.GONE : View.VISIBLE);
|
||||
|
||||
SimpleDateFormat dateFmt = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault());
|
||||
SimpleDateFormat timeFmt = new SimpleDateFormat("HH:mm", Locale.getDefault());
|
||||
|
||||
btnStartDate.setText(dateFmt.format(startCal.getTime()));
|
||||
btnEndDate.setText(dateFmt.format(endCal.getTime()));
|
||||
btnStartTime.setText(timeFmt.format(startCal.getTime()));
|
||||
btnEndTime.setText(timeFmt.format(endCal.getTime()));
|
||||
|
||||
String preview = dateFmt.format(startCal.getTime());
|
||||
if (!isAllDay) preview += " " + timeFmt.format(startCal.getTime());
|
||||
preview += " - ";
|
||||
|
||||
if (isSameDay(startCal, endCal)) {
|
||||
if (isAllDay) preview += " (Samme dag)";
|
||||
else preview += timeFmt.format(endCal.getTime());
|
||||
} else {
|
||||
preview += dateFmt.format(endCal.getTime());
|
||||
if (!isAllDay) preview += " " + timeFmt.format(endCal.getTime());
|
||||
}
|
||||
txtPreview.setText(preview);
|
||||
}
|
||||
|
||||
private boolean isSameDay(Calendar c1, Calendar c2) {
|
||||
return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) &&
|
||||
c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR);
|
||||
}
|
||||
|
||||
private String capitalize(String s) {
|
||||
if (s == null || s.isEmpty()) return s;
|
||||
return s.substring(0, 1).toUpperCase() + s.substring(1);
|
||||
}
|
||||
|
||||
private String getDayCode(int calendarDay) {
|
||||
switch (calendarDay) {
|
||||
case Calendar.MONDAY: return "MO";
|
||||
case Calendar.TUESDAY: return "TU";
|
||||
case Calendar.WEDNESDAY: return "WE";
|
||||
case Calendar.THURSDAY: return "TH";
|
||||
case Calendar.FRIDAY: return "FR";
|
||||
case Calendar.SATURDAY: return "SA";
|
||||
case Calendar.SUNDAY: return "SU";
|
||||
default: return "MO";
|
||||
}
|
||||
}
|
||||
|
||||
private String getCalendarSlug() {
|
||||
if (spinnerCalendar.getSelectedItem() != null) {
|
||||
return spinnerCalendar.getSelectedItem().toString();
|
||||
}
|
||||
return "Felles";
|
||||
SimpleDateFormat dFmt = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()), tFmt = new SimpleDateFormat("HH:mm", Locale.getDefault());
|
||||
btnStartDate.setText(dFmt.format(startCal.getTime())); btnEndDate.setText(dFmt.format(endCal.getTime()));
|
||||
btnStartTime.setText(tFmt.format(startCal.getTime())); btnEndTime.setText(tFmt.format(endCal.getTime()));
|
||||
String p = dFmt.format(startCal.getTime()) + (isAllDay ? "" : " " + tFmt.format(startCal.getTime())) + " - ";
|
||||
if (startCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR) && startCal.get(Calendar.DAY_OF_YEAR) == endCal.get(Calendar.DAY_OF_YEAR)) {
|
||||
p += (isAllDay ? "(Samme dag)" : tFmt.format(endCal.getTime()));
|
||||
} else p += dFmt.format(endCal.getTime()) + (isAllDay ? "" : " " + tFmt.format(endCal.getTime()));
|
||||
txtPreview.setText(p);
|
||||
}
|
||||
|
||||
private void submitEvent() {
|
||||
String title = etTitle.getText().toString().trim();
|
||||
if (title.isEmpty()) {
|
||||
etTitle.setError("Mangler tittel");
|
||||
return;
|
||||
if (title.isEmpty()) { etTitle.setError("Mangler tittel"); return; }
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(switchAllDay.isChecked() ? "yyyy-MM-dd" : "yyyy-MM-dd'T'HH:mm", Locale.getDefault());
|
||||
List<Integer> reminders = new ArrayList<>();
|
||||
for (int i=0; i<chipGroupReminders.getChildCount(); i++) {
|
||||
Chip c = (Chip) chipGroupReminders.getChildAt(i);
|
||||
if (c.isChecked()) reminders.add((Integer) c.getTag());
|
||||
}
|
||||
|
||||
boolean isAllDay = switchAllDay.isChecked();
|
||||
String format = isAllDay ? "yyyy-MM-dd" : "yyyy-MM-dd'T'HH:mm";
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault());
|
||||
|
||||
String startTimeStr = sdf.format(startCal.getTime());
|
||||
String endTimeStr = sdf.format(endCal.getTime());
|
||||
String location = etLocation.getText().toString();
|
||||
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();
|
||||
}
|
||||
String desc = etDesc.getText().toString();
|
||||
if (rbSpecific.isChecked()) {
|
||||
StringBuilder sb = new StringBuilder(); boolean first = true;
|
||||
for (User u : filteredUsers) if (u.isSelected()) { if (!first) sb.append(","); sb.append(u.getEmail()); first = false; }
|
||||
if (sb.length() > 0) desc += "\n\n#deltakere:" + sb.toString();
|
||||
}
|
||||
desc += "\n#arrangor:" + (originalOrganizer != null ? originalOrganizer : UserManager.getInstance().getUserDisplayName());
|
||||
|
||||
// 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;
|
||||
String calSlug = spinnerCalendar.getSelectedItem() != null ? spinnerCalendar.getSelectedItem().toString() : "Felles";
|
||||
|
||||
CreateEventRequest req = new CreateEventRequest(
|
||||
title, description, location, startTimeStr, endTimeStr,
|
||||
getCalendarSlug(), reminders, isAllDay, selectedRRule
|
||||
);
|
||||
|
||||
if (eventToEdit != null) {
|
||||
req.id = eventToEdit.getId();
|
||||
}
|
||||
|
||||
Toast.makeText(getContext(), eventToEdit != null ? "Oppdaterer..." : "Oppretter...", Toast.LENGTH_SHORT).show();
|
||||
|
||||
final Context appContext = requireContext().getApplicationContext();
|
||||
|
||||
Call<JsonElement> call;
|
||||
if (eventToEdit != null) {
|
||||
call = RetrofitClient.getApiService().updateCalendarEvent(req);
|
||||
} else {
|
||||
call = RetrofitClient.getApiService().createCalendarEvent(req);
|
||||
}
|
||||
CreateEventRequest req = new CreateEventRequest(title, desc, etLocation.getText().toString(), sdf.format(startCal.getTime()), sdf.format(endCal.getTime()), calSlug, reminders, switchAllDay.isChecked(), selectedRRule);
|
||||
if (eventToEdit != null) req.id = eventToEdit.getId();
|
||||
|
||||
Call<JsonElement> call = (eventToEdit != null) ? RetrofitClient.getApiService().updateCalendarEvent(req) : RetrofitClient.getApiService().createCalendarEvent(req);
|
||||
call.enqueue(new Callback<JsonElement>() {
|
||||
@Override
|
||||
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
|
||||
@Override 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();
|
||||
fetchCalendarAndSchedule(appContext);
|
||||
Toast.makeText(getContext(), "Lagret!", Toast.LENGTH_LONG).show();
|
||||
Navigation.findNavController(getView()).navigateUp();
|
||||
} else {
|
||||
Toast.makeText(getContext(), "Feil (" + response.code() + ")", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call<JsonElement> call, Throwable t) {
|
||||
Toast.makeText(getContext(), "Nettverksfeil", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@Override public void onFailure(Call<JsonElement> call, Throwable t) { Toast.makeText(getContext(), "Feil!", Toast.LENGTH_SHORT).show(); }
|
||||
});
|
||||
}
|
||||
|
||||
private void fetchCalendarAndSchedule(Context context) {
|
||||
new Thread(() -> {
|
||||
try {
|
||||
if (context == null) return;
|
||||
Response<List<CalendarEvent>> response = RetrofitClient.getApiService().getCalendarEvents().execute();
|
||||
if (response.isSuccessful() && response.body() != null) {
|
||||
AlarmScheduler.scheduleAlarmsForEvents(context, response.body());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e("CreateEvent", "Kunne ikke oppdatere alarmer", e);
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
80
app/src/main/java/com/kbs/kbsintranett/UserFilterHelper.java
Normal file
80
app/src/main/java/com/kbs/kbsintranett/UserFilterHelper.java
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
package com.kbs.kbsintranett;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class UserFilterHelper {
|
||||
|
||||
private static final List<Integer> EXCLUDED_IDS = Arrays.asList(50, 51); // felles@kbs.no og kbs@kbs.no
|
||||
private static final String REQUIRED_DOMAIN = "@kbs.no";
|
||||
|
||||
public static List<User> getFilteredUsers(List<User> allUsers) {
|
||||
if (allUsers == null) return new ArrayList<>();
|
||||
|
||||
UserManager me = UserManager.getInstance();
|
||||
String myEmail = me.getUserEmail();
|
||||
|
||||
List<User> sanitizedList = new ArrayList<>();
|
||||
for (User u : allUsers) {
|
||||
String email = u.getEmail() != null ? u.getEmail().toLowerCase() : "";
|
||||
if (!email.endsWith(REQUIRED_DOMAIN)) continue;
|
||||
if (EXCLUDED_IDS.contains(u.getId())) continue;
|
||||
if (u.getRoles() == null || u.getRoles().isEmpty()) continue;
|
||||
|
||||
sanitizedList.add(u);
|
||||
}
|
||||
|
||||
if (me.isEditorOrAbove()) {
|
||||
return sanitizedList;
|
||||
}
|
||||
|
||||
List<User> finalResult = new ArrayList<>();
|
||||
List<String> myRoles = getRolesForEmail(sanitizedList, myEmail);
|
||||
|
||||
// NY ROLLE LAGT TIL I LISTEN: amuhmsmiljogruppa
|
||||
List<String> deptRoles = Arrays.asList(
|
||||
"serviceavdelingen",
|
||||
"automasjonsavdelingen",
|
||||
"prosjektavdelingen",
|
||||
"administrasjonen",
|
||||
"kbs_alle",
|
||||
"amuhmsmiljogruppa"
|
||||
);
|
||||
|
||||
for (User u : sanitizedList) {
|
||||
if (u.getEmail().equalsIgnoreCase(myEmail)) {
|
||||
finalResult.add(u);
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean sharesDepartment = false;
|
||||
for (String role : u.getRoles()) {
|
||||
String r = role.toLowerCase();
|
||||
if (deptRoles.contains(r) && myRoles.contains(r)) {
|
||||
sharesDepartment = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (sharesDepartment) {
|
||||
finalResult.add(u);
|
||||
}
|
||||
}
|
||||
|
||||
return finalResult;
|
||||
}
|
||||
|
||||
private static List<String> getRolesForEmail(List<User> users, String email) {
|
||||
List<String> roles = new ArrayList<>();
|
||||
for (User u : users) {
|
||||
if (u.getEmail().equalsIgnoreCase(email)) {
|
||||
if (u.getRoles() != null) {
|
||||
for (String r : u.getRoles()) roles.add(r.toLowerCase());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return roles;
|
||||
}
|
||||
}
|
||||
9621
hele_prosjektet.txt
9621
hele_prosjektet.txt
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue