@solidxai/core-ui 0.1.2 → 0.1.4-beta.0

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 (149) hide show
  1. package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
  2. package/dist/components/auth/SolidInitialLoginOtp.js +0 -5
  3. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  4. package/dist/components/auth/SolidInitialLoginOtp.tsx +0 -5
  5. package/dist/components/auth/SolidLogin.d.ts.map +1 -1
  6. package/dist/components/auth/SolidLogin.js +7 -5
  7. package/dist/components/auth/SolidLogin.js.map +1 -1
  8. package/dist/components/auth/SolidLogin.tsx +10 -8
  9. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  10. package/dist/components/common/GeneralSettings.js +48 -47
  11. package/dist/components/common/GeneralSettings.js.map +1 -1
  12. package/dist/components/common/GeneralSettings.tsx +41 -10
  13. package/dist/components/core/common/FilterComponent.js.map +1 -1
  14. package/dist/components/core/common/FilterComponent.tsx +1 -1
  15. package/dist/components/core/common/GroupingComponent.d.ts +54 -0
  16. package/dist/components/core/common/GroupingComponent.d.ts.map +1 -0
  17. package/dist/components/core/common/GroupingComponent.js +196 -0
  18. package/dist/components/core/common/GroupingComponent.js.map +1 -0
  19. package/dist/components/core/common/GroupingComponent.tsx +452 -0
  20. package/dist/components/core/common/SolidGlobalSearchElement.d.ts +18 -1
  21. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  22. package/dist/components/core/common/SolidGlobalSearchElement.js +197 -74
  23. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  24. package/dist/components/core/common/SolidGlobalSearchElement.tsx +276 -40
  25. package/dist/components/core/common/SolidImageViewer.d.ts +10 -0
  26. package/dist/components/core/common/SolidImageViewer.d.ts.map +1 -0
  27. package/dist/components/core/common/SolidImageViewer.js +59 -0
  28. package/dist/components/core/common/SolidImageViewer.js.map +1 -0
  29. package/dist/components/core/common/SolidImageViewer.tsx +84 -0
  30. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts +19 -0
  31. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts.map +1 -0
  32. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js +90 -0
  33. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js.map +1 -0
  34. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.tsx +59 -0
  35. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.d.ts.map +1 -1
  36. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js +7 -3
  37. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js.map +1 -1
  38. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +45 -40
  39. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts +2 -0
  40. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts.map +1 -0
  41. package/dist/components/core/filter/SolidOneToManyFilterElement.js +86 -0
  42. package/dist/components/core/filter/SolidOneToManyFilterElement.js.map +1 -0
  43. package/dist/components/core/filter/SolidOneToManyFilterElement.tsx +62 -0
  44. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts +1 -0
  45. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts.map +1 -1
  46. package/dist/components/core/filter/SolidVarInputsFilterElement.js +4 -1
  47. package/dist/components/core/filter/SolidVarInputsFilterElement.js.map +1 -1
  48. package/dist/components/core/filter/SolidVarInputsFilterElement.tsx +10 -0
  49. package/dist/components/core/filter/fields/SolidRelationField.d.ts.map +1 -1
  50. package/dist/components/core/filter/fields/SolidRelationField.js +4 -2
  51. package/dist/components/core/filter/fields/SolidRelationField.js.map +1 -1
  52. package/dist/components/core/filter/fields/SolidRelationField.tsx +4 -2
  53. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts +4 -0
  54. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -0
  55. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js +25 -0
  56. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js.map +1 -0
  57. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.tsx +60 -0
  58. package/dist/components/core/form/SolidFormFooter.js +4 -4
  59. package/dist/components/core/form/SolidFormFooter.js.map +1 -1
  60. package/dist/components/core/form/SolidFormFooter.tsx +4 -4
  61. package/dist/components/core/form/fields/SolidBooleanField.d.ts.map +1 -1
  62. package/dist/components/core/form/fields/SolidBooleanField.js +11 -8
  63. package/dist/components/core/form/fields/SolidBooleanField.js.map +1 -1
  64. package/dist/components/core/form/fields/SolidBooleanField.tsx +20 -8
  65. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
  66. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +26 -21
  67. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  68. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +27 -17
  69. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts +1 -0
  70. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts.map +1 -1
  71. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js +51 -0
  72. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js.map +1 -1
  73. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts +51 -0
  74. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.d.ts.map +1 -1
  75. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.js +80 -79
  76. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.js.map +1 -1
  77. package/dist/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx +92 -85
  78. package/dist/components/core/kanban/SolidKanbanView.js +5 -5
  79. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  80. package/dist/components/core/kanban/SolidKanbanView.tsx +5 -5
  81. package/dist/components/core/list/SolidListView.d.ts +12 -7
  82. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  83. package/dist/components/core/list/SolidListView.js +143 -153
  84. package/dist/components/core/list/SolidListView.js.map +1 -1
  85. package/dist/components/core/list/SolidListView.tsx +89 -94
  86. package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
  87. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +16 -17
  88. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  89. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +46 -44
  90. package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
  91. package/dist/components/core/list/columns/SolidMediaSingleColumn.js +6 -4
  92. package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
  93. package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +7 -5
  94. package/dist/components/core/list/listViewRegistry.js.map +1 -1
  95. package/dist/components/core/list/listViewRegistry.ts +1 -2
  96. package/dist/components/core/tree/SolidTreeView.d.ts +38 -0
  97. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -0
  98. package/dist/components/core/tree/SolidTreeView.js +1170 -0
  99. package/dist/components/core/tree/SolidTreeView.js.map +1 -0
  100. package/dist/components/core/tree/SolidTreeView.tsx +1603 -0
  101. package/dist/components/core/tree/treeViewRegistry.d.ts +7 -0
  102. package/dist/components/core/tree/treeViewRegistry.d.ts.map +1 -0
  103. package/dist/components/core/tree/treeViewRegistry.js +17 -0
  104. package/dist/components/core/tree/treeViewRegistry.js.map +1 -0
  105. package/dist/components/core/tree/treeViewRegistry.ts +23 -0
  106. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  107. package/dist/components/core/users/CreateUser.js +19 -6
  108. package/dist/components/core/users/CreateUser.js.map +1 -1
  109. package/dist/components/core/users/CreateUser.tsx +39 -0
  110. package/dist/helpers/fetchS3Url.d.ts +19 -0
  111. package/dist/helpers/fetchS3Url.d.ts.map +1 -0
  112. package/dist/helpers/fetchS3Url.js +60 -0
  113. package/dist/helpers/fetchS3Url.js.map +1 -0
  114. package/dist/helpers/fetchS3Url.ts +33 -0
  115. package/dist/helpers/helpers.d.ts +2 -0
  116. package/dist/helpers/helpers.d.ts.map +1 -1
  117. package/dist/helpers/helpers.js +3 -1
  118. package/dist/helpers/helpers.js.map +1 -1
  119. package/dist/helpers/helpers.ts +4 -1
  120. package/dist/helpers/registry.d.ts.map +1 -1
  121. package/dist/helpers/registry.js +2 -0
  122. package/dist/helpers/registry.js.map +1 -1
  123. package/dist/helpers/registry.ts +3 -1
  124. package/dist/index.d.ts +9 -2
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +6 -1
  127. package/dist/index.js.map +1 -1
  128. package/dist/index.ts +14 -2
  129. package/dist/resources/globals.css +18 -4
  130. package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
  131. package/dist/routes/pages/admin/core/ListPage.js +8 -3
  132. package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
  133. package/dist/routes/pages/admin/core/ListPage.tsx +11 -3
  134. package/dist/routes/pages/admin/core/TreePage.d.ts +2 -0
  135. package/dist/routes/pages/admin/core/TreePage.d.ts.map +1 -0
  136. package/dist/routes/pages/admin/core/TreePage.js +37 -0
  137. package/dist/routes/pages/admin/core/TreePage.js.map +1 -0
  138. package/dist/routes/pages/admin/core/TreePage.tsx +30 -0
  139. package/dist/routes/solidRoutes.d.ts.map +1 -1
  140. package/dist/routes/solidRoutes.js +2 -0
  141. package/dist/routes/solidRoutes.js.map +1 -1
  142. package/dist/routes/solidRoutes.tsx +3 -1
  143. package/dist/routes/types.d.ts +1 -1
  144. package/dist/routes/types.d.ts.map +1 -1
  145. package/dist/routes/types.js.map +1 -1
  146. package/dist/routes/types.ts +1 -0
  147. package/dist/types/index.d.ts +8 -2
  148. package/dist/types/solid-core.d.ts +40 -0
  149. package/package.json +1 -1
@@ -44,6 +44,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
44
44
  return to.concat(ar || Array.prototype.slice.call(from));
45
45
  };
46
46
  import { useState } from "react";
47
+ import qs from "qs";
47
48
  import { createSolidEntityApi } from "../../../../../../../redux/api/solidEntityApi";
48
49
  export var useRelationEntityHandler = function (_a) {
49
50
  var fieldContext = _a.fieldContext, formik = _a.formik, _b = _a.autoCompleteLimit, autoCompleteLimit = _b === void 0 ? 1000 : _b;
@@ -80,6 +81,55 @@ export var useRelationEntityHandler = function (_a) {
80
81
  });
81
82
  });
82
83
  };
84
+ var populateFormikWithRelatedEntities = function () { return __awaiter(void 0, void 0, void 0, function () {
85
+ var relationFieldName, parentId, queryData, qsString, response, data, mappedItems;
86
+ var _a;
87
+ var _b, _c, _d, _e;
88
+ return __generator(this, function (_f) {
89
+ switch (_f.label) {
90
+ case 0:
91
+ relationFieldName = (_c = (_b = fieldContext.fieldMetadata) === null || _b === void 0 ? void 0 : _b.relationCoModelFieldName) !== null && _c !== void 0 ? _c : fieldContext.modelName;
92
+ parentId = (_e = (_d = fieldContext.data) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : -1;
93
+ queryData = {
94
+ offset: 0,
95
+ limit: autoCompleteLimit,
96
+ filters: {
97
+ $and: [
98
+ (_a = {},
99
+ _a[relationFieldName] = {
100
+ id: { $eq: parentId },
101
+ },
102
+ _a),
103
+ ],
104
+ },
105
+ };
106
+ qsString = qs.stringify(queryData, {
107
+ encodeValuesOnly: true,
108
+ });
109
+ return [4 /*yield*/, triggerGetSolidEntities(qsString)];
110
+ case 1:
111
+ response = _f.sent();
112
+ data = response.data;
113
+ if (!data)
114
+ return [2 /*return*/];
115
+ mappedItems = data.records.map(function (item) {
116
+ var _a, _b;
117
+ return ({
118
+ label: item[(_b = (_a = fieldMetadata === null || fieldMetadata === void 0 ? void 0 : fieldMetadata.relationModel) === null || _a === void 0 ? void 0 : _a.userKeyField) === null || _b === void 0 ? void 0 : _b.name],
119
+ value: item.id,
120
+ original: item,
121
+ });
122
+ });
123
+ /**
124
+ * IMPORTANT:
125
+ * 1. Set checkbox options
126
+ * 2. Set formik selected values (checked state)
127
+ */
128
+ formik.setFieldValue(fieldLayoutInfo.attrs.name, mappedItems);
129
+ return [2 /*return*/];
130
+ }
131
+ });
132
+ }); };
83
133
  var addNewRelation = function (values) {
84
134
  var _a, _b;
85
135
  var currentData = formik.values[fieldLayoutInfo.attrs.name] || [];
@@ -99,6 +149,7 @@ export var useRelationEntityHandler = function (_a) {
99
149
  return {
100
150
  autoCompleteItems: autoCompleteItems,
101
151
  fetchRelationEntities: fetchRelationEntities,
152
+ populateFormikWithRelatedEntities: populateFormikWithRelatedEntities,
102
153
  addNewRelation: addNewRelation
103
154
  };
104
155
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useRelationEntityHandler.js","sourceRoot":"","sources":["../../../../../../../../src/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAErF,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,EAAuD;QAArD,YAAY,kBAAA,EAAE,MAAM,YAAA,EAAE,yBAAwB,EAAxB,iBAAiB,mBAAG,IAAI,KAAA;IACvF,IAAM,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;IACjD,IAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC;IAE3C,IAAM,SAAS,GAAG,oBAAoB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC1E,IAAA,4BAA4B,GAAK,SAAS,6BAAd,CAAe;IAC5C,IAAA,uBAAuB,GAAI,4BAA4B,EAAE,GAAlC,CAAmC;IAE3D,IAAA,KAA4C,QAAQ,CAAC,EAAE,CAAC,EAAvD,iBAAiB,QAAA,EAAE,oBAAoB,QAAgB,CAAC;IAE/D,IAAM,qBAAqB,GAAG,UAAO,cAAmB,EAAE,KAAyB;QAA9C,+BAAA,EAAA,mBAAmB;QAAE,sBAAA,EAAA,yBAAyB;;;;;4BAahE,qBAAM,uBAAuB,CAAC,cAAc,CAAC,EAAA;;wBAAxD,QAAQ,GAAG,SAA6C;wBACxD,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;wBAE3B,IAAI,IAAI,EAAE;4BACF,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,IAAS;;gCAAK,OAAA,CAAC;oCACnD,KAAK,EAAE,IAAI,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;oCAC7D,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;oCACjB,QAAQ,EAAE,IAAI;iCACf,CAAC,CAAA;6BAAA,CAAC,CAAC;4BACJ,oBAAoB,CAAC,WAAW,CAAC,CAAC;yBACnC;;;;;KACF,CAAC;IAEF,IAAM,cAAc,GAAG,UAAC,MAAW;;QACjC,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpE,IAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,IAAM,OAAO,GAAG;YACd,KAAK,EAAE,UAAU,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;YACnE,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,UAAU;SACrB,CAAC;QAEF,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,kCAAM,WAAW,UAAE,OAAO,UAAE,CAAC;QAE5E,sCAAsC;QACtC,oBAAoB,CAAC,UAAC,IAAS;YAC7B,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAC,IAAS,IAAK,OAAA,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAA5B,CAA4B,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,iCAAK,IAAI,UAAE,OAAO,SAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,iBAAiB,mBAAA;QACjB,qBAAqB,uBAAA;QACrB,cAAc,gBAAA;KACf,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useState } from \"react\";\nimport qs from \"qs\";\nimport { createSolidEntityApi } from \"../../../../../../../redux/api/solidEntityApi\";\n\nexport const useRelationEntityHandler = ({ fieldContext, formik, autoCompleteLimit = 1000 }: any) => {\n const fieldMetadata = fieldContext.fieldMetadata;\n const fieldLayoutInfo = fieldContext.field;\n\n const entityApi = createSolidEntityApi(fieldMetadata.relationCoModelSingularName);\n const { useLazyGetSolidEntitiesQuery } = entityApi;\n const [triggerGetSolidEntities] = useLazyGetSolidEntitiesQuery();\n\n const [autoCompleteItems, setAutoCompleteItems] = useState([]);\n\n const fetchRelationEntities = async (autocompleteQs = \"\", limit = autoCompleteLimit) => {\n // const queryData = {\n // offset: 0,\n // limit: limit,\n // filters: {\n // [fieldMetadata?.relationModel?.userKeyField?.name]: {\n // '$containsi': query\n // }\n // }\n // };\n\n // const autocompleteQs = qs.stringify(queryData, { encodeValuesOnly: true });\n\n const response = await triggerGetSolidEntities(autocompleteQs);\n const data = response.data;\n\n if (data) {\n const mappedItems = data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item['id'],\n original: item\n }));\n setAutoCompleteItems(mappedItems);\n }\n };\n\n const addNewRelation = (values: any) => {\n const currentData = formik.values[fieldLayoutInfo.attrs.name] || [];\n const jsonValues = Object.fromEntries(values.entries());\n const newItem = {\n label: jsonValues[fieldMetadata?.relationModel?.userKeyField?.name],\n value: \"new\",\n original: jsonValues,\n };\n\n formik.setFieldValue(fieldLayoutInfo.attrs.name, [...currentData, newItem]);\n\n // Optionally add to autocomplete list\n setAutoCompleteItems((prev: any) => {\n const exists = prev.some((item: any) => item.label === newItem.label);\n return exists ? prev : [...prev, newItem];\n });\n };\n\n return {\n autoCompleteItems,\n fetchRelationEntities,\n addNewRelation\n };\n};\n"]}
1
+ {"version":3,"file":"useRelationEntityHandler.js","sourceRoot":"","sources":["../../../../../../../../src/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport qs from \"qs\";\nimport { createSolidEntityApi } from \"../../../../../../../redux/api/solidEntityApi\";\n\nexport const useRelationEntityHandler = ({ fieldContext, formik, autoCompleteLimit = 1000 }: any) => {\n const fieldMetadata = fieldContext.fieldMetadata;\n const fieldLayoutInfo = fieldContext.field;\n\n const entityApi = createSolidEntityApi(fieldMetadata.relationCoModelSingularName);\n const { useLazyGetSolidEntitiesQuery } = entityApi;\n const [triggerGetSolidEntities] = useLazyGetSolidEntitiesQuery();\n\n const [autoCompleteItems, setAutoCompleteItems] = useState([]);\n\n const fetchRelationEntities = async (autocompleteQs = \"\", limit = autoCompleteLimit) => {\n // const queryData = {\n // offset: 0,\n // limit: limit,\n // filters: {\n // [fieldMetadata?.relationModel?.userKeyField?.name]: {\n // '$containsi': query\n // }\n // }\n // };\n\n // const autocompleteQs = qs.stringify(queryData, { encodeValuesOnly: true });\n\n const response = await triggerGetSolidEntities(autocompleteQs);\n const data = response.data;\n\n if (data) {\n const mappedItems = data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item['id'],\n original: item\n }));\n setAutoCompleteItems(mappedItems);\n }\n };\n\n const populateFormikWithRelatedEntities = async () => {\n\n /**\n * Example:\n * permissions filtered by roles.id = current role id\n */\n\n const relationFieldName =\n fieldContext.fieldMetadata?.relationCoModelFieldName ??\n fieldContext.modelName;\n\n const parentId = fieldContext.data?.id ?? -1;\n\n const queryData = {\n offset: 0,\n limit: autoCompleteLimit,\n filters: {\n $and: [\n {\n [relationFieldName]: {\n id: { $eq: parentId },\n },\n },\n ],\n },\n };\n\n const qsString = qs.stringify(queryData, {\n encodeValuesOnly: true,\n });\n\n const response = await triggerGetSolidEntities(qsString);\n const data = response.data;\n\n if (!data) return;\n\n const mappedItems = data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item.id,\n original: item,\n }));\n\n /**\n * IMPORTANT:\n * 1. Set checkbox options\n * 2. Set formik selected values (checked state)\n */\n formik.setFieldValue(fieldLayoutInfo.attrs.name, mappedItems);\n };\n\n const addNewRelation = (values: any) => {\n const currentData = formik.values[fieldLayoutInfo.attrs.name] || [];\n const jsonValues = Object.fromEntries(values.entries());\n const newItem = {\n label: jsonValues[fieldMetadata?.relationModel?.userKeyField?.name],\n value: \"new\",\n original: jsonValues,\n };\n\n formik.setFieldValue(fieldLayoutInfo.attrs.name, [...currentData, newItem]);\n\n // Optionally add to autocomplete list\n setAutoCompleteItems((prev: any) => {\n const exists = prev.some((item: any) => item.label === newItem.label);\n return exists ? prev : [...prev, newItem];\n });\n };\n\n return {\n autoCompleteItems,\n fetchRelationEntities,\n populateFormikWithRelatedEntities,\n addNewRelation\n };\n};\n"]}
@@ -38,6 +38,56 @@ export const useRelationEntityHandler = ({ fieldContext, formik, autoCompleteLim
38
38
  }
39
39
  };
40
40
 
41
+ const populateFormikWithRelatedEntities = async () => {
42
+
43
+ /**
44
+ * Example:
45
+ * permissions filtered by roles.id = current role id
46
+ */
47
+
48
+ const relationFieldName =
49
+ fieldContext.fieldMetadata?.relationCoModelFieldName ??
50
+ fieldContext.modelName;
51
+
52
+ const parentId = fieldContext.data?.id ?? -1;
53
+
54
+ const queryData = {
55
+ offset: 0,
56
+ limit: autoCompleteLimit,
57
+ filters: {
58
+ $and: [
59
+ {
60
+ [relationFieldName]: {
61
+ id: { $eq: parentId },
62
+ },
63
+ },
64
+ ],
65
+ },
66
+ };
67
+
68
+ const qsString = qs.stringify(queryData, {
69
+ encodeValuesOnly: true,
70
+ });
71
+
72
+ const response = await triggerGetSolidEntities(qsString);
73
+ const data = response.data;
74
+
75
+ if (!data) return;
76
+
77
+ const mappedItems = data.records.map((item: any) => ({
78
+ label: item[fieldMetadata?.relationModel?.userKeyField?.name],
79
+ value: item.id,
80
+ original: item,
81
+ }));
82
+
83
+ /**
84
+ * IMPORTANT:
85
+ * 1. Set checkbox options
86
+ * 2. Set formik selected values (checked state)
87
+ */
88
+ formik.setFieldValue(fieldLayoutInfo.attrs.name, mappedItems);
89
+ };
90
+
41
91
  const addNewRelation = (values: any) => {
42
92
  const currentData = formik.values[fieldLayoutInfo.attrs.name] || [];
43
93
  const jsonValues = Object.fromEntries(values.entries());
@@ -59,6 +109,7 @@ export const useRelationEntityHandler = ({ fieldContext, formik, autoCompleteLim
59
109
  return {
60
110
  autoCompleteItems,
61
111
  fetchRelationEntities,
112
+ populateFormikWithRelatedEntities,
62
113
  addNewRelation
63
114
  };
64
115
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SolidS3FileViewerWidget.d.ts","sourceRoot":"","sources":["../../../../../../src/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAK5E,OAAO,0BAA0B,CAAC;AAElC;;GAEG;AACH,eAAO,MAAM,uBAAuB,6BAA8B,yBAAyB,4CAiN1F,CAAC"}
1
+ {"version":3,"file":"SolidS3FileViewerWidget.d.ts","sourceRoot":"","sources":["../../../../../../src/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAK5E,OAAO,0BAA0B,CAAC;AAIlC;;GAEG;AACH,eAAO,MAAM,uBAAuB,6BAA8B,yBAAyB,4CAsN1F,CAAC"}
@@ -35,12 +35,13 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  }
36
36
  };
37
37
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
38
- import { useEffect, useRef, useState } from "react";
38
+ import { useRef, useState } from "react";
39
39
  import { Button } from "primereact/button";
40
40
  import { Dialog } from "primereact/dialog";
41
41
  import { useResolveS3UrlMutation } from "../../../../../redux/api/fieldApi";
42
- import Viewer from "viewerjs";
43
42
  import "viewerjs/dist/viewer.css";
43
+ import { SolidImageViewer } from "../../../../../components/core/common/SolidImageViewer";
44
+ import { fetchS3Url } from "../../../../..//helpers/fetchS3Url";
44
45
  /**
45
46
  * SolidS3FileViewerWidget (PrimeReact version)
46
47
  */
@@ -63,39 +64,24 @@ export var SolidS3FileViewerWidget = function (_a) {
63
64
  var _f = useState(false), open = _f[0], setOpen = _f[1];
64
65
  var _g = useState(false), shouldShowViewer = _g[0], setShouldShowViewer = _g[1];
65
66
  var resolveS3Url = useResolveS3UrlMutation()[0];
66
- var fetchS3Url = function () { return __awaiter(void 0, void 0, void 0, function () {
67
- var result, e_1;
67
+ var resolveFileUrl = function () { return __awaiter(void 0, void 0, void 0, function () {
68
+ var options, url;
68
69
  return __generator(this, function (_a) {
69
70
  switch (_a.label) {
70
71
  case 0:
71
- console.log("fetch url called");
72
72
  setIsLoading(true);
73
- _a.label = 1;
73
+ options = {
74
+ s3Key: value,
75
+ fileType: fileType,
76
+ bucketName: bucketName,
77
+ mediaStorageProviderUserKey: mediaStorageProviderUserKey,
78
+ isPrivate: isPrivate
79
+ };
80
+ return [4 /*yield*/, fetchS3Url(resolveS3Url, options)];
74
81
  case 1:
75
- _a.trys.push([1, 3, , 4]);
76
- return [4 /*yield*/, resolveS3Url({
77
- modelName: fieldContext.modelName,
78
- fieldName: fieldContext.fieldMetadata.name,
79
- s3Key: value,
80
- fileType: fileType,
81
- bucketName: bucketName,
82
- mediaStorageProviderUserKey: mediaStorageProviderUserKey,
83
- isPrivate: isPrivate
84
- }).unwrap()];
85
- case 2:
86
- result = _a.sent();
87
- setIsLoading(false);
88
- if (result.statusCode == "200") {
89
- console.log("fetch url success", result.data.url);
90
- return [2 /*return*/, result.data.url];
91
- }
92
- return [3 /*break*/, 4];
93
- case 3:
94
- e_1 = _a.sent();
95
- console.error("Failed to resolve S3 URL:", e_1);
82
+ url = _a.sent();
96
83
  setIsLoading(false);
97
- return [2 /*return*/, null];
98
- case 4: return [2 /*return*/];
84
+ return [2 /*return*/, url];
99
85
  }
100
86
  });
101
87
  }); };
@@ -106,7 +92,7 @@ export var SolidS3FileViewerWidget = function (_a) {
106
92
  case 0:
107
93
  if (isLoading)
108
94
  return [2 /*return*/];
109
- return [4 /*yield*/, fetchS3Url()];
95
+ return [4 /*yield*/, resolveFileUrl()];
110
96
  case 1:
111
97
  url = _a.sent();
112
98
  if (!url)
@@ -129,7 +115,7 @@ export var SolidS3FileViewerWidget = function (_a) {
129
115
  console.log("isLoading in view", isLoading);
130
116
  if (isLoading)
131
117
  return [2 /*return*/];
132
- return [4 /*yield*/, fetchS3Url()];
118
+ return [4 /*yield*/, resolveFileUrl()];
133
119
  case 1:
134
120
  url = _a.sent();
135
121
  console.log("url after fetch success", url);
@@ -151,55 +137,70 @@ export var SolidS3FileViewerWidget = function (_a) {
151
137
  var isPDF = fileType === "pdf";
152
138
  var isDownloadOnly = ["xlsx", "xls", "csv", "doc", "docx"].includes(fileType);
153
139
  // 🔹 Initialize Viewer.js once image exists
154
- useEffect(function () {
155
- if (imageRef.current && previewUrl && isImage) {
156
- // Destroy existing viewer if any
157
- if (viewerRef.current) {
158
- viewerRef.current.destroy();
159
- }
160
- // Create new viewer instance
161
- viewerRef.current = new Viewer(imageRef.current, {
162
- toolbar: {
163
- zoomIn: 1,
164
- zoomOut: 1,
165
- rotateLeft: 1,
166
- rotateRight: 1,
167
- reset: 1,
168
- },
169
- navbar: false,
170
- title: false,
171
- transition: true,
172
- movable: true,
173
- scalable: true,
174
- rotatable: true,
175
- zoomable: true,
176
- zIndex: 9999,
177
- // Add hidden event to reset state
178
- hidden: function () {
179
- setShouldShowViewer(false);
180
- }
181
- });
182
- console.log("Viewer initialized");
183
- }
184
- return function () {
185
- if (viewerRef.current) {
186
- viewerRef.current.destroy();
187
- viewerRef.current = null;
188
- }
189
- };
190
- }, [previewUrl, isImage]);
140
+ // useEffect(() => {
141
+ // if (imageRef.current && previewUrl && isImage) {
142
+ // // Destroy existing viewer if any
143
+ // if (viewerRef.current) {
144
+ // viewerRef.current.destroy();
145
+ // }
146
+ // // Create new viewer instance
147
+ // viewerRef.current = new Viewer(imageRef.current, {
148
+ // toolbar: {
149
+ // zoomIn: 1,
150
+ // zoomOut: 1,
151
+ // rotateLeft: 1,
152
+ // rotateRight: 1,
153
+ // reset: 1,
154
+ // },
155
+ // navbar: false,
156
+ // title: false,
157
+ // transition: true,
158
+ // movable: true,
159
+ // scalable: true,
160
+ // rotatable: true,
161
+ // zoomable: true,
162
+ // zIndex: 9999,
163
+ // // Add hidden event to reset state
164
+ // hidden: () => {
165
+ // setShouldShowViewer(false);
166
+ // }
167
+ // });
168
+ // console.log("Viewer initialized");
169
+ // }
170
+ // return () => {
171
+ // if (viewerRef.current) {
172
+ // viewerRef.current.destroy();
173
+ // viewerRef.current = null;
174
+ // }
175
+ // };
176
+ // }, [previewUrl, isImage]);
191
177
  // 🔹 Show viewer when shouldShowViewer becomes true
192
- useEffect(function () {
193
- if (shouldShowViewer && viewerRef.current) {
194
- console.log("Showing viewer");
195
- viewerRef.current.show();
196
- }
197
- }, [shouldShowViewer]);
198
- return (_jsxs("div", { className: "mt-2 flex flex-col gap-2", children: [_jsx("p", { className: "m-0 form-field-label font-medium", children: fieldLabel }), value ? (_jsxs("div", { className: "flex gap-3 items-center", children: [(isImage || isPDF) && (_jsx(Button, { icon: "pi pi-eye", type: "button", style: { minWidth: 66 }, loading: isLoading, tooltip: value, disabled: isLoading, label: "View ".concat(fileType), size: "small", iconPos: "left", onClick: handleView })), downloadAllowed && (_jsx(Button, { size: "small", type: "button", icon: "pi pi-download", tooltip: "Download ".concat(value === null || value === void 0 ? void 0 : value.split("/").pop()), loading: isLoading, onClick: handleDownload, disabled: isLoading, className: 'solid-icon-button' }))] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: "No file uploaded" })), isImage && previewUrl && (_jsx("img", { ref: imageRef, src: previewUrl, alt: value, style: {
199
- position: "absolute",
200
- visibility: "hidden",
201
- width: "1px",
202
- height: "1px"
178
+ // useEffect(() => {
179
+ // if (shouldShowViewer && viewerRef.current) {
180
+ // console.log("Showing viewer");
181
+ // viewerRef.current.show();
182
+ // }
183
+ // }, [shouldShowViewer]);
184
+ return (_jsxs("div", { className: "mt-2 flex flex-col gap-2", children: [_jsx("p", { className: "m-0 form-field-label font-medium", children: fieldLabel }), value ? (_jsxs("div", { className: "flex gap-3 items-center", children: [(isImage || isPDF) && (_jsx(Button, { icon: "pi pi-eye", type: "button", style: { minWidth: 66 }, loading: isLoading, tooltip: value, disabled: isLoading, label: "View ".concat(fileType), size: "small", iconPos: "left", onClick: handleView })), downloadAllowed && (_jsx(Button, { size: "small", type: "button", icon: "pi pi-download", tooltip: "Download ".concat(value === null || value === void 0 ? void 0 : value.split("/").pop()), loading: isLoading, onClick: handleDownload, disabled: isLoading, className: 'solid-icon-button' }))] })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: "No file uploaded" })), isImage && previewUrl && (
185
+ // <img
186
+ // ref={imageRef}
187
+ // src={previewUrl}
188
+ // alt={value}
189
+ // style={{
190
+ // position: "absolute",
191
+ // visibility: "hidden",
192
+ // width: "1px",
193
+ // height: "1px"
194
+ // }}
195
+ // />
196
+ _jsx(SolidImageViewer, { images: [previewUrl], open: shouldShowViewer, onClose: function () { return setShouldShowViewer(false); }, viewerOptions: {
197
+ toolbar: {
198
+ zoomIn: 1,
199
+ zoomOut: 1,
200
+ rotateLeft: 1,
201
+ rotateRight: 1,
202
+ reset: 1,
203
+ },
203
204
  } })), _jsx(Dialog, { header: value, visible: open, modal: true, style: { width: "80vw", maxHeight: "90vh" }, onHide: function () { return setOpen(false); }, headerClassName: 'p-1 form-wrapper-title', contentClassName: 'p-0', contentStyle: { borderRadius: 6 }, children: previewUrl && isPDF && (_jsx("div", { style: {
204
205
  width: "100%",
205
206
  height: "75vh",
@@ -1 +1 @@
1
- {"version":3,"file":"SolidS3FileViewerWidget.js","sourceRoot":"","sources":["../../../../../../src/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport { useEffect, useRef, useState } from \"react\";\nimport { SolidFormFieldWidgetProps } from \"../../../../../types/solid-core\";\nimport { Button } from \"primereact/button\";\nimport { Dialog } from \"primereact/dialog\";\nimport { useResolveS3UrlMutation } from \"../../../../../redux/api/fieldApi\";\nimport Viewer from \"viewerjs\";\nimport \"viewerjs/dist/viewer.css\";\n\n/**\n * SolidS3FileViewerWidget (PrimeReact version)\n */\nexport const SolidS3FileViewerWidget = ({ formik, fieldContext }: SolidFormFieldWidgetProps) => {\n const fieldMetadata = fieldContext.fieldMetadata;\n const fieldLayoutInfo = fieldContext.field;\n const fieldLabel = fieldLayoutInfo.attrs.label ?? fieldMetadata.displayName;\n const value = formik.values[fieldLayoutInfo.attrs.name];\n const fileType = fieldLayoutInfo.attrs.fileType?.toLowerCase();\n const downloadAllowed = fieldLayoutInfo.attrs.downloadAllowed !== false;\n const bucketName = fieldLayoutInfo.attrs.bucketName;\n const mediaStorageProviderUserKey = fieldLayoutInfo.attrs.mediaStorageProviderUserKey;\n const isPrivate = fieldLayoutInfo.attrs.isPrivate ? fieldLayoutInfo.attrs.isPrivate : \"false\";\n\n const imageRef = useRef<HTMLImageElement | null>(null);\n const viewerRef = useRef<Viewer | null>(null);\n\n const [previewUrl, setPreviewUrl] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [open, setOpen] = useState(false);\n const [shouldShowViewer, setShouldShowViewer] = useState(false);\n\n const [resolveS3Url] = useResolveS3UrlMutation();\n\n const fetchS3Url = async () => {\n console.log(\"fetch url called\");\n setIsLoading(true);\n try {\n const result = await resolveS3Url({\n modelName: fieldContext.modelName,\n fieldName: fieldContext.fieldMetadata.name,\n s3Key: value,\n fileType: fileType,\n bucketName: bucketName,\n mediaStorageProviderUserKey: mediaStorageProviderUserKey,\n isPrivate: isPrivate\n }).unwrap();\n\n setIsLoading(false);\n if (result.statusCode == \"200\") {\n console.log(\"fetch url success\", result.data.url);\n return result.data.url;\n }\n } catch (e) {\n console.error(\"Failed to resolve S3 URL:\", e);\n setIsLoading(false);\n return null;\n }\n };\n\n const handleDownload = async () => {\n if (isLoading) return;\n const url = await fetchS3Url();\n if (!url) return;\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = value?.split(\"/\").pop() || \"file\";\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n a.click();\n };\n\n const handleView = async () => {\n console.log(\"isLoading in view\", isLoading);\n if (isLoading) return;\n \n const url = await fetchS3Url();\n console.log(\"url after fetch success\", url);\n if (!url) return;\n \n setPreviewUrl(url);\n \n if (isImage) {\n // Trigger viewer to show after state update\n setShouldShowViewer(true);\n } else {\n setOpen(true);\n }\n };\n\n const isImage = [\"jpeg\", \"jpg\", \"png\", \"gif\", \"webp\"].includes(fileType);\n const isPDF = fileType === \"pdf\";\n const isDownloadOnly = [\"xlsx\", \"xls\", \"csv\", \"doc\", \"docx\"].includes(fileType);\n\n // 🔹 Initialize Viewer.js once image exists\n useEffect(() => {\n if (imageRef.current && previewUrl && isImage) {\n // Destroy existing viewer if any\n if (viewerRef.current) {\n viewerRef.current.destroy();\n }\n\n // Create new viewer instance\n viewerRef.current = new Viewer(imageRef.current, {\n toolbar: {\n zoomIn: 1,\n zoomOut: 1,\n rotateLeft: 1,\n rotateRight: 1,\n reset: 1,\n },\n navbar: false,\n title: false,\n transition: true,\n movable: true,\n scalable: true,\n rotatable: true,\n zoomable: true,\n zIndex:9999,\n // Add hidden event to reset state\n hidden: () => {\n setShouldShowViewer(false);\n }\n });\n\n console.log(\"Viewer initialized\");\n }\n\n return () => {\n if (viewerRef.current) {\n viewerRef.current.destroy();\n viewerRef.current = null;\n }\n };\n }, [previewUrl, isImage]);\n\n // 🔹 Show viewer when shouldShowViewer becomes true\n useEffect(() => {\n if (shouldShowViewer && viewerRef.current) {\n console.log(\"Showing viewer\");\n viewerRef.current.show();\n }\n }, [shouldShowViewer]);\n\n return (\n <div className=\"mt-2 flex flex-col gap-2\">\n <p className=\"m-0 form-field-label font-medium\">{fieldLabel}</p>\n\n {value ? (\n <div className=\"flex gap-3 items-center\">\n {(isImage || isPDF) && (\n <Button\n icon=\"pi pi-eye\"\n type=\"button\"\n style={{ minWidth: 66 }}\n loading={isLoading}\n tooltip={value}\n disabled={isLoading}\n label={`View ${fileType}`}\n size=\"small\"\n iconPos=\"left\"\n onClick={handleView}\n />\n )}\n {downloadAllowed && (\n <Button\n size=\"small\"\n type=\"button\"\n icon=\"pi pi-download\"\n tooltip={`Download ${value?.split(\"/\").pop()}`}\n loading={isLoading}\n onClick={handleDownload}\n disabled={isLoading}\n className='solid-icon-button' />\n )}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">No file uploaded</p>\n )}\n\n {/* Hidden image for Viewer.js - keep visibility hidden instead of display none */}\n {isImage && previewUrl && (\n <img\n ref={imageRef}\n src={previewUrl}\n alt={value}\n style={{ \n position: \"absolute\",\n visibility: \"hidden\",\n width: \"1px\",\n height: \"1px\"\n }}\n />\n )}\n\n <Dialog\n header={value}\n visible={open}\n modal\n style={{ width: \"80vw\", maxHeight: \"90vh\" }}\n onHide={() => setOpen(false)}\n headerClassName='p-1 form-wrapper-title'\n contentClassName='p-0'\n contentStyle={{ borderRadius: 6 }}\n >\n {previewUrl && isPDF && (\n <div\n style={{\n width: \"100%\",\n height: \"75vh\",\n overflow: \"hidden\",\n }}\n >\n <iframe\n src={previewUrl}\n style={{ width: \"100%\", height: \"100%\", border: \"none\" }}\n />\n </div>\n )}\n </Dialog>\n </div>\n );\n};"]}
1
+ {"version":3,"file":"SolidS3FileViewerWidget.js","sourceRoot":"","sources":["../../../../../../src/components/core/form/fields/widgets/SolidS3FileViewerWidget.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,OAAO,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAC;AAC1F,OAAO,EAAE,UAAU,EAA0B,MAAM,oCAAoC,CAAC;AAExF;;GAEG;AACH,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAAC,EAAmD;;QAAjD,MAAM,YAAA,EAAE,YAAY,kBAAA;IAC1D,IAAM,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;IACjD,IAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC;IAC3C,IAAM,UAAU,GAAG,MAAA,eAAe,CAAC,KAAK,CAAC,KAAK,mCAAI,aAAa,CAAC,WAAW,CAAC;IAC5E,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,IAAM,QAAQ,GAAG,MAAA,eAAe,CAAC,KAAK,CAAC,QAAQ,0CAAE,WAAW,EAAE,CAAC;IAC/D,IAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC;IACxE,IAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC;IACpD,IAAM,2BAA2B,GAAG,eAAe,CAAC,KAAK,CAAC,2BAA2B,CAAC;IACtF,IAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9F,IAAM,QAAQ,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IACvD,IAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAExC,IAAA,KAA8B,QAAQ,CAAS,EAAE,CAAC,EAAjD,UAAU,QAAA,EAAE,aAAa,QAAwB,CAAC;IACnD,IAAA,KAA4B,QAAQ,CAAC,KAAK,CAAC,EAA1C,SAAS,QAAA,EAAE,YAAY,QAAmB,CAAC;IAC5C,IAAA,KAAkB,QAAQ,CAAC,KAAK,CAAC,EAAhC,IAAI,QAAA,EAAE,OAAO,QAAmB,CAAC;IAClC,IAAA,KAA0C,QAAQ,CAAC,KAAK,CAAC,EAAxD,gBAAgB,QAAA,EAAE,mBAAmB,QAAmB,CAAC;IAEzD,IAAA,YAAY,GAAI,uBAAuB,EAAE,GAA7B,CAA8B;IAEjD,IAAM,cAAc,GAAG;;;;;oBACnB,YAAY,CAAC,IAAI,CAAC,CAAC;oBAEb,OAAO,GAAsB;wBAC/B,KAAK,EAAE,KAAK;wBACZ,QAAQ,EAAE,QAAQ;wBAClB,UAAU,EAAE,UAAU;wBACtB,2BAA2B,EAAE,2BAA2B;wBACxD,SAAS,EAAE,SAAS;qBACvB,CAAC;oBAEU,qBAAM,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,EAAA;;oBAA7C,GAAG,GAAG,SAAuC;oBACnD,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,sBAAO,GAAG,EAAC;;;SACd,CAAC;IAEF,IAAM,cAAc,GAAG;;;;;oBACnB,IAAI,SAAS;wBAAE,sBAAO;oBACV,qBAAM,cAAc,EAAE,EAAA;;oBAA5B,GAAG,GAAG,SAAsB;oBAClC,IAAI,CAAC,GAAG;wBAAE,sBAAO;oBACX,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;oBACtC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;oBACb,CAAC,CAAC,QAAQ,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAI,MAAM,CAAC;oBAC/C,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;oBACpB,CAAC,CAAC,GAAG,GAAG,qBAAqB,CAAC;oBAC9B,CAAC,CAAC,KAAK,EAAE,CAAC;;;;SACb,CAAC;IAEF,IAAM,UAAU,GAAG;;;;;oBACf,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;oBAC5C,IAAI,SAAS;wBAAE,sBAAO;oBAEV,qBAAM,cAAc,EAAE,EAAA;;oBAA5B,GAAG,GAAG,SAAsB;oBAClC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;oBAC5C,IAAI,CAAC,GAAG;wBAAE,sBAAO;oBAEjB,aAAa,CAAC,GAAG,CAAC,CAAC;oBAEnB,IAAI,OAAO,EAAE;wBACT,4CAA4C;wBAC5C,mBAAmB,CAAC,IAAI,CAAC,CAAC;qBAC7B;yBAAM;wBACH,OAAO,CAAC,IAAI,CAAC,CAAC;qBACjB;;;;SACJ,CAAC;IAEF,IAAM,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzE,IAAM,KAAK,GAAG,QAAQ,KAAK,KAAK,CAAC;IACjC,IAAM,cAAc,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEhF,4CAA4C;IAC5C,oBAAoB;IACpB,uDAAuD;IACvD,4CAA4C;IAC5C,mCAAmC;IACnC,2CAA2C;IAC3C,YAAY;IAEZ,wCAAwC;IACxC,6DAA6D;IAC7D,yBAAyB;IACzB,6BAA6B;IAC7B,8BAA8B;IAC9B,iCAAiC;IACjC,kCAAkC;IAClC,4BAA4B;IAC5B,iBAAiB;IACjB,6BAA6B;IAC7B,4BAA4B;IAC5B,gCAAgC;IAChC,6BAA6B;IAC7B,8BAA8B;IAC9B,+BAA+B;IAC/B,8BAA8B;IAC9B,4BAA4B;IAC5B,iDAAiD;IACjD,8BAA8B;IAC9B,8CAA8C;IAC9C,gBAAgB;IAChB,cAAc;IAEd,6CAA6C;IAC7C,QAAQ;IAER,qBAAqB;IACrB,mCAAmC;IACnC,2CAA2C;IAC3C,wCAAwC;IACxC,YAAY;IACZ,SAAS;IACT,6BAA6B;IAE7B,oDAAoD;IACpD,oBAAoB;IACpB,mDAAmD;IACnD,yCAAyC;IACzC,oCAAoC;IACpC,QAAQ;IACR,0BAA0B;IAE1B,OAAO,CACH,eAAK,SAAS,EAAC,0BAA0B,aACrC,YAAG,SAAS,EAAC,kCAAkC,YAAE,UAAU,GAAK,EAE/D,KAAK,CAAC,CAAC,CAAC,CACL,eAAK,SAAS,EAAC,yBAAyB,aACnC,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CACnB,KAAC,MAAM,IACH,IAAI,EAAC,WAAW,EAChB,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EACvB,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,KAAK,EACd,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,eAAQ,QAAQ,CAAE,EACzB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,MAAM,EACd,OAAO,EAAE,UAAU,GACrB,CACL,EACA,eAAe,IAAI,CAChB,KAAC,MAAM,IACH,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,gBAAgB,EACrB,OAAO,EAAE,mBAAY,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAE,EAC9C,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAC,mBAAmB,GAAG,CACvC,IACC,CACT,CAAC,CAAC,CAAC,CACA,YAAG,SAAS,EAAC,+BAA+B,iCAAqB,CACpE,EAGA,OAAO,IAAI,UAAU,IAAI;YACtB,OAAO;YACP,qBAAqB;YACrB,uBAAuB;YACvB,kBAAkB;YAClB,eAAe;YACf,gCAAgC;YAChC,gCAAgC;YAChC,wBAAwB;YACxB,wBAAwB;YACxB,SAAS;YACT,KAAK;YACL,KAAC,gBAAgB,IACb,MAAM,EAAE,CAAC,UAAU,CAAC,EACpB,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,cAAM,OAAA,mBAAmB,CAAC,KAAK,CAAC,EAA1B,CAA0B,EACzC,aAAa,EAAE;oBACX,OAAO,EAAE;wBACL,MAAM,EAAE,CAAC;wBACT,OAAO,EAAE,CAAC;wBACV,UAAU,EAAE,CAAC;wBACb,WAAW,EAAE,CAAC;wBACd,KAAK,EAAE,CAAC;qBACX;iBACJ,GACH,CAEL,EAED,KAAC,MAAM,IACH,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,IAAI,EACb,KAAK,QACL,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAC3C,MAAM,EAAE,cAAM,OAAA,OAAO,CAAC,KAAK,CAAC,EAAd,CAAc,EAC5B,eAAe,EAAC,wBAAwB,EACxC,gBAAgB,EAAC,KAAK,EACtB,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,YAEhC,UAAU,IAAI,KAAK,IAAI,CACpB,cACI,KAAK,EAAE;wBACH,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,MAAM;wBACd,QAAQ,EAAE,QAAQ;qBACrB,YAED,iBACI,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAC1D,GACA,CACT,GACI,IACP,CACT,CAAC;AACN,CAAC,CAAC","sourcesContent":["\nimport { useRef, useState } from \"react\";\nimport { SolidFormFieldWidgetProps } from \"../../../../../types/solid-core\";\nimport { Button } from \"primereact/button\";\nimport { Dialog } from \"primereact/dialog\";\nimport { useResolveS3UrlMutation } from \"../../../../../redux/api/fieldApi\";\nimport Viewer from \"viewerjs\";\nimport \"viewerjs/dist/viewer.css\";\nimport { SolidImageViewer } from \"../../../../../components/core/common/SolidImageViewer\";\nimport { fetchS3Url, type FetchS3UrlOptions } from \"../../../../..//helpers/fetchS3Url\";\n\n/**\n * SolidS3FileViewerWidget (PrimeReact version)\n */\nexport const SolidS3FileViewerWidget = ({ formik, fieldContext }: SolidFormFieldWidgetProps) => {\n const fieldMetadata = fieldContext.fieldMetadata;\n const fieldLayoutInfo = fieldContext.field;\n const fieldLabel = fieldLayoutInfo.attrs.label ?? fieldMetadata.displayName;\n const value = formik.values[fieldLayoutInfo.attrs.name];\n const fileType = fieldLayoutInfo.attrs.fileType?.toLowerCase();\n const downloadAllowed = fieldLayoutInfo.attrs.downloadAllowed !== false;\n const bucketName = fieldLayoutInfo.attrs.bucketName;\n const mediaStorageProviderUserKey = fieldLayoutInfo.attrs.mediaStorageProviderUserKey;\n const isPrivate = fieldLayoutInfo.attrs.isPrivate ? fieldLayoutInfo.attrs.isPrivate : \"false\";\n\n const imageRef = useRef<HTMLImageElement | null>(null);\n const viewerRef = useRef<Viewer | null>(null);\n\n const [previewUrl, setPreviewUrl] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [open, setOpen] = useState(false);\n const [shouldShowViewer, setShouldShowViewer] = useState(false);\n\n const [resolveS3Url] = useResolveS3UrlMutation();\n\n const resolveFileUrl = async () => {\n setIsLoading(true);\n\n const options: FetchS3UrlOptions = {\n s3Key: value,\n fileType: fileType,\n bucketName: bucketName,\n mediaStorageProviderUserKey: mediaStorageProviderUserKey,\n isPrivate: isPrivate\n };\n\n const url = await fetchS3Url(resolveS3Url, options);\n setIsLoading(false);\n return url;\n };\n\n const handleDownload = async () => {\n if (isLoading) return;\n const url = await resolveFileUrl();\n if (!url) return;\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = value?.split(\"/\").pop() || \"file\";\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n a.click();\n };\n\n const handleView = async () => {\n console.log(\"isLoading in view\", isLoading);\n if (isLoading) return;\n\n const url = await resolveFileUrl();\n console.log(\"url after fetch success\", url);\n if (!url) return;\n\n setPreviewUrl(url);\n\n if (isImage) {\n // Trigger viewer to show after state update\n setShouldShowViewer(true);\n } else {\n setOpen(true);\n }\n };\n\n const isImage = [\"jpeg\", \"jpg\", \"png\", \"gif\", \"webp\"].includes(fileType);\n const isPDF = fileType === \"pdf\";\n const isDownloadOnly = [\"xlsx\", \"xls\", \"csv\", \"doc\", \"docx\"].includes(fileType);\n\n // 🔹 Initialize Viewer.js once image exists\n // useEffect(() => {\n // if (imageRef.current && previewUrl && isImage) {\n // // Destroy existing viewer if any\n // if (viewerRef.current) {\n // viewerRef.current.destroy();\n // }\n\n // // Create new viewer instance\n // viewerRef.current = new Viewer(imageRef.current, {\n // toolbar: {\n // zoomIn: 1,\n // zoomOut: 1,\n // rotateLeft: 1,\n // rotateRight: 1,\n // reset: 1,\n // },\n // navbar: false,\n // title: false,\n // transition: true,\n // movable: true,\n // scalable: true,\n // rotatable: true,\n // zoomable: true,\n // zIndex: 9999,\n // // Add hidden event to reset state\n // hidden: () => {\n // setShouldShowViewer(false);\n // }\n // });\n\n // console.log(\"Viewer initialized\");\n // }\n\n // return () => {\n // if (viewerRef.current) {\n // viewerRef.current.destroy();\n // viewerRef.current = null;\n // }\n // };\n // }, [previewUrl, isImage]);\n\n // 🔹 Show viewer when shouldShowViewer becomes true\n // useEffect(() => {\n // if (shouldShowViewer && viewerRef.current) {\n // console.log(\"Showing viewer\");\n // viewerRef.current.show();\n // }\n // }, [shouldShowViewer]);\n\n return (\n <div className=\"mt-2 flex flex-col gap-2\">\n <p className=\"m-0 form-field-label font-medium\">{fieldLabel}</p>\n\n {value ? (\n <div className=\"flex gap-3 items-center\">\n {(isImage || isPDF) && (\n <Button\n icon=\"pi pi-eye\"\n type=\"button\"\n style={{ minWidth: 66 }}\n loading={isLoading}\n tooltip={value}\n disabled={isLoading}\n label={`View ${fileType}`}\n size=\"small\"\n iconPos=\"left\"\n onClick={handleView}\n />\n )}\n {downloadAllowed && (\n <Button\n size=\"small\"\n type=\"button\"\n icon=\"pi pi-download\"\n tooltip={`Download ${value?.split(\"/\").pop()}`}\n loading={isLoading}\n onClick={handleDownload}\n disabled={isLoading}\n className='solid-icon-button' />\n )}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">No file uploaded</p>\n )}\n\n {/* Hidden image for Viewer.js - keep visibility hidden instead of display none */}\n {isImage && previewUrl && (\n // <img\n // ref={imageRef}\n // src={previewUrl}\n // alt={value}\n // style={{\n // position: \"absolute\",\n // visibility: \"hidden\",\n // width: \"1px\",\n // height: \"1px\"\n // }}\n // />\n <SolidImageViewer\n images={[previewUrl]}\n open={shouldShowViewer}\n onClose={() => setShouldShowViewer(false)}\n viewerOptions={{\n toolbar: {\n zoomIn: 1,\n zoomOut: 1,\n rotateLeft: 1,\n rotateRight: 1,\n reset: 1,\n },\n }}\n />\n\n )}\n\n <Dialog\n header={value}\n visible={open}\n modal\n style={{ width: \"80vw\", maxHeight: \"90vh\" }}\n onHide={() => setOpen(false)}\n headerClassName='p-1 form-wrapper-title'\n contentClassName='p-0'\n contentStyle={{ borderRadius: 6 }}\n >\n {previewUrl && isPDF && (\n <div\n style={{\n width: \"100%\",\n height: \"75vh\",\n overflow: \"hidden\",\n }}\n >\n <iframe\n src={previewUrl}\n style={{ width: \"100%\", height: \"100%\", border: \"none\" }}\n />\n </div>\n )}\n </Dialog>\n </div>\n );\n};\n"]}