diff --git a/app/src/main/java/com/kbs/kbsintranett/HandbookDetailFragment.java b/app/src/main/java/com/kbs/kbsintranett/HandbookDetailFragment.java
index 002d3a3..628e1b1 100644
--- a/app/src/main/java/com/kbs/kbsintranett/HandbookDetailFragment.java
+++ b/app/src/main/java/com/kbs/kbsintranett/HandbookDetailFragment.java
@@ -1,21 +1,29 @@
-// FILSTI: app\src\main\java\com\kbs\kbsintranett\HandbookDetailFragment.java
package com.kbs.kbsintranett;
+import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
-import android.text.Html;
-import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
import android.widget.ProgressBar;
-import android.widget.TextView;
import android.widget.Toast;
+
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
-import androidx.core.text.HtmlCompat; // Bedre HTML støtte
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
+
+import com.google.gson.JsonObject;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@@ -23,11 +31,116 @@ import retrofit2.Response;
public class HandbookDetailFragment extends Fragment {
private int pageId;
- private String pageTitle; // Fallback tittel før lasting
- private TextView titleView;
- private TextView contentView;
+ private String pageTitle;
+ private WebView webView;
private ProgressBar progressBar;
+ // --- CSS: DESIGN MED MER LUFT ---
+ private static final String CSS_STYLE =
+ "";
+
+ // --- JAVASCRIPT: AUTOSCROLL ---
+ private static final String JS_SCRIPT =
+ "";
+
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -38,28 +151,187 @@ public class HandbookDetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- // Hent argumenter fra navigasjon
if (getArguments() != null) {
pageId = getArguments().getInt("page_id");
pageTitle = getArguments().getString("page_title");
}
Toolbar toolbar = view.findViewById(R.id.detail_toolbar);
- toolbar.setTitle("Håndbok");
+ toolbar.setTitle(pageTitle != null ? pageTitle : "Håndbok");
toolbar.setNavigationOnClickListener(v -> Navigation.findNavController(view).navigateUp());
- titleView = view.findViewById(R.id.detail_title);
- contentView = view.findViewById(R.id.detail_content);
+ webView = view.findViewById(R.id.detail_webview);
progressBar = view.findViewById(R.id.detail_loading);
- titleView.setText(pageTitle); // Sett midlertidig tittel
-
+ setupWebView();
fetchContent();
}
+ private void setupWebView() {
+ WebSettings settings = webView.getSettings();
+ settings.setJavaScriptEnabled(true);
+ settings.setDomStorageEnabled(true);
+ settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+
+ webView.setWebViewClient(new WebViewClient() {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
+ return handleLinkClick(request.getUrl().toString());
+ }
+
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ return handleLinkClick(url);
+ }
+ });
+ }
+
+ private boolean handleLinkClick(String url) {
+ // Ignorer klikk på accordion-lenker
+ if (url.endsWith("#")) return true;
+
+ String lowerUrl = url.toLowerCase();
+ int formIdToOpen = 0;
+
+ // --- SPESIALHÅNDTERING: Link til Skjemaer basert på URL-nøkkelord ---
+
+ // ID 1: Ansatteopplysninger
+ if (lowerUrl.contains("ansatteopplysninger")) {
+ formIdToOpen = 1;
+ }
+ // ID 2: Vernerunde
+ else if (lowerUrl.contains("vernerunde")) {
+ formIdToOpen = 2;
+ }
+ // ID 4: RUH (Rapport om uønsket hendelse)
+ else if (lowerUrl.contains("uonsket-hendelse") || lowerUrl.contains("/ruh")) {
+ formIdToOpen = 4;
+ }
+ // ID 5: Lån av verktøy/henger
+ else if (lowerUrl.contains("lan-av") || lowerUrl.contains("verktoy")) {
+ formIdToOpen = 5;
+ }
+ // ID 6: Avviksmelding
+ else if (lowerUrl.contains("avviksmelding") || lowerUrl.contains("/avvik")) {
+ formIdToOpen = 6;
+ }
+ // ID 9: Sikkerhetskurs / Kompetansebevis
+ else if (lowerUrl.contains("sikkerhetskurs") || lowerUrl.contains("kompetansebevis")) {
+ formIdToOpen = 9;
+ }
+ // ID 10: HMS Bekreftelse
+ else if (lowerUrl.contains("hms-bekreftelse") || lowerUrl.contains("hms-policy")) {
+ formIdToOpen = 10;
+ }
+ // ID 11: Egenmelding
+ else if (lowerUrl.contains("egenmelding")) {
+ formIdToOpen = 11;
+ }
+ // ID 12: Sjekkliste firmabil
+ else if (lowerUrl.contains("sjekkliste") && (lowerUrl.contains("bil") || lowerUrl.contains("kjoretoy"))) {
+ formIdToOpen = 12;
+ }
+ // ID 14: SJA (Sikker Jobbanalyse)
+ else if (lowerUrl.contains("sja") || lowerUrl.contains("jobbanalyse")) {
+ formIdToOpen = 14;
+ }
+ // ID 15: Fraværsvarsel
+ else if (lowerUrl.contains("fravaersvarsel") || lowerUrl.contains("fravarsvarsel")) {
+ formIdToOpen = 15;
+ }
+ // ID 16: Refusjon utlegg
+ else if (lowerUrl.contains("refusjon") || lowerUrl.contains("utlegg")) {
+ formIdToOpen = 16;
+ }
+ // ID 21: Medarbeidersamtale
+ else if (lowerUrl.contains("medarbeidersamtale")) {
+ formIdToOpen = 21;
+ }
+ // ID 22: Medarbeiderundersøkelse
+ else if (lowerUrl.contains("medarbeiderundersokelse")) {
+ formIdToOpen = 22;
+ }
+
+ // Hvis vi fant et skjema, naviger dit internt
+ if (formIdToOpen > 0) {
+ Bundle bundle = new Bundle();
+ bundle.putInt("formId", formIdToOpen);
+ Navigation.findNavController(getView()).navigate(R.id.action_handbook_to_form, bundle);
+ return true;
+ }
+
+ // --- STANDARD INTERN NAVIGASJON ---
+ if (url.contains("intranet.kbs.no") || url.startsWith("/")) {
+ int targetId = extractIdFromUrl(url);
+ if (targetId > 0) {
+ navigateToPage(targetId, "Laster...");
+ return true;
+ }
+
+ progressBar.setVisibility(View.VISIBLE);
+ RetrofitClient.getApiService().lookupPageId(url).enqueue(new Callback() {
+ @Override
+ public void onResponse(Call call, Response response) {
+ if (!isAdded()) return;
+ progressBar.setVisibility(View.GONE);
+
+ if (response.isSuccessful() && response.body() != null) {
+ int id = response.body().get("id").getAsInt();
+ if (id > 0) {
+ navigateToPage(id, "Laster...");
+ } else {
+ openExternal(url);
+ }
+ } else {
+ openExternal(url);
+ }
+ }
+
+ @Override
+ public void onFailure(Call call, Throwable t) {
+ if (!isAdded()) return;
+ progressBar.setVisibility(View.GONE);
+ openExternal(url);
+ }
+ });
+ return true;
+ } else {
+ // Ekstern lenke
+ Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ startActivity(browserIntent);
+ return true;
+ }
+ }
+
+ private void navigateToPage(int id, String title) {
+ Bundle bundle = new Bundle();
+ bundle.putInt("page_id", id);
+ bundle.putString("page_title", title);
+ Navigation.findNavController(getView()).navigate(R.id.action_handbook_to_detail, bundle);
+ }
+
+ private void openExternal(String url) {
+ Intent intent = new Intent(getContext(), WebViewActivity.class);
+ intent.putExtra(WebViewActivity.EXTRA_URL, url);
+ intent.putExtra(WebViewActivity.EXTRA_TITLE, "KBS Intranett");
+ startActivity(intent);
+ }
+
+ private int extractIdFromUrl(String url) {
+ Pattern p = Pattern.compile("[?&](p|page_id|post)=([0-9]+)");
+ Matcher m = p.matcher(url);
+ if (m.find()) {
+ try {
+ return Integer.parseInt(m.group(2));
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+ return 0;
+ }
+
private void fetchContent() {
progressBar.setVisibility(View.VISIBLE);
-
RetrofitClient.getApiService().getHandbookPage(pageId).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
@@ -68,17 +340,29 @@ public class HandbookDetailFragment extends Fragment {
if (response.isSuccessful() && response.body() != null) {
HandbookPage page = response.body();
- titleView.setText(page.title);
- // RENDERING AV HTML
- // HtmlCompat.FROM_HTML_MODE_COMPACT håndterer grunnleggende tags (p, br, b, i, h1-h6, ul, li)
- // Det støtter dessverre ikke tabeller eller bilder optimalt rett i TextView.
- if (page.content != null) {
- contentView.setText(HtmlCompat.fromHtml(page.content, HtmlCompat.FROM_HTML_MODE_COMPACT));
- contentView.setMovementMethod(LinkMovementMethod.getInstance()); // Gjør linker klikkbare
- } else {
- contentView.setText("Ingen innhold funnet.");
+ if (getView() != null) {
+ Toolbar toolbar = getView().findViewById(R.id.detail_toolbar);
+ if (toolbar != null) toolbar.setTitle(page.title);
}
+
+ String htmlContent = "" +
+ "" +
+ CSS_STYLE +
+ JS_SCRIPT +
+ "";
+
+ htmlContent += "" + page.title + "
";
+
+ if (page.content != null) {
+ htmlContent += page.content;
+ } else {
+ htmlContent += "Ingen innhold funnet.
";
+ }
+ htmlContent += "";
+
+ webView.loadDataWithBaseURL("https://intranet.kbs.no", htmlContent, "text/html", "UTF-8", null);
+
} else {
Toast.makeText(getContext(), "Kunne ikke laste innhold.", Toast.LENGTH_SHORT).show();
}
diff --git a/app/src/main/java/com/kbs/kbsintranett/ProfileFragment.java b/app/src/main/java/com/kbs/kbsintranett/ProfileFragment.java
index a43ca41..42afa4f 100644
--- a/app/src/main/java/com/kbs/kbsintranett/ProfileFragment.java
+++ b/app/src/main/java/com/kbs/kbsintranett/ProfileFragment.java
@@ -26,6 +26,7 @@ public class ProfileFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
+
// 1. Finn Views
ImageView closeBtn = view.findViewById(R.id.btn_close_profile);
ImageView profileImage = view.findViewById(R.id.profile_image);
@@ -33,6 +34,7 @@ public class ProfileFragment extends Fragment {
TextView emailText = view.findViewById(R.id.profile_email);
TextView roleText = view.findViewById(R.id.profile_role);
Button logoutBtn = view.findViewById(R.id.btn_logout);
+ Button updateInfoBtn = view.findViewById(R.id.btn_update_info); // NY
// 2. Hent data fra UserManager
UserManager user = UserManager.getInstance();
@@ -53,7 +55,14 @@ public class ProfileFragment extends Fragment {
Navigation.findNavController(view).navigateUp();
});
- // 5. Håndter utlogging
+ // 5. Håndter "Oppdater opplysninger" (Skjema ID 1)
+ updateInfoBtn.setOnClickListener(v -> {
+ Bundle bundle = new Bundle();
+ bundle.putInt("formId", 1); // ID 1 er Ansatteopplysninger
+ Navigation.findNavController(view).navigate(R.id.action_profile_to_form, bundle);
+ });
+
+ // 6. Håndter utlogging
logoutBtn.setOnClickListener(v -> performLogout());
return view;
diff --git a/app/src/main/res/layout/fragment_handbook.xml b/app/src/main/res/layout/fragment_handbook.xml
index 0de1f1c..9e9d68e 100644
--- a/app/src/main/res/layout/fragment_handbook.xml
+++ b/app/src/main/res/layout/fragment_handbook.xml
@@ -22,6 +22,15 @@
android:textColor="#333333"
android:layout_marginBottom="12dp"/>
+
+
-
-
+
+
+ android:layout_centerInParent="true"
+ android:visibility="gone"/>
-
+
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml
index 2787143..88b0178 100644
--- a/app/src/main/res/layout/fragment_profile.xml
+++ b/app/src/main/res/layout/fragment_profile.xml
@@ -5,44 +5,50 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
- android:background="@color/kbs_very_light_blue">
+ android:background="@color/kbs_very_light_blue">
-
-
+ android:layout_marginBottom="32dp"
+ android:paddingHorizontal="10dp"
+ android:background="@color/kbs_logo_blue" >
+
+
+
+
+
+ android:paddingTop="32dp">
+
+
+ android:layout_marginBottom="32dp"/>
+
+
+ android:backgroundTint="@color/kbs_logo_accent_red"
+ android:textColor="@color/white"/>
diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml
index 598b6b7..8136961 100644
--- a/app/src/main/res/navigation/mobile_navigation.xml
+++ b/app/src/main/res/navigation/mobile_navigation.xml
@@ -69,7 +69,7 @@
android:id="@+id/navigation_forms_detail"
android:name="com.kbs.kbsintranett.FormsFragment"
android:label="Fyll ut skjema"
- tools:layout="@layout/fragment_forms" >
+ tools:layout="@layout/fragment_forms">
+
+
+
\ No newline at end of file
diff --git a/hele_prosjektet.txt b/hele_prosjektet.txt
index ccccb26..fbec233 100644
--- a/hele_prosjektet.txt
+++ b/hele_prosjektet.txt
@@ -47,14 +47,12 @@ plugins {
android {
namespace = "com.kbs.kbsintranett"
- compileSdk {
- version = release(36)
- }
+ compileSdk = 34
defaultConfig {
applicationId = "com.kbs.kbsintranett"
minSdk = 28
- targetSdk = 36
+ targetSdk = 34
versionCode = 1
versionName = "1.0"
@@ -71,6 +69,7 @@ android {
}
}
compileOptions {
+ // ENDRET: Oppgradert til Java 11 for å fikse build warnings
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
@@ -90,8 +89,8 @@ dependencies {
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.google.code.gson:gson:2.10.1")
- // Navigation Component (KORRIGERT FOR KOTLIN DSL)
- val navVersion = "2.8.5" // Oppdatert til en nyere, stabil versjon
+ // Navigation Component
+ val navVersion = "2.8.5"
implementation("androidx.navigation:navigation-fragment:$navVersion")
implementation("androidx.navigation:navigation-ui:$navVersion")
@@ -100,6 +99,9 @@ dependencies {
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
implementation("androidx.work:work-runtime:2.9.0")
+
+ // Swipe Refresh Layout
+ implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
}
============================================================
@@ -162,28 +164,18 @@ FILSTI: app\src\main\AndroidManifest.xml
============================================================
+ xmlns:tools="http://schemas.android.com/tools">
-
-
-
-
+
+
-
-
-
-
+
+
{
+ fetchFormsList();
+ });
+
+ // Hent data første gang
fetchFormsList();
return view;
}
private void fetchFormsList() {
- RetrofitClient.getApiService().getFormsListMap().enqueue(new Callback