This commit is contained in:
2026-03-02 16:00:49 +07:00
parent 32af5f6e7f
commit ce23aedcff
35 changed files with 394 additions and 3000 deletions
+32
View File
@@ -0,0 +1,32 @@
# Dependencies
node_modules/
# Production build
build/
dist/
# Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Environment variables
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# IDE configurations
.vscode/
.idea/
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# OS files
.DS_Store
Thumbs.db
+2 -1
View File
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">
-603
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="manifest" href="manifest.json" /> <link rel="manifest" href="manifest.json" />
<title>Agro Monev</title> <title>Agro Monev</title>
<script type="module" crossorigin src="./assets/index-yYrlP9ZJ.js"></script> <script type="module" crossorigin src="./assets/index-DrAa0Ust.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-Bzz_IyVK.css"> <link rel="stylesheet" crossorigin href="./assets/index-Bzz_IyVK.css">
</head> </head>
<body> <body>
+4 -4
View File
@@ -6,20 +6,20 @@ import {
Portal, Portal,
hideOthers, hideOthers,
useFocusGuards useFocusGuards
} from "./chunk-6UYCW752.js"; } from "./chunk-WIKMTAHT.js";
import { import {
Presence Presence
} from "./chunk-YEHADEKF.js"; } from "./chunk-H4FEHRTE.js";
import { import {
useId useId
} from "./chunk-HJJKWFHH.js"; } from "./chunk-DR23R4HS.js";
import { import {
Primitive, Primitive,
composeEventHandlers, composeEventHandlers,
createContext2, createContext2,
createContextScope, createContextScope,
useControllableState useControllableState
} from "./chunk-HTKU3RA7.js"; } from "./chunk-CD6XDNKE.js";
import { import {
composeRefs, composeRefs,
useComposedRefs useComposedRefs
+11 -11
View File
@@ -1,12 +1,4 @@
"use client"; "use client";
import {
createCollection,
useDirection
} from "./chunk-Z5TL6HO7.js";
import {
usePrevious,
useSize
} from "./chunk-7EWB5V5P.js";
import { import {
Combination_default, Combination_default,
DismissableLayer, DismissableLayer,
@@ -14,18 +6,26 @@ import {
Portal, Portal,
hideOthers, hideOthers,
useFocusGuards useFocusGuards
} from "./chunk-6UYCW752.js"; } from "./chunk-WIKMTAHT.js";
import {
usePrevious,
useSize
} from "./chunk-BSEPHKUN.js";
import {
createCollection,
useDirection
} from "./chunk-AW4DWX7J.js";
import { import {
useCallbackRef, useCallbackRef,
useId useId
} from "./chunk-HJJKWFHH.js"; } from "./chunk-DR23R4HS.js";
import { import {
Primitive, Primitive,
composeEventHandlers, composeEventHandlers,
createContextScope, createContextScope,
useControllableState, useControllableState,
useLayoutEffect2 useLayoutEffect2
} from "./chunk-HTKU3RA7.js"; } from "./chunk-CD6XDNKE.js";
import { import {
composeRefs, composeRefs,
useComposedRefs useComposedRefs
+2 -2
View File
@@ -2,13 +2,13 @@
import { import {
usePrevious, usePrevious,
useSize useSize
} from "./chunk-7EWB5V5P.js"; } from "./chunk-BSEPHKUN.js";
import { import {
Primitive, Primitive,
composeEventHandlers, composeEventHandlers,
createContextScope, createContextScope,
useControllableState useControllableState
} from "./chunk-HTKU3RA7.js"; } from "./chunk-CD6XDNKE.js";
import { import {
useComposedRefs useComposedRefs
} from "./chunk-JDYSANEB.js"; } from "./chunk-JDYSANEB.js";
+6 -6
View File
@@ -1,21 +1,21 @@
"use client"; "use client";
import {
Presence
} from "./chunk-H4FEHRTE.js";
import { import {
createCollection, createCollection,
useDirection useDirection
} from "./chunk-Z5TL6HO7.js"; } from "./chunk-AW4DWX7J.js";
import {
Presence
} from "./chunk-YEHADEKF.js";
import { import {
useCallbackRef, useCallbackRef,
useId useId
} from "./chunk-HJJKWFHH.js"; } from "./chunk-DR23R4HS.js";
import { import {
Primitive, Primitive,
composeEventHandlers, composeEventHandlers,
createContextScope, createContextScope,
useControllableState useControllableState
} from "./chunk-HTKU3RA7.js"; } from "./chunk-CD6XDNKE.js";
import { import {
useComposedRefs useComposedRefs
} from "./chunk-JDYSANEB.js"; } from "./chunk-JDYSANEB.js";
+161 -149
View File
@@ -1,215 +1,224 @@
{ {
"hash": "0f3868e6", "hash": "1f9be60d",
"configHash": "cd26d671", "configHash": "31506afd",
"lockfileHash": "b353e952", "lockfileHash": "027a3aef",
"browserHash": "1524d4e3", "browserHash": "09026e62",
"optimized": { "optimized": {
"react": { "react": {
"src": "../../react/index.js", "src": "../../react/index.js",
"file": "react.js", "file": "react.js",
"fileHash": "70ea0e20", "fileHash": "fb8f4549",
"needsInterop": true "needsInterop": true
}, },
"react-dom": { "react-dom": {
"src": "../../react-dom/index.js", "src": "../../react-dom/index.js",
"file": "react-dom.js", "file": "react-dom.js",
"fileHash": "75336cb8", "fileHash": "d8889d21",
"needsInterop": true "needsInterop": true
}, },
"react/jsx-dev-runtime": { "react/jsx-dev-runtime": {
"src": "../../react/jsx-dev-runtime.js", "src": "../../react/jsx-dev-runtime.js",
"file": "react_jsx-dev-runtime.js", "file": "react_jsx-dev-runtime.js",
"fileHash": "df15e2ea", "fileHash": "be308676",
"needsInterop": true "needsInterop": true
}, },
"react/jsx-runtime": { "react/jsx-runtime": {
"src": "../../react/jsx-runtime.js", "src": "../../react/jsx-runtime.js",
"file": "react_jsx-runtime.js", "file": "react_jsx-runtime.js",
"fileHash": "03e768df", "fileHash": "1b437650",
"needsInterop": true "needsInterop": true
}, },
"@base44/sdk": {
"src": "../../@base44/sdk/dist/index.js",
"file": "@base44_sdk.js",
"fileHash": "abaacb92",
"needsInterop": false
},
"@base44/sdk/dist/utils/axios-client": {
"src": "../../@base44/sdk/dist/utils/axios-client.js",
"file": "@base44_sdk_dist_utils_axios-client.js",
"fileHash": "51b092e9",
"needsInterop": false
},
"@radix-ui/react-dialog": {
"src": "../../@radix-ui/react-dialog/dist/index.mjs",
"file": "@radix-ui_react-dialog.js",
"fileHash": "9e879ff8",
"needsInterop": false
},
"@radix-ui/react-label": {
"src": "../../@radix-ui/react-label/dist/index.mjs",
"file": "@radix-ui_react-label.js",
"fileHash": "9077f253",
"needsInterop": false
},
"@radix-ui/react-progress": {
"src": "../../@radix-ui/react-progress/dist/index.mjs",
"file": "@radix-ui_react-progress.js",
"fileHash": "46eff1e0",
"needsInterop": false
},
"@radix-ui/react-select": {
"src": "../../@radix-ui/react-select/dist/index.mjs",
"file": "@radix-ui_react-select.js",
"fileHash": "51e1c5df",
"needsInterop": false
},
"@radix-ui/react-slot": {
"src": "../../@radix-ui/react-slot/dist/index.mjs",
"file": "@radix-ui_react-slot.js",
"fileHash": "8df52186",
"needsInterop": false
},
"@radix-ui/react-switch": {
"src": "../../@radix-ui/react-switch/dist/index.mjs",
"file": "@radix-ui_react-switch.js",
"fileHash": "35a95945",
"needsInterop": false
},
"@radix-ui/react-tabs": {
"src": "../../@radix-ui/react-tabs/dist/index.mjs",
"file": "@radix-ui_react-tabs.js",
"fileHash": "16a82ff8",
"needsInterop": false
},
"@tanstack/react-query": {
"src": "../../@tanstack/react-query/build/modern/index.js",
"file": "@tanstack_react-query.js",
"fileHash": "0e4da0a0",
"needsInterop": false
},
"class-variance-authority": {
"src": "../../class-variance-authority/dist/index.mjs",
"file": "class-variance-authority.js",
"fileHash": "10c0c62c",
"needsInterop": false
},
"clsx": {
"src": "../../clsx/dist/clsx.mjs",
"file": "clsx.js",
"fileHash": "64f5986f",
"needsInterop": false
},
"date-fns": {
"src": "../../date-fns/index.mjs",
"file": "date-fns.js",
"fileHash": "ebf4831e",
"needsInterop": false
},
"date-fns/locale": {
"src": "../../date-fns/locale.mjs",
"file": "date-fns_locale.js",
"fileHash": "40e30606",
"needsInterop": false
},
"framer-motion": {
"src": "../../framer-motion/dist/es/index.mjs",
"file": "framer-motion.js",
"fileHash": "ae6b1866",
"needsInterop": false
},
"leaflet": {
"src": "../../leaflet/dist/leaflet-src.js",
"file": "leaflet.js",
"fileHash": "b88da861",
"needsInterop": true
},
"lucide-react": {
"src": "../../lucide-react/dist/esm/lucide-react.js",
"file": "lucide-react.js",
"fileHash": "c5857819",
"needsInterop": false
},
"react-dom/client": { "react-dom/client": {
"src": "../../react-dom/client.js", "src": "../../react-dom/client.js",
"file": "react-dom_client.js", "file": "react-dom_client.js",
"fileHash": "7cc04734", "fileHash": "0b32c5fb",
"needsInterop": true "needsInterop": true
}, },
"react-leaflet": { "@tanstack/react-query": {
"src": "../../react-leaflet/lib/index.js", "src": "../../@tanstack/react-query/build/modern/index.js",
"file": "react-leaflet.js", "file": "@tanstack_react-query.js",
"fileHash": "cc93aa75", "fileHash": "c3cae4c6",
"needsInterop": false "needsInterop": false
}, },
"react-router-dom": { "react-router-dom": {
"src": "../../react-router-dom/dist/index.js", "src": "../../react-router-dom/dist/index.js",
"file": "react-router-dom.js", "file": "react-router-dom.js",
"fileHash": "017bf93b", "fileHash": "1d0dc616",
"needsInterop": false "needsInterop": false
}, },
"recharts": { "lucide-react": {
"src": "../../recharts/es6/index.js", "src": "../../lucide-react/dist/esm/lucide-react.js",
"file": "recharts.js", "file": "lucide-react.js",
"fileHash": "b53e6a83", "fileHash": "20d46397",
"needsInterop": false
},
"framer-motion": {
"src": "../../framer-motion/dist/es/index.mjs",
"file": "framer-motion.js",
"fileHash": "f806cb8e",
"needsInterop": false "needsInterop": false
}, },
"sonner": { "sonner": {
"src": "../../sonner/dist/index.mjs", "src": "../../sonner/dist/index.mjs",
"file": "sonner.js", "file": "sonner.js",
"fileHash": "0bfcc1a8", "fileHash": "72f81728",
"needsInterop": false
},
"date-fns/locale": {
"src": "../../date-fns/locale.mjs",
"file": "date-fns_locale.js",
"fileHash": "961f2940",
"needsInterop": false
},
"date-fns": {
"src": "../../date-fns/index.mjs",
"file": "date-fns.js",
"fileHash": "b86dabaa",
"needsInterop": false
},
"recharts": {
"src": "../../recharts/es6/index.js",
"file": "recharts.js",
"fileHash": "b0bd2148",
"needsInterop": false
},
"@base44/sdk/dist/utils/axios-client": {
"src": "../../@base44/sdk/dist/utils/axios-client.js",
"file": "@base44_sdk_dist_utils_axios-client.js",
"fileHash": "b85066c3",
"needsInterop": false
},
"@base44/sdk": {
"src": "../../@base44/sdk/dist/index.js",
"file": "@base44_sdk.js",
"fileHash": "81b96f45",
"needsInterop": false "needsInterop": false
}, },
"sql.js": { "sql.js": {
"src": "../../sql.js/dist/sql-wasm-browser.js", "src": "../../sql.js/dist/sql-wasm-browser.js",
"file": "sql__js.js", "file": "sql__js.js",
"fileHash": "d967612e", "fileHash": "22971ff8",
"needsInterop": true "needsInterop": true
}, },
"clsx": {
"src": "../../clsx/dist/clsx.mjs",
"file": "clsx.js",
"fileHash": "fd82d21e",
"needsInterop": false
},
"tailwind-merge": { "tailwind-merge": {
"src": "../../tailwind-merge/dist/bundle-mjs.mjs", "src": "../../tailwind-merge/dist/bundle-mjs.mjs",
"file": "tailwind-merge.js", "file": "tailwind-merge.js",
"fileHash": "8e2e1d8d", "fileHash": "50e69157",
"needsInterop": false "needsInterop": false
},
"@radix-ui/react-slot": {
"src": "../../@radix-ui/react-slot/dist/index.mjs",
"file": "@radix-ui_react-slot.js",
"fileHash": "d93f2953",
"needsInterop": false
},
"class-variance-authority": {
"src": "../../class-variance-authority/dist/index.mjs",
"file": "class-variance-authority.js",
"fileHash": "a4a77514",
"needsInterop": false
},
"@radix-ui/react-select": {
"src": "../../@radix-ui/react-select/dist/index.mjs",
"file": "@radix-ui_react-select.js",
"fileHash": "657bcaa3",
"needsInterop": false
},
"@radix-ui/react-tabs": {
"src": "../../@radix-ui/react-tabs/dist/index.mjs",
"file": "@radix-ui_react-tabs.js",
"fileHash": "ee9985b3",
"needsInterop": false
},
"@radix-ui/react-label": {
"src": "../../@radix-ui/react-label/dist/index.mjs",
"file": "@radix-ui_react-label.js",
"fileHash": "88e18468",
"needsInterop": false
},
"react-leaflet": {
"src": "../../react-leaflet/lib/index.js",
"file": "react-leaflet.js",
"fileHash": "f925c49b",
"needsInterop": false
},
"leaflet": {
"src": "../../leaflet/dist/leaflet-src.js",
"file": "leaflet.js",
"fileHash": "e294f8c6",
"needsInterop": true
},
"@radix-ui/react-dialog": {
"src": "../../@radix-ui/react-dialog/dist/index.mjs",
"file": "@radix-ui_react-dialog.js",
"fileHash": "00e3c21e",
"needsInterop": false
},
"@radix-ui/react-switch": {
"src": "../../@radix-ui/react-switch/dist/index.mjs",
"file": "@radix-ui_react-switch.js",
"fileHash": "7d2e4b39",
"needsInterop": false
},
"@radix-ui/react-progress": {
"src": "../../@radix-ui/react-progress/dist/index.mjs",
"file": "@radix-ui_react-progress.js",
"fileHash": "d818f0a0",
"needsInterop": false
},
"dexie": {
"src": "../../dexie/import-wrapper.mjs",
"file": "dexie.js",
"fileHash": "df50a9c9",
"needsInterop": false
},
"lodash": {
"src": "../../lodash/lodash.js",
"file": "lodash.js",
"fileHash": "856214fa",
"needsInterop": true
} }
}, },
"chunks": { "chunks": {
"chunk-A55GUTZU": { "chunk-GTF7DNNX": {
"file": "chunk-A55GUTZU.js" "file": "chunk-GTF7DNNX.js"
},
"chunk-WIKMTAHT": {
"file": "chunk-WIKMTAHT.js"
},
"chunk-BSEPHKUN": {
"file": "chunk-BSEPHKUN.js"
},
"chunk-H4FEHRTE": {
"file": "chunk-H4FEHRTE.js"
},
"chunk-AW4DWX7J": {
"file": "chunk-AW4DWX7J.js"
},
"chunk-DR23R4HS": {
"file": "chunk-DR23R4HS.js"
},
"chunk-CD6XDNKE": {
"file": "chunk-CD6XDNKE.js"
},
"chunk-JDYSANEB": {
"file": "chunk-JDYSANEB.js"
}, },
"chunk-A73536KP": { "chunk-A73536KP": {
"file": "chunk-A73536KP.js" "file": "chunk-A73536KP.js"
}, },
"chunk-Z5TL6HO7": {
"file": "chunk-Z5TL6HO7.js"
},
"chunk-7EWB5V5P": {
"file": "chunk-7EWB5V5P.js"
},
"chunk-U7P2NEEE": { "chunk-U7P2NEEE": {
"file": "chunk-U7P2NEEE.js" "file": "chunk-U7P2NEEE.js"
}, },
"chunk-CJARZ5TB": { "chunk-CJARZ5TB": {
"file": "chunk-CJARZ5TB.js" "file": "chunk-CJARZ5TB.js"
}, },
"chunk-GTF7DNNX": {
"file": "chunk-GTF7DNNX.js"
},
"chunk-6UYCW752": {
"file": "chunk-6UYCW752.js"
},
"chunk-YEHADEKF": {
"file": "chunk-YEHADEKF.js"
},
"chunk-HJJKWFHH": {
"file": "chunk-HJJKWFHH.js"
},
"chunk-HTKU3RA7": {
"file": "chunk-HTKU3RA7.js"
},
"chunk-JDYSANEB": {
"file": "chunk-JDYSANEB.js"
},
"chunk-SXRIVT2P": { "chunk-SXRIVT2P": {
"file": "chunk-SXRIVT2P.js" "file": "chunk-SXRIVT2P.js"
}, },
@@ -219,6 +228,9 @@
"chunk-QCHXOAYK": { "chunk-QCHXOAYK": {
"file": "chunk-QCHXOAYK.js" "file": "chunk-QCHXOAYK.js"
}, },
"chunk-A55GUTZU": {
"file": "chunk-A55GUTZU.js"
},
"chunk-WOOG5QLI": { "chunk-WOOG5QLI": {
"file": "chunk-WOOG5QLI.js" "file": "chunk-WOOG5QLI.js"
} }
-1356
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
-65
View File
@@ -1,65 +0,0 @@
import {
useLayoutEffect2
} from "./chunk-HTKU3RA7.js";
import {
require_react
} from "./chunk-QCHXOAYK.js";
import {
__toESM
} from "./chunk-WOOG5QLI.js";
// node_modules/@radix-ui/react-use-size/dist/index.mjs
var React = __toESM(require_react(), 1);
function useSize(element) {
const [size, setSize] = React.useState(void 0);
useLayoutEffect2(() => {
if (element) {
setSize({ width: element.offsetWidth, height: element.offsetHeight });
const resizeObserver = new ResizeObserver((entries) => {
if (!Array.isArray(entries)) {
return;
}
if (!entries.length) {
return;
}
const entry = entries[0];
let width;
let height;
if ("borderBoxSize" in entry) {
const borderSizeEntry = entry["borderBoxSize"];
const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;
width = borderSize["inlineSize"];
height = borderSize["blockSize"];
} else {
width = element.offsetWidth;
height = element.offsetHeight;
}
setSize({ width, height });
});
resizeObserver.observe(element, { box: "border-box" });
return () => resizeObserver.unobserve(element);
} else {
setSize(void 0);
}
}, [element]);
return size;
}
// node_modules/@radix-ui/react-use-previous/dist/index.mjs
var React2 = __toESM(require_react(), 1);
function usePrevious(value) {
const ref = React2.useRef({ value, previous: value });
return React2.useMemo(() => {
if (ref.current.value !== value) {
ref.current.previous = ref.current.value;
ref.current.value = value;
}
return ref.current.previous;
}, [value]);
}
export {
useSize,
usePrevious
};
//# sourceMappingURL=chunk-7EWB5V5P.js.map
-7
View File
@@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@radix-ui/react-use-size/src/use-size.tsx", "../../@radix-ui/react-use-previous/src/use-previous.tsx"],
"sourcesContent": ["/// <reference types=\"resize-observer-browser\" />\n\nimport * as React from 'react';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\n\nfunction useSize(element: HTMLElement | null) {\n const [size, setSize] = React.useState<{ width: number; height: number } | undefined>(undefined);\n\n useLayoutEffect(() => {\n if (element) {\n // provide size as early as possible\n setSize({ width: element.offsetWidth, height: element.offsetHeight });\n\n const resizeObserver = new ResizeObserver((entries) => {\n if (!Array.isArray(entries)) {\n return;\n }\n\n // Since we only observe the one element, we don't need to loop over the\n // array\n if (!entries.length) {\n return;\n }\n\n const entry = entries[0];\n let width: number;\n let height: number;\n\n if ('borderBoxSize' in entry) {\n const borderSizeEntry = entry['borderBoxSize'];\n // iron out differences between browsers\n const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;\n width = borderSize['inlineSize'];\n height = borderSize['blockSize'];\n } else {\n // for browsers that don't support `borderBoxSize`\n // we calculate it ourselves to get the correct border box.\n width = element.offsetWidth;\n height = element.offsetHeight;\n }\n\n setSize({ width, height });\n });\n\n resizeObserver.observe(element, { box: 'border-box' });\n\n return () => resizeObserver.unobserve(element);\n } else {\n // We only want to reset to `undefined` when the element becomes `null`,\n // not if it changes to another element.\n setSize(undefined);\n }\n }, [element]);\n\n return size;\n}\n\nexport { useSize };\n", "import * as React from 'react';\n\nfunction usePrevious<T>(value: T) {\n const ref = React.useRef({ value, previous: value });\n\n // We compare values before making an update to ensure that\n // a change has been made. This ensures the previous value is\n // persisted correctly between renders.\n return React.useMemo(() => {\n if (ref.current.value !== value) {\n ref.current.previous = ref.current.value;\n ref.current.value = value;\n }\n return ref.current.previous;\n }, [value]);\n}\n\nexport { usePrevious };\n"],
"mappings": ";;;;;;;;;;;AAEA,YAAuB;AAGvB,SAAS,QAAQ,SAA6B;AAC5C,QAAM,CAAC,MAAM,OAAO,IAAU,eAAwD,MAAS;AAE/F,mBAAgB,MAAM;AACpB,QAAI,SAAS;AAEX,cAAQ,EAAE,OAAO,QAAQ,aAAa,QAAQ,QAAQ,aAAa,CAAC;AAEpE,YAAM,iBAAiB,IAAI,eAAe,CAAC,YAAY;AACrD,YAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B;QACF;AAIA,YAAI,CAAC,QAAQ,QAAQ;AACnB;QACF;AAEA,cAAM,QAAQ,QAAQ,CAAC;AACvB,YAAI;AACJ,YAAI;AAEJ,YAAI,mBAAmB,OAAO;AAC5B,gBAAM,kBAAkB,MAAM,eAAe;AAE7C,gBAAM,aAAa,MAAM,QAAQ,eAAe,IAAI,gBAAgB,CAAC,IAAI;AACzE,kBAAQ,WAAW,YAAY;AAC/B,mBAAS,WAAW,WAAW;QACjC,OAAO;AAGL,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;QACnB;AAEA,gBAAQ,EAAE,OAAO,OAAO,CAAC;MAC3B,CAAC;AAED,qBAAe,QAAQ,SAAS,EAAE,KAAK,aAAa,CAAC;AAErD,aAAO,MAAM,eAAe,UAAU,OAAO;IAC/C,OAAO;AAGL,cAAQ,MAAS;IACnB;EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO;AACT;;;ACvDA,IAAAA,SAAuB;AAEvB,SAAS,YAAe,OAAU;AAChC,QAAM,MAAY,cAAO,EAAE,OAAO,UAAU,MAAM,CAAC;AAKnD,SAAa,eAAQ,MAAM;AACzB,QAAI,IAAI,QAAQ,UAAU,OAAO;AAC/B,UAAI,QAAQ,WAAW,IAAI,QAAQ;AACnC,UAAI,QAAQ,QAAQ;IACtB;AACA,WAAO,IAAI,QAAQ;EACrB,GAAG,CAAC,KAAK,CAAC;AACZ;",
"names": ["React"]
}
-40
View File
@@ -1,40 +0,0 @@
import {
useLayoutEffect2
} from "./chunk-HTKU3RA7.js";
import {
require_react
} from "./chunk-QCHXOAYK.js";
import {
__toESM
} from "./chunk-WOOG5QLI.js";
// node_modules/@radix-ui/react-id/dist/index.mjs
var React = __toESM(require_react(), 1);
var useReactId = React[" useId ".trim().toString()] || (() => void 0);
var count = 0;
function useId(deterministicId) {
const [id, setId] = React.useState(useReactId());
useLayoutEffect2(() => {
if (!deterministicId) setId((reactId) => reactId ?? String(count++));
}, [deterministicId]);
return deterministicId || (id ? `radix-${id}` : "");
}
// node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs
var React2 = __toESM(require_react(), 1);
function useCallbackRef(callback) {
const callbackRef = React2.useRef(callback);
React2.useEffect(() => {
callbackRef.current = callback;
});
return React2.useMemo(() => (...args) => {
var _a;
return (_a = callbackRef.current) == null ? void 0 : _a.call(callbackRef, ...args);
}, []);
}
export {
useId,
useCallbackRef
};
//# sourceMappingURL=chunk-HJJKWFHH.js.map
-7
View File
@@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@radix-ui/react-id/src/id.tsx", "../../@radix-ui/react-use-callback-ref/src/use-callback-ref.tsx"],
"sourcesContent": ["import * as React from 'react';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\n\n// We spaces with `.trim().toString()` to prevent bundlers from trying to `import { useId } from 'react';`\nconst useReactId = (React as any)[' useId '.trim().toString()] || (() => undefined);\nlet count = 0;\n\nfunction useId(deterministicId?: string): string {\n const [id, setId] = React.useState<string | undefined>(useReactId());\n // React versions older than 18 will have client-side ids only.\n useLayoutEffect(() => {\n if (!deterministicId) setId((reactId) => reactId ?? String(count++));\n }, [deterministicId]);\n return deterministicId || (id ? `radix-${id}` : '');\n}\n\nexport { useId };\n", "import * as React from 'react';\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: any[]) => any>(callback: T | undefined): T {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []);\n}\n\nexport { useCallbackRef };\n"],
"mappings": ";;;;;;;;;;;AAAA,YAAuB;AAIvB,IAAM,aAAc,MAAc,UAAU,KAAK,EAAE,SAAS,CAAC,MAAM,MAAM;AACzE,IAAI,QAAQ;AAEZ,SAAS,MAAM,iBAAkC;AAC/C,QAAM,CAAC,IAAI,KAAK,IAAU,eAA6B,WAAW,CAAC;AAEnE,mBAAgB,MAAM;AACpB,QAAI,CAAC,gBAAiB,OAAM,CAAC,YAAY,WAAW,OAAO,OAAO,CAAC;EACrE,GAAG,CAAC,eAAe,CAAC;AACpB,SAAO,oBAAoB,KAAK,SAAS,EAAE,KAAK;AAClD;;;ACdA,IAAAA,SAAuB;AAMvB,SAAS,eAAkD,UAA4B;AACrF,QAAM,cAAoB,cAAO,QAAQ;AAEnC,EAAA,iBAAU,MAAM;AACpB,gBAAY,UAAU;EACxB,CAAC;AAGD,SAAa,eAAQ,MAAO,IAAI,SAAA;;AAAS,6BAAY,YAAZ,qCAAsB,GAAG;KAAa,CAAC,CAAC;AACnF;",
"names": ["React"]
}
-336
View File
@@ -1,336 +0,0 @@
import {
composeRefs
} from "./chunk-JDYSANEB.js";
import {
require_react_dom
} from "./chunk-SXRIVT2P.js";
import {
require_jsx_runtime
} from "./chunk-KBTYAULA.js";
import {
require_react
} from "./chunk-QCHXOAYK.js";
import {
__toESM
} from "./chunk-WOOG5QLI.js";
// node_modules/@radix-ui/primitive/dist/index.mjs
var canUseDOM = !!(typeof window !== "undefined" && window.document && window.document.createElement);
function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {
return function handleEvent(event) {
originalEventHandler == null ? void 0 : originalEventHandler(event);
if (checkForDefaultPrevented === false || !event.defaultPrevented) {
return ourEventHandler == null ? void 0 : ourEventHandler(event);
}
};
}
// node_modules/@radix-ui/react-context/dist/index.mjs
var React = __toESM(require_react(), 1);
var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
function createContext2(rootComponentName, defaultContext) {
const Context = React.createContext(defaultContext);
const Provider = (props) => {
const { children, ...context } = props;
const value = React.useMemo(() => context, Object.values(context));
return (0, import_jsx_runtime.jsx)(Context.Provider, { value, children });
};
Provider.displayName = rootComponentName + "Provider";
function useContext2(consumerName) {
const context = React.useContext(Context);
if (context) return context;
if (defaultContext !== void 0) return defaultContext;
throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``);
}
return [Provider, useContext2];
}
function createContextScope(scopeName, createContextScopeDeps = []) {
let defaultContexts = [];
function createContext3(rootComponentName, defaultContext) {
const BaseContext = React.createContext(defaultContext);
const index = defaultContexts.length;
defaultContexts = [...defaultContexts, defaultContext];
const Provider = (props) => {
var _a;
const { scope, children, ...context } = props;
const Context = ((_a = scope == null ? void 0 : scope[scopeName]) == null ? void 0 : _a[index]) || BaseContext;
const value = React.useMemo(() => context, Object.values(context));
return (0, import_jsx_runtime.jsx)(Context.Provider, { value, children });
};
Provider.displayName = rootComponentName + "Provider";
function useContext2(consumerName, scope) {
var _a;
const Context = ((_a = scope == null ? void 0 : scope[scopeName]) == null ? void 0 : _a[index]) || BaseContext;
const context = React.useContext(Context);
if (context) return context;
if (defaultContext !== void 0) return defaultContext;
throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``);
}
return [Provider, useContext2];
}
const createScope = () => {
const scopeContexts = defaultContexts.map((defaultContext) => {
return React.createContext(defaultContext);
});
return function useScope(scope) {
const contexts = (scope == null ? void 0 : scope[scopeName]) || scopeContexts;
return React.useMemo(
() => ({ [`__scope${scopeName}`]: { ...scope, [scopeName]: contexts } }),
[scope, contexts]
);
};
};
createScope.scopeName = scopeName;
return [createContext3, composeContextScopes(createScope, ...createContextScopeDeps)];
}
function composeContextScopes(...scopes) {
const baseScope = scopes[0];
if (scopes.length === 1) return baseScope;
const createScope = () => {
const scopeHooks = scopes.map((createScope2) => ({
useScope: createScope2(),
scopeName: createScope2.scopeName
}));
return function useComposedScopes(overrideScopes) {
const nextScopes = scopeHooks.reduce((nextScopes2, { useScope, scopeName }) => {
const scopeProps = useScope(overrideScopes);
const currentScope = scopeProps[`__scope${scopeName}`];
return { ...nextScopes2, ...currentScope };
}, {});
return React.useMemo(() => ({ [`__scope${baseScope.scopeName}`]: nextScopes }), [nextScopes]);
};
};
createScope.scopeName = baseScope.scopeName;
return createScope;
}
// node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs
var React2 = __toESM(require_react(), 1);
var useLayoutEffect2 = (globalThis == null ? void 0 : globalThis.document) ? React2.useLayoutEffect : () => {
};
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
var React4 = __toESM(require_react(), 1);
var React22 = __toESM(require_react(), 1);
// node_modules/@radix-ui/react-use-effect-event/dist/index.mjs
var React3 = __toESM(require_react(), 1);
var useReactEffectEvent = React3[" useEffectEvent ".trim().toString()];
var useReactInsertionEffect = React3[" useInsertionEffect ".trim().toString()];
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
var useInsertionEffect = React4[" useInsertionEffect ".trim().toString()] || useLayoutEffect2;
function useControllableState({
prop,
defaultProp,
onChange = () => {
},
caller
}) {
const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({
defaultProp,
onChange
});
const isControlled = prop !== void 0;
const value = isControlled ? prop : uncontrolledProp;
if (true) {
const isControlledRef = React4.useRef(prop !== void 0);
React4.useEffect(() => {
const wasControlled = isControlledRef.current;
if (wasControlled !== isControlled) {
const from = wasControlled ? "controlled" : "uncontrolled";
const to = isControlled ? "controlled" : "uncontrolled";
console.warn(
`${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`
);
}
isControlledRef.current = isControlled;
}, [isControlled, caller]);
}
const setValue = React4.useCallback(
(nextValue) => {
var _a;
if (isControlled) {
const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;
if (value2 !== prop) {
(_a = onChangeRef.current) == null ? void 0 : _a.call(onChangeRef, value2);
}
} else {
setUncontrolledProp(nextValue);
}
},
[isControlled, prop, setUncontrolledProp, onChangeRef]
);
return [value, setValue];
}
function useUncontrolledState({
defaultProp,
onChange
}) {
const [value, setValue] = React4.useState(defaultProp);
const prevValueRef = React4.useRef(value);
const onChangeRef = React4.useRef(onChange);
useInsertionEffect(() => {
onChangeRef.current = onChange;
}, [onChange]);
React4.useEffect(() => {
var _a;
if (prevValueRef.current !== value) {
(_a = onChangeRef.current) == null ? void 0 : _a.call(onChangeRef, value);
prevValueRef.current = value;
}
}, [value, prevValueRef]);
return [value, setValue, onChangeRef];
}
function isFunction(value) {
return typeof value === "function";
}
var SYNC_STATE = Symbol("RADIX:SYNC_STATE");
// node_modules/@radix-ui/react-primitive/dist/index.mjs
var React6 = __toESM(require_react(), 1);
var ReactDOM = __toESM(require_react_dom(), 1);
// node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.mjs
var React5 = __toESM(require_react(), 1);
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
function createSlot(ownerName) {
const SlotClone = createSlotClone(ownerName);
const Slot2 = React5.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props;
const childrenArray = React5.Children.toArray(children);
const slottable = childrenArray.find(isSlottable);
if (slottable) {
const newElement = slottable.props.children;
const newChildren = childrenArray.map((child) => {
if (child === slottable) {
if (React5.Children.count(newElement) > 1) return React5.Children.only(null);
return React5.isValidElement(newElement) ? newElement.props.children : null;
} else {
return child;
}
});
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children: React5.isValidElement(newElement) ? React5.cloneElement(newElement, void 0, newChildren) : null });
}
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children });
});
Slot2.displayName = `${ownerName}.Slot`;
return Slot2;
}
var Slot = createSlot("Slot");
function createSlotClone(ownerName) {
const SlotClone = React5.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props;
if (React5.isValidElement(children)) {
const childrenRef = getElementRef(children);
const props2 = mergeProps(slotProps, children.props);
if (children.type !== React5.Fragment) {
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
}
return React5.cloneElement(children, props2);
}
return React5.Children.count(children) > 1 ? React5.Children.only(null) : null;
});
SlotClone.displayName = `${ownerName}.SlotClone`;
return SlotClone;
}
var SLOTTABLE_IDENTIFIER = Symbol("radix.slottable");
function createSlottable(ownerName) {
const Slottable2 = ({ children }) => {
return (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children });
};
Slottable2.displayName = `${ownerName}.Slottable`;
Slottable2.__radixId = SLOTTABLE_IDENTIFIER;
return Slottable2;
}
var Slottable = createSlottable("Slottable");
function isSlottable(child) {
return React5.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
}
function mergeProps(slotProps, childProps) {
const overrideProps = { ...childProps };
for (const propName in childProps) {
const slotPropValue = slotProps[propName];
const childPropValue = childProps[propName];
const isHandler = /^on[A-Z]/.test(propName);
if (isHandler) {
if (slotPropValue && childPropValue) {
overrideProps[propName] = (...args) => {
const result = childPropValue(...args);
slotPropValue(...args);
return result;
};
} else if (slotPropValue) {
overrideProps[propName] = slotPropValue;
}
} else if (propName === "style") {
overrideProps[propName] = { ...slotPropValue, ...childPropValue };
} else if (propName === "className") {
overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
}
}
return { ...slotProps, ...overrideProps };
}
function getElementRef(element) {
var _a, _b;
let getter = (_a = Object.getOwnPropertyDescriptor(element.props, "ref")) == null ? void 0 : _a.get;
let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.ref;
}
getter = (_b = Object.getOwnPropertyDescriptor(element, "ref")) == null ? void 0 : _b.get;
mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.props.ref;
}
return element.props.ref || element.ref;
}
// node_modules/@radix-ui/react-primitive/dist/index.mjs
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
var NODES = [
"a",
"button",
"div",
"form",
"h2",
"h3",
"img",
"input",
"label",
"li",
"nav",
"ol",
"p",
"select",
"span",
"svg",
"ul"
];
var Primitive = NODES.reduce((primitive, node) => {
const Slot2 = createSlot(`Primitive.${node}`);
const Node = React6.forwardRef((props, forwardedRef) => {
const { asChild, ...primitiveProps } = props;
const Comp = asChild ? Slot2 : node;
if (typeof window !== "undefined") {
window[Symbol.for("radix-ui")] = true;
}
return (0, import_jsx_runtime3.jsx)(Comp, { ...primitiveProps, ref: forwardedRef });
});
Node.displayName = `Primitive.${node}`;
return { ...primitive, [node]: Node };
}, {});
function dispatchDiscreteCustomEvent(target, event) {
if (target) ReactDOM.flushSync(() => target.dispatchEvent(event));
}
export {
composeEventHandlers,
createContext2,
createContextScope,
useLayoutEffect2,
useControllableState,
Primitive,
dispatchDiscreteCustomEvent
};
//# sourceMappingURL=chunk-HTKU3RA7.js.map
File diff suppressed because one or more lines are too long
-144
View File
@@ -1,144 +0,0 @@
import {
useLayoutEffect2
} from "./chunk-HTKU3RA7.js";
import {
useComposedRefs
} from "./chunk-JDYSANEB.js";
import {
require_react
} from "./chunk-QCHXOAYK.js";
import {
__toESM
} from "./chunk-WOOG5QLI.js";
// node_modules/@radix-ui/react-presence/dist/index.mjs
var React2 = __toESM(require_react(), 1);
var React = __toESM(require_react(), 1);
function useStateMachine(initialState, machine) {
return React.useReducer((state, event) => {
const nextState = machine[state][event];
return nextState ?? state;
}, initialState);
}
var Presence = (props) => {
const { present, children } = props;
const presence = usePresence(present);
const child = typeof children === "function" ? children({ present: presence.isPresent }) : React2.Children.only(children);
const ref = useComposedRefs(presence.ref, getElementRef(child));
const forceMount = typeof children === "function";
return forceMount || presence.isPresent ? React2.cloneElement(child, { ref }) : null;
};
Presence.displayName = "Presence";
function usePresence(present) {
const [node, setNode] = React2.useState();
const stylesRef = React2.useRef(null);
const prevPresentRef = React2.useRef(present);
const prevAnimationNameRef = React2.useRef("none");
const initialState = present ? "mounted" : "unmounted";
const [state, send] = useStateMachine(initialState, {
mounted: {
UNMOUNT: "unmounted",
ANIMATION_OUT: "unmountSuspended"
},
unmountSuspended: {
MOUNT: "mounted",
ANIMATION_END: "unmounted"
},
unmounted: {
MOUNT: "mounted"
}
});
React2.useEffect(() => {
const currentAnimationName = getAnimationName(stylesRef.current);
prevAnimationNameRef.current = state === "mounted" ? currentAnimationName : "none";
}, [state]);
useLayoutEffect2(() => {
const styles = stylesRef.current;
const wasPresent = prevPresentRef.current;
const hasPresentChanged = wasPresent !== present;
if (hasPresentChanged) {
const prevAnimationName = prevAnimationNameRef.current;
const currentAnimationName = getAnimationName(styles);
if (present) {
send("MOUNT");
} else if (currentAnimationName === "none" || (styles == null ? void 0 : styles.display) === "none") {
send("UNMOUNT");
} else {
const isAnimating = prevAnimationName !== currentAnimationName;
if (wasPresent && isAnimating) {
send("ANIMATION_OUT");
} else {
send("UNMOUNT");
}
}
prevPresentRef.current = present;
}
}, [present, send]);
useLayoutEffect2(() => {
if (node) {
let timeoutId;
const ownerWindow = node.ownerDocument.defaultView ?? window;
const handleAnimationEnd = (event) => {
const currentAnimationName = getAnimationName(stylesRef.current);
const isCurrentAnimation = currentAnimationName.includes(CSS.escape(event.animationName));
if (event.target === node && isCurrentAnimation) {
send("ANIMATION_END");
if (!prevPresentRef.current) {
const currentFillMode = node.style.animationFillMode;
node.style.animationFillMode = "forwards";
timeoutId = ownerWindow.setTimeout(() => {
if (node.style.animationFillMode === "forwards") {
node.style.animationFillMode = currentFillMode;
}
});
}
}
};
const handleAnimationStart = (event) => {
if (event.target === node) {
prevAnimationNameRef.current = getAnimationName(stylesRef.current);
}
};
node.addEventListener("animationstart", handleAnimationStart);
node.addEventListener("animationcancel", handleAnimationEnd);
node.addEventListener("animationend", handleAnimationEnd);
return () => {
ownerWindow.clearTimeout(timeoutId);
node.removeEventListener("animationstart", handleAnimationStart);
node.removeEventListener("animationcancel", handleAnimationEnd);
node.removeEventListener("animationend", handleAnimationEnd);
};
} else {
send("ANIMATION_END");
}
}, [node, send]);
return {
isPresent: ["mounted", "unmountSuspended"].includes(state),
ref: React2.useCallback((node2) => {
stylesRef.current = node2 ? getComputedStyle(node2) : null;
setNode(node2);
}, [])
};
}
function getAnimationName(styles) {
return (styles == null ? void 0 : styles.animationName) || "none";
}
function getElementRef(element) {
var _a, _b;
let getter = (_a = Object.getOwnPropertyDescriptor(element.props, "ref")) == null ? void 0 : _a.get;
let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.ref;
}
getter = (_b = Object.getOwnPropertyDescriptor(element, "ref")) == null ? void 0 : _b.get;
mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.props.ref;
}
return element.props.ref || element.ref;
}
export {
Presence
};
//# sourceMappingURL=chunk-YEHADEKF.js.map
File diff suppressed because one or more lines are too long
-196
View File
@@ -1,196 +0,0 @@
import {
createContextScope
} from "./chunk-HTKU3RA7.js";
import {
composeRefs,
useComposedRefs
} from "./chunk-JDYSANEB.js";
import {
require_jsx_runtime
} from "./chunk-KBTYAULA.js";
import {
require_react
} from "./chunk-QCHXOAYK.js";
import {
__toESM
} from "./chunk-WOOG5QLI.js";
// node_modules/@radix-ui/react-collection/dist/index.mjs
var import_react = __toESM(require_react(), 1);
// node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot/dist/index.mjs
var React = __toESM(require_react(), 1);
var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
function createSlot(ownerName) {
const SlotClone = createSlotClone(ownerName);
const Slot2 = React.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props;
const childrenArray = React.Children.toArray(children);
const slottable = childrenArray.find(isSlottable);
if (slottable) {
const newElement = slottable.props.children;
const newChildren = childrenArray.map((child) => {
if (child === slottable) {
if (React.Children.count(newElement) > 1) return React.Children.only(null);
return React.isValidElement(newElement) ? newElement.props.children : null;
} else {
return child;
}
});
return (0, import_jsx_runtime.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });
}
return (0, import_jsx_runtime.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children });
});
Slot2.displayName = `${ownerName}.Slot`;
return Slot2;
}
var Slot = createSlot("Slot");
function createSlotClone(ownerName) {
const SlotClone = React.forwardRef((props, forwardedRef) => {
const { children, ...slotProps } = props;
if (React.isValidElement(children)) {
const childrenRef = getElementRef(children);
const props2 = mergeProps(slotProps, children.props);
if (children.type !== React.Fragment) {
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
}
return React.cloneElement(children, props2);
}
return React.Children.count(children) > 1 ? React.Children.only(null) : null;
});
SlotClone.displayName = `${ownerName}.SlotClone`;
return SlotClone;
}
var SLOTTABLE_IDENTIFIER = Symbol("radix.slottable");
function createSlottable(ownerName) {
const Slottable2 = ({ children }) => {
return (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
};
Slottable2.displayName = `${ownerName}.Slottable`;
Slottable2.__radixId = SLOTTABLE_IDENTIFIER;
return Slottable2;
}
var Slottable = createSlottable("Slottable");
function isSlottable(child) {
return React.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
}
function mergeProps(slotProps, childProps) {
const overrideProps = { ...childProps };
for (const propName in childProps) {
const slotPropValue = slotProps[propName];
const childPropValue = childProps[propName];
const isHandler = /^on[A-Z]/.test(propName);
if (isHandler) {
if (slotPropValue && childPropValue) {
overrideProps[propName] = (...args) => {
const result = childPropValue(...args);
slotPropValue(...args);
return result;
};
} else if (slotPropValue) {
overrideProps[propName] = slotPropValue;
}
} else if (propName === "style") {
overrideProps[propName] = { ...slotPropValue, ...childPropValue };
} else if (propName === "className") {
overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
}
}
return { ...slotProps, ...overrideProps };
}
function getElementRef(element) {
var _a, _b;
let getter = (_a = Object.getOwnPropertyDescriptor(element.props, "ref")) == null ? void 0 : _a.get;
let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.ref;
}
getter = (_b = Object.getOwnPropertyDescriptor(element, "ref")) == null ? void 0 : _b.get;
mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
if (mayWarn) {
return element.props.ref;
}
return element.props.ref || element.ref;
}
// node_modules/@radix-ui/react-collection/dist/index.mjs
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
var import_react2 = __toESM(require_react(), 1);
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
function createCollection(name) {
const PROVIDER_NAME = name + "CollectionProvider";
const [createCollectionContext, createCollectionScope] = createContextScope(PROVIDER_NAME);
const [CollectionProviderImpl, useCollectionContext] = createCollectionContext(
PROVIDER_NAME,
{ collectionRef: { current: null }, itemMap: /* @__PURE__ */ new Map() }
);
const CollectionProvider = (props) => {
const { scope, children } = props;
const ref = import_react.default.useRef(null);
const itemMap = import_react.default.useRef(/* @__PURE__ */ new Map()).current;
return (0, import_jsx_runtime2.jsx)(CollectionProviderImpl, { scope, itemMap, collectionRef: ref, children });
};
CollectionProvider.displayName = PROVIDER_NAME;
const COLLECTION_SLOT_NAME = name + "CollectionSlot";
const CollectionSlotImpl = createSlot(COLLECTION_SLOT_NAME);
const CollectionSlot = import_react.default.forwardRef(
(props, forwardedRef) => {
const { scope, children } = props;
const context = useCollectionContext(COLLECTION_SLOT_NAME, scope);
const composedRefs = useComposedRefs(forwardedRef, context.collectionRef);
return (0, import_jsx_runtime2.jsx)(CollectionSlotImpl, { ref: composedRefs, children });
}
);
CollectionSlot.displayName = COLLECTION_SLOT_NAME;
const ITEM_SLOT_NAME = name + "CollectionItemSlot";
const ITEM_DATA_ATTR = "data-radix-collection-item";
const CollectionItemSlotImpl = createSlot(ITEM_SLOT_NAME);
const CollectionItemSlot = import_react.default.forwardRef(
(props, forwardedRef) => {
const { scope, children, ...itemData } = props;
const ref = import_react.default.useRef(null);
const composedRefs = useComposedRefs(forwardedRef, ref);
const context = useCollectionContext(ITEM_SLOT_NAME, scope);
import_react.default.useEffect(() => {
context.itemMap.set(ref, { ref, ...itemData });
return () => void context.itemMap.delete(ref);
});
return (0, import_jsx_runtime2.jsx)(CollectionItemSlotImpl, { ...{ [ITEM_DATA_ATTR]: "" }, ref: composedRefs, children });
}
);
CollectionItemSlot.displayName = ITEM_SLOT_NAME;
function useCollection(scope) {
const context = useCollectionContext(name + "CollectionConsumer", scope);
const getItems = import_react.default.useCallback(() => {
const collectionNode = context.collectionRef.current;
if (!collectionNode) return [];
const orderedNodes = Array.from(collectionNode.querySelectorAll(`[${ITEM_DATA_ATTR}]`));
const items = Array.from(context.itemMap.values());
const orderedItems = items.sort(
(a, b) => orderedNodes.indexOf(a.ref.current) - orderedNodes.indexOf(b.ref.current)
);
return orderedItems;
}, [context.collectionRef, context.itemMap]);
return getItems;
}
return [
{ Provider: CollectionProvider, Slot: CollectionSlot, ItemSlot: CollectionItemSlot },
useCollection,
createCollectionScope
];
}
// node_modules/@radix-ui/react-direction/dist/index.mjs
var React3 = __toESM(require_react(), 1);
var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
var DirectionContext = React3.createContext(void 0);
function useDirection(localDir) {
const globalDir = React3.useContext(DirectionContext);
return localDir || globalDir || "ltr";
}
export {
createCollection,
useDirection
};
//# sourceMappingURL=chunk-Z5TL6HO7.js.map
File diff suppressed because one or more lines are too long
@@ -1,3 +1,3 @@
#Mon Feb 23 02:25:57 WIB 2026 #Mon Mar 02 09:46:41 WIB 2026
com.getcapacitor.android.capacitor-android-main-6\:/layout/capacitor_bridge_layout_main.xml=/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/capacitor_bridge_layout_main.xml com.getcapacitor.android.capacitor-android-main-6\:/layout/capacitor_bridge_layout_main.xml=/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/capacitor_bridge_layout_main.xml
com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/no_webview.xml com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/no_webview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merger version="3" xmlns:ns1="http://schemas.android.com/tools"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!&lt;dir>navigation"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res"><file name="capacitor_bridge_layout_main" path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/layout/capacitor_bridge_layout_main.xml" qualifiers="" type="layout"/><file name="no_webview" path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/layout/no_webview.xml" qualifiers="" type="layout"/><file path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/values/colors.xml" qualifiers=""><color name="colorPrimary" ns1:ignore="UnusedResources">#3F51B5</color><color name="colorPrimaryDark" ns1:ignore="UnusedResources">#303F9F</color><color name="colorAccent" ns1:ignore="UnusedResources">#FF4081</color></file><file path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/values/styles.xml" qualifiers=""><style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar"> <merger version="3" xmlns:ns1="http://schemas.android.com/tools"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!&lt;dir>navigation"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res"><file name="capacitor_bridge_layout_main" path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/layout/capacitor_bridge_layout_main.xml" qualifiers="" type="layout"/><file name="no_webview" path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/layout/no_webview.xml" qualifiers="" type="layout"/><file path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/values/colors.xml" qualifiers=""><color name="colorPrimary" ns1:ignore="UnusedResources">#3F51B5</color><color name="colorPrimaryDark" ns1:ignore="UnusedResources">#303F9F</color><color name="colorAccent" ns1:ignore="UnusedResources">#FF4081</color></file><file path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/values/styles.xml" qualifiers=""><style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
</style></file><file path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/values/strings.xml" qualifiers=""><string name="no_webview_text">This app requires a WebView to work</string></file></source></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!&lt;dir>navigation"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!&lt;dir>navigation"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/build/generated/res/resValues/debug"/></dataSet><mergedItems/></merger> </style></file><file path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/res/values/strings.xml" qualifiers=""><string name="no_webview_text">This app requires a WebView to work</string></file></source></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!&lt;dir>navigation"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!&lt;dir>navigation"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/build/generated/res/resValues/debug"/></dataSet><mergedItems/></merger>
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/assets"><file name="native-bridge.js" path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/assets/native-bridge.js"/></source></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/build/intermediates/shader_assets/debug/compileDebugShaders/out"/></dataSet></merger> <merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/assets"><file name="native-bridge.js" path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/assets/native-bridge.js"/></source></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/build/intermediates/shader_assets/debug/compileDebugShaders/out"/></dataSet></merger>
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/jniLibs"/></dataSet></merger> <merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/jniLibs"/></dataSet></merger>
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/shaders"/></dataSet></merger> <merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/debug/shaders"/></dataSet></merger>
@@ -1,16 +1,16 @@
-- Merging decision tree log --- -- Merging decision tree log ---
manifest manifest
ADDED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12 ADDED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12
INJECTED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12 INJECTED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12
package package
INJECTED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml INJECTED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
xmlns:android xmlns:android
ADDED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:11-69 ADDED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:11-69
uses-sdk uses-sdk
INJECTED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml reason: use-sdk injection requested INJECTED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml reason: use-sdk injection requested
INJECTED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml INJECTED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
INJECTED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml INJECTED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
android:targetSdkVersion android:targetSdkVersion
INJECTED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml INJECTED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
android:minSdkVersion android:minSdkVersion
INJECTED from /Users/fauzgabriel/Downloads/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml INJECTED from /Users/fauzgabriel/development/pertanian-app/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
+40 -7
View File
@@ -1,5 +1,6 @@
import { initDB, persistDB } from '../../utils/sqlClient'; import { initDB, persistDB } from '../../utils/sqlClient';
import { db } from '../../utils/db'; import { db } from '../../utils/db';
import { toArray } from 'lodash';
export const isOnline = () => navigator.onLine; export const isOnline = () => navigator.onLine;
@@ -16,9 +17,10 @@ export const OfflineService = {
}; };
try { try {
// Simpan objek JSON langsung ke IndexedDB // update first
await db[table].put(record); await db[table].put(record);
// Tambahkan ke antrean sinkronisasi
// gonna insert
await db.pending_sync.add({ await db.pending_sync.add({
id: `q_${Date.now()}`, id: `q_${Date.now()}`,
entity_type: entityType, entity_type: entityType,
@@ -35,9 +37,8 @@ export const OfflineService = {
} }
}, },
getEntities: async (entityType, filter = {}) => { // Tambahkan default value {} getEntities: async (entityType, filter = {}) => {
try { try {
// 1. Validasi Nama Tabel
if (!entityType) return []; if (!entityType) return [];
const table = entityType.toLowerCase().endsWith('s') const table = entityType.toLowerCase().endsWith('s')
? entityType.toLowerCase() ? entityType.toLowerCase()
@@ -49,14 +50,21 @@ export const OfflineService = {
return []; return [];
} }
// 2. Cek apakah ada filter yang valid const invalidData = await dbTable.filter(
// Pastikan filter bukan null/undefined dan punya isi item => !item.nik || item.nik === ''
).toArray();
if(invalidData.length > 0){
const idsToDelete = invalidData.map(d => d.id);
await dbTable.bulkDelete(idsToDelete);
console.log(`🧹 Cleanup: Menghapus ${invalidData.length} data tanpa NIK dari ${table}`);
}
if (filter && typeof filter === 'object' && Object.keys(filter).length > 0) { if (filter && typeof filter === 'object' && Object.keys(filter).length > 0) {
console.log(`🔍 Fetching ${table} with filter:`, filter); console.log(`🔍 Fetching ${table} with filter:`, filter);
return await dbTable.where(filter).toArray(); return await dbTable.where(filter).toArray();
} }
// 3. Jika tidak ada filter, ambil semua (Urutkan terbaru)
console.log(`🔍 Fetching all from ${table}`); console.log(`🔍 Fetching all from ${table}`);
return await dbTable.reverse().toArray(); return await dbTable.reverse().toArray();
@@ -73,5 +81,30 @@ export const OfflineService = {
console.error("Gagal hitung antrean:", e); console.error("Gagal hitung antrean:", e);
return 0; return 0;
} }
},
deleteEntityLocally: async (entityType, id) => {
const table = entityType.toLowerCase().endsWith('s')
? entityType.toLowerCase()
: `${entityType.toLowerCase()}s`;
try {
// 1. Hapus dari tabel utama di Dexie (Local)
await db[table].delete(id);
// 2. Tambahkan ke antrean sinkronisasi dengan operasi 'DELETE'
await db.pending_sync.add({
id: `q_${Date.now()}`,
entity_type: entityType,
operation: 'DELETE',
payload: { id }, // Kirim ID saja untuk dihapus di server nanti
created_at: new Date().toISOString()
});
console.log(`🗑️ Dexie: Data ${entityType} dengan ID ${id} berhasil dihapus lokal!`);
return true;
} catch (err) {
console.error("❌ Dexie Delete Error:", err);
throw err;
}
} }
}; };
+57 -1
View File
@@ -18,6 +18,7 @@ import LinkUserAccount from "@/components/farmers/LinkUserAccount";
import { toast } from "sonner"; import { toast } from "sonner";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { OfflineService } from "@/components/common/offlineStorage"; import { OfflineService } from "@/components/common/offlineStorage";
import { useNavigate } from 'react-router-dom';
export default function FarmerDetail() { export default function FarmerDetail() {
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
@@ -26,6 +27,7 @@ export default function FarmerDetail() {
const {id: paramsId } = useParams(); const {id: paramsId } = useParams();
const id = paramsId || searchId; const id = paramsId || searchId;
const [isEditing, setIsEditing] = useState(false); const [isEditing, setIsEditing] = useState(false);
const navigate = useNavigate();
// const { data: farmer, isLoading } = useQuery({ // const { data: farmer, isLoading } = useQuery({
// queryKey: ["farmer", farmerId], // queryKey: ["farmer", farmerId],
@@ -137,10 +139,64 @@ export default function FarmerDetail() {
const plants = Array.isArray(rawPlants) ? rawPlants : []; const plants = Array.isArray(rawPlants) ? rawPlants : [];
const verifyMutation = useMutation({ const verifyMutation = useMutation({
mutationFn: (status) => base44.entities.Farmer.update(id, { verification_status: status }), mutationFn: async (status) => {
console.log("Data dari Verifikais :", [status, id])
try {
const onlineUpdate = await base44.entities.Farmer.update(id, { verification_status: status })
if(typeof onlineUpdate == 'string' && onlineUpdate.includes('<!doctype html>')){
throw Error("HTML respond found, it must be error")
}
return onlineUpdate;
} catch (error) {
throw {type: "OFFLINE_SAVE", status, id};
}
},
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["farmer", id] }); queryClient.invalidateQueries({ queryKey: ["farmer", id] });
toast.success("Status verifikasi diperbarui!"); toast.success("Status verifikasi diperbarui!");
},
onError: async (error, variables) => {
console.log(variables);
if(error.type == 'OFFLINE_SAVE'){
console.warn("Saving offline");
try {
const entity = 'farmer';
await OfflineService.saveEntityLocally(entity,{
...variables,
id: variables.id,
verification_status: variables.status,
});
queryClient.setQueryData(["farmers"], (oldData) => {
if (!Array.isArray(oldData)) return [];
return oldData.map(item => {
if (item.id === variables.id) {
return {
...item,
verification_status: variables.status,
sync_status: 'pending'
};
}
return item;
});
});
queryClient.setQueryData(["farmer", variables.id], (oldData) => {
return oldData ? { ...oldData, verification_status: variables.status, sync_status: 'pending' } : oldData;
});
// toast.info("Tersimpan secara lokal");
// setTimeout(() => {
// navigate(createPageUrl("Farmers"));
// }, 500);
} catch (sqlError) {
console.error("SQLite Error:", sqlError);
toast.error("Gagal simpan lokal");
}
}
} }
}); });
+26 -7
View File
@@ -63,14 +63,28 @@ export default function FarmerPortal() {
// Load user and farmer data // Load user and farmer data
useEffect(() => { useEffect(() => {
getAllLand().then(console.log); getAllLand().then(function(){
console.log("get all land")
});
const loadData = async () => { const loadData = async () => {
try { try {
const currentUser = await base44.auth.me(); const currentUser = await base44.auth.me();
setUser(currentUser); setUser(currentUser);
// Find farmer linked to this user // Find farmer linked to this user
const farmers = await base44.entities.Farmer.filter({ user_email: currentUser.email }); let farmers = [];
try{
const resp = await base44.entities.Farmer.filter({ user_email: currentUser.email });
if(typeof resp ==='string' && resp.includes('<!doctype html>')){
console.error('Server tidak ditemukan / sedang error')
}else
if(resp && !resp.error){
farmers = resp;
}
}catch(e){
}
if (farmers.length > 0) { if (farmers.length > 0) {
setFarmer(farmers[0]); setFarmer(farmers[0]);
} }
@@ -102,11 +116,7 @@ export default function FarmerPortal() {
queryFn: () => landEntity.filter({ farmer_id: farmer.id }), queryFn: () => landEntity.filter({ farmer_id: farmer.id }),
// queryFn: async () => { // queryFn: async () => {
// console.log("📡 Mengambil data lahan untuk ID:", farmer.id); // console.log("📡 Mengambil data lahan untuk ID:", farmer.id);
// // Harus pakai AWAIT karena getAllLand adalah fungsi async (mengambil dari DB)
// const data = await getAllLand(farmer.id); // const data = await getAllLand(farmer.id);
// console.log("📥 Data berhasil dimuat ke React Query:", data);
// return data; // return data;
// }, // },
enabled: !!farmer?.id enabled: !!farmer?.id
@@ -115,7 +125,16 @@ export default function FarmerPortal() {
// Load farmer's plants with offline support // Load farmer's plants with offline support
const { data: plants = [] } = useQuery({ const { data: plants = [] } = useQuery({
queryKey: ["farmer-plants", farmer?.id], queryKey: ["farmer-plants", farmer?.id],
queryFn: () => plantEntity.filter({ farmer_id: farmer.id }), queryFn: async () => {
try {
const response = plantEntity.filter({ farmer_id: farmer.id });
if(response && !response.error){
return Array.isArray(response) ? response : [];
}
} catch (error) {
return [];
}
},
enabled: !!farmer?.id enabled: !!farmer?.id
}); });
+7 -3
View File
@@ -100,7 +100,10 @@ export default function LandDetail() {
let serverData = []; let serverData = [];
try { try {
const serverData = await base44.entities.Land.get(id); const serverData = await base44.entities.Land.get(id);
if (serverData && !serverData.error) return serverData; if(typeof serverData == 'string' && serverData.includes('<!doctype html>')){
console.warn('data server tidak ditemukan');
}
else if (serverData && !serverData.error) return serverData;
} catch (e) { } catch (e) {
console.warn("Server unreachable, searching locally..."); console.warn("Server unreachable, searching locally...");
} }
@@ -111,10 +114,11 @@ export default function LandDetail() {
} }
throw new Error("Lahan tidak ditemukan"); throw new Error("Lahan tidak ditemukan");
}, },
enabled: !!id enabled: !!id,
initialData: null
}); });
console.log('Land data =>', land)
// const { data: farmers = [] } = useQuery({ // const { data: farmers = [] } = useQuery({
// queryKey: ["farmers"], // queryKey: ["farmers"],
// queryFn: () => base44.entities.Farmer.list() // queryFn: () => base44.entities.Farmer.list()
+2 -2
View File
@@ -51,7 +51,7 @@ export default function ProductivityMonitoring() {
// }); // });
const {data: rawLands = []} = useQuery({ const {data: rawLands = []} = useQuery({
queryKey: ['farmers'], queryKey: ['lands'],
queryFn: async () => { queryFn: async () => {
let dataServer = []; let dataServer = [];
try{ try{
@@ -59,7 +59,7 @@ export default function ProductivityMonitoring() {
dataServer = Array.isArray(res) ? res : []; dataServer = Array.isArray(res) ? res : [];
}catch(err){} }catch(err){}
const localData = await OfflineService.getEntities('farmers'); const localData = await OfflineService.getEntities('lands');
const combined = new Map(); const combined = new Map();
dataServer.forEach(d => combined.set(d.id, d)); dataServer.forEach(d => combined.set(d.id, d));
localData.array.forEach(f => combined.set(f.id, f)); localData.array.forEach(f => combined.set(f.id, f));
+24 -5
View File
@@ -39,11 +39,15 @@ export default function Validators() {
const {data: provinces = []} = useQuery({ const {data: provinces = []} = useQuery({
queryKey: ["provinces"], queryKey: ["provinces"],
queryFn: () => { queryFn: async () => {
try{ try{
const data = base44.entities.Province.list(); const data = base44.entities.Province.list();
return Array.isArray(data) ? data : []; if (data && Array.isArray(data)) {
return data;
}
return [];
}catch(e){ }catch(e){
console.warn('gagal meemuat data dari server');
return []; return [];
} }
} }
@@ -73,12 +77,27 @@ export default function Validators() {
} }
const createMutation = useMutation({ const createMutation = useMutation({
mutationFn: (data) => base44.entities.Validator.create(data), mutationFn: async (data) => {
try{
const actServer = base44.entities.Validator.create(data);
if(typeof actServer === 'string' && actServer.includes('<!doctype html')){
throw new Error('Data is HTML file, not a good responds');
}
return actServer;
}catch(err){
throw {type: 'OFFLINE_SAVE', data}
}
},
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["validators"] }); queryClient.invalidateQueries({ queryKey: ["validators"] });
setShowForm(false); setShowForm(false);
setFormData({ user_email: "", full_name: "", role: "kepala_desa", village: "", district: "", regency: "", phone: "", is_active: true }); setFormData({ user_email: "", full_name: "", role: "kepala_desa", village: "", district: "", regency: "", phone: "", is_active: true });
toast.success("Validator berhasil ditambahkan!"); toast.success("Validator berhasil ditambahkan!");
},
onError: async (error, datas)=>{
if(error.type === 'OFFLINE_SAVE'){{
console.log('Error menyimpan online dan akan disimpan offline')
}}
} }
}); });
@@ -187,7 +206,7 @@ export default function Validators() {
</div> </div>
<div className="space-y-2"> <div className="space-y-2">
<Label>Provinsi</Label> <Label>Provinsi</Label>
<Select value={formData.province} onValueChange={(v) => handleChange("province", v)}> <Select value={formData.province || ""} onValueChange={(v) => handleChange("province", v)}>
<SelectTrigger><SelectValue placeholder="Pilih provinsi" /></SelectTrigger> <SelectTrigger><SelectValue placeholder="Pilih provinsi" /></SelectTrigger>
<SelectContent> <SelectContent>
{provinces.map(p => (<SelectItem key={p.id} value={p.id}>{p.nama}</SelectItem>))} {provinces.map(p => (<SelectItem key={p.id} value={p.id}>{p.nama}</SelectItem>))}