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"/> + +