documentation-hub 5.7.2

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 (271) hide show
  1. package/.eslintrc.json +43 -0
  2. package/.github/workflows/build.yml +64 -0
  3. package/.github/workflows/ci.yml +39 -0
  4. package/.vscode/extensions.json +3 -0
  5. package/Current.md +97 -0
  6. package/DocHub_Image.png +0 -0
  7. package/README.md +666 -0
  8. package/USER_GUIDE.md +1173 -0
  9. package/Updater.md +311 -0
  10. package/build/256x256.png +0 -0
  11. package/build/512x512.png +0 -0
  12. package/build/app-update.yml +4 -0
  13. package/build/create-icon.js +208 -0
  14. package/build/icon.ico +0 -0
  15. package/build/icon.png +0 -0
  16. package/build/icon_1024x1024.png +0 -0
  17. package/dist/assets/Analytics-BpsG9895.js +1 -0
  18. package/dist/assets/Card-IAZin8kp.js +1 -0
  19. package/dist/assets/CurrentSession-B-rFkHvf.js +12 -0
  20. package/dist/assets/Dashboard-C_5gMb0q.js +1 -0
  21. package/dist/assets/Documents-CqZ25axS.js +1 -0
  22. package/dist/assets/Input-l89xwXBi.js +1 -0
  23. package/dist/assets/Reporting-DqdHJY_a.js +1 -0
  24. package/dist/assets/Search-XNbu5z_3.js +1 -0
  25. package/dist/assets/SessionManager-lH9hZfzH.js +1 -0
  26. package/dist/assets/Sessions-ClZOPYNc.js +1 -0
  27. package/dist/assets/Settings-DUEHGURa.js +11 -0
  28. package/dist/assets/index-8xUe8ptc.js +24 -0
  29. package/dist/assets/index-RYyJqF7O.css +1 -0
  30. package/dist/assets/path-BkOl0AGO.js +1 -0
  31. package/dist/assets/promises-ID_B9S-h.js +1 -0
  32. package/dist/assets/urlHelpers-TvgahX0r.js +1 -0
  33. package/dist/assets/useToast-yRSO1dkm.js +1 -0
  34. package/dist/assets/vendor-charts-RkGK5ROP.js +36 -0
  35. package/dist/assets/vendor-db-l0sNRNKZ.js +1 -0
  36. package/dist/assets/vendor-react-BVZ_anCF.js +4 -0
  37. package/dist/assets/vendor-search-Dw8P0qyA.js +1 -0
  38. package/dist/assets/vendor-ui-BU7NfluV.js +53 -0
  39. package/dist/electron/PowerAutomateApiService-LfW09ZGr.js +147 -0
  40. package/dist/electron/main-CXkNtyv-.js +19789 -0
  41. package/dist/electron/main.js +5 -0
  42. package/dist/electron/preload.js +1 -0
  43. package/dist/icon.png +0 -0
  44. package/dist/index.html +27 -0
  45. package/docs/CODEBASE_ANALYSIS_REPORT.md +309 -0
  46. package/docs/DEBUG_LOGGING_GUIDE.md +244 -0
  47. package/docs/README.md +115 -0
  48. package/docs/TOC_WIRING_GUIDE.md +344 -0
  49. package/docs/analysis/Bullet_Symbol_Bug_Analysis.md +136 -0
  50. package/docs/analysis/DOCXMLATER_ANALYSIS_SUMMARY.txt +169 -0
  51. package/docs/analysis/Document_Processing_Issues_Analysis.md +704 -0
  52. package/docs/analysis/FIELD_PRESERVATION_ANALYSIS.md +1200 -0
  53. package/docs/analysis/INDENTATION_PRESERVE_ANALYSIS.md +181 -0
  54. package/docs/analysis/INDENTATION_PRESERVE_IMPLEMENTATION.md +207 -0
  55. package/docs/analysis/List_Implementation.md +206 -0
  56. package/docs/analysis/List_Implementation_Accuracy_Report.md +366 -0
  57. package/docs/analysis/PROCESSING_OPTIONS_UI_UPDATES.md +220 -0
  58. package/docs/analysis/RefactorStyles.md +852 -0
  59. package/docs/analysis/STYLE_PARAMETER_ENHANCEMENT.md +143 -0
  60. package/docs/analysis/docxmlater-comparison-todo-2025-11-13.md +636 -0
  61. package/docs/analysis/docxmlater-implementation-analysis-2025-11-13.md +340 -0
  62. package/docs/analysis/docxmlater-template_ui-integration-analysis.md +263 -0
  63. package/docs/analysis/github-issues-to-create.md +237 -0
  64. package/docs/api/API_README.md +538 -0
  65. package/docs/api/API_REFERENCE.md +751 -0
  66. package/docs/api/TYPE_DEFINITIONS.md +869 -0
  67. package/docs/architecture/FONT_EMBEDDING_GUIDE.md +318 -0
  68. package/docs/architecture/docxmlater-functions-and-structure.md +726 -0
  69. package/docs/docxmlater-readme.md +1341 -0
  70. package/docs/fixes/EXECUTION_LOG_TEST_BASE.md +573 -0
  71. package/docs/fixes/HYPERLINK_TEXT_SANITIZATION.md +253 -0
  72. package/docs/fixes/README.md +37 -0
  73. package/docs/github-issues/issue-1-body.md +125 -0
  74. package/docs/github-issues/issue-10-body.md +850 -0
  75. package/docs/github-issues/issue-2-body.md +200 -0
  76. package/docs/github-issues/issue-3-body.md +270 -0
  77. package/docs/github-issues/issue-4-body.md +169 -0
  78. package/docs/github-issues/issue-5-body.md +173 -0
  79. package/docs/github-issues/issue-6-body.md +158 -0
  80. package/docs/github-issues/issue-7-body.md +171 -0
  81. package/docs/github-issues/issue-8-body.md +407 -0
  82. package/docs/github-issues/issue-9-body.md +515 -0
  83. package/docs/github-issues/issue-tracker.md +274 -0
  84. package/docs/github-issues/predictive-analysis-2025-10-18.md +2131 -0
  85. package/docs/implementation/List_Framework_Refactor_Plan.md +336 -0
  86. package/docs/implementation/PRIMARY_TEXT_COLOR_FEATURE.md +217 -0
  87. package/docs/implementation/RELEASE_PLAN_v2.1.0.md +362 -0
  88. package/docs/implementation/RefactorStyles.md +588 -0
  89. package/docs/implementation/implement-plan.md +489 -0
  90. package/docs/implementation/missing-helpers-implementation.md +391 -0
  91. package/docs/implementation/refactor-plan.md +520 -0
  92. package/docs/implementation/session-implementation-complete.md +233 -0
  93. package/docs/implementation/session-management-plan.md +250 -0
  94. package/docs/setup-checklist.md +77 -0
  95. package/docs/versions/changelog.md +345 -0
  96. package/electron/customUpdater.ts +656 -0
  97. package/electron/main.ts +2441 -0
  98. package/electron/memoryConfig.ts +187 -0
  99. package/electron/preload.ts +394 -0
  100. package/electron/proxyConfig.ts +340 -0
  101. package/electron/services/BackupService.ts +452 -0
  102. package/electron/services/DictionaryService.ts +402 -0
  103. package/electron/services/LocalDictionaryLookupService.ts +147 -0
  104. package/electron/services/PowerAutomateApiService.ts +231 -0
  105. package/electron/services/SharePointSyncService.ts +474 -0
  106. package/electron/windowsCertStore.ts +427 -0
  107. package/electron/zscalerConfig.ts +381 -0
  108. package/eslint.config.js +92 -0
  109. package/jest.config.js +52 -0
  110. package/package.json +214 -0
  111. package/postcss.config.mjs +6 -0
  112. package/public/icon.png +0 -0
  113. package/publish-release.ps1 +5 -0
  114. package/renovate.json +30 -0
  115. package/src/App.tsx +216 -0
  116. package/src/__mocks__/p-limit.js +12 -0
  117. package/src/__mocks__/styleMock.js +1 -0
  118. package/src/components/common/BugReportButton.tsx +44 -0
  119. package/src/components/common/BugReportDialog.tsx +193 -0
  120. package/src/components/common/Button.tsx +153 -0
  121. package/src/components/common/Card.tsx +86 -0
  122. package/src/components/common/ColorPickerDialog.tsx +177 -0
  123. package/src/components/common/ConfirmDialog.tsx +96 -0
  124. package/src/components/common/DebugConsole.tsx +275 -0
  125. package/src/components/common/EmptyState.tsx +183 -0
  126. package/src/components/common/ErrorBoundary.tsx +98 -0
  127. package/src/components/common/ErrorDetailsDialog.tsx +153 -0
  128. package/src/components/common/ErrorFallback.tsx +218 -0
  129. package/src/components/common/Input.tsx +109 -0
  130. package/src/components/common/Skeleton.tsx +184 -0
  131. package/src/components/common/SplashScreen.tsx +81 -0
  132. package/src/components/common/Toast.tsx +155 -0
  133. package/src/components/common/Tooltip.tsx +79 -0
  134. package/src/components/common/UpdateNotification.tsx +320 -0
  135. package/src/components/comparison/ComparisonWindow.tsx +374 -0
  136. package/src/components/comparison/SideBySideDiff.tsx +486 -0
  137. package/src/components/comparison/index.ts +8 -0
  138. package/src/components/document/DocumentUploader.tsx +288 -0
  139. package/src/components/document/HyperlinkPreview.tsx +430 -0
  140. package/src/components/document/HyperlinkService.md +1484 -0
  141. package/src/components/document/Hyperlink_Technical_Documentation.md +496 -0
  142. package/src/components/document/InlineChangesView.tsx +707 -0
  143. package/src/components/document/ProcessingProgress.tsx +303 -0
  144. package/src/components/document/ProcessingResults.tsx +256 -0
  145. package/src/components/document/TrackedChangesDetail.tsx +530 -0
  146. package/src/components/document/TrackedChangesPanel.tsx +546 -0
  147. package/src/components/document/VirtualDocumentList.tsx +240 -0
  148. package/src/components/editor/DocumentEditor.tsx +723 -0
  149. package/src/components/editor/DocumentEditorModal.tsx +640 -0
  150. package/src/components/editor/EditorQuickActions.tsx +502 -0
  151. package/src/components/editor/EditorToolbar.tsx +312 -0
  152. package/src/components/editor/TableEditor.tsx +926 -0
  153. package/src/components/editor/index.ts +18 -0
  154. package/src/components/layout/Header.tsx +190 -0
  155. package/src/components/layout/Sidebar.tsx +313 -0
  156. package/src/components/layout/TitleBar.tsx +190 -0
  157. package/src/components/navigation/CommandPalette.tsx +233 -0
  158. package/src/components/navigation/KeyboardShortcutsModal.tsx +173 -0
  159. package/src/components/sessions/ChangeItem.tsx +408 -0
  160. package/src/components/sessions/ChangeViewer.tsx +1155 -0
  161. package/src/components/sessions/DocumentComparisonModal.tsx +314 -0
  162. package/src/components/sessions/ProcessingOptions.tsx +297 -0
  163. package/src/components/sessions/ReplacementsTab.tsx +438 -0
  164. package/src/components/sessions/RevisionHandlingOptions.tsx +87 -0
  165. package/src/components/sessions/SessionManager.tsx +188 -0
  166. package/src/components/sessions/StylesEditor.tsx +1335 -0
  167. package/src/components/sessions/TabContainer.tsx +151 -0
  168. package/src/components/sessions/VirtualSessionList.tsx +157 -0
  169. package/src/components/sessions/sessionToProcessorManager.tsx +420 -0
  170. package/src/components/settings/CertificateManager.tsx +410 -0
  171. package/src/components/settings/SegmentedControl.tsx +88 -0
  172. package/src/components/settings/SettingRow.tsx +52 -0
  173. package/src/contexts/GlobalStatsContext.tsx +396 -0
  174. package/src/contexts/SessionContext.tsx +2129 -0
  175. package/src/contexts/ThemeContext.tsx +428 -0
  176. package/src/contexts/UserSettingsContext.tsx +290 -0
  177. package/src/contexts/__tests__/GlobalStatsContext.test.tsx +390 -0
  178. package/src/global.d.ts +273 -0
  179. package/src/hooks/useDocumentQueue.tsx +210 -0
  180. package/src/hooks/useToast.tsx +55 -0
  181. package/src/main.tsx +10 -0
  182. package/src/pages/Analytics.tsx +386 -0
  183. package/src/pages/CurrentSession.tsx +1174 -0
  184. package/src/pages/Dashboard.tsx +319 -0
  185. package/src/pages/Documents.tsx +317 -0
  186. package/src/pages/Projects.tsx +250 -0
  187. package/src/pages/Reporting.tsx +386 -0
  188. package/src/pages/Search.tsx +349 -0
  189. package/src/pages/Sessions.tsx +285 -0
  190. package/src/pages/Settings.tsx +2662 -0
  191. package/src/services/HyperlinkService.ts +1085 -0
  192. package/src/services/document/DocXMLaterProcessor.ts +617 -0
  193. package/src/services/document/DocumentProcessingComparison.ts +856 -0
  194. package/src/services/document/DocumentSnapshotService.ts +575 -0
  195. package/src/services/document/WordDocumentProcessor.ts +10509 -0
  196. package/src/services/document/__tests__/DocXMLaterProcessor.hyperlinks.test.md +311 -0
  197. package/src/services/document/__tests__/WordDocumentProcessor.integration.test.ts +515 -0
  198. package/src/services/document/__tests__/WordDocumentProcessor.test.ts +812 -0
  199. package/src/services/document/blanklines/BlankLineManager.ts +658 -0
  200. package/src/services/document/blanklines/__tests__/paragraphChecks.test.ts +281 -0
  201. package/src/services/document/blanklines/helpers/blankLineInsertion.ts +87 -0
  202. package/src/services/document/blanklines/helpers/blankLineSnapshot.ts +251 -0
  203. package/src/services/document/blanklines/helpers/clearCustom.ts +121 -0
  204. package/src/services/document/blanklines/helpers/contextChecks.ts +117 -0
  205. package/src/services/document/blanklines/helpers/imageChecks.ts +51 -0
  206. package/src/services/document/blanklines/helpers/paragraphChecks.ts +236 -0
  207. package/src/services/document/blanklines/helpers/removeBlanksBetweenListItems.ts +91 -0
  208. package/src/services/document/blanklines/helpers/removeTrailingBlanks.ts +35 -0
  209. package/src/services/document/blanklines/helpers/tableGuards.ts +21 -0
  210. package/src/services/document/blanklines/index.ts +67 -0
  211. package/src/services/document/blanklines/rules/additionRules.ts +337 -0
  212. package/src/services/document/blanklines/rules/indentationRules.ts +317 -0
  213. package/src/services/document/blanklines/rules/removalRules.ts +362 -0
  214. package/src/services/document/blanklines/rules/ruleTypes.ts +92 -0
  215. package/src/services/document/blanklines/types.ts +29 -0
  216. package/src/services/document/helpers/ImageBorderCropper.ts +377 -0
  217. package/src/services/document/helpers/__tests__/whitespace.test.ts +272 -0
  218. package/src/services/document/helpers/whitespace.ts +117 -0
  219. package/src/services/document/list/ListNormalizer.ts +947 -0
  220. package/src/services/document/list/index.ts +45 -0
  221. package/src/services/document/list/list-detection.ts +275 -0
  222. package/src/services/document/list/list-types.ts +162 -0
  223. package/src/services/document/processors/HyperlinkProcessor.ts +370 -0
  224. package/src/services/document/processors/ListProcessor.ts +257 -0
  225. package/src/services/document/processors/StructureProcessor.ts +176 -0
  226. package/src/services/document/processors/StyleProcessor.ts +389 -0
  227. package/src/services/document/processors/TableProcessor.ts +2238 -0
  228. package/src/services/document/processors/__tests__/HyperlinkProcessor.test.ts +314 -0
  229. package/src/services/document/processors/__tests__/ListProcessor.test.ts +291 -0
  230. package/src/services/document/processors/__tests__/StructureProcessor.test.ts +257 -0
  231. package/src/services/document/processors/__tests__/TableProcessor.hlp-tips-bullets.test.ts +459 -0
  232. package/src/services/document/processors/__tests__/TableProcessor.test.ts +1604 -0
  233. package/src/services/document/processors/index.ts +28 -0
  234. package/src/services/document/types/docx-processing.ts +310 -0
  235. package/src/services/editor/EditorActionHandlers.ts +901 -0
  236. package/src/services/editor/index.ts +13 -0
  237. package/src/setupTests.ts +47 -0
  238. package/src/styles/global.css +782 -0
  239. package/src/types/backup.ts +132 -0
  240. package/src/types/dictionary.ts +125 -0
  241. package/src/types/document-processing.ts +331 -0
  242. package/src/types/docxmlater-augments.d.ts +142 -0
  243. package/src/types/editor.ts +280 -0
  244. package/src/types/electron.ts +340 -0
  245. package/src/types/globalStats.ts +155 -0
  246. package/src/types/hyperlink.ts +471 -0
  247. package/src/types/operations.ts +354 -0
  248. package/src/types/session.ts +427 -0
  249. package/src/types/settings.ts +112 -0
  250. package/src/utils/MemoryMonitor.ts +248 -0
  251. package/src/utils/cn.ts +6 -0
  252. package/src/utils/colorConvert.ts +306 -0
  253. package/src/utils/diffUtils.ts +347 -0
  254. package/src/utils/documentUtils.ts +202 -0
  255. package/src/utils/electronGuard.ts +62 -0
  256. package/src/utils/indexedDB.ts +915 -0
  257. package/src/utils/logger.ts +717 -0
  258. package/src/utils/pathSecurity.ts +232 -0
  259. package/src/utils/pathValidator.ts +236 -0
  260. package/src/utils/processingTimeEstimator.ts +153 -0
  261. package/src/utils/safeJsonParse.ts +62 -0
  262. package/src/utils/textSanitizer.ts +162 -0
  263. package/src/utils/urlHelpers.ts +304 -0
  264. package/src/utils/urlPatterns.ts +198 -0
  265. package/src/utils/urlSanitizer.ts +152 -0
  266. package/src/vite-env.d.ts +11 -0
  267. package/tsconfig.electron.json +19 -0
  268. package/tsconfig.json +36 -0
  269. package/tsconfig.node.json +12 -0
  270. package/typedoc.json +45 -0
  271. package/vite.config.ts +152 -0
@@ -0,0 +1,427 @@
1
+ // Revision handling mode type
2
+ export type RevisionHandlingMode = 'accept_all' | 'preserve' | 'preserve_and_wrap';
3
+
4
+ // Change category type
5
+ export type ChangeCategory =
6
+ | 'content'
7
+ | 'formatting'
8
+ | 'structural'
9
+ | 'table'
10
+ | 'hyperlink'
11
+ | 'image'
12
+ | 'field'
13
+ | 'comment'
14
+ | 'bookmark'
15
+ | 'contentControl';
16
+
17
+ /**
18
+ * Change entry from Word tracked changes (compatible with docxmlater ChangeEntry)
19
+ */
20
+ export interface ChangeEntry {
21
+ id: string;
22
+ revisionType: string;
23
+ category: ChangeCategory;
24
+ description: string;
25
+ author: string;
26
+ date: Date;
27
+ location?: {
28
+ sectionIndex?: number;
29
+ paragraphIndex: number;
30
+ runIndex?: number;
31
+ nearestHeading?: string;
32
+ characterOffset?: number;
33
+ };
34
+ content?: {
35
+ before?: string;
36
+ after?: string;
37
+ affectedText?: string;
38
+ hyperlinkChange?: {
39
+ urlBefore?: string;
40
+ urlAfter?: string;
41
+ textBefore?: string;
42
+ textAfter?: string;
43
+ /** Status of the hyperlink source (for theSource links) */
44
+ status?: 'updated' | 'not_found' | 'expired';
45
+ /** Content ID for theSource documents */
46
+ contentId?: string;
47
+ };
48
+ };
49
+ propertyChange?: {
50
+ property: string;
51
+ oldValue?: string;
52
+ newValue?: string;
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Summary statistics for changelog entries
58
+ */
59
+ export interface ChangelogSummary {
60
+ total: number;
61
+ byCategory: Record<ChangeCategory, number>;
62
+ byType: Record<string, number>;
63
+ byAuthor: Record<string, number>;
64
+ dateRange: { earliest: Date; latest: Date } | null;
65
+ }
66
+
67
+ /**
68
+ * Unified change entry for UI display - combines Word revisions and processing changes
69
+ */
70
+ export interface UnifiedChange {
71
+ id: string;
72
+ source: 'word' | 'processing';
73
+ category: ChangeCategory; // 'content' | 'formatting' | 'structural' | 'table' | 'hyperlink'
74
+ description: string;
75
+ author?: string;
76
+ date?: Date;
77
+ location?: {
78
+ paragraphIndex?: number;
79
+ nearestHeading?: string;
80
+ };
81
+ before?: string;
82
+ after?: string;
83
+ affectedText?: string; // The text that was affected by this change
84
+ count?: number; // For consolidated changes
85
+ hyperlinkChange?: {
86
+ urlBefore?: string;
87
+ urlAfter?: string;
88
+ textBefore?: string;
89
+ textAfter?: string;
90
+ /** Status of the hyperlink source (for theSource links) */
91
+ status?: 'updated' | 'not_found' | 'expired';
92
+ /** Content ID for theSource documents */
93
+ contentId?: string;
94
+ };
95
+ /** Property change details (for formatting changes) */
96
+ propertyChange?: {
97
+ property: string;
98
+ oldValue?: string;
99
+ newValue?: string;
100
+ };
101
+ /** Multiple property changes grouped together (when same text has multiple formatting changes) */
102
+ groupedProperties?: Array<{
103
+ property: string;
104
+ oldValue?: string;
105
+ newValue?: string;
106
+ }>;
107
+ }
108
+
109
+ /**
110
+ * Previous revision state - tracked changes that existed in the document BEFORE DocHub processing
111
+ * These are captured on document load and displayed separately in the UI
112
+ */
113
+ export interface PreviousRevisionState {
114
+ /** Whether document had pre-existing tracked changes */
115
+ hadRevisions: boolean;
116
+ /** Changelog entries from pre-existing Word revisions (before DocHub processing) */
117
+ entries: ChangeEntry[];
118
+ /** Summary statistics for pre-existing revisions */
119
+ summary: ChangelogSummary | null;
120
+ }
121
+
122
+ /**
123
+ * Word revision state for a document - tracked changes from DocHub processing
124
+ */
125
+ export interface WordRevisionState {
126
+ /** Whether document has Word tracked changes */
127
+ hasRevisions: boolean;
128
+ /** Changelog entries from DocHub processing (author is typically 'DocHub' or user name) */
129
+ entries: ChangeEntry[];
130
+ /** Summary statistics */
131
+ summary: ChangelogSummary | null;
132
+ /** How revisions were handled during processing */
133
+ handlingMode: RevisionHandlingMode;
134
+ /** Author name used for DocHub processing changes - used to distinguish DocHub vs pre-existing changes */
135
+ processingAuthor?: string;
136
+ /** Result of revision handling */
137
+ handlingResult?: {
138
+ accepted: string[];
139
+ preserved: string[];
140
+ conflicts: number;
141
+ };
142
+ }
143
+
144
+ export interface Document {
145
+ id: string;
146
+ name: string;
147
+ path?: string;
148
+ size: number;
149
+ type?: string;
150
+ status: 'pending' | 'processing' | 'completed' | 'error';
151
+ processedAt?: Date;
152
+ errors?: string[];
153
+ errorType?: 'file_locked' | 'api_timeout' | 'word_compatibility' | 'general';
154
+ fileData?: ArrayBuffer; // Store file data for processing
155
+ /** Pre-existing tracked changes that were in the document BEFORE DocHub processing */
156
+ previousRevisions?: PreviousRevisionState;
157
+ /** Word tracked changes state from DocHub processing */
158
+ wordRevisions?: WordRevisionState;
159
+ // Processing results
160
+ processingResult?: {
161
+ hyperlinksProcessed?: number;
162
+ hyperlinksModified?: number;
163
+ contentIdsAppended?: number;
164
+ backupPath?: string;
165
+ duration?: number;
166
+ changes?: DocumentChange[];
167
+ optionsUsed?: string[]; // IDs of processing options that were enabled during processing
168
+ warnings?: string[]; // Any warnings or issues encountered (e.g., "Header 2 spacing could not be applied")
169
+ };
170
+ }
171
+
172
+ export interface DocumentChange {
173
+ id?: string; // Unique identifier for the change (for reversion)
174
+ type: 'hyperlink' | 'text' | 'style' | 'structure' | 'table' | 'deletion';
175
+ description: string;
176
+ before?: string;
177
+ after?: string;
178
+ count?: number;
179
+ // Location tracking for precise reversion
180
+ elementPath?: string; // XPath-like identifier for element
181
+ paragraphIndex?: number; // Paragraph index in document
182
+ runIndex?: number; // Run index within paragraph
183
+ context?: string; // Surrounding context for better identification
184
+
185
+ // NEW: Enhanced location context
186
+ nearestHeader2?: string; // Closest Header 2 above this change
187
+ sectionContext?: string; // Additional section info
188
+
189
+ // NEW: Grouping and categorization
190
+ category?: 'blank_lines' | 'hyperlink_update' | 'hyperlink_failed' | 'list_fix' |
191
+ 'style_application' | 'structure' | 'other';
192
+ affectedItems?: string[]; // For grouped changes (e.g., list of URLs updated)
193
+
194
+ // NEW: Hyperlink-specific metadata
195
+ contentId?: string; // Content ID if applicable
196
+ hyperlinkStatus?: 'updated' | 'expired' | 'not_found' | 'valid';
197
+
198
+ // NEW: URL change tracking for hyperlinks
199
+ urlBefore?: string; // Original URL (before change)
200
+ urlAfter?: string; // New URL (after change)
201
+ }
202
+
203
+ export interface SessionStats {
204
+ documentsProcessed: number;
205
+ hyperlinksChecked: number;
206
+ feedbackImported: number;
207
+ timeSaved: number; // in minutes
208
+ }
209
+
210
+ export interface Session {
211
+ id: string;
212
+ name: string;
213
+ createdAt: Date;
214
+ lastModified: Date;
215
+ closedAt?: Date;
216
+ documents: Document[];
217
+ stats: SessionStats;
218
+ status: 'active' | 'closed';
219
+ // Processing configuration
220
+ processingOptions?: {
221
+ appendContentId?: boolean; // DEPRECATED: #content should never be appended
222
+ contentIdToAppend?: string; // DEPRECATED: #content should never be appended
223
+ validateUrls: boolean;
224
+ createBackup: boolean;
225
+ processInternalLinks: boolean;
226
+ processExternalLinks: boolean;
227
+ enabledOperations: string[];
228
+ /** How to handle Word tracked changes during processing */
229
+ revisionHandlingMode?: RevisionHandlingMode;
230
+ /** Author name for preserve_and_wrap mode */
231
+ revisionAuthor?: string;
232
+ /** Auto-accept all revisions after processing for clean output (default: false) */
233
+ autoAcceptRevisions?: boolean;
234
+ };
235
+ // Style configuration
236
+ styles?: SessionStyle[];
237
+ // Document uniformity settings
238
+ listBulletSettings?: ListBulletSettings;
239
+ tableUniformitySettings?: TableUniformitySettings; // Legacy - will be deprecated
240
+ tableShadingSettings?: TableShadingSettings; // NEW: Simplified table shading colors
241
+ tableOfContentsSettings?: TableOfContentsSettings;
242
+ // Replacement rules
243
+ replacements?: ReplacementRule[];
244
+ }
245
+
246
+ export interface SessionStyle {
247
+ id: string; // CRITICAL: needed to identify which style (header1, header2, header3, normal, listParagraph)
248
+ name: string;
249
+ fontFamily: string;
250
+ fontSize: number;
251
+ bold: boolean; // Required: true = apply bold, false = remove bold
252
+ italic: boolean; // Required: true = apply italic, false = remove italic
253
+ underline: boolean; // Required: true = apply underline, false = remove underline
254
+ preserveBold?: boolean; // Optional: true = preserve existing bold (ignore bold property)
255
+ preserveItalic?: boolean; // Optional: true = preserve existing italic (ignore italic property)
256
+ preserveUnderline?: boolean; // Optional: true = preserve existing underline (ignore underline property)
257
+ preserveCenterAlignment?: boolean; // Optional: true = preserve center alignment if paragraph is already centered
258
+ alignment: 'left' | 'center' | 'right' | 'justify';
259
+ color: string;
260
+ spaceBefore: number;
261
+ spaceAfter: number;
262
+ lineSpacing: number;
263
+ noSpaceBetweenSame?: boolean; // Don't add space between paragraphs of the same style (List Paragraph)
264
+ indentation?: {
265
+ left?: number; // Left indent in inches (e.g., 0.25" for bullet position)
266
+ firstLine?: number; // First line indent in inches (e.g., 0.5" for text position)
267
+ };
268
+ }
269
+
270
+ export interface IndentationLevel {
271
+ level: number;
272
+ symbolIndent: number; // Symbol/bullet position from left margin in inches
273
+ textIndent: number; // Text position from left margin in inches
274
+ bulletChar?: string; // bullet character for this level
275
+ numberedFormat?: string; // format for numbered lists (1., a., i., etc.)
276
+ }
277
+
278
+ export interface ListBulletSettings {
279
+ enabled: boolean;
280
+ indentationLevels: IndentationLevel[];
281
+ // Note: List item spacing uses the List Paragraph style's spaceBefore/spaceAfter values
282
+ }
283
+
284
+ export interface TableUniformitySettings {
285
+ enabled: boolean;
286
+ borderStyle: 'none' | 'single' | 'double' | 'dashed';
287
+ borderWidth: number; // in points
288
+ headerRowBold: boolean;
289
+ headerRowShaded: boolean;
290
+ headerRowShadingColor: string; // color hex for header row shading
291
+ alternatingRowColors: boolean;
292
+ cellPadding: number; // in points
293
+ autoFit: 'content' | 'window';
294
+ // Header 2 in 1x1 table cell settings
295
+ header2In1x1CellShading: string; // color hex
296
+ header2In1x1Alignment: 'left' | 'center' | 'right' | 'justify';
297
+ // Large table (>1x1) settings
298
+ largeTableSettings: {
299
+ font: string;
300
+ fontSize: number;
301
+ bold: boolean;
302
+ italic: boolean;
303
+ underline: boolean;
304
+ alignment: 'left' | 'center' | 'right' | 'justify';
305
+ cellPadding: number;
306
+ };
307
+ applyToIfThenPattern: boolean; // Apply to cells with "If...Then" pattern
308
+ applyToTopRow: boolean; // Apply to top row if not 1x1
309
+ }
310
+
311
+ export interface TableOfContentsSettings {
312
+ enabled: boolean;
313
+ }
314
+
315
+ export interface TableShadingSettings {
316
+ header2Shading: string; // Hex color for Header 2 / 1x1 table cells (default: #BFBFBF)
317
+ otherShading: string; // Hex color for other table cells (default: #DFDFDF)
318
+ imageBorderWidth?: number; // Border width in points for images (default: 1.0)
319
+ preserveBold?: boolean; // If true, preserve original bold formatting in table cells (default: use Normal style's preserveBold)
320
+ heading2FontFamily?: string; // Font family for Heading 2 / 1x1 table cells (default: from Heading 2 style config)
321
+ heading2FontSize?: number; // Font size in points for Heading 2 / 1x1 table cells (default: from Heading 2 style config)
322
+
323
+ // Table cell padding in inches
324
+ // 1x1 Tables padding
325
+ padding1x1Top?: number; // default: 0
326
+ padding1x1Bottom?: number; // default: 0
327
+ padding1x1Left?: number; // default: 0.08
328
+ padding1x1Right?: number; // default: 0.08
329
+
330
+ // Other Tables padding (>1x1)
331
+ paddingOtherTop?: number; // default: 0
332
+ paddingOtherBottom?: number; // default: 0
333
+ paddingOtherLeft?: number; // default: 0.08
334
+ paddingOtherRight?: number; // default: 0.08
335
+
336
+ // Cell border settings
337
+ cellBorderThickness?: number; // Border thickness in points (default: 0.5)
338
+ }
339
+
340
+ export interface ReplacementRule {
341
+ id: string;
342
+ enabled: boolean;
343
+ type: 'hyperlink' | 'text';
344
+ pattern: string;
345
+ replacement: string;
346
+ caseSensitive?: boolean;
347
+ }
348
+
349
+ /**
350
+ * Custom session defaults stored in localStorage
351
+ * Used when user clicks "Save as Default" to persist their preferred settings
352
+ */
353
+ export interface CustomSessionDefaults {
354
+ styles?: SessionStyle[];
355
+ listBulletSettings?: ListBulletSettings;
356
+ processingOptions?: Session['processingOptions'];
357
+ tableShadingSettings?: TableShadingSettings;
358
+ }
359
+
360
+ export interface SessionContextType {
361
+ sessions: Session[];
362
+ activeSessions: Session[];
363
+ currentSession: Session | null;
364
+ recentSessions: Session[];
365
+
366
+ // Actions
367
+ createSession: (name: string) => Session;
368
+ loadSession: (id: string) => void;
369
+ reopenSession: (id: string) => void;
370
+ closeSession: (id: string) => void;
371
+ deleteSession: (id: string) => void;
372
+ switchSession: (id: string) => void;
373
+
374
+ // Document actions
375
+ addDocuments: (sessionId: string, files: File[]) => Promise<void>;
376
+ removeDocument: (sessionId: string, documentId: string) => void;
377
+ processDocument: (sessionId: string, documentId: string) => Promise<void>;
378
+
379
+ // Revert actions
380
+ revertChange: (sessionId: string, documentId: string, changeId: string) => Promise<void>;
381
+ revertAllChanges: (sessionId: string, documentId: string) => Promise<void>;
382
+
383
+ // Stats
384
+ updateSessionStats: (sessionId: string, stats: Partial<SessionStats>) => void;
385
+ updateSessionName: (sessionId: string, name: string) => void;
386
+ updateSessionOptions: (
387
+ sessionId: string,
388
+ processingOptions: Session['processingOptions']
389
+ ) => void;
390
+ updateSessionReplacements: (sessionId: string, replacements: ReplacementRule[]) => void;
391
+ updateSessionStyles: (sessionId: string, styles: SessionStyle[]) => void;
392
+ updateSessionListBulletSettings: (
393
+ sessionId: string,
394
+ listBulletSettings: ListBulletSettings
395
+ ) => void;
396
+ updateSessionTableUniformitySettings: (
397
+ sessionId: string,
398
+ tableUniformitySettings: TableUniformitySettings
399
+ ) => void;
400
+ updateSessionTableShadingSettings: (
401
+ sessionId: string,
402
+ tableShadingSettings: TableShadingSettings
403
+ ) => void;
404
+ updateSessionTableOfContentsSettings: (
405
+ sessionId: string,
406
+ tableOfContentsSettings: TableOfContentsSettings
407
+ ) => void;
408
+
409
+ // Persistence
410
+ saveSession: (session: Session) => void;
411
+ loadSessionFromStorage: (id: string) => Session | null;
412
+
413
+ // Defaults management
414
+ resetSessionToDefaults: (sessionId: string) => void;
415
+ saveAsCustomDefaults: (sessionId: string) => void;
416
+ }
417
+
418
+ /**
419
+ * Queue item for sequential document processing
420
+ * Used by useDocumentQueue hook to process documents one at a time
421
+ */
422
+ export interface QueueItem {
423
+ documentId: string;
424
+ sessionId: string;
425
+ addedAt: Date;
426
+ status: 'queued' | 'processing' | 'completed' | 'error';
427
+ }
@@ -0,0 +1,112 @@
1
+ export interface UserProfile {
2
+ firstName: string;
3
+ lastName: string;
4
+ email: string;
5
+ }
6
+
7
+ export interface NotificationSettings {
8
+ emailNotifications: boolean;
9
+ pushNotifications: boolean;
10
+ projectUpdates: boolean;
11
+ teamMentions: boolean;
12
+ weeklyDigest: boolean;
13
+ }
14
+
15
+ export interface ApiConnections {
16
+ powerAutomateUrl: string;
17
+ bugReportUrl: string;
18
+ submitIdeaUrl: string;
19
+ }
20
+
21
+ export interface UpdateSettings {
22
+ autoUpdateOnLaunch: boolean;
23
+ checkForPreReleases: boolean;
24
+ // SharePoint update source (alternative to GitHub)
25
+ useSharePointSource: boolean;
26
+ sharePointFolderUrl: string;
27
+ }
28
+
29
+ /**
30
+ * Local Dictionary Settings for SharePoint Dictionary integration
31
+ * When enabled, hyperlink lookups use local SQLite database instead of API
32
+ *
33
+ * Uses interactive browser authentication (like the Updates feature)
34
+ * to download and parse an Excel file containing Document_ID, Content_ID, Title, Status
35
+ */
36
+ export interface LocalDictionarySettings {
37
+ enabled: boolean;
38
+ sharePointFileUrl: string; // Direct URL to .xlsx file on SharePoint
39
+ lastRetrievalTime: string | null;
40
+ lastRetrievalSuccess: boolean;
41
+ totalEntries: number;
42
+ }
43
+
44
+ /**
45
+ * Backup Settings for document backup configuration
46
+ */
47
+ export interface BackupSettings {
48
+ enabled: boolean;
49
+ }
50
+
51
+ /**
52
+ * Display Settings for monitor configuration
53
+ * Used for document comparison feature
54
+ */
55
+ export interface DisplaySettings {
56
+ comparisonMonitorId: number; // Index of selected monitor (0 = primary)
57
+ }
58
+
59
+ export interface UserSettings {
60
+ profile: UserProfile;
61
+ notifications: NotificationSettings;
62
+ apiConnections: ApiConnections;
63
+ language: string;
64
+ timezone: string;
65
+ dateFormat: string;
66
+ updateSettings: UpdateSettings;
67
+ localDictionary: LocalDictionarySettings;
68
+ backupSettings: BackupSettings;
69
+ displaySettings: DisplaySettings;
70
+ }
71
+
72
+ export const defaultUserSettings: UserSettings = {
73
+ profile: {
74
+ firstName: 'John',
75
+ lastName: 'Doe',
76
+ email: 'john.doe@example.com',
77
+ },
78
+ notifications: {
79
+ emailNotifications: false,
80
+ pushNotifications: false,
81
+ projectUpdates: false,
82
+ teamMentions: false,
83
+ weeklyDigest: false,
84
+ },
85
+ apiConnections: {
86
+ powerAutomateUrl: 'https://www.example.com',
87
+ bugReportUrl: 'https://www.example.com',
88
+ submitIdeaUrl: 'https://www.example.com',
89
+ },
90
+ language: 'English (US)',
91
+ timezone: 'UTC-05:00 Eastern Time (ET)',
92
+ dateFormat: 'MM/DD/YYYY',
93
+ updateSettings: {
94
+ autoUpdateOnLaunch: true,
95
+ checkForPreReleases: false,
96
+ useSharePointSource: false,
97
+ sharePointFolderUrl: '',
98
+ },
99
+ localDictionary: {
100
+ enabled: false,
101
+ sharePointFileUrl: '',
102
+ lastRetrievalTime: null,
103
+ lastRetrievalSuccess: false,
104
+ totalEntries: 0,
105
+ },
106
+ backupSettings: {
107
+ enabled: true,
108
+ },
109
+ displaySettings: {
110
+ comparisonMonitorId: 0, // Default to primary monitor
111
+ },
112
+ };