retold-data-service 2.1.2 → 2.1.5

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.
Files changed (80) hide show
  1. package/BUILDING-AND-PUBLISHING.md +2 -2
  2. package/Dockerfile +1 -1
  3. package/README.md +12 -27
  4. package/build-all.js +66 -0
  5. package/diagrams/architecture.excalidraw +2966 -0
  6. package/diagrams/architecture.mmd +17 -0
  7. package/diagrams/architecture.svg +2 -0
  8. package/docs/README.md +12 -12
  9. package/docs/_brand.json +18 -0
  10. package/docs/_cover.md +1 -1
  11. package/docs/_topbar.md +1 -1
  12. package/docs/_version.json +3 -3
  13. package/docs/api/reference.md +8 -8
  14. package/docs/architecture.md +6 -84
  15. package/docs/diagrams/component-diagram.excalidraw +2807 -0
  16. package/docs/diagrams/component-diagram.mmd +14 -0
  17. package/docs/diagrams/component-diagram.svg +2 -0
  18. package/docs/diagrams/component-stack.excalidraw +1169 -0
  19. package/docs/diagrams/component-stack.mmd +6 -0
  20. package/docs/diagrams/component-stack.svg +2 -0
  21. package/docs/diagrams/hook-execution-order.excalidraw +3230 -0
  22. package/docs/diagrams/hook-execution-order.mmd +19 -0
  23. package/docs/diagrams/hook-execution-order.svg +2 -0
  24. package/docs/diagrams/initialization-flow.excalidraw +1800 -0
  25. package/docs/diagrams/initialization-flow.mmd +22 -0
  26. package/docs/diagrams/initialization-flow.svg +2 -0
  27. package/docs/index.html +6 -7
  28. package/docs/lifecycle-hooks.md +2 -21
  29. package/docs/retold-catalog.json +141 -141
  30. package/docs/retold-keyword-index.json +6818 -1608
  31. package/package.json +130 -96
  32. package/source/services/RetoldDataService-Brand.js +13 -0
  33. package/source/services/comprehension-loader/pict-app/Pict-Application-ComprehensionLoader.js +65 -15
  34. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Layout.js +28 -74
  35. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Load.js +17 -17
  36. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-SettingsPanel.js +62 -0
  37. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Shell.js +142 -0
  38. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-StatusBar.js +125 -0
  39. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-StatusDetail.js +89 -0
  40. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-TopBar-Nav.js +42 -0
  41. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-TopBar-User.js +48 -0
  42. package/source/services/comprehension-loader/web/comprehension-loader.js +5415 -6183
  43. package/source/services/comprehension-loader/web/comprehension-loader.js.map +1 -1
  44. package/source/services/comprehension-loader/web/comprehension-loader.min.js +75 -1
  45. package/source/services/comprehension-loader/web/comprehension-loader.min.js.map +1 -1
  46. package/source/services/comprehension-loader/web/favicons/favicon-dark.svg +13 -0
  47. package/source/services/comprehension-loader/web/favicons/favicon-light.svg +13 -0
  48. package/source/services/comprehension-loader/web/favicons/favicon.svg +13 -0
  49. package/source/services/comprehension-loader/web/index.html +3 -0
  50. package/source/services/comprehension-loader/web/pict.min.js +12 -0
  51. package/source/services/data-cloner/DataCloner-Command-Headless.js +2 -1
  52. package/source/services/data-cloner/DataCloner-Command-Sync.js +110 -75
  53. package/source/services/data-cloner/pict-app/Pict-Application-DataCloner.js +70 -47
  54. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Export.js +3 -3
  55. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Layout.js +40 -86
  56. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-SettingsPanel.js +61 -0
  57. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Shell.js +136 -0
  58. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-StatusBar.js +117 -0
  59. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-StatusDetail.js +81 -0
  60. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Sync.js +18 -18
  61. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-TopBar-Nav.js +42 -0
  62. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-TopBar-User.js +48 -0
  63. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-ViewData.js +2 -2
  64. package/source/services/data-cloner/web/data-cloner.js +5772 -7986
  65. package/source/services/data-cloner/web/data-cloner.js.map +1 -1
  66. package/source/services/data-cloner/web/data-cloner.min.js +75 -1
  67. package/source/services/data-cloner/web/data-cloner.min.js.map +1 -1
  68. package/source/services/data-cloner/web/favicons/favicon-dark.svg +13 -0
  69. package/source/services/data-cloner/web/favicons/favicon-light.svg +13 -0
  70. package/source/services/data-cloner/web/favicons/favicon.svg +13 -0
  71. package/source/services/data-cloner/web/favicons/favicons/favicon-dark.svg +13 -0
  72. package/source/services/data-cloner/web/favicons/favicons/favicon-light.svg +13 -0
  73. package/source/services/data-cloner/web/favicons/favicons/favicon.svg +13 -0
  74. package/source/services/data-cloner/web/index.html +3 -0
  75. package/source/services/data-cloner/web/pict.min.js +12 -0
  76. package/test/Bundles_smoke_tests.js +43 -0
  77. package/test/ComprehensionLoader_smoke_tests.js +95 -0
  78. package/test/DataCloner-RuntimeOverrides_tests.js +344 -0
  79. package/test/DataCloner_smoke_tests.js +87 -0
  80. package/docs/css/docuserve.css +0 -327
package/package.json CHANGED
@@ -1,98 +1,132 @@
1
1
  {
2
- "name": "retold-data-service",
3
- "version": "2.1.2",
4
- "description": "Serve up a whole model!",
5
- "main": "source/Retold-Data-Service.js",
6
- "bin": {
7
- "retold-data-service-clone": "bin/retold-data-service-clone.js"
8
- },
9
- "scripts": {
10
- "start": "node bin/retold-data-service-clone.js",
11
- "coverage": "npx quack coverage",
12
- "test": "npx quack test",
13
- "build": "npx quack build",
14
- "prepublishOnly": "npx quack build",
15
- "build-test-model": "cd test && npx stricture -i model/ddl/BookStore.ddl",
16
- "docker-dev-build": "docker build ./ -f Dockerfile_LUXURYCode -t retold-data-service-image:local",
17
- "docker-dev-run": "docker run -it -d --name retold-data-service-dev -p 44444:8080 -p 43306:3306 -p 48086:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/retold-data-service\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" retold-data-service-image:local",
18
- "docker-dev-shell": "docker exec -it retold-data-service-dev /bin/bash",
19
- "docker-service-build": "docker build ./ -f Dockerfile_Service -t retold-data-service-server-image:local",
20
- "docker-service-run-test": "docker run -it --init -d --name retold-data-service -p 8086:8086 -p 43306:3306 -v \"$(pwd):/retold-data-service:z\" -u \"$(id -u):$(id -g)\" retold-data-service-server-image:local",
21
- "docker-service-run": "docker run -it --init -d --name retold-data-service -p 8086:8086 -p 43306:3306 -v \"$(pwd):/retold-data-service:z\" retold-data-service-server-image:local",
22
- "docker-service-shell": "docker exec -it retold-data-service /bin/bash",
23
- "test:integration": "node test/run-integration-tests.js",
24
- "test:integration:no-browser": "node test/run-integration-tests.js --skip-puppeteer",
25
- "test:all": "npx quack test && node test/run-integration-tests.js --skip-puppeteer",
26
- "postversion": "npx quack release postversion",
27
- "postpublish": "npx quack release postpublish",
28
- "publish:docker": "npx quack release publish --image",
29
- "release:patch": "npx quack release patch",
30
- "release:minor": "npx quack release minor",
31
- "release:major": "npx quack release major",
32
- "release:patch:image": "npx quack release patch --image",
33
- "release:minor:image": "npx quack release minor --image",
34
- "release:major:image": "npx quack release major --image"
35
- },
36
- "mocha": {
37
- "spec": "test/RetoldDataService_tests.js",
38
- "diff": true,
39
- "extension": [
40
- "js"
41
- ],
42
- "package": "./package.json",
43
- "reporter": "spec",
44
- "slow": "75",
45
- "timeout": "5000",
46
- "ui": "tdd",
47
- "watch-files": [
48
- "source/**/*.js",
49
- "test/**/*.js"
50
- ],
51
- "watch-ignore": [
52
- "lib/vendor"
53
- ]
54
- },
55
- "repository": {
56
- "type": "git",
57
- "url": "https://github.com/stevenvelozo/retold-data-service.git"
58
- },
59
- "keywords": [
60
- "entity",
61
- "behavior",
62
- "api"
63
- ],
64
- "author": "Steven Velozo <steven@velozo.com> (http://velozo.com/)",
65
- "license": "MIT",
66
- "bugs": {
67
- "url": "https://github.com/stevenvelozo/retold-data-service/issues"
68
- },
69
- "homepage": "https://github.com/stevenvelozo/retold-data-service",
70
- "devDependencies": {
71
- "meadow-connection-sqlite": "^1.0.19",
72
- "pict-docuserve": "^0.1.5",
73
- "puppeteer": "^24.40.0",
74
- "quackage": "^1.2.3",
75
- "stricture": "^4.0.2",
76
- "supertest": "^7.2.2"
77
- },
78
- "dependencies": {
79
- "bibliograph": "^0.1.7",
80
- "fable": "^3.1.72",
81
- "fable-serviceproviderbase": "^3.0.19",
82
- "meadow": "^2.0.38",
83
- "meadow-connection-manager": "^1.1.2",
84
- "pict-section-connection-form": "^0.0.2",
85
- "meadow-connection-mysql": "^1.0.19",
86
- "meadow-endpoints": "^4.0.20",
87
- "meadow-integration": "^1.0.40",
88
- "meadow-migrationmanager": "^0.0.16",
89
- "orator": "^6.1.2",
90
- "orator-http-proxy": "^1.0.5",
91
- "orator-serviceserver-restify": "^2.0.11",
92
- "orator-static-server": "^2.1.4",
93
- "pict": "^1.0.366",
94
- "pict-section-histogram": "^1.0.0",
95
- "pict-sessionmanager": "^1.0.2",
96
- "stricture": "^4.0.2"
97
- }
2
+ "name": "retold-data-service",
3
+ "version": "2.1.5",
4
+ "description": "Serve up a whole model!",
5
+ "main": "source/Retold-Data-Service.js",
6
+ "bin": {
7
+ "retold-data-service-clone": "bin/retold-data-service-clone.js"
8
+ },
9
+ "scripts": {
10
+ "start": "node bin/retold-data-service-clone.js",
11
+ "coverage": "npx quack coverage",
12
+ "test": "npx quack test",
13
+ "brand": "node node_modules/pict-section-theme/bin/pict-section-theme-brand.js --manifest ../../../Retold-Modules-Manifest.json --module retold-data-service --favicons source/services/comprehension-loader/web/favicons && cp -r source/services/comprehension-loader/web/favicons source/services/data-cloner/web/favicons",
14
+ "build": "node build-all.js",
15
+ "build:cloner": "npx quack build",
16
+ "build:loader": "node -e \"require('fs').writeFileSync('.quackage.json', require('fs').readFileSync('.quackage-comprehension-loader.json', 'utf8'))\" && npx quack build",
17
+ "prepublishOnly": "npm run build",
18
+ "build-test-model": "cd test && npx stricture -i model/ddl/BookStore.ddl",
19
+ "docker-dev-build": "docker build ./ -f Dockerfile_LUXURYCode -t retold-data-service-image:local",
20
+ "docker-dev-run": "docker run -it -d --name retold-data-service-dev -p 44444:8080 -p 43306:3306 -p 48086:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/retold-data-service\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" retold-data-service-image:local",
21
+ "docker-dev-shell": "docker exec -it retold-data-service-dev /bin/bash",
22
+ "docker-service-build": "docker build ./ -f Dockerfile_Service -t retold-data-service-server-image:local",
23
+ "docker-service-run-test": "docker run -it --init -d --name retold-data-service -p 8086:8086 -p 43306:3306 -v \"$(pwd):/retold-data-service:z\" -u \"$(id -u):$(id -g)\" retold-data-service-server-image:local",
24
+ "docker-service-run": "docker run -it --init -d --name retold-data-service -p 8086:8086 -p 43306:3306 -v \"$(pwd):/retold-data-service:z\" retold-data-service-server-image:local",
25
+ "docker-service-shell": "docker exec -it retold-data-service /bin/bash",
26
+ "test:integration": "node test/run-integration-tests.js",
27
+ "test:integration:no-browser": "node test/run-integration-tests.js --skip-puppeteer",
28
+ "test:all": "npx quack test && node test/run-integration-tests.js --skip-puppeteer",
29
+ "postversion": "npx quack release postversion",
30
+ "postpublish": "npx quack release postpublish",
31
+ "publish:docker": "npx quack release publish --image",
32
+ "release:patch": "npx quack release patch",
33
+ "release:minor": "npx quack release minor",
34
+ "release:major": "npx quack release major",
35
+ "release:patch:image": "npx quack release patch --image",
36
+ "release:minor:image": "npx quack release minor --image",
37
+ "release:major:image": "npx quack release major --image"
38
+ },
39
+ "mocha": {
40
+ "spec": [
41
+ "test/RetoldDataService_tests.js",
42
+ "test/Bundles_smoke_tests.js",
43
+ "test/ComprehensionLoader_smoke_tests.js",
44
+ "test/DataCloner_smoke_tests.js"
45
+ ],
46
+ "diff": true,
47
+ "extension": [
48
+ "js"
49
+ ],
50
+ "package": "./package.json",
51
+ "reporter": "spec",
52
+ "slow": "75",
53
+ "timeout": "5000",
54
+ "ui": "tdd",
55
+ "watch-files": [
56
+ "source/**/*.js",
57
+ "test/**/*.js"
58
+ ],
59
+ "watch-ignore": [
60
+ "lib/vendor"
61
+ ]
62
+ },
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "https://github.com/fable-retold/retold-data-service.git"
66
+ },
67
+ "keywords": [
68
+ "entity",
69
+ "behavior",
70
+ "api"
71
+ ],
72
+ "author": "Steven Velozo <steven@velozo.com> (http://velozo.com/)",
73
+ "license": "MIT",
74
+ "bugs": {
75
+ "url": "https://github.com/fable-retold/retold-data-service/issues"
76
+ },
77
+ "homepage": "https://github.com/fable-retold/retold-data-service",
78
+ "devDependencies": {
79
+ "chai": "^4.5.0",
80
+ "jsdom": "^25.0.1",
81
+ "meadow-connection-sqlite": "^1.0.20",
82
+ "mocha": "^11.0.1",
83
+ "pict-docuserve": "^1.4.19",
84
+ "puppeteer": "^24.40.0",
85
+ "quackage": "^1.3.0",
86
+ "stricture": "^4.0.6",
87
+ "supertest": "^7.2.2"
88
+ },
89
+ "dependencies": {
90
+ "bibliograph": "^1.0.0",
91
+ "fable": "^3.1.75",
92
+ "fable-serviceproviderbase": "^3.0.19",
93
+ "meadow": "^2.0.43",
94
+ "meadow-connection-manager": "^1.1.5",
95
+ "meadow-connection-mysql": "^1.0.19",
96
+ "meadow-endpoints": "^4.0.22",
97
+ "meadow-integration": "^1.0.42",
98
+ "meadow-migrationmanager": "^1.0.4",
99
+ "orator": "^6.1.2",
100
+ "orator-http-proxy": "^1.0.5",
101
+ "orator-serviceserver-restify": "^2.0.11",
102
+ "orator-static-server": "^2.1.4",
103
+ "pict": "^1.0.372",
104
+ "pict-provider-theme": "^1.1.2",
105
+ "pict-section-connection-form": "^1.0.0",
106
+ "pict-section-histogram": "^1.0.1",
107
+ "pict-section-modal": "^1.1.4",
108
+ "pict-section-theme": "^1.1.1",
109
+ "pict-sessionmanager": "^1.0.2",
110
+ "stricture": "^4.0.6"
111
+ },
112
+ "retold": {
113
+ "brand": {
114
+ "Hash": "retold-data-service",
115
+ "Name": "Retold Data Service",
116
+ "Tagline": "Schema-driven data movement and comprehension",
117
+ "Palette": "ocean",
118
+ "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-data-service-filled-light\">\n\t\t\t\t<path d=\"M 48.00 2.00 L 87.84 25.00 L 87.84 71.00 L 48.00 94.00 L 8.16 71.00 L 8.16 25.00 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 48.00 2.00 L 87.84 25.00 L 87.84 71.00 L 48.00 94.00 L 8.16 71.00 L 8.16 25.00 Z\" fill=\"#23a6c7\"/>\n\t\t<g clip-path=\"url(#frame-retold-data-service-filled-light)\"><rect x=\"20\" y=\"20\" width=\"56\" height=\"56\" rx=\"8\" fill=\"rgba(255,255,255,0.18)\"/>\n\t\t\t\t\t<path d=\"M 48 30 L 70 48 L 48 66 L 26 48 Z\" fill=\"#e36b59\"/></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=\"28\" font-weight=\"600\"\n\t\t\tfill=\"#ffffff\" letter-spacing=\"-1\">RDS</text>\n\t</svg>",
119
+ "IconType": "svg",
120
+ "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-data-service-light\">\n\t\t\t\t<path d=\"M 48.00 2.00 L 87.84 25.00 L 87.84 71.00 L 48.00 94.00 L 8.16 71.00 L 8.16 25.00 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 48.00 2.00 L 87.84 25.00 L 87.84 71.00 L 48.00 94.00 L 8.16 71.00 L 8.16 25.00 Z\" fill=\"#23a6c7\"/>\n\t\t<g clip-path=\"url(#fav-retold-data-service-light)\"><rect x=\"16\" y=\"16\" width=\"64\" height=\"64\" rx=\"10\" 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>",
121
+ "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-data-service-dark\">\n\t\t\t\t<path d=\"M 48.00 2.00 L 87.84 25.00 L 87.84 71.00 L 48.00 94.00 L 8.16 71.00 L 8.16 25.00 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 48.00 2.00 L 87.84 25.00 L 87.84 71.00 L 48.00 94.00 L 8.16 71.00 L 8.16 25.00 Z\" fill=\"#67c6de\"/>\n\t\t<g clip-path=\"url(#fav-retold-data-service-dark)\"><rect x=\"16\" y=\"16\" width=\"64\" height=\"64\" rx=\"10\" 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>",
122
+ "Colors": {
123
+ "Primary": "#23a6c7",
124
+ "Secondary": "#e36b59",
125
+ "PrimaryLight": "#23a6c7",
126
+ "PrimaryDark": "#67c6de",
127
+ "SecondaryLight": "#e36b59",
128
+ "SecondaryDark": "#edb3aa"
129
+ }
130
+ }
131
+ }
98
132
  }
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ // Located at source/services/. Apps live one level deeper at
4
+ // source/services/<app>/pict-app/. The package.json is two levels up.
5
+ const tmpPackage = require('../../package.json');
6
+
7
+ if (!tmpPackage.retold || !tmpPackage.retold.brand)
8
+ {
9
+ throw new Error('retold-data-service: package.json is missing retold.brand — '
10
+ + 'run `npm run brand` (which calls pict-section-theme-brand) before building');
11
+ }
12
+
13
+ module.exports = tmpPackage.retold.brand;
@@ -2,28 +2,41 @@ const libPictApplication = require('pict-application');
2
2
 
3
3
  const libProvider = require('./providers/Pict-Provider-ComprehensionLoader.js');
4
4
 
5
- const libViewLayout = require('./views/PictView-ComprehensionLoader-Layout.js');
6
- const libViewSession = require('./views/PictView-ComprehensionLoader-Session.js');
7
- const libViewSchema = require('./views/PictView-ComprehensionLoader-Schema.js');
8
- const libViewSource = require('./views/PictView-ComprehensionLoader-Source.js');
9
- const libViewLoad = require('./views/PictView-ComprehensionLoader-Load.js');
5
+ const libViewLayout = require('./views/PictView-ComprehensionLoader-Layout.js');
6
+ const libViewSession = require('./views/PictView-ComprehensionLoader-Session.js');
7
+ const libViewSchema = require('./views/PictView-ComprehensionLoader-Schema.js');
8
+ const libViewSource = require('./views/PictView-ComprehensionLoader-Source.js');
9
+ const libViewLoad = require('./views/PictView-ComprehensionLoader-Load.js');
10
10
  const libViewHistogram = require('pict-section-histogram');
11
11
 
12
+ const libPictSectionModal = require('pict-section-modal');
13
+ const libPictSectionTheme = require('pict-section-theme');
14
+ const libBrand = require('../../RetoldDataService-Brand.js');
15
+
16
+ const libViewShell = require('./views/PictView-ComprehensionLoader-Shell.js');
17
+ const libViewTopBarNav = require('./views/PictView-ComprehensionLoader-TopBar-Nav.js');
18
+ const libViewTopBarUser = require('./views/PictView-ComprehensionLoader-TopBar-User.js');
19
+ const libViewStatusBar = require('./views/PictView-ComprehensionLoader-StatusBar.js');
20
+ const libViewStatusDetail = require('./views/PictView-ComprehensionLoader-StatusDetail.js');
21
+ const libViewSettings = require('./views/PictView-ComprehensionLoader-SettingsPanel.js');
22
+
12
23
  class ComprehensionLoaderApplication extends libPictApplication
13
24
  {
14
25
  constructor(pFable, pOptions, pServiceHash)
15
26
  {
16
27
  super(pFable, pOptions, pServiceHash);
17
28
 
18
- // Register provider
19
- this.pict.addProvider('ComprehensionLoader', libProvider.default_configuration, libProvider);
29
+ // 1. Modal section (provides shell + panels + modal API).
30
+ this.pict.addView('Pict-Section-Modal',
31
+ libPictSectionModal.default_configuration, libPictSectionModal);
20
32
 
21
- // Register views
22
- this.pict.addView('ComprehensionLoader-Layout', libViewLayout.default_configuration, libViewLayout);
33
+ // 2. Provider + existing section views.
34
+ this.pict.addProvider('ComprehensionLoader', libProvider.default_configuration, libProvider);
35
+ this.pict.addView('ComprehensionLoader-Layout', libViewLayout.default_configuration, libViewLayout);
23
36
  this.pict.addView('ComprehensionLoader-Session', libViewSession.default_configuration, libViewSession);
24
- this.pict.addView('ComprehensionLoader-Schema', libViewSchema.default_configuration, libViewSchema);
25
- this.pict.addView('ComprehensionLoader-Source', libViewSource.default_configuration, libViewSource);
26
- this.pict.addView('ComprehensionLoader-Load', libViewLoad.default_configuration, libViewLoad);
37
+ this.pict.addView('ComprehensionLoader-Schema', libViewSchema.default_configuration, libViewSchema);
38
+ this.pict.addView('ComprehensionLoader-Source', libViewSource.default_configuration, libViewSource);
39
+ this.pict.addView('ComprehensionLoader-Load', libViewLoad.default_configuration, libViewLoad);
27
40
  this.pict.addView('ComprehensionLoader-StatusHistogram',
28
41
  {
29
42
  ViewIdentifier: 'ComprehensionLoader-StatusHistogram',
@@ -36,9 +49,38 @@ class ComprehensionLoaderApplication extends libPictApplication
36
49
  ShowValues: false,
37
50
  ShowLabels: true,
38
51
  MaxBarSize: 80,
39
- BarColor: '#4a90d9',
52
+ BarColor: 'var(--theme-color-brand-primary, #4a90d9)',
40
53
  Bins: []
41
54
  }, libViewHistogram);
55
+
56
+ // 3. Shell host + slot views + status bar / detail + settings panel.
57
+ this.pict.addView('ComprehensionLoader-Shell',
58
+ libViewShell.default_configuration, libViewShell);
59
+ this.pict.addView('ComprehensionLoader-TopBar-Nav',
60
+ libViewTopBarNav.default_configuration, libViewTopBarNav);
61
+ this.pict.addView('ComprehensionLoader-TopBar-User',
62
+ libViewTopBarUser.default_configuration, libViewTopBarUser);
63
+ this.pict.addView('ComprehensionLoader-StatusBar',
64
+ libViewStatusBar.default_configuration, libViewStatusBar);
65
+ this.pict.addView('ComprehensionLoader-StatusDetail',
66
+ libViewStatusDetail.default_configuration, libViewStatusDetail);
67
+ this.pict.addView('ComprehensionLoader-SettingsPanel',
68
+ libViewSettings.default_configuration, libViewSettings);
69
+
70
+ // 4. Theme-Section provider — registered LAST so it can find the slot views.
71
+ this.pict.addProvider('Theme-Section',
72
+ {
73
+ ApplyDefault: 'pict-default',
74
+ DefaultMode: 'system',
75
+ DefaultScale: 1.0,
76
+ Brand: libBrand,
77
+ Views: ['Picker', 'ModeToggle', 'ScaleSelect', 'BrandMark', 'TopBar', 'BottomBar'],
78
+ ViewOptions:
79
+ {
80
+ TopBar: { NavView: 'ComprehensionLoader-TopBar-Nav', UserView: 'ComprehensionLoader-TopBar-User', Height: 56 },
81
+ BottomBar: { StatusView: 'ComprehensionLoader-StatusBar', Height: 36 }
82
+ }
83
+ }, libPictSectionTheme);
42
84
  }
43
85
 
44
86
  onAfterInitializeAsync(fCallback)
@@ -66,10 +108,18 @@ class ComprehensionLoaderApplication extends libPictApplication
66
108
  // Make pict available for inline onclick handlers
67
109
  window.pict = this.pict;
68
110
 
69
- // Render layout (which chains child view renders via onAfterRender)
111
+ // Render the shell first creates panel destination divs.
112
+ this.pict.views['ComprehensionLoader-Shell'].render();
113
+
114
+ // Render the layout (which chains child view renders via onAfterRender)
115
+ // into the shell's #ComprehensionLoader-Workspace destination.
70
116
  this.pict.views['ComprehensionLoader-Layout'].render();
71
117
 
72
- // Post-render initialization
118
+ // Render the StatusBar into the BottomBar slot — provider's polling
119
+ // updates this by id in-place, so we only need the initial paint.
120
+ this.pict.views['ComprehensionLoader-StatusBar'].render();
121
+
122
+ // Post-render initialization (unchanged)
73
123
  this.pict.providers.ComprehensionLoader.initPersistence();
74
124
  this.pict.providers.ComprehensionLoader.startLiveStatusPolling();
75
125
  this.pict.providers.ComprehensionLoader.initAccordionPreviews();
@@ -42,37 +42,6 @@ class ComprehensionLoaderLayoutView extends libPictView
42
42
  tmpCards[i].classList.remove('open');
43
43
  }
44
44
  }
45
-
46
- toggleStatusDetail()
47
- {
48
- let tmpDetail = document.getElementById('liveStatusDetail');
49
- let tmpMeta = document.getElementById('liveStatusMeta');
50
- let tmpMessage = document.getElementById('liveStatusMessage');
51
- let tmpToggle = document.getElementById('liveStatusToggle');
52
- let tmpBar = document.getElementById('liveStatusBar');
53
- if (!tmpDetail) return;
54
-
55
- let tmpIsExpanded = tmpDetail.style.display !== 'none';
56
-
57
- if (tmpIsExpanded)
58
- {
59
- tmpDetail.style.display = 'none';
60
- tmpMeta.style.display = '';
61
- tmpMessage.style.display = '';
62
- tmpToggle.innerHTML = '&#9660;';
63
- tmpBar.classList.remove('expanded');
64
- this.pict.providers.ComprehensionLoader.onStatusDetailCollapsed();
65
- }
66
- else
67
- {
68
- tmpDetail.style.display = '';
69
- tmpMeta.style.display = 'none';
70
- tmpMessage.style.display = 'none';
71
- tmpToggle.innerHTML = '&#9650;';
72
- tmpBar.classList.add('expanded');
73
- this.pict.providers.ComprehensionLoader.onStatusDetailExpanded();
74
- }
75
- }
76
45
  }
77
46
 
78
47
  module.exports = ComprehensionLoaderLayoutView;
@@ -81,7 +50,7 @@ module.exports.default_configuration =
81
50
  {
82
51
  ViewIdentifier: 'ComprehensionLoader-Layout',
83
52
  DefaultRenderable: 'ComprehensionLoader-Layout',
84
- DefaultDestinationAddress: '#ComprehensionLoader-Application-Container',
53
+ DefaultDestinationAddress: '#ComprehensionLoader-Workspace',
85
54
  CSS: /*css*/`
86
55
  * { box-sizing: border-box; margin: 0; padding: 0; }
87
56
  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; }
@@ -94,7 +63,7 @@ h2 { margin-bottom: 12px; color: var(--theme-color-text-secondary, #444); font-s
94
63
  .accordion-row { display: flex; gap: 0; margin-bottom: 16px; align-items: stretch; }
95
64
  .accordion-number {
96
65
  flex: 0 0 48px; display: flex; align-items: flex-start; justify-content: center;
97
- padding-top: 16px; font-size: 1.6em; font-weight: 700; color: #4a90d9;
66
+ padding-top: 16px; font-size: 1.6em; font-weight: 700; color: var(--theme-color-brand-primary, #4a90d9);
98
67
  user-select: none;
99
68
  }
100
69
  .accordion-card {
@@ -123,11 +92,11 @@ h2 { margin-bottom: 12px; color: var(--theme-color-text-secondary, #444); font-s
123
92
  .accordion-actions { display: flex; align-items: baseline; gap: 8px; flex-shrink: 0; }
124
93
  .accordion-card.open .accordion-actions { display: none; }
125
94
  .accordion-go {
126
- font-size: 0.82em; color: #4a90d9; cursor: pointer; text-decoration: none;
95
+ font-size: 0.82em; color: var(--theme-color-brand-primary, #4a90d9); cursor: pointer; text-decoration: none;
127
96
  font-weight: 500; white-space: nowrap; padding: 2px 6px; border-radius: 3px;
128
97
  transition: background 0.15s;
129
98
  }
130
- .accordion-go:hover { background: #e8f0fe; text-decoration: underline; }
99
+ .accordion-go:hover { background: var(--theme-color-background-hover, #e8f0fe); text-decoration: underline; }
131
100
  .accordion-auto {
132
101
  font-size: 0.82em; color: var(--theme-color-text-muted, #999); white-space: nowrap; cursor: pointer;
133
102
  }
@@ -144,7 +113,7 @@ h2 { margin-bottom: 12px; color: var(--theme-color-text-secondary, #444); font-s
144
113
  }
145
114
  .accordion-phase.visible { display: flex; }
146
115
  .accordion-phase-ok { color: var(--theme-color-status-success, #28a745); }
147
- .accordion-phase-error { color: #dc3545; }
116
+ .accordion-phase-error { color: var(--theme-color-status-error, #dc3545); }
148
117
  .accordion-phase-busy { color: var(--theme-color-status-success, #28a745); }
149
118
  .accordion-phase-busy .phase-spinner {
150
119
  display: inline-block; width: 14px; height: 14px;
@@ -170,18 +139,18 @@ input[type="text"], input[type="password"], input[type="number"] {
170
139
  font-size: 0.95em; margin-bottom: 10px;
171
140
  }
172
141
  input[type="text"]:focus, input[type="password"]:focus, input[type="number"]:focus {
173
- outline: none; border-color: #4a90d9;
142
+ outline: none; border-color: var(--theme-color-brand-primary, #4a90d9);
174
143
  }
175
144
 
176
145
  button {
177
146
  padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer;
178
147
  font-size: 0.9em; font-weight: 600; margin-right: 8px; margin-bottom: 8px;
179
148
  }
180
- button.primary { background: #4a90d9; color: var(--theme-color-background-panel, #fff); }
181
- button.primary:hover { background: #357abd; }
182
- button.secondary { background: #6c757d; color: var(--theme-color-background-panel, #fff); }
149
+ button.primary { background: var(--theme-color-brand-primary, #4a90d9); color: var(--theme-color-background-panel, #fff); }
150
+ button.primary:hover { background: var(--theme-color-brand-primary-hover, #357abd); }
151
+ button.secondary { background: var(--theme-color-text-secondary, #6c757d); color: var(--theme-color-background-panel, #fff); }
183
152
  button.secondary:hover { background: #5a6268; }
184
- button.danger { background: #dc3545; color: var(--theme-color-background-panel, #fff); }
153
+ button.danger { background: var(--theme-color-status-error, #dc3545); color: var(--theme-color-background-panel, #fff); }
185
154
  button.danger:hover { background: #c82333; }
186
155
  button.success { background: var(--theme-color-status-success, #28a745); color: var(--theme-color-background-panel, #fff); }
187
156
  button.success:hover { background: #218838; }
@@ -196,7 +165,7 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
196
165
  .inline-group { display: flex; gap: 8px; align-items: flex-end; margin-bottom: 10px; }
197
166
  .inline-group > div { flex: 1; }
198
167
 
199
- a { color: #4a90d9; }
168
+ a { color: var(--theme-color-brand-primary, #4a90d9); }
200
169
 
201
170
  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; }
202
171
 
@@ -208,28 +177,28 @@ select { background: var(--theme-color-background-panel, #fff); width: 100%; pad
208
177
  .live-status-bar {
209
178
  background: var(--theme-color-background-panel, #fff); border-radius: 8px; margin-bottom: 16px;
210
179
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
211
- position: sticky; top: 0; z-index: 100; border-left: 4px solid #6c757d;
180
+ position: sticky; top: 0; z-index: 100; border-left: 4px solid var(--theme-color-text-secondary, #6c757d);
212
181
  }
213
- .live-status-bar.phase-idle { border-left-color: #6c757d; }
214
- .live-status-bar.phase-disconnected { border-left-color: #dc3545; }
215
- .live-status-bar.phase-ready { border-left-color: #4a90d9; }
182
+ .live-status-bar.phase-idle { border-left-color: var(--theme-color-text-secondary, #6c757d); }
183
+ .live-status-bar.phase-disconnected { border-left-color: var(--theme-color-status-error, #dc3545); }
184
+ .live-status-bar.phase-ready { border-left-color: var(--theme-color-brand-primary, #4a90d9); }
216
185
  .live-status-bar.phase-loading { border-left-color: var(--theme-color-status-success, #28a745); }
217
- .live-status-bar.phase-stopping { border-left-color: #ffc107; }
186
+ .live-status-bar.phase-stopping { border-left-color: var(--theme-color-status-warning, #ffc107); }
218
187
  .live-status-bar.phase-complete { border-left-color: var(--theme-color-status-success, #28a745); }
219
188
 
220
189
  .live-status-dot {
221
190
  width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0;
222
- background: #6c757d;
191
+ background: var(--theme-color-text-secondary, #6c757d);
223
192
  }
224
- .live-status-bar.phase-idle .live-status-dot { background: #6c757d; }
225
- .live-status-bar.phase-disconnected .live-status-dot { background: #dc3545; }
226
- .live-status-bar.phase-ready .live-status-dot { background: #4a90d9; }
193
+ .live-status-bar.phase-idle .live-status-dot { background: var(--theme-color-text-secondary, #6c757d); }
194
+ .live-status-bar.phase-disconnected .live-status-dot { background: var(--theme-color-status-error, #dc3545); }
195
+ .live-status-bar.phase-ready .live-status-dot { background: var(--theme-color-brand-primary, #4a90d9); }
227
196
  .live-status-bar.phase-loading .live-status-dot {
228
197
  background: var(--theme-color-status-success, #28a745);
229
198
  animation: live-pulse 1.5s ease-in-out infinite;
230
199
  }
231
200
  .live-status-bar.phase-stopping .live-status-dot {
232
- background: #ffc107;
201
+ background: var(--theme-color-status-warning, #ffc107);
233
202
  animation: live-pulse 0.8s ease-in-out infinite;
234
203
  }
235
204
  .live-status-bar.phase-complete .live-status-dot { background: var(--theme-color-status-success, #28a745); }
@@ -248,7 +217,7 @@ select { background: var(--theme-color-background-panel, #fff); width: 100%; pad
248
217
  .live-status-meta-item strong { color: var(--theme-color-text-primary, #333); }
249
218
 
250
219
  .live-status-progress-bar {
251
- height: 3px; background: #e9ecef; border-radius: 2px; overflow: hidden;
220
+ height: 3px; background: var(--theme-color-background-tertiary, #e9ecef); border-radius: 2px; overflow: hidden;
252
221
  position: absolute; bottom: 0; left: 0; right: 0;
253
222
  }
254
223
  .live-status-progress-fill {
@@ -260,7 +229,7 @@ select { background: var(--theme-color-background-panel, #fff); width: 100%; pad
260
229
  padding: 14px 20px; user-select: none;
261
230
  }
262
231
  .live-status-bar.expanded .live-status-header {
263
- border-bottom: 1px solid #e9ecef; padding-bottom: 10px;
232
+ border-bottom: 1px solid var(--theme-color-background-tertiary, #e9ecef); padding-bottom: 10px;
264
233
  }
265
234
  .live-status-expand-toggle {
266
235
  flex: 0 0 20px; display: flex; align-items: center; justify-content: center;
@@ -288,10 +257,10 @@ select { background: var(--theme-color-background-panel, #fff); width: 100%; pad
288
257
  }
289
258
  .running-op-name { font-weight: 600; min-width: 180px; }
290
259
  .running-op-bar {
291
- flex: 1; height: 8px; background: #e9ecef; border-radius: 4px; overflow: hidden;
260
+ flex: 1; height: 8px; background: var(--theme-color-background-tertiary, #e9ecef); border-radius: 4px; overflow: hidden;
292
261
  min-width: 120px;
293
262
  }
294
- .running-op-bar-fill { height: 100%; background: #4a90d9; transition: width 0.5s ease; }
263
+ .running-op-bar-fill { height: 100%; background: var(--theme-color-brand-primary, #4a90d9); transition: width 0.5s ease; }
295
264
  .running-op-count { font-size: 0.85em; color: var(--theme-color-text-secondary, #666); white-space: nowrap; }
296
265
  .running-op-pending { color: var(--theme-color-text-muted, #888); font-size: 0.85em; font-style: italic; padding: 4px 0; }
297
266
 
@@ -309,8 +278,8 @@ select { background: var(--theme-color-background-panel, #fff); width: 100%; pad
309
278
  .error-op-row { padding: 6px 0; border-bottom: 1px solid var(--theme-color-background-tertiary, #f0f0f0); font-size: 0.9em; }
310
279
  .error-op-row:last-child { border-bottom: none; }
311
280
  .error-op-header { display: flex; align-items: center; gap: 8px; }
312
- .error-op-name { font-weight: 600; color: #dc3545; }
313
- .error-op-status { font-size: 0.82em; color: #dc3545; }
281
+ .error-op-name { font-weight: 600; color: var(--theme-color-status-error, #dc3545); }
282
+ .error-op-status { font-size: 0.82em; color: var(--theme-color-status-error, #dc3545); }
314
283
  .error-op-message { font-size: 0.82em; color: var(--theme-color-text-muted, #888); margin-top: 2px; padding-left: 18px; }
315
284
  `,
316
285
  Templates:
@@ -320,21 +289,6 @@ select { background: var(--theme-color-background-panel, #fff); width: 100%; pad
320
289
  Template: /*html*/`
321
290
  <h1>Retold Comprehension Loader</h1>
322
291
 
323
- <!-- Live Status Bar (Expandable) -->
324
- <div id="liveStatusBar" class="live-status-bar phase-idle" style="position:relative">
325
- <div class="live-status-header" onclick="pict.views['ComprehensionLoader-Layout'].toggleStatusDetail()">
326
- <div class="live-status-dot"></div>
327
- <div class="live-status-message" id="liveStatusMessage">Idle</div>
328
- <div class="live-status-meta" id="liveStatusMeta"></div>
329
- <div class="live-status-expand-toggle" id="liveStatusToggle">&#9660;</div>
330
- </div>
331
- <div class="live-status-detail" id="liveStatusDetail" style="display:none">
332
- <div id="ComprehensionLoader-Throughput-Histogram"></div>
333
- <div id="ComprehensionLoader-StatusDetail-Container"></div>
334
- </div>
335
- <div class="live-status-progress-bar"><div class="live-status-progress-fill" id="liveStatusProgressFill" style="width:0%"></div></div>
336
- </div>
337
-
338
292
  <!-- Expand / Collapse All -->
339
293
  <div class="accordion-controls">
340
294
  <button onclick="pict.views['ComprehensionLoader-Layout'].expandAllSections()">Expand All</button>
@@ -354,7 +308,7 @@ select { background: var(--theme-color-background-panel, #fff); width: 100%; pad
354
308
  {
355
309
  RenderableHash: 'ComprehensionLoader-Layout',
356
310
  TemplateHash: 'ComprehensionLoader-Layout',
357
- DestinationAddress: '#ComprehensionLoader-Application-Container'
311
+ DestinationAddress: '#ComprehensionLoader-Workspace'
358
312
  }
359
313
  ]
360
314
  };