retold-facto 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +2 -2
- package/docs/_brand.json +18 -0
- package/docs/index.html +0 -2
- package/package.json +56 -26
- package/source/services/web-app/Facto-Brand.js +18 -0
- package/source/services/web-app/pict-app/views/PictView-Facto-Catalog.js +11 -11
- package/source/services/web-app/pict-app/views/PictView-Facto-Datasets.js +3 -3
- package/source/services/web-app/pict-app/views/PictView-Facto-Ingest.js +6 -6
- package/source/services/web-app/pict-app/views/PictView-Facto-Layout.js +24 -24
- package/source/services/web-app/pict-app/views/PictView-Facto-Projections.js +6 -6
- package/source/services/web-app/pict-app/views/PictView-Facto-Records.js +3 -3
- package/source/services/web-app/pict-app/views/PictView-Facto-Scanner.js +10 -10
- package/source/services/web-app/pict-app/views/PictView-Facto-Sources.js +4 -4
- package/source/services/web-app/pict-app/views/PictView-Facto-Throughput.js +3 -3
- package/source/services/web-app/pict-app-full/Pict-Application-Facto-Full.js +15 -47
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-BottomBar.js +5 -5
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Connections.js +7 -7
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Dashboard.js +2 -2
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Dashboards.js +21 -21
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Datasets.js +2 -2
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-MappingEditor.js +3 -3
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-ProjectionDetail.js +25 -25
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Projections.js +1 -1
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-RecordViewer.js +29 -29
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Records.js +25 -25
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Scanner.js +17 -17
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-SchemaDetail.js +48 -48
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-SchemaDocEditor.js +94 -94
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-SchemaEditor.js +18 -18
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-SchemaResearch.js +6 -6
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-SourceDetail.js +51 -51
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-SourceEditor.js +94 -94
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-SourceResearch.js +8 -8
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-Throughput.js +30 -30
- package/source/services/web-app/pict-app-full/views/PictView-Facto-Full-TopBar.js +31 -50
- package/source/services/web-app/web/codemirror-bundle.js +7 -7
- package/source/services/web-app/web/css/facto.css +83 -67
- package/source/services/web-app/web/favicons/apple-touch-icon.png +0 -0
- package/source/services/web-app/web/favicons/favicon-16.png +0 -0
- package/source/services/web-app/web/favicons/favicon-192.png +0 -0
- package/source/services/web-app/web/favicons/favicon-32.png +0 -0
- package/source/services/web-app/web/favicons/favicon-48.png +0 -0
- package/source/services/web-app/web/favicons/favicon-512.png +0 -0
- package/source/services/web-app/web/favicons/favicon-64.png +0 -0
- package/source/services/web-app/web/favicons/favicon-dark.svg +29 -0
- package/source/services/web-app/web/favicons/favicon-light.svg +29 -0
- package/source/services/web-app/web/favicons/favicon.svg +29 -0
- package/source/services/web-app/web/index.html +3 -7
- package/source/services/web-app/web/pict.min.js +12 -0
- package/source/services/web-app/web/retold-facto.js +7821 -2606
- package/source/services/web-app/web/retold-facto.js.map +1 -1
- package/source/services/web-app/web/retold-facto.min.js +34 -1
- package/source/services/web-app/web/retold-facto.min.js.map +1 -1
- package/test/Facto_Smoke_tests.js +127 -0
- package/docs/css/docuserve.css +0 -327
- package/source/services/web-app/web/css/facto-themes.css +0 -467
package/Dockerfile
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Stage 1: Build
|
|
2
|
-
FROM node:
|
|
2
|
+
FROM node:22-slim AS builder
|
|
3
3
|
WORKDIR /app
|
|
4
4
|
COPY package*.json ./
|
|
5
5
|
# `npm install`, not `npm ci` — package-lock.json is gitignored per
|
|
@@ -16,7 +16,7 @@ RUN npx quack build
|
|
|
16
16
|
RUN cp node_modules/pict/dist/pict.min.js source/services/web-app/web/pict.min.js 2>/dev/null || true
|
|
17
17
|
|
|
18
18
|
# Stage 2: Runtime
|
|
19
|
-
FROM node:
|
|
19
|
+
FROM node:22-slim
|
|
20
20
|
WORKDIR /app
|
|
21
21
|
COPY package*.json ./
|
|
22
22
|
RUN npm install --omit=dev
|
package/docs/_brand.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Hash": "retold-facto",
|
|
3
|
+
"Name": "Retold Facto",
|
|
4
|
+
"Tagline": "Data warehouse and knowledge graph storage for the Retold ecosystem.",
|
|
5
|
+
"Palette": "mix",
|
|
6
|
+
"Icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"frame-retold-facto-filled-light\">\n\t\t\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\" fill=\"#2e8ab5\"/>\n\t\t<g clip-path=\"url(#frame-retold-facto-filled-light)\"><rect x=\"26\" y=\"14\" width=\"18\" height=\"68\" rx=\"4\" fill=\"rgba(255,255,255,0.18)\"/><rect x=\"52\" y=\"14\" width=\"18\" height=\"68\" rx=\"4\" fill=\"#da9859\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"38\" font-weight=\"700\"\n\t\t\tfill=\"#ffffff\" letter-spacing=\"-1\">RF</text>\n\t</svg>",
|
|
7
|
+
"IconType": "svg",
|
|
8
|
+
"Favicon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"fav-retold-facto-light\">\n\t\t\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\" fill=\"#2e8ab5\"/>\n\t\t<g clip-path=\"url(#fav-retold-facto-light)\"><rect x=\"20\" y=\"14\" width=\"56\" height=\"68\" rx=\"4\" fill=\"rgba(255,255,255,0.22)\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"60\" font-weight=\"800\"\n\t\t\tfill=\"#ffffff\" letter-spacing=\"-1\">R</text>\n\t</svg>",
|
|
9
|
+
"FaviconDark": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"fav-retold-facto-dark\">\n\t\t\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\" fill=\"#6cb2d3\"/>\n\t\t<g clip-path=\"url(#fav-retold-facto-dark)\"><rect x=\"20\" y=\"14\" width=\"56\" height=\"68\" rx=\"4\" fill=\"rgba(255,255,255,0.22)\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"60\" font-weight=\"800\"\n\t\t\tfill=\"#101418\" letter-spacing=\"-1\">R</text>\n\t</svg>",
|
|
10
|
+
"Colors": {
|
|
11
|
+
"Primary": "#2e8ab5",
|
|
12
|
+
"Secondary": "#da9859",
|
|
13
|
+
"PrimaryLight": "#2e8ab5",
|
|
14
|
+
"PrimaryDark": "#6cb2d3",
|
|
15
|
+
"SecondaryLight": "#da9859",
|
|
16
|
+
"SecondaryDark": "#e7c7a7"
|
|
17
|
+
}
|
|
18
|
+
}
|
package/docs/index.html
CHANGED
|
@@ -8,8 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
<title>Retold Facto v0.1.0 Documentation</title>
|
|
10
10
|
|
|
11
|
-
<!-- Application Stylesheet -->
|
|
12
|
-
<link href="css/docuserve.css" rel="stylesheet">
|
|
13
11
|
<!-- KaTeX stylesheet for LaTeX equation rendering -->
|
|
14
12
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.css">
|
|
15
13
|
<!-- PICT Dynamic View CSS Container -->
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "retold-facto",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Data warehouse and knowledge graph storage for the Retold ecosystem.",
|
|
5
5
|
"main": "source/Retold-Facto.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
"coverage": "npx quack coverage",
|
|
12
12
|
"test": "npx quack test",
|
|
13
13
|
"test-browser": "npx mocha test/Facto_Browser_Integration_tests.js -u tdd --exit --timeout 120000",
|
|
14
|
+
"brand": "node node_modules/pict-section-theme/bin/pict-section-theme-brand.js --manifest ../../../Retold-Modules-Manifest.json --module retold-facto --favicons source/services/web-app/web/favicons",
|
|
15
|
+
"prebuild": "npm run brand",
|
|
14
16
|
"build": "npx quack build",
|
|
15
17
|
"build-codemirror": "npx esbuild source/services/web-app/codemirror-entry.js --bundle --outfile=source/services/web-app/web/codemirror-bundle.js --format=iife --global-name=CodeMirrorModules --platform=browser --target=es2018",
|
|
16
18
|
"build-test-model": "cd test && npx stricture -i model/ddl/Facto.ddl",
|
|
@@ -28,7 +30,10 @@
|
|
|
28
30
|
"release:major:image": "npx quack release major --image"
|
|
29
31
|
},
|
|
30
32
|
"mocha": {
|
|
31
|
-
"spec":
|
|
33
|
+
"spec": [
|
|
34
|
+
"test/RetoldFacto_tests.js",
|
|
35
|
+
"test/Facto_Smoke_tests.js"
|
|
36
|
+
],
|
|
32
37
|
"diff": true,
|
|
33
38
|
"extension": [
|
|
34
39
|
"js"
|
|
@@ -103,40 +108,65 @@
|
|
|
103
108
|
},
|
|
104
109
|
"homepage": "https://github.com/stevenvelozo/retold-facto",
|
|
105
110
|
"devDependencies": {
|
|
106
|
-
"chai": "^
|
|
107
|
-
"
|
|
111
|
+
"chai": "^4.5.0",
|
|
112
|
+
"jsdom": "^25.0.1",
|
|
113
|
+
"mocha": "^11.0.1",
|
|
114
|
+
"pict-docuserve": "^1.3.2",
|
|
108
115
|
"puppeteer": "^24.40.0",
|
|
109
|
-
"quackage": "^1.2.
|
|
110
|
-
"
|
|
116
|
+
"quackage": "^1.2.3",
|
|
117
|
+
"retold-sharp": "^1.0.0",
|
|
118
|
+
"stricture": "^4.0.3",
|
|
111
119
|
"supertest": "^7.2.2"
|
|
112
120
|
},
|
|
113
121
|
"dependencies": {
|
|
114
122
|
"@codemirror/lang-markdown": "^6.5.0",
|
|
115
123
|
"@codemirror/state": "^6.6.0",
|
|
116
|
-
"meadow-connection-sqlite": "^1.0.19",
|
|
117
124
|
"@codemirror/view": "^6.41.0",
|
|
118
|
-
"bibliograph": "^0.
|
|
125
|
+
"bibliograph": "^1.0.0",
|
|
119
126
|
"codemirror": "^6.0.2",
|
|
120
|
-
"fable": "^3.1.
|
|
127
|
+
"fable": "^3.1.73",
|
|
121
128
|
"fable-serviceproviderbase": "^3.0.19",
|
|
122
129
|
"fast-xml-parser": "^5.5.10",
|
|
123
|
-
"meadow": "^2.0.
|
|
124
|
-
"meadow-connection-manager": "^1.1.
|
|
125
|
-
"meadow-connection-mysql": "^1.0.
|
|
126
|
-
"meadow-
|
|
127
|
-
"meadow-
|
|
128
|
-
"
|
|
129
|
-
"orator
|
|
130
|
-
"orator-
|
|
131
|
-
"
|
|
132
|
-
"pict
|
|
133
|
-
"pict-
|
|
134
|
-
"pict-
|
|
135
|
-
"pict-section-
|
|
136
|
-
"pict-section-
|
|
137
|
-
"pict-section-
|
|
138
|
-
"pict-section-
|
|
139
|
-
"
|
|
130
|
+
"meadow": "^2.0.39",
|
|
131
|
+
"meadow-connection-manager": "^1.1.2",
|
|
132
|
+
"meadow-connection-mysql": "^1.0.19",
|
|
133
|
+
"meadow-connection-sqlite": "^1.0.20",
|
|
134
|
+
"meadow-endpoints": "^4.0.21",
|
|
135
|
+
"meadow-integration": "^1.0.40",
|
|
136
|
+
"orator": "^6.1.2",
|
|
137
|
+
"orator-serviceserver-restify": "^2.0.11",
|
|
138
|
+
"orator-static-server": "^2.1.4",
|
|
139
|
+
"pict": "^1.0.369",
|
|
140
|
+
"pict-provider-theme": "^1.0.1",
|
|
141
|
+
"pict-router": "^1.0.10",
|
|
142
|
+
"pict-section-connection-form": "^1.0.0",
|
|
143
|
+
"pict-section-flow": "^1.0.1",
|
|
144
|
+
"pict-section-histogram": "^1.0.1",
|
|
145
|
+
"pict-section-markdowneditor": "^1.0.15",
|
|
146
|
+
"pict-section-modal": "^1.1.1",
|
|
147
|
+
"pict-section-objecteditor": "^1.0.3",
|
|
148
|
+
"pict-section-theme": "^1.0.5",
|
|
149
|
+
"stricture": "^4.0.3",
|
|
140
150
|
"xlsx": "^0.18.5"
|
|
151
|
+
},
|
|
152
|
+
"retold": {
|
|
153
|
+
"brand": {
|
|
154
|
+
"Hash": "retold-facto",
|
|
155
|
+
"Name": "Retold Facto",
|
|
156
|
+
"Tagline": "Data warehouse and knowledge graph storage",
|
|
157
|
+
"Palette": "forest",
|
|
158
|
+
"Icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"frame-retold-facto-filled-light\">\n\t\t\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\" fill=\"#419638\"/>\n\t\t<g clip-path=\"url(#frame-retold-facto-filled-light)\"><rect x=\"26\" y=\"14\" width=\"18\" height=\"68\" rx=\"4\" fill=\"rgba(255,255,255,0.18)\"/><rect x=\"52\" y=\"14\" width=\"18\" height=\"68\" rx=\"4\" fill=\"#c8bd52\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"38\" font-weight=\"700\"\n\t\t\tfill=\"#ffffff\" letter-spacing=\"-1\">RF</text>\n\t</svg>",
|
|
159
|
+
"IconType": "svg",
|
|
160
|
+
"Favicon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"fav-retold-facto-light\">\n\t\t\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\" fill=\"#419638\"/>\n\t\t<g clip-path=\"url(#fav-retold-facto-light)\"><rect x=\"20\" y=\"14\" width=\"56\" height=\"68\" rx=\"4\" fill=\"rgba(255,255,255,0.22)\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"60\" font-weight=\"800\"\n\t\t\tfill=\"#ffffff\" letter-spacing=\"-1\">R</text>\n\t</svg>",
|
|
161
|
+
"FaviconDark": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"fav-retold-facto-dark\">\n\t\t\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 24 2\n\t\tH 72\n\t\tQ 94 2 94 24\n\t\tV 72\n\t\tQ 94 94 72 94\n\t\tH 24\n\t\tQ 2 94 2 72\n\t\tV 24\n\t\tQ 2 2 24 2 Z\" fill=\"#73bf6b\"/>\n\t\t<g clip-path=\"url(#fav-retold-facto-dark)\"><rect x=\"20\" y=\"14\" width=\"56\" height=\"68\" rx=\"4\" fill=\"rgba(255,255,255,0.22)\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"60\" font-weight=\"800\"\n\t\t\tfill=\"#101418\" letter-spacing=\"-1\">R</text>\n\t</svg>",
|
|
162
|
+
"Colors": {
|
|
163
|
+
"Primary": "#419638",
|
|
164
|
+
"Secondary": "#c8bd52",
|
|
165
|
+
"PrimaryLight": "#419638",
|
|
166
|
+
"PrimaryDark": "#73bf6b",
|
|
167
|
+
"SecondaryLight": "#c8bd52",
|
|
168
|
+
"SecondaryDark": "#dad49c"
|
|
169
|
+
}
|
|
170
|
+
}
|
|
141
171
|
}
|
|
142
172
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Brand wrapper — deterministic brand block emitted by `npm run brand`
|
|
4
|
+
// (which calls pict-section-theme-brand with the Branding entry from
|
|
5
|
+
// Retold-Modules-Manifest.json). Passed to Theme-Section as the `Brand`
|
|
6
|
+
// option so the BrandMark wordmark + --brand-color-* variables are
|
|
7
|
+
// wired into every themed surface.
|
|
8
|
+
|
|
9
|
+
// services/web-app/Facto-Brand.js → three levels up to the package.json
|
|
10
|
+
const tmpPackage = require('../../../package.json');
|
|
11
|
+
|
|
12
|
+
if (!tmpPackage.retold || !tmpPackage.retold.brand)
|
|
13
|
+
{
|
|
14
|
+
throw new Error('retold-facto: package.json is missing retold.brand — '
|
|
15
|
+
+ 'run `npm run brand` (which calls pict-section-theme-brand) before building');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
module.exports = tmpPackage.retold.brand;
|
|
@@ -29,7 +29,7 @@ class FactoCatalogView extends libPictView
|
|
|
29
29
|
let tmpEntries = this.pict.AppData.Facto.CatalogEntries;
|
|
30
30
|
if (!tmpEntries || tmpEntries.length === 0)
|
|
31
31
|
{
|
|
32
|
-
tmpContainer.innerHTML = '<p style="color
|
|
32
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888); font-style:italic;">No catalog entries yet. Add sources to your research catalog.</p>';
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -37,7 +37,7 @@ class FactoCatalogView extends libPictView
|
|
|
37
37
|
for (let i = 0; i < tmpEntries.length; i++)
|
|
38
38
|
{
|
|
39
39
|
let tmpEntry = tmpEntries[i];
|
|
40
|
-
let tmpVerified = tmpEntry.Verified ? '<span style="color
|
|
40
|
+
let tmpVerified = tmpEntry.Verified ? '<span style="color:var(--theme-color-status-success, #28a745);">✓</span>' : '<span style="color:var(--theme-color-border-default, #ccc);">✗</span>';
|
|
41
41
|
tmpHtml += '<tr>';
|
|
42
42
|
tmpHtml += '<td>' + (tmpEntry.IDSourceCatalogEntry || '') + '</td>';
|
|
43
43
|
tmpHtml += '<td>' + (tmpEntry.Agency || '') + '</td>';
|
|
@@ -171,11 +171,11 @@ class FactoCatalogView extends libPictView
|
|
|
171
171
|
(pResponse) =>
|
|
172
172
|
{
|
|
173
173
|
let tmpDatasets = (pResponse && pResponse.Datasets) ? pResponse.Datasets : [];
|
|
174
|
-
let tmpHtml = '<h3 style="margin-bottom:8px; font-size:1em; color
|
|
174
|
+
let tmpHtml = '<h3 style="margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Dataset Definitions for Entry #' + pIDEntry + '</h3>';
|
|
175
175
|
|
|
176
176
|
if (tmpDatasets.length === 0)
|
|
177
177
|
{
|
|
178
|
-
tmpHtml += '<p style="color
|
|
178
|
+
tmpHtml += '<p style="color:var(--theme-color-text-muted, #888); font-style:italic; margin-bottom:8px;">No dataset definitions yet.</p>';
|
|
179
179
|
}
|
|
180
180
|
else
|
|
181
181
|
{
|
|
@@ -184,8 +184,8 @@ class FactoCatalogView extends libPictView
|
|
|
184
184
|
{
|
|
185
185
|
let tmpDS = tmpDatasets[i];
|
|
186
186
|
let tmpStatusLabel = tmpDS.Provisioned
|
|
187
|
-
? '<span style="color
|
|
188
|
-
: '<span style="color
|
|
187
|
+
? '<span style="color:var(--theme-color-status-success, #28a745);">Provisioned (Source #' + tmpDS.IDSource + ', Dataset #' + tmpDS.IDDataset + ')</span>'
|
|
188
|
+
: '<span style="color:var(--theme-color-text-muted, #888);">Not provisioned</span>';
|
|
189
189
|
let tmpActionBtn = '';
|
|
190
190
|
if (tmpDS.Provisioned)
|
|
191
191
|
{
|
|
@@ -209,7 +209,7 @@ class FactoCatalogView extends libPictView
|
|
|
209
209
|
}
|
|
210
210
|
|
|
211
211
|
// Add dataset definition form
|
|
212
|
-
tmpHtml += '<h4 style="margin-top:12px; margin-bottom:8px; font-size:0.95em; color
|
|
212
|
+
tmpHtml += '<h4 style="margin-top:12px; margin-bottom:8px; font-size:0.95em; color:var(--theme-color-text-secondary, #555);">Add Dataset Definition</h4>';
|
|
213
213
|
tmpHtml += '<div class="inline-group">';
|
|
214
214
|
tmpHtml += '<div><label for="facto-catds-name">Name</label><input type="text" id="facto-catds-name" placeholder="e.g. Monthly Earthquake Feed"></div>';
|
|
215
215
|
tmpHtml += '<div><label for="facto-catds-format">Format</label>';
|
|
@@ -418,7 +418,7 @@ module.exports.default_configuration =
|
|
|
418
418
|
<span class="accordion-toggle">▼</span>
|
|
419
419
|
</div>
|
|
420
420
|
<div class="accordion-body">
|
|
421
|
-
<p style="margin-bottom:12px; color
|
|
421
|
+
<p style="margin-bottom:12px; color:var(--theme-color-text-secondary, #666); font-size:0.9em;">Research and catalog potential data sources before provisioning them as runtime Sources and Datasets.</p>
|
|
422
422
|
|
|
423
423
|
<!-- Search -->
|
|
424
424
|
<div class="inline-group" style="margin-bottom:12px;">
|
|
@@ -437,7 +437,7 @@ module.exports.default_configuration =
|
|
|
437
437
|
<div id="facto-catalog-detail" style="margin-top:12px;"></div>
|
|
438
438
|
|
|
439
439
|
<!-- Add entry form -->
|
|
440
|
-
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color
|
|
440
|
+
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Add Catalog Entry</h3>
|
|
441
441
|
<div class="inline-group">
|
|
442
442
|
<div>
|
|
443
443
|
<label for="facto-catalog-agency">Agency / Organization</label>
|
|
@@ -504,8 +504,8 @@ module.exports.default_configuration =
|
|
|
504
504
|
<button class="primary" onclick="pict.views['Facto-Catalog'].addEntry()">Add Catalog Entry</button>
|
|
505
505
|
|
|
506
506
|
<!-- Import / Export -->
|
|
507
|
-
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color
|
|
508
|
-
<textarea id="facto-catalog-import-json" rows="4" style="width:100%; font-family:monospace; font-size:0.85em; padding:8px; border:1px solid #ccc; border-radius:4px; margin-bottom:8px;" placeholder="Paste JSON array of catalog entries here..."></textarea>
|
|
507
|
+
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Import / Export</h3>
|
|
508
|
+
<textarea id="facto-catalog-import-json" rows="4" style="width:100%; font-family:monospace; font-size:0.85em; padding:8px; border:1px solid var(--theme-color-border-default, #ccc); border-radius:4px; margin-bottom:8px;" placeholder="Paste JSON array of catalog entries here..."></textarea>
|
|
509
509
|
<button class="primary" onclick="pict.views['Facto-Catalog'].importCatalog()">Import JSON</button>
|
|
510
510
|
<button class="secondary" onclick="pict.views['Facto-Catalog'].exportCatalog()">Export Catalog</button>
|
|
511
511
|
|
|
@@ -28,7 +28,7 @@ class FactoDatasetsView extends libPictView
|
|
|
28
28
|
let tmpDatasets = this.pict.AppData.Facto.Datasets;
|
|
29
29
|
if (!tmpDatasets || tmpDatasets.length === 0)
|
|
30
30
|
{
|
|
31
|
-
tmpContainer.innerHTML = '<p style="color
|
|
31
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888); font-style:italic;">No datasets created yet.</p>';
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -131,10 +131,10 @@ module.exports.default_configuration =
|
|
|
131
131
|
<span class="accordion-toggle">▼</span>
|
|
132
132
|
</div>
|
|
133
133
|
<div class="accordion-body">
|
|
134
|
-
<p style="margin-bottom:12px; color
|
|
134
|
+
<p style="margin-bottom:12px; color:var(--theme-color-text-secondary, #666); font-size:0.9em;">Datasets are named collections of records. Types: Raw (ingested), Compositional (merged), Projection (flattened), Derived (computed).</p>
|
|
135
135
|
<div id="facto-datasets-list"></div>
|
|
136
136
|
|
|
137
|
-
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color
|
|
137
|
+
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Create Dataset</h3>
|
|
138
138
|
<div class="inline-group">
|
|
139
139
|
<div>
|
|
140
140
|
<label for="facto-dataset-name">Name</label>
|
|
@@ -28,7 +28,7 @@ class FactoIngestView extends libPictView
|
|
|
28
28
|
let tmpJobs = this.pict.AppData.Facto.IngestJobs;
|
|
29
29
|
if (!tmpJobs || tmpJobs.length === 0)
|
|
30
30
|
{
|
|
31
|
-
tmpContainer.innerHTML = '<p style="color
|
|
31
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888); font-style:italic;">No ingest jobs yet.</p>';
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -197,10 +197,10 @@ module.exports.default_configuration =
|
|
|
197
197
|
<span class="accordion-toggle">▼</span>
|
|
198
198
|
</div>
|
|
199
199
|
<div class="accordion-body">
|
|
200
|
-
<p style="margin-bottom:12px; color
|
|
200
|
+
<p style="margin-bottom:12px; color:var(--theme-color-text-secondary, #666); font-size:0.9em;">Track data ingest operations from configured sources into datasets.</p>
|
|
201
201
|
<div id="facto-ingest-list"></div>
|
|
202
202
|
|
|
203
|
-
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color
|
|
203
|
+
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Create Ingest Job</h3>
|
|
204
204
|
<div class="inline-group">
|
|
205
205
|
<div>
|
|
206
206
|
<label for="facto-ingest-source">Source ID</label>
|
|
@@ -215,8 +215,8 @@ module.exports.default_configuration =
|
|
|
215
215
|
|
|
216
216
|
<pre id="facto-ingest-log" style="display:none; margin-top:12px; padding:12px; background:#f8f9fa; border:1px solid #e9ecef; border-radius:4px; font-size:0.85em; max-height:200px; overflow:auto; white-space:pre-wrap;"></pre>
|
|
217
217
|
|
|
218
|
-
<h3 style="margin-top:20px; margin-bottom:8px; font-size:1em; color
|
|
219
|
-
<p style="margin-bottom:8px; color
|
|
218
|
+
<h3 style="margin-top:20px; margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Paste & Ingest</h3>
|
|
219
|
+
<p style="margin-bottom:8px; color:var(--theme-color-text-secondary, #666); font-size:0.85em;">Paste CSV or JSON content directly to ingest records.</p>
|
|
220
220
|
<div class="inline-group">
|
|
221
221
|
<div>
|
|
222
222
|
<label for="facto-ingest-paste-dataset">Dataset ID</label>
|
|
@@ -239,7 +239,7 @@ module.exports.default_configuration =
|
|
|
239
239
|
<input type="text" id="facto-ingest-paste-type" placeholder="data">
|
|
240
240
|
</div>
|
|
241
241
|
</div>
|
|
242
|
-
<textarea id="facto-ingest-paste-content" rows="6" style="width:100%; padding:8px 12px; border:1px solid #ccc; border-radius:4px; font-size:0.9em; font-family:monospace; margin-bottom:10px;" placeholder="Paste CSV or JSON data here..."></textarea>
|
|
242
|
+
<textarea id="facto-ingest-paste-content" rows="6" style="width:100%; padding:8px 12px; border:1px solid var(--theme-color-border-default, #ccc); border-radius:4px; font-size:0.9em; font-family:monospace; margin-bottom:10px;" placeholder="Paste CSV or JSON data here..."></textarea>
|
|
243
243
|
<button class="primary" onclick="pict.views['Facto-Ingest'].ingestPastedContent()">Ingest</button>
|
|
244
244
|
|
|
245
245
|
</div>
|
|
@@ -57,11 +57,11 @@ module.exports.default_configuration =
|
|
|
57
57
|
DefaultDestinationAddress: '#Facto-Application-Container',
|
|
58
58
|
CSS: /*css*/`
|
|
59
59
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
60
|
-
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f5f5; color: #333; padding: 20px; }
|
|
61
|
-
h1 { margin-bottom: 20px; color: #1a1a1a; }
|
|
62
|
-
h2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px solid #ddd; padding-bottom: 6px; }
|
|
60
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--theme-color-background-secondary, #f5f5f5); color: var(--theme-color-text-primary, #333); padding: 20px; }
|
|
61
|
+
h1 { margin-bottom: 20px; color: var(--theme-color-text-primary, #1a1a1a); }
|
|
62
|
+
h2 { margin-bottom: 12px; color: var(--theme-color-text-secondary, #444); font-size: 1.2em; border-bottom: 2px solid var(--theme-color-border-default, #ddd); padding-bottom: 6px; }
|
|
63
63
|
|
|
64
|
-
.section { background: #fff; border-radius: 8px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
|
64
|
+
.section { background: var(--theme-color-background-panel, #fff); border-radius: 8px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
|
65
65
|
|
|
66
66
|
/* Accordion layout */
|
|
67
67
|
.accordion-row { display: flex; gap: 0; margin-bottom: 16px; align-items: stretch; }
|
|
@@ -71,25 +71,25 @@ h2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px soli
|
|
|
71
71
|
user-select: none;
|
|
72
72
|
}
|
|
73
73
|
.accordion-card {
|
|
74
|
-
flex: 1; background: #fff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
|
74
|
+
flex: 1; background: var(--theme-color-background-panel, #fff); border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
|
75
75
|
overflow: hidden; min-width: 0;
|
|
76
76
|
}
|
|
77
77
|
.accordion-header {
|
|
78
78
|
display: flex; align-items: center; padding: 14px 20px; cursor: pointer;
|
|
79
79
|
user-select: none; gap: 12px; transition: background 0.15s; line-height: 1.4;
|
|
80
80
|
}
|
|
81
|
-
.accordion-header:hover { background: #fafafa; }
|
|
82
|
-
.accordion-title { font-weight: 600; color: #333; font-size: 1.05em; white-space: nowrap; }
|
|
83
|
-
.accordion-preview { flex: 1; font-style: italic; color: #888; font-size: 0.9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
81
|
+
.accordion-header:hover { background: var(--theme-color-background-secondary, #fafafa); }
|
|
82
|
+
.accordion-title { font-weight: 600; color: var(--theme-color-text-primary, #333); font-size: 1.05em; white-space: nowrap; }
|
|
83
|
+
.accordion-preview { flex: 1; font-style: italic; color: var(--theme-color-text-muted, #888); font-size: 0.9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
84
84
|
.accordion-toggle {
|
|
85
85
|
flex: 0 0 20px; display: flex; align-items: center; justify-content: center;
|
|
86
|
-
border-radius: 4px; transition: background 0.15s, transform 0.25s; font-size: 0.7em; color: #888;
|
|
86
|
+
border-radius: 4px; transition: background 0.15s, transform 0.25s; font-size: 0.7em; color: var(--theme-color-text-muted, #888);
|
|
87
87
|
}
|
|
88
|
-
.accordion-header:hover .accordion-toggle { background: #eee; color: #555; }
|
|
88
|
+
.accordion-header:hover .accordion-toggle { background: var(--theme-color-border-light, #eee); color: var(--theme-color-text-secondary, #555); }
|
|
89
89
|
.accordion-card.open .accordion-toggle { transform: rotate(180deg); }
|
|
90
90
|
.accordion-body { padding: 0 20px 20px; display: none; }
|
|
91
91
|
.accordion-card.open .accordion-body { display: block; }
|
|
92
|
-
.accordion-card.open .accordion-header { border-bottom: 1px solid #eee; }
|
|
92
|
+
.accordion-card.open .accordion-header { border-bottom: 1px solid var(--theme-color-border-light, #eee); }
|
|
93
93
|
.accordion-card.open .accordion-preview { display: none; }
|
|
94
94
|
|
|
95
95
|
.accordion-controls {
|
|
@@ -97,13 +97,13 @@ h2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px soli
|
|
|
97
97
|
}
|
|
98
98
|
.accordion-controls button {
|
|
99
99
|
padding: 4px 10px; font-size: 0.82em; font-weight: 500; background: none;
|
|
100
|
-
border: 1px solid #ccc; border-radius: 4px; color: #666; cursor: pointer; margin: 0;
|
|
100
|
+
border: 1px solid var(--theme-color-border-default, #ccc); border-radius: 4px; color: var(--theme-color-text-secondary, #666); cursor: pointer; margin: 0;
|
|
101
101
|
}
|
|
102
|
-
.accordion-controls button:hover { background: #f0f0f0; border-color: #aaa; color: #333; }
|
|
102
|
+
.accordion-controls button:hover { background: var(--theme-color-background-tertiary, #f0f0f0); border-color: var(--theme-color-text-muted, #aaa); color: var(--theme-color-text-primary, #333); }
|
|
103
103
|
|
|
104
104
|
label { display: block; font-weight: 600; margin-bottom: 4px; font-size: 0.9em; }
|
|
105
105
|
input[type="text"], input[type="password"], input[type="number"] {
|
|
106
|
-
width: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px;
|
|
106
|
+
width: 100%; padding: 8px 12px; border: 1px solid var(--theme-color-border-default, #ccc); border-radius: 4px;
|
|
107
107
|
font-size: 0.95em; margin-bottom: 10px;
|
|
108
108
|
}
|
|
109
109
|
input[type="text"]:focus, input[type="password"]:focus, input[type="number"]:focus {
|
|
@@ -114,13 +114,13 @@ button {
|
|
|
114
114
|
padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer;
|
|
115
115
|
font-size: 0.9em; font-weight: 600; margin-right: 8px; margin-bottom: 8px;
|
|
116
116
|
}
|
|
117
|
-
button.primary { background: #4a90d9; color: #fff; }
|
|
117
|
+
button.primary { background: #4a90d9; color: var(--theme-color-background-panel, #fff); }
|
|
118
118
|
button.primary:hover { background: #357abd; }
|
|
119
|
-
button.secondary { background: #6c757d; color: #fff; }
|
|
119
|
+
button.secondary { background: #6c757d; color: var(--theme-color-background-panel, #fff); }
|
|
120
120
|
button.secondary:hover { background: #5a6268; }
|
|
121
|
-
button.danger { background: #dc3545; color: #fff; }
|
|
121
|
+
button.danger { background: #dc3545; color: var(--theme-color-background-panel, #fff); }
|
|
122
122
|
button.danger:hover { background: #c82333; }
|
|
123
|
-
button.success { background: #28a745; color: #fff; }
|
|
123
|
+
button.success { background: var(--theme-color-status-success, #28a745); color: var(--theme-color-background-panel, #fff); }
|
|
124
124
|
button.success:hover { background: #218838; }
|
|
125
125
|
button:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
126
126
|
|
|
@@ -135,12 +135,12 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
|
135
135
|
|
|
136
136
|
a { color: #4a90d9; }
|
|
137
137
|
|
|
138
|
-
select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px; font-size: 0.95em; margin-bottom: 10px; }
|
|
138
|
+
select { background: var(--theme-color-background-panel, #fff); width: 100%; padding: 8px 12px; border: 1px solid var(--theme-color-border-default, #ccc); border-radius: 4px; font-size: 0.95em; margin-bottom: 10px; }
|
|
139
139
|
|
|
140
140
|
table { width: 100%; border-collapse: collapse; font-size: 0.9em; }
|
|
141
|
-
th { text-align: left; font-weight: 600; padding: 8px; border-bottom: 2px solid #ddd; color: #555; }
|
|
142
|
-
td { padding: 8px; border-bottom: 1px solid #eee; }
|
|
143
|
-
tr:hover { background: #fafafa; }
|
|
141
|
+
th { text-align: left; font-weight: 600; padding: 8px; border-bottom: 2px solid var(--theme-color-border-default, #ddd); color: var(--theme-color-text-secondary, #555); }
|
|
142
|
+
td { padding: 8px; border-bottom: 1px solid var(--theme-color-border-light, #eee); }
|
|
143
|
+
tr:hover { background: var(--theme-color-background-secondary, #fafafa); }
|
|
144
144
|
|
|
145
145
|
.badge { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 0.8em; font-weight: 600; }
|
|
146
146
|
.badge-raw { background: #d1ecf1; color: #0c5460; }
|
|
@@ -152,7 +152,7 @@ tr:hover { background: #fafafa; }
|
|
|
152
152
|
.certainty-fill { height: 100%; border-radius: 4px; }
|
|
153
153
|
.certainty-low { background: #dc3545; }
|
|
154
154
|
.certainty-mid { background: #ffc107; }
|
|
155
|
-
.certainty-high { background: #28a745; }
|
|
155
|
+
.certainty-high { background: var(--theme-color-status-success, #28a745); }
|
|
156
156
|
`,
|
|
157
157
|
Templates:
|
|
158
158
|
[
|
|
@@ -160,7 +160,7 @@ tr:hover { background: #fafafa; }
|
|
|
160
160
|
Hash: 'Facto-Layout',
|
|
161
161
|
Template: /*html*/`
|
|
162
162
|
<h1>Retold Facto</h1>
|
|
163
|
-
<p style="color
|
|
163
|
+
<p style="color:var(--theme-color-text-secondary, #666); margin-bottom:20px; font-size:0.95em;">Data Warehouse & Knowledge Graph Storage</p>
|
|
164
164
|
|
|
165
165
|
<!-- Expand / Collapse All -->
|
|
166
166
|
<div class="accordion-controls">
|
|
@@ -30,7 +30,7 @@ class FactoProjectionsView extends libPictView
|
|
|
30
30
|
|
|
31
31
|
if (pResponse.DatasetsByType)
|
|
32
32
|
{
|
|
33
|
-
tmpHtml += '<tr><td colspan="4" style="padding-top:12px; font-weight:600; border-bottom:2px solid #ddd;">Datasets by Type</td></tr>';
|
|
33
|
+
tmpHtml += '<tr><td colspan="4" style="padding-top:12px; font-weight:600; border-bottom:2px solid var(--theme-color-border-default, #ddd);">Datasets by Type</td></tr>';
|
|
34
34
|
tmpHtml += '<tr>';
|
|
35
35
|
tmpHtml += '<td><span class="badge badge-raw">Raw</span></td><td>' + (pResponse.DatasetsByType.Raw || 0) + '</td>';
|
|
36
36
|
tmpHtml += '<td><span class="badge badge-compositional">Compositional</span></td><td>' + (pResponse.DatasetsByType.Compositional || 0) + '</td>';
|
|
@@ -132,7 +132,7 @@ class FactoProjectionsView extends libPictView
|
|
|
132
132
|
|
|
133
133
|
if (!pResponse || !pResponse.Records || pResponse.Records.length === 0)
|
|
134
134
|
{
|
|
135
|
-
tmpContainer.innerHTML = '<p style="color
|
|
135
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888); font-style:italic;">No records match the query.</p>';
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
138
|
|
|
@@ -179,12 +179,12 @@ module.exports.default_configuration =
|
|
|
179
179
|
<span class="accordion-toggle">▼</span>
|
|
180
180
|
</div>
|
|
181
181
|
<div class="accordion-body">
|
|
182
|
-
<p style="margin-bottom:12px; color
|
|
182
|
+
<p style="margin-bottom:12px; color:var(--theme-color-text-secondary, #666); font-size:0.9em;">Query across datasets, compare data, and view warehouse-wide statistics.</p>
|
|
183
183
|
|
|
184
|
-
<h3 style="margin-bottom:8px; font-size:1em; color
|
|
185
|
-
<div id="facto-projections-summary" style="margin-bottom:16px;"><p style="color
|
|
184
|
+
<h3 style="margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Warehouse Summary</h3>
|
|
185
|
+
<div id="facto-projections-summary" style="margin-bottom:16px;"><p style="color:var(--theme-color-text-muted, #888); font-style:italic;">Loading...</p></div>
|
|
186
186
|
|
|
187
|
-
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color
|
|
187
|
+
<h3 style="margin-top:16px; margin-bottom:8px; font-size:1em; color:var(--theme-color-text-secondary, #444);">Cross-Dataset Query</h3>
|
|
188
188
|
<div class="inline-group">
|
|
189
189
|
<div>
|
|
190
190
|
<label for="facto-proj-dataset-ids">Dataset IDs (comma-separated)</label>
|
|
@@ -28,7 +28,7 @@ class FactoRecordsView extends libPictView
|
|
|
28
28
|
let tmpRecords = this.pict.AppData.Facto.Records;
|
|
29
29
|
if (!tmpRecords || tmpRecords.length === 0)
|
|
30
30
|
{
|
|
31
|
-
tmpContainer.innerHTML = '<p style="color
|
|
31
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888); font-style:italic;">No records ingested yet.</p>';
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -58,7 +58,7 @@ class FactoRecordsView extends libPictView
|
|
|
58
58
|
{
|
|
59
59
|
tmpHtml += '<button class="secondary" style="padding:4px 12px; font-size:0.85em;" onclick="pict.views[\'Facto-Records\'].changePage(' + (tmpPage - 1) + ')">◀ Previous</button>';
|
|
60
60
|
}
|
|
61
|
-
tmpHtml += '<span style="color
|
|
61
|
+
tmpHtml += '<span style="color:var(--theme-color-text-muted, #888); font-size:0.85em;">Page ' + (tmpPage + 1) + '</span>';
|
|
62
62
|
if (tmpRecords.length >= this.pict.AppData.Facto.RecordPageSize)
|
|
63
63
|
{
|
|
64
64
|
tmpHtml += '<button class="secondary" style="padding:4px 12px; font-size:0.85em;" onclick="pict.views[\'Facto-Records\'].changePage(' + (tmpPage + 1) + ')">Next ▶</button>';
|
|
@@ -307,7 +307,7 @@ module.exports.default_configuration =
|
|
|
307
307
|
<span class="accordion-toggle">▼</span>
|
|
308
308
|
</div>
|
|
309
309
|
<div class="accordion-body">
|
|
310
|
-
<p style="margin-bottom:12px; color
|
|
310
|
+
<p style="margin-bottom:12px; color:var(--theme-color-text-secondary, #666); font-size:0.9em;">Individual data records with versioning, certainty indices, and temporal metadata.</p>
|
|
311
311
|
<div id="facto-records-list"></div>
|
|
312
312
|
</div>
|
|
313
313
|
</div>
|
|
@@ -40,7 +40,7 @@ class FactoScannerView extends libPictView
|
|
|
40
40
|
|
|
41
41
|
if (tmpPaths.length === 0)
|
|
42
42
|
{
|
|
43
|
-
tmpContainer.innerHTML = '<p style="color
|
|
43
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888); font-style:italic;">No scan paths configured. Add a folder path to discover datasets.</p>';
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -71,7 +71,7 @@ class FactoScannerView extends libPictView
|
|
|
71
71
|
|
|
72
72
|
if (tmpDatasets.length === 0)
|
|
73
73
|
{
|
|
74
|
-
tmpContainer.innerHTML = '<p style="color
|
|
74
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888); font-style:italic;">No datasets discovered yet. Add a scan path containing dataset folders with README.md files.</p>';
|
|
75
75
|
this.updateSummary(0, 0, 0, 0);
|
|
76
76
|
return;
|
|
77
77
|
}
|
|
@@ -154,7 +154,7 @@ class FactoScannerView extends libPictView
|
|
|
154
154
|
tmpHtml += '</tr>';
|
|
155
155
|
}
|
|
156
156
|
tmpHtml += '</tbody></table>';
|
|
157
|
-
tmpHtml += '<p style="color
|
|
157
|
+
tmpHtml += '<p style="color:var(--theme-color-text-muted, #888); font-size:0.85em; margin-top:8px;">Showing ' + tmpFiltered.length + ' of ' + tmpDatasets.length + ' dataset(s)</p>';
|
|
158
158
|
|
|
159
159
|
tmpContainer.innerHTML = tmpHtml;
|
|
160
160
|
}
|
|
@@ -423,7 +423,7 @@ class FactoScannerView extends libPictView
|
|
|
423
423
|
let tmpContainer = document.getElementById('facto-scanner-detail');
|
|
424
424
|
if (!tmpContainer) return;
|
|
425
425
|
|
|
426
|
-
tmpContainer.innerHTML = '<p style="color
|
|
426
|
+
tmpContainer.innerHTML = '<p style="color:var(--theme-color-text-muted, #888);">Loading details for ' + this.escapeHtml(pFolderName) + '...</p>';
|
|
427
427
|
|
|
428
428
|
this.pict.providers.Facto.loadScannerDatasetDetail(pFolderName).then(
|
|
429
429
|
(pDS) =>
|
|
@@ -434,9 +434,9 @@ class FactoScannerView extends libPictView
|
|
|
434
434
|
return;
|
|
435
435
|
}
|
|
436
436
|
|
|
437
|
-
let tmpHtml = '<div style="border:1px solid #ddd; border-radius:6px; padding:16px; background
|
|
437
|
+
let tmpHtml = '<div style="border:1px solid var(--theme-color-border-default, #ddd); border-radius:6px; padding:16px; background:var(--theme-color-background-secondary, #fafafa);">';
|
|
438
438
|
tmpHtml += '<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:12px;">';
|
|
439
|
-
tmpHtml += '<h3 style="margin:0; font-size:1.1em; color
|
|
439
|
+
tmpHtml += '<h3 style="margin:0; font-size:1.1em; color:var(--theme-color-text-primary, #333);">' + this.escapeHtml(pDS.Title || pDS.FolderName) + '</h3>';
|
|
440
440
|
tmpHtml += '<button class="secondary" style="padding:4px 10px; font-size:0.82em;" onclick="document.getElementById(\'facto-scanner-detail\').innerHTML=\'\';">Close</button>';
|
|
441
441
|
tmpHtml += '</div>';
|
|
442
442
|
|
|
@@ -471,7 +471,7 @@ class FactoScannerView extends libPictView
|
|
|
471
471
|
// Description
|
|
472
472
|
if (pDS.Description)
|
|
473
473
|
{
|
|
474
|
-
tmpHtml += '<div style="margin-bottom:12px;"><strong>Description:</strong><div style="color
|
|
474
|
+
tmpHtml += '<div style="margin-bottom:12px;"><strong>Description:</strong><div style="color:var(--theme-color-text-secondary, #555); font-size:0.9em; margin-top:4px; max-height:100px; overflow-y:auto; white-space:pre-wrap;">' + this.escapeHtml(pDS.Description.substring(0, 500)) + '</div></div>';
|
|
475
475
|
}
|
|
476
476
|
|
|
477
477
|
// Data files
|
|
@@ -492,7 +492,7 @@ class FactoScannerView extends libPictView
|
|
|
492
492
|
}
|
|
493
493
|
if (pDS.DataFiles.length > 20)
|
|
494
494
|
{
|
|
495
|
-
tmpHtml += '<tr><td colspan="4" style="color
|
|
495
|
+
tmpHtml += '<tr><td colspan="4" style="color:var(--theme-color-text-muted, #888);">...and ' + (pDS.DataFiles.length - 20) + ' more file(s)</td></tr>';
|
|
496
496
|
}
|
|
497
497
|
tmpHtml += '</tbody></table></div>';
|
|
498
498
|
}
|
|
@@ -561,10 +561,10 @@ module.exports.default_configuration =
|
|
|
561
561
|
<span class="accordion-toggle">▼</span>
|
|
562
562
|
</div>
|
|
563
563
|
<div class="accordion-body">
|
|
564
|
-
<p style="margin-bottom:12px; color
|
|
564
|
+
<p style="margin-bottom:12px; color:var(--theme-color-text-secondary, #666); font-size:0.9em;">Point the scanner at folder trees containing dataset research (README.md + data/). Discovered datasets can be provisioned into the database individually or in bulk.</p>
|
|
565
565
|
|
|
566
566
|
<!-- Summary -->
|
|
567
|
-
<div id="facto-scanner-summary" style="margin-bottom:12px; padding:8px 12px; background:#e9ecef; border-radius:4px; font-size:0.9em; color
|
|
567
|
+
<div id="facto-scanner-summary" style="margin-bottom:12px; padding:8px 12px; background:#e9ecef; border-radius:4px; font-size:0.9em; color:var(--theme-color-text-secondary, #555);">
|
|
568
568
|
No datasets loaded
|
|
569
569
|
</div>
|
|
570
570
|
|