Chrome >= 134 css transform performance

Has there been some kind of recent upgrade to how Google Chrome handles scroll events and/or applying transform styles?

Since about Chrome v134 I have the issue that setting a transform/translateY style on scroll, the element on which I set the style flickers briefly. (Tested on Windows and Linux)

In the Chromium browser of the same version, however, this is not happening.

<div style="position: relative;" id="scroller" onscroll="onScroll()">
  <div id="stickyHeader">Sticky Header</div>
</div>
function onScroll() {
  stickyHeader.style.transform = `translateY(${scroller.scrollTop}px)`;
}

see complete code in this fiddle: https://jsfiddle.net/floAtEbcont/n1k6Lxuw/19/

let scroller;
let stickyHeader;

function onLoad() {
  scroller = document.getElementById('scroller');
  stickyHeader = document.getElementById('stickyHeader');

  for (const element of Object.keys(Array.from(Array(1000)))) {
    const elementNode = document.createElement('div');
    elementNode.append(element);
    scroller.append(elementNode);
  }
}

function onScroll() {
  stickyHeader.style.transform = `translateY(${scroller.scrollTop}px)`;
}
html,
body {
  height: 100%;
  max-height: 100%;
  padding: 0;
  margin: 0;
}

.wrapper {
  display: flex;
  width: 100%;
  height: 100%;
  max-height: 100%;
  overflow: hidden;
}

.scroller {
  margin: 5px 10px;
  flex: 1;
  border: 1px solid black;
  overflow-y: auto;
}

.sticky-header {
  background-color: darkcyan;
  position: relative;
  z-index: 999;
  width: 100%;
}
<!DOCTYPE html>
<html>

<body onload="onLoad()">
  <div class="wrapper">
    <div class="scroller" id="scroller" onscroll="onScroll()">
      <div class="sticky-header" id="stickyHeader">Sticky Header</div>
    </div>
  </div>
</body>

</html>

Is there some way to prevent the flickering?

Intl.DateTimeFormat: Why is timeZoneName: “shortOffset” is having a different value in different languages

We are currently exploring showing timestamps with time zone to our users and decided to go with the Intl.DateTimeFormat option timeZoneName: "shortOffset" but we now noticed that the value is different between the languages.

When I run this snippet in chrome printing the timezone in different languages:

["it-IT", "da-DK", "de-DE", "en-GB", "es-ES", "pl-PL", "fr-FR", "sv-SE", "nl-NL", "nb-NO", "el-GR", "fi-FI", "pt-PT", "cs-CZ", ].forEach((l) => {
  const tz = Intl.DateTimeFormat(l, {
      timeZone: "Asia/Kolkata",
      timeZoneName: "shortOffset",
    })
    .formatToParts(new Date())
    .find((p) => p.type === "timeZoneName").value;

  console.log(l, tz);
});

I get this result:

language timezone
it-IT GMT+5:30
da-DK GMT+5.30
de-DE GMT+5:30
en-GB GMT+5:30
es-ES GMT+5:30
pl-PL GMT+5:30
fr-FR UTC+5:30
sv-SE GMT+5:30
nl-NL GMT+5:30
nb-NO GMT+5:30
el-GR GMT+5:30
fi-FI UTC+5.30
pt-PT GMT+5:30
cs-CZ GMT+5:30

so for some reason french and finnish are using the label UTC and all the other tested languages are using GMT.

I would really like to know what the reason behind this is. Is there any documentation or database where I can find the configuration of the different languages for Intl.DateTimeFormat?

Passing HTML elements between multiple Swift ViewControllers in Xcode iOS app

I’m pretty new to iOS app development in general, and I’m struggling to find online resources on how to pass variables (parsed from an HTML table via JavaScript, seen here: HTML_Table_Parsing) between two separate ViewControllers in Xcode.

I’ve placed a public copy of my Xcode project and all associated files on my GitHub, found here:

Git Repo: rynich07/WHS-Cart-Pick-iPad-App

Here’s what I’ve got set up so far:

Reference the following: iPad Simulator Xcode Screenshot

  • Main WKWebView in ViewController.swift, used to display the main warehouse picking website

    • Using a static HTML file in GitHub Xcode project called PickScreenWebpage.html as source for company privacy, but will be a live URL once deployed
  • Blue box (as seen in screenshot referenced above) is an overlayed WebKit View added via Main.storyboard, used to render image of product during picking (will also be tied to a live URL once deployed) and to enlarge critical info fields for personnel to read from afar

    • Sourced by static OverlayWebpage.html page, with the goal being the variables in the HTML can be dynamic and set programmatically based on data from the Main WKWebView above

Here’s what I need help with:

Using the PickScreenParser.js script to determine Screen Name, SKU #, and Quantity fields from the Main ViewController.swift view that the user will have open:

  • Only when the ScreenName field is equal to: rfpk_find (31.5), then

    1. Pass SKU # (12345) from Main ViewController.swift to OverlayWebpage.html
    2. Pass Quantity (5 PACKS OF 1) from Main ViewController.swift to OverlayWebpage.html
  • Again, unless the advancing page’s ScreenName field value is rfpk_find (31.5), do not update the values in the OverlayWebpage.html with any advancing screens of the Main WKWebView in ViewController.swift; instead, leave them set from the previous page.

If you guys could help me build the framework for the above, I can take it from there and make adjustments as needed.

Thanks in advance for all your input!

[runtime not ready]: Error: Non-js exception: Compiling JS failed: 1283:3:import declaration must be at top level of module, js engine: hermes

I upgraded my react native from 0.75.2 to 0.79.1 in order to fix the issue with the latest Xcode update. I followed exactly everything in the upgrade helper. After a long of trying to run the app, I finally got to know that I hade to add AppDelegate.swift file to the compile sources (as in the picture) enter image description here

Now, the problem I’m getting seems to have something to do with javascript. my babel.config.js file is as follows:

module.exports = {
  presets: ['module:@react-native/babel-preset'],
  plugins: ['module:react-native-dotenv', 'react-native-reanimated/plugin'],
};

my package.json file is as follows:

{
  "name": "lutfen",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "lint": "eslint .",
    "start": "react-native start",
    "test": "jest",
    "postinstall": "patch-package"
  },
  "dependencies": {
    "@gorhom/bottom-sheet": "^4.6.4",
    "@os-team/i18next-react-native-language-detector": "^1.0.34",
    "@react-native-async-storage/async-storage": "^2.0.0",
    "@react-native-clipboard/clipboard": "^1.15.0",
    "@react-native-community/blur": "latest",
    "@react-navigation/bottom-tabs": "^6.6.1",
    "@react-navigation/native": "^6.1.18",
    "@react-navigation/native-stack": "^6.11.0",
    "@reduxjs/toolkit": "^2.2.8",
    "axios": "^1.7.7",
    "i18next": "^23.16.5",
    "react": "19.0.0",
    "react-i18next": "^15.1.1",
    "react-native": "0.79.1",
    "react-native-fast-image": "^8.6.3",
    "react-native-gesture-handler": "^2.20.0",
    "react-native-linear-gradient": "^2.8.3",
    "react-native-localize": "^3.4.1",
    "react-native-reanimated": "^3.15.4",
    "react-native-render-html": "^6.3.4",
    "react-native-safe-area-context": "^5.4.0",
    "react-native-screens": "^3.34.0",
    "react-native-share": "^11.0.4",
    "react-native-svg": "^15.11.2",
    "react-native-webview": "^13.12.3",
    "react-redux": "^9.1.2",
    "redux": "^5.0.1"
  },
  "devDependencies": {
    "@babel/core": "^7.25.2",
    "@babel/preset-env": "^7.25.3",
    "@babel/runtime": "^7.25.0",
    "@react-native-community/cli": "18.0.0",
    "@react-native-community/cli-platform-android": "18.0.0",
    "@react-native-community/cli-platform-ios": "18.0.0",
    "@react-native/babel-preset": "0.79.1",
    "@react-native/eslint-config": "0.79.1",
    "@react-native/metro-config": "0.79.1",
    "@react-native/typescript-config": "0.79.1",
    "@types/jest": "^29.5.13",
    "@types/react": "^19.0.0",
    "@types/react-test-renderer": "^19.0.0",
    "eslint": "^8.19.0",
    "jest": "^29.6.3",
    "patch-package": "^8.0.0",
    "postinstall-postinstall": "^2.1.0",
    "prettier": "2.8.8",
    "react-native-dotenv": "^3.4.11",
    "react-native-svg-transformer": "^1.5.0",
    "react-test-renderer": "19.0.0",
    "typescript": "5.0.4"
  },
  "engines": {
    "node": ">=18"
  }
}

is there any way I can track the error? I tried to remove everything and clean all the caches and builds but the problem persist. Also, I have no information about the error (also not in the console). all I get is this: enter image description here

could you please give me any advice about how to deal with this error?

Removing extra spacing on child element on line break

I have a fixed width div containing another div.

I want the internal div as wide as its text inside, unfortunately, when the text breaks to the second line, there is a space on the right that I can’t get rid of.

While a CSS/HTML only answer is preferred, at this point I’m happy to accept a JavaScript answer.

correct layout what I want

incorrect layout what I get

.test {
  background: pink;
  width: fit-content;
  font-size: 4rem;
}

.container {
  width: 400px;
  background: yellow;
  padding: 4px;
}
<div class="container">
  <div class="test">
    somed long text here somedlong
  </div>
</div>

Issue with Switching and Adding Classes to Elements on Mouse Click

I’m encountering a problem while trying to switch and add classes to elements when a mouse click event occurs. Likewise I have multiple “li” elements. I want to add “class = subdrop active” to the selected anchor tag and the “class = active” to the subsequent li tag. I’m not sure if I’m handling the class manipulation correctly. Could someone please suggest the right approach?

<li class="submenu">
  <a href="javascript:void(0);">
    <i class="ti ti-layout-dashboard"></i>
    <span>Admin Profile</span>
    <span class="menu-arrow"></span>
  </a>
  <ul>
    <li>
      <a href="<?php echo base_url('admin_dashboard'); ?>">Dashboard</a>
    </li>
    <li>
      <a href="<?php echo base_url('admin_profile'); ?>">Profile</a>
    </li>
    <li>
      <a href="#">Settings</a>
    </li>
    <li>
      <a href="#">Contacts</a>
    </li>
  </ul>
</li>

Trying to get the following results on selected li clicks

<li class="submenu">
 <a href="javascript:void(0);" class="subdrop active"><i class="ti ti-layout-dashboard"></i><span>Admin Profile</span><span class="menu-arrow"></span>
</a>
<ul>
  <li><a href="<?php echo base_url('admin_dashboard'); ?>" class="active">Dashboard</a></li>
  <li><a href="<?php echo base_url('admin_profile'); ?>">Profile</a></li>
  <li><a href="#">Settings</a></li>
  <li><a href="#">Contacts</a></li>
</ul>
</li>

Kendo.js UID bug

I have a bug in my UI where when using UID as name of the column, the value changes from string to a random guid which is taken from data-uid:
UID looks like this:
uid: 8f7e2416-df36-4f52-a1ab-204553ca029f

The data coming from server is {“uid” : “test”}:
Data seen here:

I do not see this issue when the column name is anything other than “uid”.

Why is this happening & how can I mitigate this issue?

How to get results from an async Javascript script using C# and Microsoft WebView2 control?

I have the following Javascript script:

async function getIPAddress() {
    var thisFuncName = arguments.callee.toString().match(/function ([^(]+)/)[1];
    var retValue = {
        'Result': true,
        'ResultText': '',
        'Message': '',
        'ScriptFuncName': thisFuncName
    };

    try {
        const response = await fetch('https://api.ipify.org?format=json');
        if (response.ok) {
            const data = await response.json();
            console.log(`=> ${JSON.stringify(data)}`);
            retValue.ResultText = data.ip;
            return retValue;
        } else {
            throw new Error('Failed to fetch data');
        }
    } catch (error) {
        console.error('Error:', error);
        retValue.Message = `Error: ${error}`
        retValue.Result = false;
        return retValue;
    }
}
await getIPAddress();

which works fine when used in MS Edge browser’s DevTools:

Running script in a browser devtools

But when I’m trying to execute this script using MS WebView2 control’s .ExecuteScriptAsync(...) method then I’m getting null, and when I’m trying to execute this script using WebView2.DevTools.Dom‘s EvaluateFunctionAsync(...) method then I’m getting error Evaluation failed: SyntaxError: Unexpected reserved word.

Error: Element type is invalid. Received a promise that resolves to: undefined. Lazy element type must resolve to a class or function

I am trying to create and publish nextjs ui component Hsciifontpicker inside a [npmjs lib : hsciifontlib].
can I use next/font/local=>localFont function in a npmjs library component ?
Hsciifontpicker.jsx(in npmjs library named hsciifont) code :

// hsciifontlib/src/library/Hsciifontpicker.jsx
"use client";
import localFont from "next/font/local";
import React, { useState } from 'react';
import Select from 'react-select';
import options from './options.json';

const Hsciifontpicker= () => {

const binarywenglosoftw8asc = localFont({ src: "./fonts/hscii/englosoftw8/englosoftw8asc/binarywenglosoftw8asc.woff2", display: "swap", });
const heksenglosoftw8asc = localFont({ src: "./fonts/hscii/englosoftw8/englosoftw8asc/heksenglosoftw8asc.woff2", display: "swap", });

const hsciifont_classnames = {
      binarywenglosoftw8asc: binarywenglosoftw8asc.className,
      heksenglosoftw8asc: heksenglosoftw8asc.className,
}

  const [selectedCategory, setSelectedCategory] = useState(null);
  const [selectedItem, setSelectedItem] = useState(null);  
  let currfontcn = "";

  const handleCategoryChange = (selectedOption) => {
    setSelectedCategory(selectedOption);
    setSelectedItem(null); // Reset the second select
    if (selectedOption) { setBodyFont(selectedOption.value); }
  };

  const handleItemChange = (selectedOption) => {
    setSelectedItem(selectedOption);
    if (selectedOption) { setBodyFont(selectedOption.value); }
  };

  const setBodyFont = (selected_hsciifont_name) => {
    document.body.classList.value = document.body.classList.value.replaceAll(/__className_w+s+antialiased/g,"");
    document.body.classList.value = document.body.classList.value.replaceAll(/antialiaseds+__className_w+/g,"");
    currfontcn = hsciifont_classnames[selected_hsciifont_name];
    document.body.classList.add(currfontcn);
    document.body.classList.add("antialiased");
  };
  const itemOptions = selectedCategory ? selectedCategory.children : [];

  return (
    <div style={{ width: 400, marginBottom: 20, color: 'black', backgroundColor: 'white' }} >
      <Select
        options={options}
        onChange={handleCategoryChange}
        value={selectedCategory}
        placeholder="8aiueohcg lxnguAge(bhαsα).select"
      />
      <Select
        options={itemOptions}
        onChange={handleItemChange}
        value={selectedItem}
        placeholder="8aiueohcg font.select"
        isDisabled={!selectedCategory}
      />

    </div>
  );
};

after adding(bun add hsciifontlib) and using this library in another next js app lifp I am getting error as :

Error: Element type is invalid. Received a promise that resolves to: undefined. Lazy element type must resolve to a class or function.

lifp/src/app/page.js code:

// lifp/src/app/page.js file
import { Hsciifontpicker } from "hsciifontlib";
//import { Hsciifontpicker } from "@/components/hscii/hsciifontpicker";
export default function Home() {
  return (
    <div>
      <main>
      <div>
          <Hsciifontpicker/>
        </div>
        <div>
          <textarea rows={12}/>
        </div>
      </main>
    </div>
  );
}

How do I correctly send a signature to verify in Inngest?

I’m getting an “Invalid x-inngest-signature provided” error when I try to send an event to my Inngest server

Here is my server.js

import { config } from "dotenv";
import express from "express";
import { serve } from "inngest/express";
import { inngest } from "./client.js";
import { matchNotify } from "./functions/matchNotify.js";
import crypto from 'crypto';

config();

const app = express();

// Parse JSON and capture raw body for signature verification
app.use(express.json({
    verify: (req, res, buf) => {
        req.rawBody = buf;
    }
}));

// Serve Inngest
app.use("/api/inngest", serve({
    client: inngest,
    functions: [matchNotify],
    verify: {
        getRawBody: (req) => req.rawBody,
    },
}));

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log (`Server running on http://localhost:${PORT}`);
});

and my notif.dart that sends an event

import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'package:crypto/crypto.dart';

import 'package:flutter_dotenv/flutter_dotenv.dart';

String inngestEventKey = dotenv.env['INNGEST_EVENT_KEY'] ?? 'Default Value';

Future<void> sendNotification(
  String userId,
  String matchedId,
) async {
  final event = {
    "name": "match.created",
    "data": {"matchedUserId": userId, "matchingUserId": matchedId},
  };

  final jsonBody = jsonEncode(event);

  final keyBytes = utf8.encode(inngestEventKey);
  final bodyBytes = utf8.encode(jsonBody);
  final hmacSha256 = Hmac(sha256, keyBytes);
  final digest = hmacSha256.convert(bodyBytes);
  final signature = digest.toString().toLowerCase(); // hex output

  final response = await http.post(
    Uri.parse(
        'https://cryptic-depths-95477-ba7e4f659ba0.herokuapp.com/api/inngest'),
    headers: {
      'Content-Type': 'application/json',
      'x-inngest-signature': signature, // Sending the signature here
    },
    body: jsonBody,
  );

  if (response.statusCode == 202 || response.statusCode == 200) {
    if (kDebugMode) {
      print("Event sent successfully");
    }
  } else {
    if (kDebugMode) {
      print("Failed to send event: ${response.body}");
    }
  }
}

I’ve compared the output of signature on both sides and they matched, I’ve compared the event_key and signing_key and both are correct on both sides, I’ve tried debugging with ChatGPT and not found the solution

Sentry Logger [warn]: Discarded session because of missing or non-string release

As per the Sentry setup guide for a React FE project

Sentry setup guide in React

import * as Sentry from "@sentry/react";

Sentry.init({
  dsn: "SOME_SENTRY_DNS",
  // Setting this option to true will send default PII data to Sentry.
  // For example, automatic IP address collection on events
  sendDefaultPii: true
});

const container = document.getElementById(“app”);
const root = createRoot(container);
root.render(<App />);

I’ve adjusted that to

const SENTRY_DSN = process.env.REACT_APP_SENTRY_DSN;
const SENTRY_ENV = process.env.REACT_APP_SENTRY_ENVIRONMENT || "development";

Sentry.init({
  dsn: SENTRY_DSN,
  environment: SENTRY_ENV,
  sendDefaultPii: true,
  debug: true,
  autoSessionTracking: false,
  beforeSend(event) {
    console.log("Sentry about to send event:", event);
    return event;
  },
});

but still keep getting

Sentry Logger [warn]: Discarded session because of missing or non-string release

enter image description here

APEX Interactive Grid data not being captured by JavaScript function

I’m having trouble capturing data from multiple Interactive Grids in Oracle APEX Oracle APEX 24.2.3 using JavaScript. When I try to save the data, I’m getting undefined values for all records.

Here’s my current JavaScript code:

function getIGData(staticId) {
    console.log('Getting data for region:', staticId);
    var region = apex.region(staticId);
    if (!region) {
        console.error('Region not found:', staticId);
        return [];
    }
    
    var grid = region.widget();
    if (!grid) {
        console.error('Grid widget not found for region:', staticId);
        return [];
    }
    
    var view = grid.interactiveGrid("getViews").grid;
    var model = view.model;
    var records = [];

    model.forEach(function(record) {
        var r = record;
        console.log('Raw record data:', r);
        
        var recordData = {
            QUESTION: r.QUESTION,
            RESPONSE: r.RESPONSE || r["INITIAL ANSWER"],
            COMMENTS: r.COMMENTS,
            ACTUAL_ANSWER: r.ACTUAL_ANSWER,
            FORECAST_ANSWER: r.FORECAST_ANSWER,
            SUBQUESTION_ANSWER: r.SUBQUESTION_ANSWER
        };

        console.log('Processed record data:', recordData);
        
        if (recordData.QUESTION && recordData.RESPONSE) {
            records.push(recordData);
        }
    });

    console.log('Data from ' + staticId + ':', JSON.stringify(records));
    return records;
}

function saveAllResponses() {
    console.log('saveAllResponses function called');
    var allData = [];
    var regionIds = ["region-question-1", "region-question-2", "region-question-3", "region-question-4", "region-question-5"];
    
    regionIds.forEach(function(regionId) {
        var data = getIGData(regionId);
        console.log('Data from ' + regionId + ':', data);
        allData = allData.concat(data);
    });

    console.log('All data:', JSON.stringify(allData));
    console.log('P22_ID_RISK:', $v("P22_ID_RISK"));
    console.log('P22_SUPPLIER:', $v("P22_SUPPLIER"));
    console.log('P22_SUBTYPE:', $v("P22_SUBTYPE"));
    console.log('P22_EVALUATOR:', $v("P22_EVALUATOR"));
    console.log('P22_SUPPLIER_ID:', $v("P22_SUPPLIER_ID"));

    if (allData.length > 0) {
        apex.server.process(
            "SAVE_ALL_RESPONSES",
            {
                x01: JSON.stringify(allData),
                p_id_risk: $v("P22_ID_RISK"),
                p_supplier: $v("P22_SUPPLIER"),
                p_subtype: $v("P22_SUBTYPE"),
                p_evaluator: $v("P22_EVALUATOR"),
                p_supplier_id: $v("P22_SUPPLIER_ID")
            },
            {
                success: function(pData) {
                    console.log('Server response:', pData);
                    if (pData && pData.success) {
                        apex.message.showPageSuccess(pData.message);
                    } else {
                        apex.message.showErrors([{
                            type: "error",
                            location: ["page"],
                            message: pData && pData.message ? pData.message : "Unknown error occurred",
                            unsafe: false
                        }]);
                    }
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    console.error("AJAX error:", textStatus, errorThrown);
                    console.log("Response Text:", jqXHR.responseText);
                    apex.message.showErrors([{
                        type: "error",
                        location: ["page"],
                        message: "Error saving responses: " + errorThrown,
                        unsafe: false
                    }]);
                },
                dataType: "json"
            }
        );
    } else {
        console.log("No data to save");
        apex.message.showErrors([{
            type: "error",
            location: ["page"],
            message: "No data to save. Please ensure at least one question is answered.",
            unsafe: false
        }]);
    }
}

Also I have an Application Process called SAVE_ALL_RESPONSES

DECLARE
    l_data CLOB := wwv_flow.g_x01;
    l_id_risk NUMBER := :P22_ID_RISK;
    l_supplier VARCHAR2(100) := :P22_SUPPLIER;
    l_subtype VARCHAR2(100) := :P22_SUBTYPE;
    l_evaluator VARCHAR2(100) := :P22_EVALUATOR;
    l_supplier_id NUMBER := :P22_SUPPLIER_ID;
    l_success BOOLEAN := TRUE;
    l_message VARCHAR2(4000) := 'Responses saved successfully.';
    l_rows_updated NUMBER := 0;
BEGIN
    apex_debug.message('Received data: ' || l_data);

    IF l_data IS NULL OR l_data = '[]' THEN
        l_success := FALSE;
        l_message := 'No data received from the frontend.';
    ELSE
        APEX_JSON.PARSE(l_data);
        
        FOR i IN 1..APEX_JSON.GET_COUNT(p_path => '.') LOOP
            DECLARE
                l_question VARCHAR2(4000) := APEX_JSON.GET_VARCHAR2(p_path => '[%d].QUESTION', p0 => i);
                l_answer VARCHAR2(4000) := APEX_JSON.GET_VARCHAR2(p_path => '[%d].ANSWER', p0 => i);
            BEGIN
                UPDATE RMA_USER_EVALUATIONS
                SET ANSWER = l_answer
                WHERE ID_RISK = l_id_risk
                AND SUPPLIER = l_supplier
                AND SUBTYPE = l_subtype
                AND QUESTION = l_question;

                IF SQL%ROWCOUNT = 0 THEN
                    -- If no row was updated, it means the row doesn't exist, so we insert it
                    INSERT INTO RMA_USER_EVALUATIONS (
                        ID_RISK, SUPPLIER, SUBTYPE, QUESTION, ANSWER, 
                        EVALUATOR, SUPPLIER_ID
                    ) VALUES (
                        l_id_risk, l_supplier, l_subtype, l_question, l_answer,
                        l_evaluator, l_supplier_id
                    );
                END IF;

                l_rows_updated := l_rows_updated + 1;
            EXCEPTION
                WHEN OTHERS THEN
                    l_success := FALSE;
                    l_message := 'Error saving response for question ' || l_question || ': ' || SQLERRM;
                    apex_debug.error(l_message);
                    EXIT;
            END;
        END LOOP;

        IF l_success THEN
            COMMIT;
            l_message := l_message || ' (' || l_rows_updated || ' rows updated/inserted)';
        ELSE
            ROLLBACK;
        END IF;
    END IF;

    APEX_JSON.OPEN_OBJECT;
    APEX_JSON.WRITE('success', l_success);
    APEX_JSON.WRITE('message', l_message);
    APEX_JSON.CLOSE_OBJECT;
EXCEPTION
    WHEN OTHERS THEN
        apex_debug.error('Unexpected error: ' || SQLERRM);
        APEX_JSON.OPEN_OBJECT;
        APEX_JSON.WRITE('success', FALSE);
        APEX_JSON.WRITE('message', 'Unexpected error: ' || SQLERRM);
        APEX_JSON.CLOSE_OBJECT;
END;

My setup:

  • I have 5 Interactive Grids on my page, with IDs: region-question-1, region-question-2, region-question-3, region-question-4, region-question-5
  • Each grid has columns: QUESTION, RESPONSE (or INITIAL ANSWER), COMMENTS, ACTUAL_ANSWER, FORECAST_ANSWER, SUBQUESTION_ANSWER
  • I’m using a Dynamic Action on a button click to trigger the save function

Expected behavior:
The function should collect data from all grids and send it to the server for processing.

Actual behavior:
The function is not capturing any data from the grids. All record data is coming back as undefined.

So the region 1 should insert the answers in the rows where the question 1 in the table is:

ID_RISK SUBTYPE QUESTION ANSWER COMMENTS SUPPLIER ID SUPPLIER_ID IMPACT ACTUAL_ANSWER FORECAST_ANSWER IMPACT_ACTUAL IMPACT_FORECAST COMMENT_WHEN_CLOSED USER_CLOSED SUBQUESTION_ANSWER ADDITIONAL_INPUT
643 Tropical Storm / Hurricane 1. Impact on operations/production GG Cables and Wires Mexico 881 22352710
643 Tropical Storm / Hurricane 2. Impact on deliveries for BMW GG Cables and Wires Mexico 882 22352710
643 Tropical Storm / Hurricane 3. Status for infrastructure or equipment compromised GG Cables and Wires Mexico 883 22352710
643 Tropical Storm / Hurricane 4. Effective countermeasures are in place to mitigate the risk GG Cables and Wires Mexico 884 22352710
643 Tropical Storm / Hurricane 5. Estimated time for restoration of operations GG Cables and Wires Mexico 885 22352710

So if the user answer like this:example of answer

at the end the table in the DB should look like enter image description here

Nextjs 15 tailwind PWA: env(safe-area-inset-*) not working

I am trying to add padding to the bottom of my pwa to prevent items going behind the phone navigation. I have tried different solutions from others (custom css, adding a custom plugin to tailwind.config.css, etc…) but its not working. when i do “npm run dev” the padding is applied at the bottom. but when i make a change and save my code, the padding is gone. it also does not show up running “npm run build;npm run start”

tailwind.config.ts:

...snip...
theme: {
    data: {
      checked: 'ui~="checked"',
    },
    padding: { safe: "env(safe-area-inset-bottom)" },
    extend: {
      colors: {
...snip...

layout.tsx:

...snip...
    <html lang="en">
      <head>
        <meta charSet="utf-8" />
        <meta
          name="viewport"
          content="width=device-width, initial-scale=1, user-scalable=0, viewport-fit=cover"
        />
        <link rel="apple-touch-icon" href="/images/icon-192.png" />
        <link href="/images/icon-192.png" rel="icon" sizes="192x192" />
        <link href="/images/icon-512.png" rel="icon" sizes="512x512" />
        <link rel="manifest" href="/manifest.json" />
      </head>
      <body className="bg-gray-100 pb-safe">
        {/* <div className="flex flex-col "> */}
        <div className="h-96 bg-black"></div>
        <div className="h-96 bg-black"></div>
        <div className="h-96 bg-black"></div>
        <div className="h-96 bg-black"></div>
        {/* </div> */}
      </body>
    </html>
...snip...