@apvee/spfx-react-toolkit 1.1.0 → 1.2.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.
Files changed (135) hide show
  1. package/README.md +52 -7217
  2. package/lib/core/context.internal.d.ts +6 -1
  3. package/lib/core/context.internal.d.ts.map +1 -1
  4. package/lib/core/context.internal.js +6 -1
  5. package/lib/core/context.internal.js.map +1 -1
  6. package/lib/core/index.d.ts +21 -0
  7. package/lib/core/index.d.ts.map +1 -1
  8. package/lib/core/index.js +21 -0
  9. package/lib/core/index.js.map +1 -1
  10. package/lib/core/provider-application-customizer.d.ts.map +1 -1
  11. package/lib/core/provider-application-customizer.js.map +1 -1
  12. package/lib/core/provider-field-customizer.d.ts.map +1 -1
  13. package/lib/core/provider-field-customizer.js.map +1 -1
  14. package/lib/core/provider-listview-commandset.d.ts.map +1 -1
  15. package/lib/core/provider-listview-commandset.js.map +1 -1
  16. package/lib/core/provider-webpart.d.ts.map +1 -1
  17. package/lib/core/provider-webpart.js.map +1 -1
  18. package/lib/core/types.d.ts +2 -0
  19. package/lib/core/types.d.ts.map +1 -1
  20. package/lib/hooks/index.d.ts +31 -0
  21. package/lib/hooks/index.d.ts.map +1 -1
  22. package/lib/hooks/index.js +31 -0
  23. package/lib/hooks/index.js.map +1 -1
  24. package/lib/hooks/useAsyncInvoke.internal.d.ts +58 -0
  25. package/lib/hooks/useAsyncInvoke.internal.d.ts.map +1 -0
  26. package/lib/hooks/useAsyncInvoke.internal.js +118 -0
  27. package/lib/hooks/useAsyncInvoke.internal.js.map +1 -0
  28. package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
  29. package/lib/hooks/useSPFxAadHttpClient.js +5 -75
  30. package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
  31. package/lib/hooks/useSPFxContainerInfo.d.ts +2 -0
  32. package/lib/hooks/useSPFxContainerInfo.d.ts.map +1 -1
  33. package/lib/hooks/useSPFxContainerInfo.js +2 -0
  34. package/lib/hooks/useSPFxContainerInfo.js.map +1 -1
  35. package/lib/hooks/useSPFxDisplayMode.d.ts +4 -0
  36. package/lib/hooks/useSPFxDisplayMode.d.ts.map +1 -1
  37. package/lib/hooks/useSPFxDisplayMode.js +4 -0
  38. package/lib/hooks/useSPFxDisplayMode.js.map +1 -1
  39. package/lib/hooks/useSPFxHttpClient.d.ts +4 -0
  40. package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -1
  41. package/lib/hooks/useSPFxHttpClient.js +8 -75
  42. package/lib/hooks/useSPFxHttpClient.js.map +1 -1
  43. package/lib/hooks/useSPFxMSGraphClient.d.ts.map +1 -1
  44. package/lib/hooks/useSPFxMSGraphClient.js +4 -74
  45. package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
  46. package/lib/hooks/useSPFxOneDriveAppData.d.ts +25 -0
  47. package/lib/hooks/useSPFxOneDriveAppData.d.ts.map +1 -1
  48. package/lib/hooks/useSPFxOneDriveAppData.js +121 -256
  49. package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
  50. package/lib/hooks/useSPFxPermissions.d.ts +15 -3
  51. package/lib/hooks/useSPFxPermissions.d.ts.map +1 -1
  52. package/lib/hooks/useSPFxPermissions.js.map +1 -1
  53. package/lib/hooks/useSPFxPnPContext.d.ts +4 -0
  54. package/lib/hooks/useSPFxPnPContext.d.ts.map +1 -1
  55. package/lib/hooks/useSPFxPnPContext.js +4 -0
  56. package/lib/hooks/useSPFxPnPContext.js.map +1 -1
  57. package/lib/hooks/useSPFxPnPSearch.d.ts.map +1 -1
  58. package/lib/hooks/useSPFxPnPSearch.js +61 -48
  59. package/lib/hooks/useSPFxPnPSearch.js.map +1 -1
  60. package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
  61. package/lib/hooks/useSPFxSPHttpClient.js +4 -74
  62. package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
  63. package/lib/hooks/useSPFxThemeInfo.d.ts +2 -0
  64. package/lib/hooks/useSPFxThemeInfo.d.ts.map +1 -1
  65. package/lib/hooks/useSPFxThemeInfo.js +2 -0
  66. package/lib/hooks/useSPFxThemeInfo.js.map +1 -1
  67. package/lib/index.d.ts +27 -0
  68. package/lib/index.d.ts.map +1 -1
  69. package/lib/index.js +27 -0
  70. package/lib/index.js.map +1 -1
  71. package/lib/utils/resize-observer.internal.d.ts +12 -2
  72. package/lib/utils/resize-observer.internal.d.ts.map +1 -1
  73. package/lib/utils/resize-observer.internal.js +12 -2
  74. package/lib/utils/resize-observer.internal.js.map +1 -1
  75. package/lib/utils/theme-subscription.internal.d.ts +12 -3
  76. package/lib/utils/theme-subscription.internal.d.ts.map +1 -1
  77. package/lib/utils/theme-subscription.internal.js +19 -3
  78. package/lib/utils/theme-subscription.internal.js.map +1 -1
  79. package/lib/utils/type-guards.internal.d.ts +78 -5
  80. package/lib/utils/type-guards.internal.d.ts.map +1 -1
  81. package/lib/utils/type-guards.internal.js +78 -5
  82. package/lib/utils/type-guards.internal.js.map +1 -1
  83. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts +0 -4
  84. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
  85. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +35 -752
  86. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
  87. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.d.ts +7 -0
  88. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.d.ts.map +1 -0
  89. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js +131 -0
  90. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js.map +1 -0
  91. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.d.ts +8 -0
  92. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.d.ts.map +1 -0
  93. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js +158 -0
  94. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js.map +1 -0
  95. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.d.ts +9 -0
  96. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.d.ts.map +1 -0
  97. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js +159 -0
  98. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js.map +1 -0
  99. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.d.ts +10 -0
  100. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.d.ts.map +1 -0
  101. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js +141 -0
  102. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js.map +1 -0
  103. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.d.ts +6 -0
  104. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.d.ts.map +1 -0
  105. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js +62 -0
  106. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js.map +1 -0
  107. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.d.ts +6 -0
  108. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.d.ts.map +1 -0
  109. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js +98 -0
  110. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js.map +1 -0
  111. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.d.ts +6 -0
  112. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.d.ts.map +1 -0
  113. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js +45 -0
  114. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js.map +1 -0
  115. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.d.ts +6 -0
  116. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.d.ts.map +1 -0
  117. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js +134 -0
  118. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js.map +1 -0
  119. package/lib/webparts/spFxReactToolkitTest/components/demos/index.d.ts +13 -0
  120. package/lib/webparts/spFxReactToolkitTest/components/demos/index.d.ts.map +1 -0
  121. package/lib/webparts/spFxReactToolkitTest/components/demos/index.js +18 -0
  122. package/lib/webparts/spFxReactToolkitTest/components/demos/index.js.map +1 -0
  123. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.d.ts +18 -0
  124. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.d.ts.map +1 -0
  125. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js +17 -0
  126. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js.map +1 -0
  127. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.d.ts +16 -0
  128. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.d.ts.map +1 -0
  129. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js +14 -0
  130. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js.map +1 -0
  131. package/lib/webparts/spFxReactToolkitTest/components/shared/index.d.ts +6 -0
  132. package/lib/webparts/spFxReactToolkitTest/components/shared/index.d.ts.map +1 -0
  133. package/lib/webparts/spFxReactToolkitTest/components/shared/index.js +6 -0
  134. package/lib/webparts/spFxReactToolkitTest/components/shared/index.js.map +1 -0
  135. package/package.json +7 -7
@@ -46,722 +46,11 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
46
46
  import * as React from 'react';
47
47
  import styles from './SpFxReactToolkitTest.module.scss';
48
48
  import { Stack, Pivot, PivotItem, TextField, PrimaryButton, DefaultButton, MessageBar, MessageBarType, Separator, Label, Icon, } from '@fluentui/react';
49
- // Import all hooks from SPFx React Toolkit
50
- import { useSPFxProperties, useSPFxThemeInfo, useSPFxUserInfo, useSPFxEnvironmentInfo, useSPFxSiteInfo, useSPFxDisplayMode, useSPFxInstanceInfo, useSPFxPageContext, useSPFxTeams, useSPFxListInfo, useSPFxLocaleInfo, useSPFxHubSiteInfo, useSPFxCorrelationInfo, useSPFxPermissions, useSPFxCrossSitePermissions, useSPFxContainerSize, useSPFxContainerInfo, useSPFxSessionStorage, useSPFxLocalStorage, useSPFxLogger, useSPFxPageType, useSPFxServiceScope, useSPFxSPHttpClient, useSPFxMSGraphClient, useSPFxAadHttpClient, useSPFxHttpClient, useSPFxPerformance, useSPFxFluent9ThemeInfo, useSPFxOneDriveAppData, useSPFxTenantProperty, useSPFxUserPhoto, useSPFxPnPContext, useSPFxPnP, useSPFxPnPList, useSPFxPnPSearch, SearchVerticals, } from '../../../hooks';
51
- import '@pnp/sp/webs';
52
- import '@pnp/sp/lists';
53
- import '@pnp/sp/items';
54
- import '@pnp/sp/site-users';
49
+ import { InfoRow, StatusBadge } from './shared';
50
+ import { HttpClientDemo, PnPContextDemo, PnPOperationsDemo, PnPListDemo, PnPSearchBasicDemo, PnPSearchAdvancedDemo, PnPSearchRefinersDemo, PnPSearchSuggestionsDemo, } from './demos';
51
+ // Import hooks from SPFx React Toolkit (used in main component)
52
+ import { useSPFxProperties, useSPFxThemeInfo, useSPFxUserInfo, useSPFxEnvironmentInfo, useSPFxSiteInfo, useSPFxDisplayMode, useSPFxInstanceInfo, useSPFxPageContext, useSPFxTeams, useSPFxListInfo, useSPFxLocaleInfo, useSPFxHubSiteInfo, useSPFxCorrelationInfo, useSPFxPermissions, useSPFxCrossSitePermissions, useSPFxContainerSize, useSPFxContainerInfo, useSPFxSessionStorage, useSPFxLocalStorage, useSPFxLogger, useSPFxPageType, useSPFxServiceScope, useSPFxSPHttpClient, useSPFxMSGraphClient, useSPFxAadHttpClient, useSPFxPerformance, useSPFxFluent9ThemeInfo, useSPFxOneDriveAppData, useSPFxTenantProperty, useSPFxUserPhoto, } from '../../../hooks';
55
53
  import { SPPermission } from '@microsoft/sp-page-context';
56
- import { HttpClient } from '@microsoft/sp-http';
57
- // =============================================
58
- // Helper Components (Must be defined first)
59
- // =============================================
60
- // Helper component for displaying info rows
61
- var InfoRow = function (_a) {
62
- var label = _a.label, value = _a.value, icon = _a.icon;
63
- return (React.createElement("div", { className: styles.infoRow },
64
- icon && React.createElement(Icon, { iconName: icon }),
65
- React.createElement(Label, null,
66
- label,
67
- ":"),
68
- React.createElement("span", null, value || 'N/A')));
69
- };
70
- // Helper component for status badges
71
- var StatusBadge = function (_a) {
72
- var available = _a.available, label = _a.label;
73
- return (React.createElement("div", { className: "".concat(styles.statusBadge, " ").concat(available ? styles.success : styles.error) },
74
- React.createElement(Icon, { iconName: available ? 'Completed' : 'ErrorBadge' }),
75
- label));
76
- };
77
- // =============================================
78
- // HttpClient Example Component
79
- // =============================================
80
- /**
81
- * Example: useSPFxHttpClient
82
- * Demonstrates calling external public APIs using HttpClient
83
- */
84
- var HttpClientExample = function () {
85
- var _a = useSPFxHttpClient(), invoke = _a.invoke, isLoading = _a.isLoading, error = _a.error, clearError = _a.clearError;
86
- var _b = React.useState([]), todos = _b[0], setTodos = _b[1];
87
- var _c = React.useState(null), selectedTodo = _c[0], setSelectedTodo = _c[1];
88
- var loadTodos = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
89
- var data, err_1;
90
- return __generator(this, function (_a) {
91
- switch (_a.label) {
92
- case 0:
93
- _a.trys.push([0, 2, , 3]);
94
- return [4 /*yield*/, invoke(function (client) {
95
- return client.get('https://jsonplaceholder.typicode.com/todos?_limit=5', HttpClient.configurations.v1).then(function (res) { return res.json(); });
96
- })];
97
- case 1:
98
- data = _a.sent();
99
- setTodos(data);
100
- setSelectedTodo(null);
101
- return [3 /*break*/, 3];
102
- case 2:
103
- err_1 = _a.sent();
104
- console.error('Failed to load todos:', err_1);
105
- return [3 /*break*/, 3];
106
- case 3: return [2 /*return*/];
107
- }
108
- });
109
- }); }, [invoke]);
110
- var loadTodoDetails = React.useCallback(function (id) { return __awaiter(void 0, void 0, void 0, function () {
111
- var data, err_2;
112
- return __generator(this, function (_a) {
113
- switch (_a.label) {
114
- case 0:
115
- _a.trys.push([0, 2, , 3]);
116
- return [4 /*yield*/, invoke(function (client) {
117
- return client.get("https://jsonplaceholder.typicode.com/todos/".concat(id), HttpClient.configurations.v1).then(function (res) { return res.json(); });
118
- })];
119
- case 1:
120
- data = _a.sent();
121
- setSelectedTodo(data);
122
- return [3 /*break*/, 3];
123
- case 2:
124
- err_2 = _a.sent();
125
- console.error('Failed to load todo details:', err_2);
126
- return [3 /*break*/, 3];
127
- case 3: return [2 /*return*/];
128
- }
129
- });
130
- }); }, [invoke]);
131
- return (React.createElement(Stack, { tokens: { childrenGap: 15 }, styles: { root: { padding: '16px', border: '1px solid #ddd', borderRadius: '4px' } } },
132
- React.createElement("h3", null,
133
- React.createElement(Icon, { iconName: "CloudDownload", style: { marginRight: '8px' } }),
134
- "HttpClient Example - Public API Call"),
135
- React.createElement(MessageBar, { messageBarType: MessageBarType.info },
136
- "This example demonstrates calling a public REST API (JSONPlaceholder) using ",
137
- React.createElement("strong", null, "useSPFxHttpClient"),
138
- ". The hook provides automatic state management (loading/error) for external HTTP calls."),
139
- React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 10 } },
140
- React.createElement(PrimaryButton, { text: "Load Todos", onClick: loadTodos, disabled: isLoading, iconProps: { iconName: 'Download' } }),
141
- error && (React.createElement(DefaultButton, { text: "Clear Error", onClick: clearError, iconProps: { iconName: 'Clear' } }))),
142
- isLoading && (React.createElement(MessageBar, { messageBarType: MessageBarType.info },
143
- React.createElement(Icon, { iconName: "Sync", style: { marginRight: '8px' } }),
144
- "Loading data from external API...")),
145
- error && (React.createElement(MessageBar, { messageBarType: MessageBarType.error },
146
- React.createElement("strong", null, "Error:"),
147
- " ",
148
- error.message)),
149
- todos.length > 0 && (React.createElement(Stack, { tokens: { childrenGap: 10 } },
150
- React.createElement(Label, null, "Todos from JSONPlaceholder API:"),
151
- todos.map(function (todo) { return (React.createElement(Stack, { key: todo.id, horizontal: true, tokens: { childrenGap: 10 }, styles: {
152
- root: {
153
- padding: '8px',
154
- border: '1px solid #eee',
155
- borderRadius: '4px',
156
- cursor: 'pointer',
157
- ':hover': { backgroundColor: '#f5f5f5' }
158
- }
159
- }, onClick: function () { return loadTodoDetails(todo.id); } },
160
- React.createElement(Icon, { iconName: todo.completed ? 'CompletedSolid' : 'CircleRing' }),
161
- React.createElement("span", null, todo.title))); }))),
162
- selectedTodo && (React.createElement(Stack, { tokens: { childrenGap: 8 }, styles: { root: { padding: '12px', backgroundColor: '#f0f0f0', borderRadius: '4px' } } },
163
- React.createElement(Label, null, "Selected Todo Details:"),
164
- React.createElement(InfoRow, { label: "ID", value: String(selectedTodo.id), icon: "NumberField" }),
165
- React.createElement(InfoRow, { label: "User ID", value: String(selectedTodo.userId), icon: "Contact" }),
166
- React.createElement(InfoRow, { label: "Title", value: selectedTodo.title, icon: "TextDocument" }),
167
- React.createElement(InfoRow, { label: "Completed", value: selectedTodo.completed ? 'Yes' : 'No', icon: selectedTodo.completed ? 'CompletedSolid' : 'CircleRing' })))));
168
- };
169
- // =============================================
170
- // PnPjs Example Components
171
- // =============================================
172
- /**
173
- * Example 1: useSPFxPnPContext
174
- * Shows how to create PnP contexts for current and cross-site scenarios
175
- */
176
- var PnPContextExample = function () {
177
- var _a = React.useState(''), crossSiteUrl = _a[0], setCrossSiteUrl = _a[1];
178
- var _b = React.useState(null), siteInfo = _b[0], setSiteInfo = _b[1];
179
- var _c = React.useState(false), loading = _c[0], setLoading = _c[1];
180
- var _d = React.useState(null), errorMsg = _d[0], setErrorMsg = _d[1];
181
- // Current site context (default)
182
- var currentContext = useSPFxPnPContext();
183
- // Cross-site context (only when URL is provided)
184
- var crossSiteContext = useSPFxPnPContext(crossSiteUrl || undefined);
185
- var handleLoadCurrentSite = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
186
- var web, error_1;
187
- return __generator(this, function (_a) {
188
- switch (_a.label) {
189
- case 0:
190
- if (!currentContext.sp)
191
- return [2 /*return*/];
192
- setLoading(true);
193
- setErrorMsg(null);
194
- _a.label = 1;
195
- case 1:
196
- _a.trys.push([1, 3, 4, 5]);
197
- return [4 /*yield*/, currentContext.sp.web.select('Title', 'Url', 'Description')()];
198
- case 2:
199
- web = _a.sent();
200
- setSiteInfo({
201
- title: web.Title,
202
- url: web.Url,
203
- description: web.Description || '(no description)'
204
- });
205
- return [3 /*break*/, 5];
206
- case 3:
207
- error_1 = _a.sent();
208
- console.error('Error loading site:', error_1);
209
- setErrorMsg(error_1 instanceof Error ? error_1.message : 'Unknown error');
210
- setSiteInfo(null);
211
- return [3 /*break*/, 5];
212
- case 4:
213
- setLoading(false);
214
- return [7 /*endfinally*/];
215
- case 5: return [2 /*return*/];
216
- }
217
- });
218
- }); }, [currentContext.sp]);
219
- var handleLoadCrossSite = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
220
- var web, error_2;
221
- return __generator(this, function (_a) {
222
- switch (_a.label) {
223
- case 0:
224
- if (!crossSiteContext.sp || !crossSiteUrl)
225
- return [2 /*return*/];
226
- setLoading(true);
227
- setErrorMsg(null);
228
- _a.label = 1;
229
- case 1:
230
- _a.trys.push([1, 3, 4, 5]);
231
- return [4 /*yield*/, crossSiteContext.sp.web.select('Title', 'Url', 'Description')()];
232
- case 2:
233
- web = _a.sent();
234
- setSiteInfo({
235
- title: web.Title,
236
- url: web.Url,
237
- description: web.Description || '(no description)'
238
- });
239
- return [3 /*break*/, 5];
240
- case 3:
241
- error_2 = _a.sent();
242
- console.error('Error loading cross-site:', error_2);
243
- setErrorMsg(error_2 instanceof Error ? error_2.message : 'Unknown error');
244
- setSiteInfo(null);
245
- return [3 /*break*/, 5];
246
- case 4:
247
- setLoading(false);
248
- return [7 /*endfinally*/];
249
- case 5: return [2 /*return*/];
250
- }
251
- });
252
- }); }, [crossSiteContext.sp, crossSiteUrl]);
253
- return (React.createElement(Stack, { tokens: { childrenGap: 10 }, styles: { root: { padding: '16px', border: '1px solid #edebe9', borderRadius: '4px' } } },
254
- React.createElement("h3", null,
255
- React.createElement(Icon, { iconName: "Globe", style: { marginRight: '8px' } }),
256
- "Example 1: useSPFxPnPContext - Site Information"),
257
- React.createElement(Separator, null),
258
- errorMsg && (React.createElement(MessageBar, { messageBarType: MessageBarType.error, onDismiss: function () { return setErrorMsg(null); } }, errorMsg)),
259
- React.createElement(Stack, { tokens: { childrenGap: 8 } },
260
- React.createElement(Label, null, "Current Site Context"),
261
- React.createElement(InfoRow, { label: "Effective URL", value: currentContext.siteUrl, icon: "Link" }),
262
- React.createElement(InfoRow, { label: "Is Initialized", value: currentContext.isInitialized ? 'Yes' : 'No', icon: "CheckMark" }),
263
- currentContext.error && (React.createElement(MessageBar, { messageBarType: MessageBarType.warning },
264
- "Init Error: ",
265
- currentContext.error.message)),
266
- React.createElement(PrimaryButton, { text: loading ? 'Loading...' : 'Load Current Site Info', onClick: handleLoadCurrentSite, disabled: !currentContext.isInitialized || loading, iconProps: { iconName: 'CloudDownload' } })),
267
- React.createElement(Stack, { tokens: { childrenGap: 8 } },
268
- React.createElement(Label, null, "Cross-Site Context (Optional)"),
269
- React.createElement(TextField, { label: "Site URL", value: crossSiteUrl, onChange: function (_, newValue) { return setCrossSiteUrl(newValue !== null && newValue !== void 0 ? newValue : ''); }, placeholder: "e.g., /sites/hr or https://contoso.sharepoint.com/sites/hr", description: "Leave empty to use current site" }),
270
- crossSiteUrl && (React.createElement(React.Fragment, null,
271
- React.createElement(InfoRow, { label: "Resolved URL", value: crossSiteContext.siteUrl, icon: "Link" }),
272
- React.createElement(InfoRow, { label: "Is Initialized", value: crossSiteContext.isInitialized ? 'Yes' : 'No', icon: "CheckMark" }),
273
- crossSiteContext.error && (React.createElement(MessageBar, { messageBarType: MessageBarType.warning },
274
- "Init Error: ",
275
- crossSiteContext.error.message)),
276
- React.createElement(PrimaryButton, { text: loading ? 'Loading...' : 'Load Cross-Site Info', onClick: handleLoadCrossSite, disabled: !crossSiteContext.isInitialized || loading, iconProps: { iconName: 'Globe' } })))),
277
- siteInfo && (React.createElement(Stack, { tokens: { childrenGap: 8 }, styles: { root: { padding: '12px', backgroundColor: '#f3f2f1', borderRadius: '4px' } } },
278
- React.createElement(Label, { style: { fontWeight: 600 } },
279
- React.createElement(Icon, { iconName: "CheckMark", style: { marginRight: '4px', color: '#107c10' } }),
280
- "Site Information Loaded:"),
281
- React.createElement(InfoRow, { label: "Title", value: siteInfo.title, icon: "CityNext" }),
282
- React.createElement(InfoRow, { label: "URL", value: siteInfo.url, icon: "Link" }),
283
- React.createElement(InfoRow, { label: "Description", value: siteInfo.description, icon: "Info" }))),
284
- React.createElement(Label, null,
285
- React.createElement(Icon, { iconName: "InfoSolid", style: { marginRight: '4px', color: '#0078d4' } }),
286
- "useSPFxPnPContext creates configured SPFI instances. Use for cross-site scenarios or when you need custom cache/batch config.")));
287
- };
288
- /**
289
- * Example 2: useSPFxPnP
290
- * Shows invoke() for single operations and batch() for multiple operations
291
- */
292
- var PnPOperationsExample = function () {
293
- var _a = useSPFxPnP(), invoke = _a.invoke, batch = _a.batch, isLoading = _a.isLoading, error = _a.error, clearError = _a.clearError;
294
- var _b = React.useState([]), lists = _b[0], setLists = _b[1];
295
- var _c = React.useState(null), batchData = _c[0], setBatchData = _c[1];
296
- var handleInvokeLists = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
297
- var result, err_3;
298
- return __generator(this, function (_a) {
299
- switch (_a.label) {
300
- case 0:
301
- _a.trys.push([0, 2, , 3]);
302
- clearError();
303
- return [4 /*yield*/, invoke(function (sp) {
304
- return sp.web.lists
305
- .select('Title', 'ItemCount')
306
- .filter('Hidden eq false')
307
- .top(10)();
308
- })];
309
- case 1:
310
- result = _a.sent();
311
- setLists(result);
312
- return [3 /*break*/, 3];
313
- case 2:
314
- err_3 = _a.sent();
315
- console.error('Invoke error:', err_3);
316
- return [3 /*break*/, 3];
317
- case 3: return [2 /*return*/];
318
- }
319
- });
320
- }); }, [invoke, clearError]);
321
- var handleBatchOperations = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
322
- var results, listsResult, userResult, webResult, err_4;
323
- return __generator(this, function (_a) {
324
- switch (_a.label) {
325
- case 0:
326
- _a.trys.push([0, 2, , 3]);
327
- clearError();
328
- return [4 /*yield*/, batch(function (batchedSP) { return __awaiter(void 0, void 0, void 0, function () {
329
- var listsPromise, userPromise, webPromise;
330
- return __generator(this, function (_a) {
331
- listsPromise = batchedSP.web.lists.select('Title').top(5)();
332
- userPromise = batchedSP.web.currentUser.select('Title')();
333
- webPromise = batchedSP.web.select('Title')();
334
- // Wait for all batched operations to complete
335
- return [2 /*return*/, Promise.all([listsPromise, userPromise, webPromise])];
336
- });
337
- }); })];
338
- case 1:
339
- results = _a.sent();
340
- listsResult = results[0], userResult = results[1], webResult = results[2];
341
- setBatchData({
342
- lists: listsResult,
343
- user: userResult,
344
- webTitle: webResult.Title
345
- });
346
- return [3 /*break*/, 3];
347
- case 2:
348
- err_4 = _a.sent();
349
- console.error('Batch error:', err_4);
350
- return [3 /*break*/, 3];
351
- case 3: return [2 /*return*/];
352
- }
353
- });
354
- }); }, [batch, clearError]);
355
- return (React.createElement(Stack, { tokens: { childrenGap: 10 }, styles: { root: { padding: '16px', border: '1px solid #edebe9', borderRadius: '4px' } } },
356
- React.createElement("h3", null,
357
- React.createElement(Icon, { iconName: "CloudUpload", style: { marginRight: '8px' } }),
358
- "Example 2: useSPFxPnP - Operations & Batching"),
359
- React.createElement(Separator, null),
360
- error && (React.createElement(MessageBar, { messageBarType: MessageBarType.error, onDismiss: clearError }, error.message)),
361
- React.createElement(Stack, { tokens: { childrenGap: 8 } },
362
- React.createElement(Label, null, "Single Operation with invoke()"),
363
- React.createElement(PrimaryButton, { text: isLoading ? 'Loading...' : 'Load Lists (invoke)', onClick: handleInvokeLists, disabled: isLoading, iconProps: { iconName: 'BulletedList' } }),
364
- lists.length > 0 && (React.createElement(Stack, { tokens: { childrenGap: 4 }, styles: { root: { padding: '12px', backgroundColor: '#f3f2f1', borderRadius: '4px' } } },
365
- React.createElement(Label, null, "Lists (top 10, non-hidden):"),
366
- lists.map(function (list, idx) { return (React.createElement("div", { key: idx, style: { padding: '4px 0', borderBottom: idx < lists.length - 1 ? '1px solid #edebe9' : 'none' } },
367
- React.createElement("strong", null, list.Title),
368
- " - ",
369
- list.ItemCount,
370
- " items")); })))),
371
- React.createElement(Stack, { tokens: { childrenGap: 8 } },
372
- React.createElement(Label, null, "Batch Operations with batch()"),
373
- React.createElement(PrimaryButton, { text: isLoading ? 'Loading...' : 'Load Multiple (batch)', onClick: handleBatchOperations, disabled: isLoading, iconProps: { iconName: 'Streaming' } }),
374
- batchData && (React.createElement(Stack, { tokens: { childrenGap: 8 }, styles: { root: { padding: '12px', backgroundColor: '#f3f2f1', borderRadius: '4px' } } },
375
- React.createElement(InfoRow, { label: "Web Title", value: batchData.webTitle, icon: "CityNext" }),
376
- React.createElement(InfoRow, { label: "Current User", value: batchData.user.Title, icon: "Contact" }),
377
- React.createElement(Label, null, "Lists (top 5):"),
378
- batchData.lists.map(function (list, idx) { return (React.createElement("div", { key: idx, style: { paddingLeft: '16px' } },
379
- "\u2022 ",
380
- list.Title)); })))),
381
- React.createElement(Label, null,
382
- React.createElement(Icon, { iconName: "InfoSolid", style: { marginRight: '4px', color: '#0078d4' } }),
383
- "invoke() for single operations, batch() combines multiple requests into ONE HTTP call for better performance.")));
384
- };
385
- /**
386
- * Example 3: useSPFxPnPSearch - Basic Search
387
- */
388
- var PnPSearchBasicExample = function () {
389
- var _a = React.useState(''), searchText = _a[0], setSearchText = _a[1];
390
- var _b = useSPFxPnPSearch({
391
- pageSize: 10
392
- }), search = _b.search, results = _b.results, totalResults = _b.totalResults, loading = _b.loading, error = _b.error, clearError = _b.clearError;
393
- var handleSearch = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
394
- var searchResults, err_5;
395
- return __generator(this, function (_a) {
396
- switch (_a.label) {
397
- case 0:
398
- if (!searchText.trim())
399
- return [2 /*return*/];
400
- _a.label = 1;
401
- case 1:
402
- _a.trys.push([1, 3, , 4]);
403
- return [4 /*yield*/, search(searchText)];
404
- case 2:
405
- searchResults = _a.sent();
406
- console.log('[PnPSearchBasic] Search completed:', {
407
- returnedResults: searchResults.length,
408
- stateResults: results.length,
409
- totalResults: totalResults
410
- });
411
- return [3 /*break*/, 4];
412
- case 3:
413
- err_5 = _a.sent();
414
- console.error('Search error:', err_5);
415
- return [3 /*break*/, 4];
416
- case 4: return [2 /*return*/];
417
- }
418
- });
419
- }); }, [searchText, search, results.length, totalResults]);
420
- // Debug: log quando results cambia
421
- React.useEffect(function () {
422
- console.log('[PnPSearchBasic] Results state updated:', {
423
- resultsLength: results.length,
424
- totalResults: totalResults,
425
- loading: loading
426
- });
427
- }, [results, totalResults, loading]);
428
- return (React.createElement(Stack, { tokens: { childrenGap: 10 }, styles: { root: { padding: '16px', border: '1px solid #edebe9', borderRadius: '4px' } } },
429
- React.createElement("h3", null,
430
- React.createElement(Icon, { iconName: "Search", style: { marginRight: '8px' } }),
431
- "Example 1: Basic Search"),
432
- React.createElement(Separator, null),
433
- error && (React.createElement(MessageBar, { messageBarType: MessageBarType.error, onDismiss: clearError }, error.message)),
434
- React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 8 } },
435
- React.createElement(TextField, { value: searchText, onChange: function (_, newValue) { return setSearchText(newValue !== null && newValue !== void 0 ? newValue : ''); }, placeholder: "Search SharePoint...", styles: { root: { flexGrow: 1 } }, onKeyDown: function (e) {
436
- if (e.key === 'Enter') {
437
- handleSearch().catch(function (err) { return console.error('Search error:', err); });
438
- }
439
- } }),
440
- React.createElement(PrimaryButton, { text: loading ? 'Searching...' : 'Search', onClick: handleSearch, disabled: !searchText.trim() || loading, iconProps: { iconName: 'Search' } })),
441
- totalResults !== undefined && (React.createElement(MessageBar, { messageBarType: MessageBarType.info },
442
- "Found ",
443
- totalResults,
444
- " result",
445
- totalResults !== 1 ? 's' : '')),
446
- results.length > 0 ? (React.createElement(Stack, { tokens: { childrenGap: 6 } }, results.map(function (result) { return (React.createElement(Stack, { key: result.id, tokens: { childrenGap: 4 }, styles: { root: { padding: '10px', backgroundColor: '#faf9f8', borderRadius: '4px' } } },
447
- React.createElement("div", { style: { fontWeight: 600 } }, result.data.Title || '(No Title)'),
448
- React.createElement("a", { href: result.data.Path, target: "_blank", rel: "noopener noreferrer", style: { fontSize: '12px' } }, result.data.Path),
449
- result.data.FileType && React.createElement(Label, null,
450
- "Type: ",
451
- result.data.FileType))); }))) : totalResults === 0 ? (React.createElement(MessageBar, null, "No results found. Try a different query.")) : null,
452
- React.createElement(Label, null,
453
- React.createElement(Icon, { iconName: "InfoSolid", style: { marginRight: '4px', color: '#0078d4' } }),
454
- "Simple text search. Try: \"document\", \"report\", \"ContentType:Document\"")));
455
- };
456
- /**
457
- * Example 4: Advanced Search with Builder and Verticals
458
- */
459
- var PnPSearchAdvancedExample = function () {
460
- var _a = React.useState('All'), selectedVertical = _a[0], setSelectedVertical = _a[1];
461
- var _b = useSPFxPnPSearch({
462
- pageSize: 5,
463
- selectProperties: ['Title', 'Path', 'Author', 'LastModifiedTime', 'FileType']
464
- }), search = _b.search, results = _b.results, totalResults = _b.totalResults, loading = _b.loading, loadMore = _b.loadMore, hasMore = _b.hasMore, error = _b.error, clearError = _b.clearError;
465
- var getVerticalSourceId = function (vertical) {
466
- switch (vertical) {
467
- case 'People': return SearchVerticals.People;
468
- case 'Documents': return SearchVerticals.Documents;
469
- case 'Pages': return SearchVerticals.Pages;
470
- case 'Videos': return SearchVerticals.Videos;
471
- default: return undefined;
472
- }
473
- };
474
- var handleSearch = React.useCallback(function (query) {
475
- search(function (builder) {
476
- var result = builder.text(query).sortList({ Property: 'LastModifiedTime', Direction: 1 });
477
- var sourceId = getVerticalSourceId(selectedVertical);
478
- if (sourceId)
479
- result = result.sourceId(sourceId);
480
- return result;
481
- }).catch(function (err) { return console.error('Search error:', err); });
482
- }, [search, selectedVertical]);
483
- return (React.createElement(Stack, { tokens: { childrenGap: 10 }, styles: { root: { padding: '16px', border: '1px solid #edebe9', borderRadius: '4px' } } },
484
- React.createElement("h3", null,
485
- React.createElement(Icon, { iconName: "SearchAndApps", style: { marginRight: '8px' } }),
486
- "Example 2: Advanced Search with Builder"),
487
- React.createElement(Separator, null),
488
- error && (React.createElement(MessageBar, { messageBarType: MessageBarType.error, onDismiss: clearError }, error.message)),
489
- React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 6 }, wrap: true }, ['All', 'Documents', 'Pages', 'People', 'Videos'].map(function (v) { return (React.createElement(DefaultButton, { key: v, text: v, onClick: function () { return setSelectedVertical(v); }, primary: selectedVertical === v })); })),
490
- React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 6 } },
491
- React.createElement(PrimaryButton, { text: "Search All", onClick: function () { return handleSearch('*'); }, disabled: loading }),
492
- React.createElement(DefaultButton, { text: "Search Documents", onClick: function () { return handleSearch('filetype:docx OR filetype:pdf'); }, disabled: loading })),
493
- totalResults !== undefined && (React.createElement(MessageBar, { messageBarType: MessageBarType.info },
494
- "Found ",
495
- totalResults,
496
- " result",
497
- totalResults !== 1 ? 's' : '',
498
- " in \"",
499
- selectedVertical,
500
- "\"")),
501
- results.length > 0 && (React.createElement(Stack, { tokens: { childrenGap: 6 } },
502
- results.map(function (result) { return (React.createElement(Stack, { key: result.id, tokens: { childrenGap: 2 }, styles: { root: { padding: '10px', backgroundColor: '#f3f2f1', borderRadius: '4px' } } },
503
- React.createElement("div", { style: { fontWeight: 600 } }, result.data.Title || '(No Title)'),
504
- React.createElement(Label, null,
505
- result.data.Author,
506
- " - ",
507
- result.data.LastModifiedTime ? new Date(result.data.LastModifiedTime).toLocaleDateString() : 'N/A'),
508
- React.createElement("a", { href: result.data.Path, target: "_blank", rel: "noopener noreferrer", style: { fontSize: '11px' } }, result.data.Path))); }),
509
- hasMore && (React.createElement(PrimaryButton, { text: loading ? 'Loading...' : 'Load More', onClick: loadMore, disabled: loading })))),
510
- React.createElement(Label, null,
511
- React.createElement(Icon, { iconName: "InfoSolid", style: { marginRight: '4px', color: '#0078d4' } }),
512
- "Builder API with verticals (People, Documents, Pages, Videos) and pagination.")));
513
- };
514
- /**
515
- * Example 5: Faceted Search with Refiners
516
- */
517
- var PnPSearchRefinersExample = function () {
518
- var _a = useSPFxPnPSearch({
519
- pageSize: 10,
520
- selectProperties: ['Title', 'Path', 'FileType', 'Author'],
521
- refiners: 'FileType,Author'
522
- }), search = _a.search, results = _a.results, refiners = _a.refiners, totalResults = _a.totalResults, loading = _a.loading, applyRefiner = _a.applyRefiner, error = _a.error, clearError = _a.clearError;
523
- var handleSearch = React.useCallback(function () {
524
- search('*').catch(function (err) { return console.error('Search error:', err); });
525
- }, [search]);
526
- return (React.createElement(Stack, { tokens: { childrenGap: 10 }, styles: { root: { padding: '16px', border: '1px solid #edebe9', borderRadius: '4px' } } },
527
- React.createElement("h3", null,
528
- React.createElement(Icon, { iconName: "FilterSettings", style: { marginRight: '8px' } }),
529
- "Example 3: Faceted Search with Refiners"),
530
- React.createElement(Separator, null),
531
- error && (React.createElement(MessageBar, { messageBarType: MessageBarType.error, onDismiss: clearError }, error.message)),
532
- React.createElement(PrimaryButton, { text: loading ? 'Loading...' : 'Search All Content', onClick: handleSearch, disabled: loading, iconProps: { iconName: 'Search' } }),
533
- totalResults !== undefined && (React.createElement(Label, null,
534
- React.createElement(Icon, { iconName: "SearchIssue", style: { marginRight: '4px', color: '#0078d4' } }),
535
- "Found ",
536
- totalResults,
537
- " results")),
538
- React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 12 }, styles: { root: { alignItems: 'flex-start' } } },
539
- refiners.length > 0 && (React.createElement(Stack, { tokens: { childrenGap: 8 }, styles: { root: { width: '200px', padding: '8px', backgroundColor: '#f3f2f1', borderRadius: '4px' } } },
540
- React.createElement(Label, { style: { fontWeight: 600 } }, "Filters"),
541
- refiners.map(function (refiner) { return (React.createElement(Stack, { key: refiner.name, tokens: { childrenGap: 2 } },
542
- React.createElement(Label, null, refiner.name),
543
- refiner.entries.slice(0, 5).map(function (entry) { return (React.createElement(DefaultButton, { key: entry.value, text: "".concat(entry.value, " (").concat(entry.count, ")"), onClick: function () { return applyRefiner(refiner.name, entry.value); }, styles: { root: { height: '28px', fontSize: '12px' } } })); }))); }))),
544
- React.createElement(Stack, { tokens: { childrenGap: 6 }, styles: { root: { flexGrow: 1 } } }, results.length > 0 ? (results.map(function (result) { return (React.createElement(Stack, { key: result.id, tokens: { childrenGap: 2 }, styles: { root: { padding: '8px', backgroundColor: '#faf9f8', borderRadius: '4px' } } },
545
- React.createElement("div", { style: { fontWeight: 600 } }, result.data.Title || '(No Title)'),
546
- React.createElement(Label, null,
547
- result.data.FileType,
548
- " | ",
549
- result.data.Author),
550
- React.createElement("a", { href: result.data.Path, target: "_blank", rel: "noopener noreferrer", style: { fontSize: '11px' } }, result.data.Path))); })) : (React.createElement(Label, null, "Click \"Search All Content\" to see results.")))),
551
- React.createElement(Label, null,
552
- React.createElement(Icon, { iconName: "InfoSolid", style: { marginRight: '4px', color: '#0078d4' } }),
553
- "Faceted search with FileType and Author refiners. Click to filter/toggle.")));
554
- };
555
- /**
556
- * Example 6: Search Suggestions (Autocomplete)
557
- */
558
- var PnPSearchSuggestionsExample = function () {
559
- var _a = React.useState(''), query = _a[0], setQuery = _a[1];
560
- var _b = React.useState([]), suggestions = _b[0], setSuggestions = _b[1];
561
- var suggest = useSPFxPnPSearch().suggest;
562
- // Track if component is mounted to prevent state updates after unmount
563
- var mountedRef = React.useRef(true);
564
- // Cleanup on unmount
565
- React.useEffect(function () {
566
- mountedRef.current = true;
567
- return function () {
568
- mountedRef.current = false;
569
- };
570
- }, []);
571
- var handleSuggest = React.useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
572
- var results, err_6;
573
- return __generator(this, function (_a) {
574
- switch (_a.label) {
575
- case 0:
576
- if (!value || value.length < 2) {
577
- if (mountedRef.current) {
578
- setSuggestions([]);
579
- }
580
- return [2 /*return*/];
581
- }
582
- _a.label = 1;
583
- case 1:
584
- _a.trys.push([1, 3, , 4]);
585
- return [4 /*yield*/, suggest(value)];
586
- case 2:
587
- results = _a.sent();
588
- if (mountedRef.current) {
589
- setSuggestions(results);
590
- }
591
- return [3 /*break*/, 4];
592
- case 3:
593
- err_6 = _a.sent();
594
- console.error('[PnPSearchSuggestions] Error:', err_6);
595
- if (mountedRef.current) {
596
- setSuggestions([]);
597
- }
598
- return [3 /*break*/, 4];
599
- case 4: return [2 /*return*/];
600
- }
601
- });
602
- }); }, [suggest]);
603
- // Debounced suggest with proper cleanup
604
- var debouncedSuggest = React.useMemo(function () {
605
- var timeoutId;
606
- // Return debounced function
607
- var debounced = function (value) {
608
- if (timeoutId !== undefined) {
609
- clearTimeout(timeoutId);
610
- }
611
- timeoutId = window.setTimeout(function () { return handleSuggest(value); }, 300);
612
- };
613
- // Cleanup function stored in the debounced function
614
- debounced.cancel = function () {
615
- if (timeoutId !== undefined) {
616
- clearTimeout(timeoutId);
617
- timeoutId = undefined;
618
- }
619
- };
620
- return debounced;
621
- }, [handleSuggest]);
622
- // Cleanup timeout on unmount
623
- React.useEffect(function () {
624
- return function () {
625
- var _a;
626
- (_a = debouncedSuggest.cancel) === null || _a === void 0 ? void 0 : _a.call(debouncedSuggest);
627
- };
628
- }, [debouncedSuggest]);
629
- var handleQueryChange = React.useCallback(function (value) {
630
- setQuery(value);
631
- debouncedSuggest(value);
632
- }, [debouncedSuggest]);
633
- return (React.createElement(Stack, { tokens: { childrenGap: 10 }, styles: { root: { padding: '16px', border: '1px solid #edebe9', borderRadius: '4px' } } },
634
- React.createElement("h3", null,
635
- React.createElement(Icon, { iconName: "SearchBookmark", style: { marginRight: '8px' } }),
636
- "Example 4: Search Suggestions (Autocomplete)"),
637
- React.createElement(Separator, null),
638
- React.createElement(TextField, { label: "Search with Autocomplete", value: query, onChange: function (_, newValue) { return handleQueryChange(newValue !== null && newValue !== void 0 ? newValue : ''); }, placeholder: "Type at least 2 characters..." }),
639
- suggestions.length > 0 ? (React.createElement(Stack, { tokens: { childrenGap: 2 }, styles: { root: { padding: '8px', backgroundColor: '#f3f2f1', borderRadius: '4px' } } },
640
- React.createElement(Label, null,
641
- "Suggestions (",
642
- suggestions.length,
643
- "):"),
644
- suggestions.map(function (s, idx) { return (React.createElement("div", { key: idx, style: { padding: '6px', backgroundColor: '#fff', borderRadius: '2px', cursor: 'pointer' }, onClick: function () { return setQuery(s); } }, s)); }))) : query.length >= 2 ? (React.createElement(MessageBar, { messageBarType: MessageBarType.info }, "No suggestions available. This is normal in dev/test environments where there isn't enough indexed content. Try in a production environment with more search activity.")) : null,
645
- React.createElement(Label, null,
646
- React.createElement(Icon, { iconName: "InfoSolid", style: { marginRight: '4px', color: '#0078d4' } }),
647
- "Real-time autocomplete with 300ms debounce. Requires indexed content and search activity.")));
648
- };
649
- /**
650
- * Example 7: useSPFxPnPList - CRUD Operations
651
- */
652
- var PnPListExample = function () {
653
- var _a = React.useState(''), listTitle = _a[0], setListTitle = _a[1];
654
- var _b = React.useState(''), newTitle = _b[0], setNewTitle = _b[1];
655
- var _c = React.useState(null), editingId = _c[0], setEditingId = _c[1];
656
- var _d = React.useState(''), editTitle = _d[0], setEditTitle = _d[1];
657
- var _e = useSPFxPnPList(listTitle, { pageSize: 10 }), query = _e.query, items = _e.items, loading = _e.loading, error = _e.error, isEmpty = _e.isEmpty, hasMore = _e.hasMore, loadMore = _e.loadMore, clearError = _e.clearError, create = _e.create, update = _e.update, remove = _e.remove;
658
- var handleLoadList = React.useCallback(function () {
659
- query(function (q) { return q.select('Id', 'Title').orderBy('Id', false); }).catch(function (err) { return console.error('Load error:', err); });
660
- }, [query]);
661
- var handleCreate = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
662
- var err_7;
663
- return __generator(this, function (_a) {
664
- switch (_a.label) {
665
- case 0:
666
- if (!newTitle || !listTitle)
667
- return [2 /*return*/];
668
- _a.label = 1;
669
- case 1:
670
- _a.trys.push([1, 3, , 4]);
671
- return [4 /*yield*/, create({ Title: newTitle })];
672
- case 2:
673
- _a.sent();
674
- setNewTitle('');
675
- return [3 /*break*/, 4];
676
- case 3:
677
- err_7 = _a.sent();
678
- console.error('Create error:', err_7);
679
- return [3 /*break*/, 4];
680
- case 4: return [2 /*return*/];
681
- }
682
- });
683
- }); }, [create, newTitle, listTitle]);
684
- var handleUpdate = React.useCallback(function (id) { return __awaiter(void 0, void 0, void 0, function () {
685
- var err_8;
686
- return __generator(this, function (_a) {
687
- switch (_a.label) {
688
- case 0:
689
- if (!editTitle)
690
- return [2 /*return*/];
691
- _a.label = 1;
692
- case 1:
693
- _a.trys.push([1, 3, , 4]);
694
- return [4 /*yield*/, update(id, { Title: editTitle })];
695
- case 2:
696
- _a.sent();
697
- setEditingId(null);
698
- setEditTitle('');
699
- return [3 /*break*/, 4];
700
- case 3:
701
- err_8 = _a.sent();
702
- console.error('Update error:', err_8);
703
- return [3 /*break*/, 4];
704
- case 4: return [2 /*return*/];
705
- }
706
- });
707
- }); }, [update, editTitle]);
708
- var handleDelete = React.useCallback(function (id) { return __awaiter(void 0, void 0, void 0, function () {
709
- var err_9;
710
- return __generator(this, function (_a) {
711
- switch (_a.label) {
712
- case 0:
713
- if (!confirm('Delete this item?'))
714
- return [2 /*return*/];
715
- _a.label = 1;
716
- case 1:
717
- _a.trys.push([1, 3, , 4]);
718
- return [4 /*yield*/, remove(id)];
719
- case 2:
720
- _a.sent();
721
- return [3 /*break*/, 4];
722
- case 3:
723
- err_9 = _a.sent();
724
- console.error('Delete error:', err_9);
725
- return [3 /*break*/, 4];
726
- case 4: return [2 /*return*/];
727
- }
728
- });
729
- }); }, [remove]);
730
- return (React.createElement(Stack, { tokens: { childrenGap: 10 }, styles: { root: { padding: '16px', border: '1px solid #edebe9', borderRadius: '4px' } } },
731
- React.createElement("h3", null,
732
- React.createElement(Icon, { iconName: "BulletedList", style: { marginRight: '8px' } }),
733
- "Example 3: useSPFxPnPList - CRUD Operations"),
734
- React.createElement(Separator, null),
735
- React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 6 } },
736
- React.createElement(TextField, { label: "List Title", value: listTitle, onChange: function (_, newValue) { return setListTitle(newValue !== null && newValue !== void 0 ? newValue : ''); }, placeholder: "e.g., Site Pages", styles: { root: { flexGrow: 1 } } }),
737
- React.createElement(PrimaryButton, { text: "Load", onClick: handleLoadList, disabled: !listTitle || loading, styles: { root: { marginTop: '28px' } } })),
738
- error && (React.createElement(MessageBar, { messageBarType: MessageBarType.error, onDismiss: clearError }, error.message)),
739
- listTitle && (React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 6 }, styles: { root: { padding: '8px', backgroundColor: '#f3f2f1', borderRadius: '4px' } } },
740
- React.createElement(TextField, { value: newTitle, onChange: function (_, newValue) { return setNewTitle(newValue !== null && newValue !== void 0 ? newValue : ''); }, placeholder: "New item title...", styles: { root: { flexGrow: 1 } } }),
741
- React.createElement(PrimaryButton, { text: "Create", onClick: handleCreate, disabled: !newTitle || loading }))),
742
- loading && React.createElement(MessageBar, null, "Loading..."),
743
- isEmpty && !loading && React.createElement(MessageBar, null, "No items found."),
744
- items.length > 0 && (React.createElement(Stack, { tokens: { childrenGap: 3 } },
745
- React.createElement(Label, null,
746
- "Items (",
747
- items.length,
748
- "):"),
749
- items.map(function (item) { return (React.createElement(Stack, { key: item.Id, horizontal: true, tokens: { childrenGap: 6 }, styles: { root: { padding: '6px', backgroundColor: '#faf9f8', borderRadius: '4px' } } }, editingId === item.Id ? (React.createElement(React.Fragment, null,
750
- React.createElement(TextField, { value: editTitle, onChange: function (_, v) { return setEditTitle(v !== null && v !== void 0 ? v : ''); }, styles: { root: { flexGrow: 1 } } }),
751
- React.createElement(DefaultButton, { text: "Save", onClick: function () { return handleUpdate(item.Id); } }),
752
- React.createElement(DefaultButton, { text: "Cancel", onClick: function () { setEditingId(null); setEditTitle(''); } }))) : (React.createElement(React.Fragment, null,
753
- React.createElement("div", { style: { flexGrow: 1 } },
754
- "#",
755
- item.Id,
756
- " - ",
757
- item.Title),
758
- React.createElement(DefaultButton, { text: "Edit", onClick: function () { setEditingId(item.Id); setEditTitle(item.Title); } }),
759
- React.createElement(DefaultButton, { text: "Delete", onClick: function () { return handleDelete(item.Id); } }))))); }),
760
- hasMore && React.createElement(PrimaryButton, { text: "Load More", onClick: loadMore, disabled: loading }))),
761
- React.createElement(Label, null,
762
- React.createElement(Icon, { iconName: "InfoSolid", style: { marginRight: '4px', color: '#0078d4' } }),
763
- "Complete CRUD with auto-refetch. Try with \"Site Pages\" or \"Documents\".")));
764
- };
765
54
  // Helper function to safely stringify objects with circular references
766
55
  var safeStringify = function (obj, indent) {
767
56
  if (indent === void 0) { indent = 2; }
@@ -904,30 +193,20 @@ var SpFxReactToolkitTest = function () {
904
193
  setLogMessages(function (prev) { return __spreadArray(__spreadArray([], prev.slice(-4), true), [{ level: level, message: message }], false); });
905
194
  }, [logger]);
906
195
  var handleLoadOneDrive = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
907
- var error_3;
908
196
  return __generator(this, function (_a) {
909
197
  switch (_a.label) {
910
- case 0:
911
- _a.trys.push([0, 2, , 3]);
912
- return [4 /*yield*/, oneDriveData.load()];
198
+ case 0: return [4 /*yield*/, oneDriveData.load()];
913
199
  case 1:
914
200
  _a.sent();
915
- setMessageText('Data loaded from OneDrive successfully!');
201
+ setMessageText('OneDrive load completed. Check status below (missing file sets isNotFound=true).');
916
202
  setShowMessage(true);
917
203
  setTimeout(function () { return setShowMessage(false); }, 3000);
918
- return [3 /*break*/, 3];
919
- case 2:
920
- error_3 = _a.sent();
921
- setMessageText("Load failed: ".concat(error_3 instanceof Error ? error_3.message : 'Unknown error'));
922
- setShowMessage(true);
923
- setTimeout(function () { return setShowMessage(false); }, 5000);
924
- return [3 /*break*/, 3];
925
- case 3: return [2 /*return*/];
204
+ return [2 /*return*/];
926
205
  }
927
206
  });
928
207
  }); }, [oneDriveData]);
929
208
  var handleSaveOneDrive = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
930
- var newData, error_4;
209
+ var newData, error_1;
931
210
  var _a, _b;
932
211
  return __generator(this, function (_c) {
933
212
  switch (_c.label) {
@@ -947,8 +226,8 @@ var SpFxReactToolkitTest = function () {
947
226
  setTimeout(function () { return setShowMessage(false); }, 3000);
948
227
  return [3 /*break*/, 3];
949
228
  case 2:
950
- error_4 = _c.sent();
951
- setMessageText("Save failed: ".concat(error_4 instanceof Error ? error_4.message : 'Unknown error'));
229
+ error_1 = _c.sent();
230
+ setMessageText("Save failed: ".concat(error_1 instanceof Error ? error_1.message : 'Unknown error'));
952
231
  setShowMessage(true);
953
232
  setTimeout(function () { return setShowMessage(false); }, 5000);
954
233
  return [3 /*break*/, 3];
@@ -957,7 +236,7 @@ var SpFxReactToolkitTest = function () {
957
236
  });
958
237
  }); }, [oneDriveMessage, oneDriveData]);
959
238
  var handleLoadTenantProperty = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
960
- var error_5;
239
+ var error_2;
961
240
  return __generator(this, function (_a) {
962
241
  switch (_a.label) {
963
242
  case 0:
@@ -973,8 +252,8 @@ var SpFxReactToolkitTest = function () {
973
252
  setTimeout(function () { return setShowMessage(false); }, 3000);
974
253
  return [3 /*break*/, 3];
975
254
  case 2:
976
- error_5 = _a.sent();
977
- setMessageText("Load failed: ".concat(error_5 instanceof Error ? error_5.message : 'Unknown error'));
255
+ error_2 = _a.sent();
256
+ setMessageText("Load failed: ".concat(error_2 instanceof Error ? error_2.message : 'Unknown error'));
978
257
  setShowMessage(true);
979
258
  setTimeout(function () { return setShowMessage(false); }, 5000);
980
259
  return [3 /*break*/, 3];
@@ -983,7 +262,7 @@ var SpFxReactToolkitTest = function () {
983
262
  });
984
263
  }); }, [tenantVersion, tenantCounter]);
985
264
  var handleSaveTenantVersion = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
986
- var error_6;
265
+ var error_3;
987
266
  return __generator(this, function (_a) {
988
267
  switch (_a.label) {
989
268
  case 0:
@@ -1005,8 +284,8 @@ var SpFxReactToolkitTest = function () {
1005
284
  setTimeout(function () { return setShowMessage(false); }, 3000);
1006
285
  return [3 /*break*/, 4];
1007
286
  case 3:
1008
- error_6 = _a.sent();
1009
- setMessageText("Save failed: ".concat(error_6 instanceof Error ? error_6.message : 'Unknown error'));
287
+ error_3 = _a.sent();
288
+ setMessageText("Save failed: ".concat(error_3 instanceof Error ? error_3.message : 'Unknown error'));
1010
289
  setShowMessage(true);
1011
290
  setTimeout(function () { return setShowMessage(false); }, 5000);
1012
291
  return [3 /*break*/, 4];
@@ -1015,7 +294,7 @@ var SpFxReactToolkitTest = function () {
1015
294
  });
1016
295
  }); }, [tenantVersionInput, tenantVersion]);
1017
296
  var handleIncrementTenantCounter = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
1018
- var newValue, error_7;
297
+ var newValue, error_4;
1019
298
  var _a;
1020
299
  return __generator(this, function (_b) {
1021
300
  switch (_b.label) {
@@ -1038,8 +317,8 @@ var SpFxReactToolkitTest = function () {
1038
317
  setTimeout(function () { return setShowMessage(false); }, 3000);
1039
318
  return [3 /*break*/, 4];
1040
319
  case 3:
1041
- error_7 = _b.sent();
1042
- setMessageText("Increment failed: ".concat(error_7 instanceof Error ? error_7.message : 'Unknown error'));
320
+ error_4 = _b.sent();
321
+ setMessageText("Increment failed: ".concat(error_4 instanceof Error ? error_4.message : 'Unknown error'));
1043
322
  setShowMessage(true);
1044
323
  setTimeout(function () { return setShowMessage(false); }, 5000);
1045
324
  return [3 /*break*/, 4];
@@ -1048,7 +327,7 @@ var SpFxReactToolkitTest = function () {
1048
327
  });
1049
328
  }); }, [tenantCounter]);
1050
329
  var handleRemoveTenantProperty = React.useCallback(function (propertyName) { return __awaiter(void 0, void 0, void 0, function () {
1051
- var hook, error_8;
330
+ var hook, error_5;
1052
331
  return __generator(this, function (_a) {
1053
332
  switch (_a.label) {
1054
333
  case 0:
@@ -1073,8 +352,8 @@ var SpFxReactToolkitTest = function () {
1073
352
  setTimeout(function () { return setShowMessage(false); }, 3000);
1074
353
  return [3 /*break*/, 4];
1075
354
  case 3:
1076
- error_8 = _a.sent();
1077
- setMessageText("Remove failed: ".concat(error_8 instanceof Error ? error_8.message : 'Unknown error'));
355
+ error_5 = _a.sent();
356
+ setMessageText("Remove failed: ".concat(error_5 instanceof Error ? error_5.message : 'Unknown error'));
1078
357
  setShowMessage(true);
1079
358
  setTimeout(function () { return setShowMessage(false); }, 5000);
1080
359
  return [3 /*break*/, 4];
@@ -1268,11 +547,15 @@ var SpFxReactToolkitTest = function () {
1268
547
  oneDriveData.writeError && (React.createElement(MessageBar, { messageBarType: MessageBarType.warning },
1269
548
  "Write Error: ",
1270
549
  oneDriveData.writeError.message)),
550
+ !oneDriveData.isLoading && oneDriveData.isNotFound && !oneDriveData.data && !oneDriveData.error && (React.createElement(MessageBar, { messageBarType: MessageBarType.info }, "File not found in OneDrive yet (isNotFound=true). Click \"Save to OneDrive\" to create it.")),
1271
551
  oneDriveData.isLoading ? (React.createElement(MessageBar, { messageBarType: MessageBarType.info }, "Loading from OneDrive...")) : oneDriveData.data ? (React.createElement(Stack, { tokens: { childrenGap: 1 } },
1272
552
  React.createElement(InfoRow, { label: "Message", value: oneDriveData.data.message, icon: "Message" }),
1273
553
  React.createElement(InfoRow, { label: "Counter", value: String(oneDriveData.data.counter), icon: "NumberField" }),
1274
554
  React.createElement(InfoRow, { label: "Last Updated", value: new Date(oneDriveData.data.timestamp).toLocaleString(), icon: "DateTime" }),
1275
- React.createElement(InfoRow, { label: "Is Ready", value: oneDriveData.isReady ? 'Yes' : 'No', icon: "CheckMark" }))) : (React.createElement(Label, null, "No data loaded yet. Click \"Load\" to fetch from OneDrive.")),
555
+ React.createElement(InfoRow, { label: "Is Ready", value: oneDriveData.isReady ? 'Yes' : 'No', icon: "CheckMark" }),
556
+ React.createElement(InfoRow, { label: "Is Not Found", value: oneDriveData.isNotFound ? 'Yes' : 'No', icon: "BlockedSiteSolid12" }))) : (React.createElement(Label, null, oneDriveData.isNotFound
557
+ ? 'No file found yet. Click "Save to OneDrive" to create it.'
558
+ : 'No data loaded yet. Click "Load" to fetch from OneDrive.')),
1276
559
  React.createElement(TextField, { label: "New Message", value: oneDriveMessage, onChange: function (_, newValue) { return setOneDriveMessage(newValue !== null && newValue !== void 0 ? newValue : ''); }, placeholder: "Enter a message to save...", disabled: oneDriveData.isWriting || oneDriveData.isLoading }),
1277
560
  React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 2 } },
1278
561
  React.createElement(PrimaryButton, { text: "Load from OneDrive", onClick: handleLoadOneDrive, disabled: oneDriveData.isLoading || oneDriveData.isWriting, iconProps: { iconName: 'CloudDownload' } }),
@@ -1432,22 +715,22 @@ var SpFxReactToolkitTest = function () {
1432
715
  "This hook provides access to the generic HttpClient for calling external APIs (non-SharePoint). For SharePoint REST API calls, use ",
1433
716
  React.createElement("strong", null, "useSPFxSPHttpClient"),
1434
717
  " instead."),
1435
- React.createElement(HttpClientExample, null))),
718
+ React.createElement(HttpClientDemo, null))),
1436
719
  React.createElement(PivotItem, { headerText: "PnPjs", itemIcon: "CloudDownload" },
1437
720
  React.createElement(Stack, { tokens: { childrenGap: 20 }, styles: { root: { marginTop: '16px' } } },
1438
- React.createElement(PnPContextExample, null),
1439
- React.createElement(PnPOperationsExample, null),
1440
- React.createElement(PnPListExample, null))),
721
+ React.createElement(PnPContextDemo, null),
722
+ React.createElement(PnPOperationsDemo, null),
723
+ React.createElement(PnPListDemo, null))),
1441
724
  React.createElement(PivotItem, { headerText: "Search", itemIcon: "Search" },
1442
725
  React.createElement(Stack, { tokens: { childrenGap: 20 }, styles: { root: { marginTop: '16px' } } },
1443
726
  React.createElement(MessageBar, { messageBarType: MessageBarType.info },
1444
727
  React.createElement("strong", null, "useSPFxPnPSearch Hook Examples"),
1445
728
  React.createElement("br", null),
1446
729
  "These examples demonstrate SharePoint Search capabilities using the native PnPjs SearchQueryBuilder API."),
1447
- React.createElement(PnPSearchBasicExample, null),
1448
- React.createElement(PnPSearchAdvancedExample, null),
1449
- React.createElement(PnPSearchRefinersExample, null),
1450
- React.createElement(PnPSearchSuggestionsExample, null))))));
730
+ React.createElement(PnPSearchBasicDemo, null),
731
+ React.createElement(PnPSearchAdvancedDemo, null),
732
+ React.createElement(PnPSearchRefinersDemo, null),
733
+ React.createElement(PnPSearchSuggestionsDemo, null))))));
1451
734
  };
1452
735
  export default SpFxReactToolkitTest;
1453
736
  //# sourceMappingURL=SpFxReactToolkitTest.js.map