@ynput/ayon-frontend-shared 0.4.2 → 0.4.3

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 (179) hide show
  1. package/dist/ProjectTreeTable.cjs.js +1 -1
  2. package/dist/ProjectTreeTable.es.js +247 -243
  3. package/dist/_virtual/index.cjs22.js +1 -1
  4. package/dist/_virtual/index.cjs23.js +1 -1
  5. package/dist/_virtual/index.cjs24.js +1 -1
  6. package/dist/_virtual/index.cjs4.js +1 -1
  7. package/dist/_virtual/index.cjs5.js +1 -1
  8. package/dist/_virtual/index.cjs6.js +1 -1
  9. package/dist/_virtual/index.cjs8.js +1 -1
  10. package/dist/_virtual/index.es22.js +3 -3
  11. package/dist/_virtual/index.es23.js +5 -5
  12. package/dist/_virtual/index.es24.js +5 -5
  13. package/dist/_virtual/index.es4.js +2 -5
  14. package/dist/_virtual/index.es4.js.map +1 -1
  15. package/dist/_virtual/index.es5.js +5 -2
  16. package/dist/_virtual/index.es5.js.map +1 -1
  17. package/dist/_virtual/index.es6.js +2 -2
  18. package/dist/_virtual/index.es8.js +2 -2
  19. package/dist/api.cjs.js +1 -1
  20. package/dist/api.es.js +446 -445
  21. package/dist/index.cjs.js +1 -1
  22. package/dist/index.es.js +20 -9
  23. package/dist/index.es.js.map +1 -1
  24. package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
  25. package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
  26. package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
  27. package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
  28. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
  29. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  30. package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
  31. package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
  32. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  33. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  34. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  35. package/dist/node_modules/remove-accents/index.es.js +1 -1
  36. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  37. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  38. package/dist/shared/node_modules/@module-federation/runtime/dist/index.cjs.js +1 -1
  39. package/dist/shared/node_modules/@module-federation/runtime/dist/index.es.js +1 -1
  40. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  41. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  42. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  43. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  44. package/dist/shared/src/api/generated/graphql.cjs.js +85 -28
  45. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  46. package/dist/shared/src/api/generated/graphql.es.js +129 -68
  47. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  48. package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js +1 -1
  49. package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js.map +1 -1
  50. package/dist/shared/src/api/queries/columnStats/metricTargets.es.js +36 -36
  51. package/dist/shared/src/api/queries/columnStats/metricTargets.es.js.map +1 -1
  52. package/dist/shared/src/components/Chips/Chips.cjs.js +12 -6
  53. package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
  54. package/dist/shared/src/components/Chips/Chips.es.js +69 -62
  55. package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
  56. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
  57. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  58. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +32 -12
  59. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  60. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -2
  61. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  62. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +33 -33
  63. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  64. package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
  65. package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
  66. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
  67. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
  68. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +39 -8
  69. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
  70. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  71. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  72. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +32 -31
  73. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  74. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
  75. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
  76. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js +1 -1
  77. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js.map +1 -1
  78. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js +24 -18
  79. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js.map +1 -1
  80. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js +1 -1
  81. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js.map +1 -1
  82. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js +26 -25
  83. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js.map +1 -1
  84. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
  85. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
  86. package/dist/shared/src/containers/ListTable/ListTableCell.es.js +14 -2
  87. package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
  88. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  89. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  90. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +125 -126
  91. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  92. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +6 -0
  93. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
  94. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +14 -8
  95. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
  96. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  97. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  98. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +200 -178
  99. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  100. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
  101. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  102. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +14 -3
  103. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  104. package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js +1 -1
  105. package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js.map +1 -1
  106. package/dist/shared/src/containers/ProjectTreeTable/constants.es.js +6 -3
  107. package/dist/shared/src/containers/ProjectTreeTable/constants.es.js.map +1 -1
  108. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
  109. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
  110. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +19 -19
  111. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
  112. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +5 -3
  113. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
  114. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +100 -97
  115. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
  116. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +9 -1
  117. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
  118. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +47 -31
  119. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
  120. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +28 -9
  121. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
  122. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +58 -39
  123. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
  124. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +53 -25
  125. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
  126. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +150 -103
  127. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
  128. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +9 -2
  129. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
  130. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +66 -57
  131. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
  132. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
  133. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
  134. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +9 -8
  135. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
  136. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +20 -4
  137. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
  138. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +86 -67
  139. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js.map +1 -1
  140. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js +6 -0
  141. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js.map +1 -0
  142. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js +11 -0
  143. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js.map +1 -0
  144. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
  145. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
  146. package/dist/shared/src/containers/Views/context/ViewsContext.es.js +67 -62
  147. package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
  148. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
  149. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
  150. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +47 -46
  151. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
  152. package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
  153. package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
  154. package/dist/shared/src/context/ProjectContext.es.js +1 -1
  155. package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
  156. package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js +1 -1
  157. package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js.map +1 -1
  158. package/dist/shared/src/util/buildHierarchicalTableRows.es.js +36 -33
  159. package/dist/shared/src/util/buildHierarchicalTableRows.es.js.map +1 -1
  160. package/dist/types/api/generated/graphql.d.ts +71 -0
  161. package/dist/types/api/queries/activities/getActivities.d.ts +28 -0
  162. package/dist/types/api/queries/entities/getEntity.d.ts +14 -0
  163. package/dist/types/api/queries/entities/getEntityPanel.d.ts +14 -0
  164. package/dist/types/api/queries/entities/updateEntity.d.ts +14 -0
  165. package/dist/types/api/queries/entityLists/getLists.d.ts +14 -0
  166. package/dist/types/api/queries/overview/getOverview.d.ts +14 -0
  167. package/dist/types/api/queries/project/getProject.d.ts +14 -0
  168. package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +14 -0
  169. package/dist/types/api/queries/users/getUsers.d.ts +14 -0
  170. package/dist/types/api/queries/versions/getVersionsProducts.d.ts +28 -0
  171. package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +4 -1
  172. package/dist/types/containers/Feed/helpers/buildBackendFilter.d.ts +1 -0
  173. package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +1 -0
  174. package/dist/types/containers/ProjectTreeTable/constants.d.ts +3 -0
  175. package/dist/types/containers/ProjectTreeTable/widgets/SubtasksWidget.d.ts +1 -0
  176. package/dist/types/containers/ProjectTreeTable/widgets/wrapMode.d.ts +2 -0
  177. package/dist/types/containers/Views/context/ViewsContext.d.ts +1 -0
  178. package/dist/types/util/buildHierarchicalTableRows.d.ts +2 -0
  179. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { j as mi } from "../../../../../_virtual/jsx-runtime.es.js";
2
- import { useContext as pi, useState as G, useMemo as O, useCallback as Q } from "react";
3
- import { BASE_VIEW_ID as ai, WORKING_VIEW_ID as di } from "../types.es.js";
1
+ import { j as pi } from "../../../../../_virtual/jsx-runtime.es.js";
2
+ import { useContext as ai, useState as G, useMemo as O, useCallback as Q } from "react";
3
+ import { BASE_VIEW_ID as di, WORKING_VIEW_ID as wi } from "../types.es.js";
4
4
  import "../../../api/base/client.es.js";
5
5
  import "../../../api/generated/graphql.es.js";
6
6
  import "../../../api/generated/graphqlLinks.es.js";
@@ -84,7 +84,7 @@ import "../../../api/queries/project/updateProject.es.js";
84
84
  import "../../../api/queries/projectFolders/projectFolders.es.js";
85
85
  import "../../../api/queries/review/getReview.es.js";
86
86
  import "../../../api/queries/review/updateReview.es.js";
87
- import { useGetShareOptionsQuery as wi } from "../../../api/queries/share/share.es.js";
87
+ import { useGetShareOptionsQuery as ci } from "../../../api/queries/share/share.es.js";
88
88
  import "../../../api/queries/system/getSystem.es.js";
89
89
  import "../../../api/queries/tasks/getTasks.es.js";
90
90
  import "../../../api/queries/tasks/updateTasks.es.js";
@@ -94,32 +94,32 @@ import "../../../api/queries/users/getUsers.es.js";
94
94
  import "../../../api/queries/users/updateUsers.es.js";
95
95
  import "../../../api/queries/users/guests.es.js";
96
96
  import "../../../api/queries/versions/updateVersions.es.js";
97
- import { useListViewsQuery as ci, useGetWorkingViewQuery as ui, useGetBaseViewQuery as U, useGetViewQuery as Vi } from "../../../api/queries/views/getViews.es.js";
98
- import { viewsQueries as gi } from "../../../api/queries/views/updateViews.es.js";
97
+ import { useListViewsQuery as ui, useGetWorkingViewQuery as Vi, useGetBaseViewQuery as U, useGetViewQuery as gi } from "../../../api/queries/views/getViews.es.js";
98
+ import { viewsQueries as li } from "../../../api/queries/views/updateViews.es.js";
99
99
  import "../../../api/queries/watchers/getWatchers.es.js";
100
100
  import "../../../api/queries/uris/getUris.es.js";
101
- import li from "../hooks/useBuildViewMenuItems.es.js";
102
- import { useGlobalContext as fi } from "../../../context/GlobalContext.es.js";
103
- import { usePowerpack as Si } from "../../../context/PowerpackContext.es.js";
101
+ import fi from "../hooks/useBuildViewMenuItems.es.js";
102
+ import { useGlobalContext as Si } from "../../../context/GlobalContext.es.js";
103
+ import { usePowerpack as ki } from "../../../context/PowerpackContext.es.js";
104
104
  import { useSelectedView as Li } from "../hooks/useSelectedView.es.js";
105
- import { useViewsMutations as ki } from "../hooks/useViewsMutations.es.js";
106
- import { useBaseViewMutations as Ci } from "../hooks/useBaseViewMutations.es.js";
107
- import { useSaveViewFromCurrent as Ii } from "../hooks/useSaveViewFromCurrent.es.js";
108
- import { useViewSettingsChanged as Di } from "../hooks/useViewSettingsChanged.es.js";
109
- import { useLocalStorage as Wi } from "../../../hooks/useLocalStorage.es.js";
110
- import { isViewStudioScope as hi } from "../utils/isViewStudioScope.es.js";
105
+ import { useViewsMutations as Ci } from "../hooks/useViewsMutations.es.js";
106
+ import { useBaseViewMutations as Ii } from "../hooks/useBaseViewMutations.es.js";
107
+ import { useSaveViewFromCurrent as Di } from "../hooks/useSaveViewFromCurrent.es.js";
108
+ import { useViewSettingsChanged as Wi } from "../hooks/useViewSettingsChanged.es.js";
109
+ import { useLocalStorage as hi } from "../../../hooks/useLocalStorage.es.js";
110
+ import { isViewStudioScope as Bi } from "../utils/isViewStudioScope.es.js";
111
111
  import { ViewsContext as _ } from "./ViewsContextInstance.es.js";
112
- const Bi = "view", Go = ({
112
+ const Ei = "view", Oo = ({
113
113
  children: p,
114
114
  viewType: i,
115
- viewAlias: S = Bi,
115
+ viewAlias: S = Ei,
116
116
  projectName: o,
117
- dispatch: L,
117
+ dispatch: k,
118
118
  debug: u
119
119
  }) => {
120
- let { powerLicense: a } = Si();
120
+ let { powerLicense: a } = ki();
121
121
  u?.powerLicense !== void 0 && (console.warn("Using debug power license:", u.powerLicense), a = u.powerLicense);
122
- const { user: k } = fi(), [F, C] = G(!1), [r, I] = G(null), P = "viewsMenuCollapsed", [V, D] = Wi(
122
+ const { user: L } = Si(), [F, C] = G(!1), [r, I] = G(null), P = "viewsMenuCollapsed", [V, D] = hi(
123
123
  P,
124
124
  {}
125
125
  ), R = (t) => {
@@ -128,59 +128,63 @@ const Bi = "view", Go = ({
128
128
  const M = { ...V };
129
129
  M[c] = !1, D(M);
130
130
  }
131
- }, { data: b } = wi(
131
+ }, { data: b } = ci(
132
132
  { projectName: o },
133
133
  { skip: !a || !r }
134
134
  ), [s, n, g, A] = Li({
135
135
  viewType: i,
136
136
  projectName: o
137
- }), [K, d] = Di({
137
+ }), [K, d] = Wi({
138
138
  viewType: i
139
- }), { currentData: W = [], isLoading: q } = ci(
139
+ }), { currentData: W = [], isLoading: q } = ui(
140
140
  { projectName: o, viewType: i },
141
141
  { skip: !i }
142
142
  ), m = O(
143
143
  () => W.filter(
144
- (t) => t.label !== ai && !(o && t.working && t.scope === "studio")
144
+ (t) => t.label !== di && !(o && t.working && t.scope === "studio")
145
145
  ),
146
146
  [W]
147
- ), { onCreateView: y, onDeleteView: z, onUpdateView: w, onResetWorkingView: h } = ki({
147
+ ), { onCreateView: y, onDeleteView: z, onUpdateView: w, onResetWorkingView: h } = Ci({
148
148
  viewType: i,
149
149
  projectName: o,
150
150
  viewsList: m,
151
151
  onCreate: R
152
- }), { currentData: e, isLoading: H } = ui(
152
+ }), {
153
+ currentData: e,
154
+ isLoading: H,
155
+ isError: J
156
+ } = Vi(
153
157
  { projectName: o, viewType: i },
154
158
  { skip: !i }
155
- ), { currentData: J, isLoading: X } = U(
159
+ ), { currentData: X, isLoading: Y } = U(
156
160
  { projectName: o, viewType: i },
157
161
  { skip: !i }
158
- ), { currentData: Y, isLoading: Z } = U(
162
+ ), { currentData: Z, isLoading: $ } = U(
159
163
  { projectName: void 0, viewType: i },
160
164
  { skip: !i }
161
- ), $ = q || A || H || X || Z, B = e?.settings, l = s?.id === di ? B : s?.settings, x = s?.id === e?.id, E = K && x && g && g !== e?.id ? g : void 0, { currentData: f, isFetching: j } = Vi(
165
+ ), j = q || A || H || Y || $, B = e?.settings, l = s?.id === wi ? B : s?.settings, E = s?.id === e?.id, x = K && E && g && g !== e?.id ? g : void 0, { currentData: f, isFetching: N } = gi(
162
166
  {
163
167
  viewId: r,
164
- projectName: hi(r, m) ? void 0 : o,
168
+ projectName: Bi(r, m) ? void 0 : o,
165
169
  viewType: i
166
170
  },
167
171
  { skip: typeof r != "string" || !a }
168
- ), N = O(
172
+ ), T = O(
169
173
  () => r === f?.id ? f : void 0,
170
174
  [r, f]
171
- ), { onSaveViewFromCurrent: T } = Ii({
175
+ ), { onSaveViewFromCurrent: ii } = Di({
172
176
  viewType: i,
173
177
  projectName: o,
174
178
  viewsList: m,
175
179
  sourceSettings: l,
176
180
  onUpdateView: w
177
- }), { onCreateBaseView: ii, onUpdateBaseView: ti, onDeleteBaseView: oi, onLoadBaseView: ei } = Ci({
181
+ }), { onCreateBaseView: ti, onUpdateBaseView: oi, onDeleteBaseView: ei, onLoadBaseView: ri } = Ii({
178
182
  viewType: i,
179
183
  projectName: o,
180
184
  viewSettings: l,
181
185
  workingView: e,
182
- dispatch: L
183
- }), ri = Q(
186
+ dispatch: k
187
+ }), si = Q(
184
188
  async (t, { selectView: c } = {}) => {
185
189
  if (!e?.id) {
186
190
  console.error("No working view to update");
@@ -201,15 +205,15 @@ const Bi = "view", Go = ({
201
205
  } catch (t) {
202
206
  console.error("Failed to reset view:", t);
203
207
  }
204
- }, [e, h, s, n, d]), si = li({
208
+ }, [e, h, s, n, d]), ni = fi({
205
209
  viewsList: m,
206
210
  workingView: e,
207
211
  viewType: i,
208
212
  viewAlias: S,
209
213
  projectName: o,
210
- currentUser: k,
214
+ currentUser: L,
211
215
  useWorkingView: !a,
212
- editingViewId: E,
216
+ editingViewId: x,
213
217
  selectedId: s?.id,
214
218
  collapsed: V,
215
219
  setCollapsed: D,
@@ -218,35 +222,36 @@ const Bi = "view", Go = ({
218
222
  n(t), d(!1), C(!1);
219
223
  },
220
224
  onEdit: (t) => I(t),
221
- onSave: async (t) => T(t)
222
- }), ni = {
225
+ onSave: async (t) => ii(t)
226
+ }), mi = {
223
227
  viewType: i,
224
228
  viewAlias: S,
225
229
  projectName: o,
226
230
  isMenuOpen: F,
227
231
  editingView: r,
228
- currentUser: k,
232
+ currentUser: L,
229
233
  selectedView: s,
230
234
  viewSettings: l,
231
- editingViewData: N,
232
- isLoadingEditingViewData: j,
235
+ editingViewData: T,
236
+ isLoadingEditingViewData: N,
233
237
  viewsList: m,
234
238
  // Working view
235
239
  workingSettings: B,
236
240
  workingView: e,
237
- isViewWorking: x,
238
- onUpdateWorkingView: ri,
241
+ isViewWorking: E,
242
+ onUpdateWorkingView: si,
239
243
  // base views
240
- projectBaseView: J,
241
- studioBaseView: Y,
244
+ projectBaseView: X,
245
+ studioBaseView: Z,
242
246
  // base view mutations
243
- onCreateBaseView: ii,
244
- onUpdateBaseView: ti,
245
- onDeleteBaseView: oi,
246
- onLoadBaseView: ei,
247
- editingViewId: E,
248
- viewMenuItems: si,
249
- isLoadingViews: $,
247
+ onCreateBaseView: ti,
248
+ onUpdateBaseView: oi,
249
+ onDeleteBaseView: ei,
250
+ onLoadBaseView: ri,
251
+ editingViewId: x,
252
+ viewMenuItems: ni,
253
+ isLoadingViews: j,
254
+ isErrorWorkingView: J,
250
255
  // data
251
256
  shareOptions: b,
252
257
  setIsMenuOpen: C,
@@ -260,19 +265,19 @@ const Bi = "view", Go = ({
260
265
  // shared actions
261
266
  resetWorkingView: v,
262
267
  // api
263
- api: gi,
264
- dispatch: L
268
+ api: li,
269
+ dispatch: k
265
270
  };
266
- return /* @__PURE__ */ mi.jsx(_.Provider, { value: ni, children: p });
267
- }, Oo = () => {
268
- const p = pi(_);
271
+ return /* @__PURE__ */ pi.jsx(_.Provider, { value: mi, children: p });
272
+ }, Qo = () => {
273
+ const p = ai(_);
269
274
  if (!p)
270
275
  throw new Error("useViewsContext must be used within a ViewsProvider");
271
276
  return p;
272
277
  };
273
278
  export {
274
- Go as ViewsProvider,
275
- hi as isViewStudioScope,
276
- Oo as useViewsContext
279
+ Oo as ViewsProvider,
280
+ Bi as isViewStudioScope,
281
+ Qo as useViewsContext
277
282
  };
278
283
  //# sourceMappingURL=ViewsContext.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsContext.es.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { type ViewType, WORKING_VIEW_ID, BASE_VIEW_ID } from '../types'\nimport {\n GetDefaultViewApiResponse,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n useGetBaseViewQuery,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { useGlobalContext } from '@shared/context/GlobalContext'\nimport { usePowerpack } from '@shared/context/PowerpackContext'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { type UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useBaseViewMutations } from '../hooks/useBaseViewMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks/useLocalStorage'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nexport type CollapsedViewState = Record<string, boolean>\n\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n viewAlias: string\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n // Working view\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n isViewWorking: boolean\n onUpdateWorkingView: (\n payload: Partial<ViewData>,\n options?: { selectView?: boolean },\n ) => Promise<void>\n // base views\n projectBaseView: ViewListItemModel | undefined\n studioBaseView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingEditingViewData: boolean\n isLoadingViews: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Base view mutations\n onCreateBaseView: (isStudioScope: boolean) => Promise<void>\n onUpdateBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onDeleteBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onLoadBaseView: (isStudioScope: boolean) => Promise<void>\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any // dispatch is used to dispatch api mutations in pp like the share one.\n}\n\nconst DEFAULT_VIEW_ALIAS = 'view'\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n viewAlias?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType,\n viewAlias = DEFAULT_VIEW_ALIAS,\n projectName,\n dispatch,\n debug,\n}) => {\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { user: currentUser } = useGlobalContext()\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsedSections, setCollapsedSections] = useLocalStorage<CollapsedViewState>(\n stateKey,\n {},\n )\n\n // anything extra to do when a view is created successfully\n const handleOnViewCreated = (view: ViewData) => {\n const key = view.visibility === 'private' ? 'myViews' : 'sharedViews'\n // if the section is collapsed, expand it\n if (collapsedSections[key]) {\n const newCollapsedSections = { ...collapsedSections }\n newCollapsedSections[key] = false\n setCollapsedSections(newCollapsedSections)\n }\n }\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId, isLoadingDefaultView] =\n useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data and filter out base views\n const { currentData: viewsListRaw = [], isLoading: isLoadingViewsList } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Filter out base views from the list\n // Filter out studio working view if in project scope\n const viewsList = useMemo(\n () =>\n viewsListRaw.filter(\n (view) =>\n view.label !== BASE_VIEW_ID && !(projectName && view.working && view.scope === 'studio'),\n ),\n [viewsListRaw],\n )\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n viewsList,\n onCreate: handleOnViewCreated,\n })\n\n // always get your working view\n const { currentData: workingView, isLoading: isLoadingWorkingView } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Fetch both project and studio base views\n const { currentData: projectBaseView, isLoading: isLoadingProjectBaseView } = useGetBaseViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n const { currentData: studioBaseView, isLoading: isLoadingStudioBaseView } = useGetBaseViewQuery(\n { projectName: undefined, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // isLoadingViews is true ONLY on the very first fetch (no cached data yet).\n // It does NOT flip back to true during background re-fetches (e.g. after a save),\n // which prevents UI flickering in consumers like ProjectOverviewContext.\n const isLoadingViews =\n isLoadingViewsList ||\n isLoadingDefaultView ||\n isLoadingWorkingView ||\n isLoadingProjectBaseView ||\n isLoadingStudioBaseView\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n selectedView?.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData, isFetching: isLoadingEditingViewData } =\n useGetViewQuery(\n {\n viewId: editingView as string,\n projectName: isViewStudioScope(editingView as string, viewsList) ? undefined : projectName,\n viewType: viewType as string,\n },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n viewsList,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Base view mutations\n const { onCreateBaseView, onUpdateBaseView, onDeleteBaseView, onLoadBaseView } =\n useBaseViewMutations({\n viewType: viewType as string,\n projectName,\n viewSettings,\n workingView,\n dispatch,\n })\n\n const onUpdateWorkingView = useCallback(\n async (payload: Partial<ViewData>, { selectView }: { selectView?: boolean } = {}) => {\n if (!workingView?.id) {\n console.error('No working view to update')\n return\n }\n await onUpdateView(workingView.id, payload, !projectName)\n if (selectView) {\n setSelectedView(workingView.id)\n }\n },\n [onUpdateView, workingView],\n )\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n viewAlias,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n selectedId: selectedView?.id,\n collapsed: collapsedSections,\n setCollapsed: setCollapsedSections,\n onResetWorkingView: resetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n viewAlias,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n editingViewData,\n isLoadingEditingViewData,\n viewsList,\n // Working view\n workingSettings,\n workingView,\n isViewWorking,\n onUpdateWorkingView,\n // base views\n projectBaseView,\n studioBaseView,\n // base view mutations\n onCreateBaseView,\n onUpdateBaseView,\n onDeleteBaseView,\n onLoadBaseView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n\nimport { isViewStudioScope } from '../utils/isViewStudioScope'\nimport { ViewsContext } from './ViewsContextInstance'\nexport { isViewStudioScope }\n"],"names":["DEFAULT_VIEW_ALIAS","ViewsProvider","children","viewType","viewAlias","projectName","dispatch","debug","powerLicense","usePowerpack","currentUser","useGlobalContext","isMenuOpen","setIsMenuOpen","useState","editingView","setEditingView","stateKey","collapsedSections","setCollapsedSections","useLocalStorage","handleOnViewCreated","view","key","newCollapsedSections","shareOptions","useGetShareOptionsQuery","selectedView","setSelectedView","previousSelectedViewId","isLoadingDefaultView","useSelectedView","viewSettingsChanged","setViewSettingsChanged","useViewSettingsChanged","viewsListRaw","isLoadingViewsList","useListViewsQuery","viewsList","useMemo","BASE_VIEW_ID","onCreateView","onDeleteView","onUpdateView","onResetWorkingView","useViewsMutations","workingView","isLoadingWorkingView","useGetWorkingViewQuery","projectBaseView","isLoadingProjectBaseView","useGetBaseViewQuery","studioBaseView","isLoadingStudioBaseView","isLoadingViews","workingSettings","viewSettings","WORKING_VIEW_ID","isViewWorking","editingViewId","editingViewDataData","isLoadingEditingViewData","useGetViewQuery","isViewStudioScope","editingViewData","onSaveViewFromCurrent","useSaveViewFromCurrent","onCreateBaseView","onUpdateBaseView","onDeleteBaseView","onLoadBaseView","useBaseViewMutations","onUpdateWorkingView","useCallback","payload","selectView","resetWorkingView","error","viewMenuItems","useBuildViewMenuItems","viewId","value","viewsQueries","jsx","ViewsContext","useViewsContext","context","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"ViewsContext.es.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { type ViewType, WORKING_VIEW_ID, BASE_VIEW_ID } from '../types'\nimport {\n GetDefaultViewApiResponse,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n useGetBaseViewQuery,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { useGlobalContext } from '@shared/context/GlobalContext'\nimport { usePowerpack } from '@shared/context/PowerpackContext'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { type UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useBaseViewMutations } from '../hooks/useBaseViewMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks/useLocalStorage'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nexport type CollapsedViewState = Record<string, boolean>\n\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n viewAlias: string\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n // Working view\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n isViewWorking: boolean\n onUpdateWorkingView: (\n payload: Partial<ViewData>,\n options?: { selectView?: boolean },\n ) => Promise<void>\n // base views\n projectBaseView: ViewListItemModel | undefined\n studioBaseView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingEditingViewData: boolean\n isLoadingViews: boolean\n isErrorWorkingView: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Base view mutations\n onCreateBaseView: (isStudioScope: boolean) => Promise<void>\n onUpdateBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onDeleteBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onLoadBaseView: (isStudioScope: boolean) => Promise<void>\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any // dispatch is used to dispatch api mutations in pp like the share one.\n}\n\nconst DEFAULT_VIEW_ALIAS = 'view'\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n viewAlias?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType,\n viewAlias = DEFAULT_VIEW_ALIAS,\n projectName,\n dispatch,\n debug,\n}) => {\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { user: currentUser } = useGlobalContext()\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsedSections, setCollapsedSections] = useLocalStorage<CollapsedViewState>(\n stateKey,\n {},\n )\n\n // anything extra to do when a view is created successfully\n const handleOnViewCreated = (view: ViewData) => {\n const key = view.visibility === 'private' ? 'myViews' : 'sharedViews'\n // if the section is collapsed, expand it\n if (collapsedSections[key]) {\n const newCollapsedSections = { ...collapsedSections }\n newCollapsedSections[key] = false\n setCollapsedSections(newCollapsedSections)\n }\n }\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId, isLoadingDefaultView] =\n useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data and filter out base views\n const { currentData: viewsListRaw = [], isLoading: isLoadingViewsList } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Filter out base views from the list\n // Filter out studio working view if in project scope\n const viewsList = useMemo(\n () =>\n viewsListRaw.filter(\n (view) =>\n view.label !== BASE_VIEW_ID && !(projectName && view.working && view.scope === 'studio'),\n ),\n [viewsListRaw],\n )\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n viewsList,\n onCreate: handleOnViewCreated,\n })\n\n // always get your working view\n const {\n currentData: workingView,\n isLoading: isLoadingWorkingView,\n isError: isErrorWorkingView,\n } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Fetch both project and studio base views\n const { currentData: projectBaseView, isLoading: isLoadingProjectBaseView } = useGetBaseViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n const { currentData: studioBaseView, isLoading: isLoadingStudioBaseView } = useGetBaseViewQuery(\n { projectName: undefined, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // isLoadingViews is true ONLY on the very first fetch (no cached data yet).\n // It does NOT flip back to true during background re-fetches (e.g. after a save),\n // which prevents UI flickering in consumers like ProjectOverviewContext.\n const isLoadingViews =\n isLoadingViewsList ||\n isLoadingDefaultView ||\n isLoadingWorkingView ||\n isLoadingProjectBaseView ||\n isLoadingStudioBaseView\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n selectedView?.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData, isFetching: isLoadingEditingViewData } =\n useGetViewQuery(\n {\n viewId: editingView as string,\n projectName: isViewStudioScope(editingView as string, viewsList) ? undefined : projectName,\n viewType: viewType as string,\n },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n viewsList,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Base view mutations\n const { onCreateBaseView, onUpdateBaseView, onDeleteBaseView, onLoadBaseView } =\n useBaseViewMutations({\n viewType: viewType as string,\n projectName,\n viewSettings,\n workingView,\n dispatch,\n })\n\n const onUpdateWorkingView = useCallback(\n async (payload: Partial<ViewData>, { selectView }: { selectView?: boolean } = {}) => {\n if (!workingView?.id) {\n console.error('No working view to update')\n return\n }\n await onUpdateView(workingView.id, payload, !projectName)\n if (selectView) {\n setSelectedView(workingView.id)\n }\n },\n [onUpdateView, workingView],\n )\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n viewAlias,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n selectedId: selectedView?.id,\n collapsed: collapsedSections,\n setCollapsed: setCollapsedSections,\n onResetWorkingView: resetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n viewAlias,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n editingViewData,\n isLoadingEditingViewData,\n viewsList,\n // Working view\n workingSettings,\n workingView,\n isViewWorking,\n onUpdateWorkingView,\n // base views\n projectBaseView,\n studioBaseView,\n // base view mutations\n onCreateBaseView,\n onUpdateBaseView,\n onDeleteBaseView,\n onLoadBaseView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n isErrorWorkingView,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n\nimport { isViewStudioScope } from '../utils/isViewStudioScope'\nimport { ViewsContext } from './ViewsContextInstance'\nexport { isViewStudioScope }\n"],"names":["DEFAULT_VIEW_ALIAS","ViewsProvider","children","viewType","viewAlias","projectName","dispatch","debug","powerLicense","usePowerpack","currentUser","useGlobalContext","isMenuOpen","setIsMenuOpen","useState","editingView","setEditingView","stateKey","collapsedSections","setCollapsedSections","useLocalStorage","handleOnViewCreated","view","key","newCollapsedSections","shareOptions","useGetShareOptionsQuery","selectedView","setSelectedView","previousSelectedViewId","isLoadingDefaultView","useSelectedView","viewSettingsChanged","setViewSettingsChanged","useViewSettingsChanged","viewsListRaw","isLoadingViewsList","useListViewsQuery","viewsList","useMemo","BASE_VIEW_ID","onCreateView","onDeleteView","onUpdateView","onResetWorkingView","useViewsMutations","workingView","isLoadingWorkingView","isErrorWorkingView","useGetWorkingViewQuery","projectBaseView","isLoadingProjectBaseView","useGetBaseViewQuery","studioBaseView","isLoadingStudioBaseView","isLoadingViews","workingSettings","viewSettings","WORKING_VIEW_ID","isViewWorking","editingViewId","editingViewDataData","isLoadingEditingViewData","useGetViewQuery","isViewStudioScope","editingViewData","onSaveViewFromCurrent","useSaveViewFromCurrent","onCreateBaseView","onUpdateBaseView","onDeleteBaseView","onLoadBaseView","useBaseViewMutations","onUpdateWorkingView","useCallback","payload","selectView","resetWorkingView","error","viewMenuItems","useBuildViewMenuItems","viewId","value","viewsQueries","jsx","ViewsContext","useViewsContext","context","useContext"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");require("../../../api/queries/views/getViews.cjs.js");const y=require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const H=require("./generateWorkingView.cjs.js"),I=require("react-toastify"),V=require("react"),R=require("react-redux"),T=require("../context/ViewsContext.cjs.js");let S=!1;const m=()=>{S||(S=!0,queueMicrotask(()=>{S=!1}))},N=async(e,s,u,r={},o,w,f,i)=>{const{viewSettings:a,viewType:n,projectName:p,selectedView:t,setSelectedView:d,workingView:q,onSettingsChanged:c}=o;if(!n)throw new Error("No view type provided for updating view settings");const l=t?.id,g=t?.working;try{s(u);const{settings:k,workingViewId:C}=f(),b=k??a;if(b===void 0){console.warn("updateViewSettings: no settings baseline available, aborting to prevent data loss.");return}const h={...b,...e},W=H.generateWorkingView(h),v=C??q?.id;v&&(W.id=v);const F=W.id,E=w({payload:v?{settings:h}:W,viewType:n,projectName:p},v);i(),(!g||t?.id!==v)&&(t&&c(!0),d(F)),await E,s(null),r.successMessage&&I.toast.success(r.successMessage)}catch(k){s(null),l&&d(l),t&&!g&&c(!1),console.error(k);const C=r.errorMessage||`Failed to update view settings: ${k}`;I.toast.error(C)}},j=()=>{const[e]=y.useCreateViewMutation(),[s]=y.useUpdateViewMutation(),u=T.useViewsContext(),r=R.useStore(),o=V.useCallback(async(i,a)=>{if(a){const n={};return["label","owner","settings"].forEach(t=>{i.payload[t]!==void 0&&(n[t]=i.payload[t])}),await s({viewType:i.viewType,projectName:i.projectName,viewId:a,payload:n}).unwrap()}else return await e(i).unwrap()},[e,s]),w=V.useCallback(()=>{const{viewType:i,projectName:a,selectedView:n,workingView:p}=u;if(!i)return{};const t=r.getState(),d=y.viewsQueries.endpoints.getWorkingView.select({viewType:i,projectName:a})(t),c=d?.data?.id||p?.id,l=y.viewsQueries.endpoints.getDefaultView.select({viewType:i,projectName:a})(t),g=l?.data?.id||n?.id;return(!!c&&g===c||S)&&d?.data?.settings?{settings:d.data.settings,workingViewId:c}:l?.data?.settings?{settings:l.data.settings,workingViewId:c}:{workingViewId:c}},[r,u]);return{updateViewSettings:V.useCallback(async(...i)=>await N(...i,u,o,w,m),[u,o,w]),onCreateView:o,getLatestSettings:w,markCacheDirty:m}},M=(e,s)=>s.split(".").reduce((u,r)=>u?.[r],e),L=(e,s,u)=>{const[r,...o]=s.split(".");return r?{...e,[r]:o.length?L(e[r]||{},o.join("."),u):u}:e},x=(e,s)=>{const{viewSettings:u,isLoadingViews:r}=T.useViewsContext(),{updateViewSettings:o,getLatestSettings:w}=j(),[f,i]=V.useState(null),a=V.useRef(null),n=u,p=f!==null?f:M(n,e)??s,t=V.useCallback(q=>{a.current=q,i(q)},[]),d=V.useCallback(q=>{if(r||!n)return;const c=w().settings??n,l=a.current!==null?a.current:M(c,e)??s,g=typeof q=="function"?q(l):q;o(L(c,e,g),t,g,{})},[s,w,r,e,n,t,o]);return[p,d]};exports.updateViewSettings=N;exports.useViewUpdateHelper=j;exports.useViewsState=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");require("../../../api/queries/views/getViews.cjs.js");const y=require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const R=require("./generateWorkingView.cjs.js"),m=require("react-toastify"),V=require("react"),x=require("react-redux"),N=require("../context/ViewsContext.cjs.js");let S=!1;const M=()=>{S||(S=!0,queueMicrotask(()=>{S=!1}))},j=async(e,s,u,r={},o,w,k,i)=>{const{viewSettings:a,viewType:n,projectName:p,selectedView:t,setSelectedView:d,workingView:q,onSettingsChanged:c,isErrorWorkingView:l}=o;if(!n)throw new Error("No view type provided for updating view settings");const g=t?.id,C=t?.working;try{s(u);const{settings:v,workingViewId:W}=k(),h=v??a;if(h===void 0&&!l){console.warn("updateViewSettings: no settings baseline available, aborting to prevent data loss.");return}const I={...h,...e},b=R.generateWorkingView(I),f=W??q?.id;f&&(b.id=f);const F=b.id,H=w({payload:f?{settings:I}:b,viewType:n,projectName:p},f);i(),(!C||t?.id!==f)&&(t&&c(!0),d(F)),await H,s(null),r.successMessage&&m.toast.success(r.successMessage)}catch(v){s(null),g&&d(g),t&&!C&&c(!1),console.error(v);const W=r.errorMessage||`Failed to update view settings: ${v}`;m.toast.error(W)}},L=()=>{const[e]=y.useCreateViewMutation(),[s]=y.useUpdateViewMutation(),u=N.useViewsContext(),r=x.useStore(),o=V.useCallback(async(i,a)=>{if(a){const n={};return["label","owner","settings"].forEach(t=>{i.payload[t]!==void 0&&(n[t]=i.payload[t])}),await s({viewType:i.viewType,projectName:i.projectName,viewId:a,payload:n}).unwrap()}else return await e(i).unwrap()},[e,s]),w=V.useCallback(()=>{const{viewType:i,projectName:a,selectedView:n,workingView:p}=u;if(!i)return{};const t=r.getState(),d=y.viewsQueries.endpoints.getWorkingView.select({viewType:i,projectName:a})(t),c=d?.data?.id||p?.id,l=y.viewsQueries.endpoints.getDefaultView.select({viewType:i,projectName:a})(t),g=l?.data?.id||n?.id;return(!!c&&g===c||S)&&d?.data?.settings?{settings:d.data.settings,workingViewId:c}:l?.data?.settings?{settings:l.data.settings,workingViewId:c}:{workingViewId:c}},[r,u]);return{updateViewSettings:V.useCallback(async(...i)=>await j(...i,u,o,w,M),[u,o,w]),onCreateView:o,getLatestSettings:w,markCacheDirty:M}},T=(e,s)=>s.split(".").reduce((u,r)=>u?.[r],e),E=(e,s,u)=>{const[r,...o]=s.split(".");return r?{...e,[r]:o.length?E(e[r]||{},o.join("."),u):u}:e},A=(e,s)=>{const{viewSettings:u,isLoadingViews:r}=N.useViewsContext(),{updateViewSettings:o,getLatestSettings:w}=L(),[k,i]=V.useState(null),a=V.useRef(null),n=u,p=k!==null?k:T(n,e)??s,t=V.useCallback(q=>{a.current=q,i(q)},[]),d=V.useCallback(q=>{if(r||!n)return;const c=w().settings??n,l=a.current!==null?a.current:T(c,e)??s,g=typeof q=="function"?q(l):q;o(E(c,e,g),t,g,{})},[s,w,r,e,n,t,o]);return[p,d]};exports.updateViewSettings=j;exports.useViewUpdateHelper=L;exports.useViewsState=A;
2
2
  //# sourceMappingURL=viewUpdateHelper.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewUpdateHelper.cjs.js","sources":["../../../../../../src/containers/Views/utils/viewUpdateHelper.ts"],"sourcesContent":["/**\n * Shared helper for updating view settings with optimistic local state management.\n *\n * Sequential updateViewSettings calls in the same event tick MUST chain correctly:\n * the second call has to see the first call's changes. Closure-captured\n * `viewSettings` does not refresh between sync calls (no re-render yet), so we\n * read the latest settings from the RTK Query cache at call time instead.\n * RTK's updateView mutation performs an optimistic cache write in\n * `onQueryStarted`, so the cache is already up-to-date by the time the next\n * call reads it.\n */\n\nimport {\n EntityIdResponse,\n useCreateViewMutation,\n useUpdateViewMutation,\n viewsQueries,\n} from '@shared/api'\nimport { generateWorkingView } from './generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { SetStateAction, useCallback, useRef, useState } from 'react'\nimport { useStore } from 'react-redux'\nimport { useViewsContext, ViewsContextValue } from '../context/ViewsContext'\n\ninterface UpdateOptions {\n successMessage?: string\n errorMessage?: string\n}\n\n// Module-level flag shared across every useViewUpdateHelper instance. Set true\n// when a mutation has been dispatched in the current tick (RTK cache is now\n// optimistically fresh); reset on the next microtask. Must be module-level so\n// that two different hook instances (e.g. ProjectOverviewDataProvider +\n// ProjectOverviewContext) coordinate correctly when writes flow through one\n// and subsequent reads come from the other in the same event tick.\nlet cacheDirtyThisTick = false\nconst markCacheDirty = () => {\n if (cacheDirtyThisTick) return\n cacheDirtyThisTick = true\n queueMicrotask(() => {\n cacheDirtyThisTick = false\n })\n}\n\nexport type UpdateViewSettingsFn = (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions,\n) => Promise<void>\n\nexport interface LatestSettingsResult {\n settings?: any\n workingViewId?: string\n}\n\nexport const updateViewSettings = async (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions = {},\n viewContext: ViewsContextValue,\n onApplyViewChanges: (arg: any, viewId?: string) => Promise<EntityIdResponse | void>,\n // Reads latest effective settings from RTK Query cache at call time. Required to\n // prevent stale-closure races when two updates fire in the same tick.\n getLatest: () => LatestSettingsResult,\n // Invoked synchronously right after the mutation is dispatched. The caller\n // uses this to flip a \"cache is fresh this tick\" flag so subsequent sync\n // calls in the same tick read the just-updated cache instead of stale state.\n markCacheDirty: () => void,\n): Promise<void> => {\n const {\n viewSettings,\n viewType,\n projectName,\n selectedView,\n setSelectedView,\n workingView,\n onSettingsChanged,\n } = viewContext\n\n if (!viewType) throw new Error('No view type provided for updating view settings')\n\n const previousSelectedViewId = selectedView?.id\n const wasWorking = selectedView?.working\n\n try {\n // Immediately update local state for fast UI response\n localStateSetter(newLocalValue)\n\n // Read latest settings from RTK cache (includes prior same-tick optimistic writes).\n // Fallback to closure-captured value if cache has nothing (first render, etc.).\n const { settings: latestSettingsFromCache, workingViewId: latestWorkingViewIdFromCache } =\n getLatest()\n const latestSettings = latestSettingsFromCache ?? viewSettings\n\n // If we have no settings baseline at all (neither from cache nor from context),\n // abort to prevent writing a partial payload that would overwrite saved settings.\n // This is a defence-in-depth guard; in normal flow isLoadingViews prevents callers\n // from triggering updates before data is available.\n if (latestSettings === undefined) {\n console.warn(\n 'updateViewSettings: no settings baseline available, aborting to prevent data loss.',\n )\n return\n }\n\n // Create settings with updates\n const newSettings = { ...latestSettings, ...updatedSettings }\n\n // always update the working view no matter what\n const newWorkingView = generateWorkingView(newSettings)\n\n // Ensure the payload uses the consistent ID if we already have a working view\n const viewId = latestWorkingViewIdFromCache ?? workingView?.id\n if (viewId) {\n newWorkingView.id = viewId\n }\n const newWorkingViewId = newWorkingView.id\n\n // Make API call in background\n // only include the fields that are updating (just settings)\n const payload = viewId ? { settings: newSettings } : newWorkingView\n\n const promise = onApplyViewChanges(\n {\n payload,\n viewType: viewType,\n projectName: projectName,\n },\n viewId,\n )\n\n // Mutation dispatch above ran onQueryStarted synchronously → RTK cache now\n // reflects `newSettings`. Signal this so any subsequent sync call in the\n // same tick reads the fresh cache instead of the stale closure baseline.\n markCacheDirty()\n\n // if not already on the working view: set that the settings have been changed to show the little blue save button and switch to the working view\n // Note: selectedView?.id is always a real UUID from the server, never the WORKING_VIEW_ID sentinel.\n if (!wasWorking || selectedView?.id !== viewId) {\n if (selectedView) {\n onSettingsChanged(true)\n }\n setSelectedView(newWorkingViewId as string)\n }\n\n await promise\n\n // Clear local state after successful API call - the server data will take over\n localStateSetter(null)\n\n if (options.successMessage) {\n toast.success(options.successMessage)\n }\n } catch (error) {\n // Revert local state on error\n localStateSetter(null)\n\n if (previousSelectedViewId) {\n setSelectedView(previousSelectedViewId)\n }\n\n if (selectedView && !wasWorking) {\n onSettingsChanged(false)\n }\n\n console.error(error)\n const errorMsg = options.errorMessage || `Failed to update view settings: ${error}`\n toast.error(errorMsg)\n }\n}\n\nexport const useViewUpdateHelper = () => {\n const [createView] = useCreateViewMutation()\n const [updateView] = useUpdateViewMutation()\n\n const viewContext = useViewsContext()\n const store = useStore()\n\n const onApplyViewChanges = useCallback(\n async (arg: any, viewId?: string) => {\n if (viewId) {\n // Filter the payload to only include valid patch fields\n // and ideally only include fields that are actually being updated.\n // Expecting the caller to provide only the fields they want to update in the payload.\n const patchPayload: any = {}\n const patchFields = ['label', 'owner', 'settings']\n patchFields.forEach((key) => {\n if (arg.payload[key] !== undefined) {\n patchPayload[key] = arg.payload[key]\n }\n })\n\n return await updateView({\n viewType: arg.viewType,\n projectName: arg.projectName,\n viewId,\n payload: patchPayload,\n }).unwrap()\n } else {\n return await createView(arg).unwrap()\n }\n },\n [createView, updateView],\n )\n\n // Returns cached settings when a same-tick prior write has refreshed the\n // cache. Otherwise returns undefined and the caller falls back to the\n // closure-captured viewSettings (correct baseline for the first write in a\n // tick, including the named-view → working-view fork).\n const getLatest = useCallback((): LatestSettingsResult => {\n const { viewType, projectName, selectedView, workingView } = viewContext\n if (!viewType) return {}\n\n const state = store.getState() as any\n\n // 1. Get the working view from the store — most authoritative after optimistic writes.\n const workingViewEntry = viewsQueries.endpoints.getWorkingView.select({\n viewType,\n projectName,\n })(state)\n const storeWorkingViewId = workingViewEntry?.data?.id\n // Prefer the store's working view ID over the potentially stale context closure value.\n const resolvedWorkingViewId = storeWorkingViewId || workingView?.id\n\n // 2. Determine the currently targeted view ID.\n // Use the store's getDefaultView cache (updated optimistically by setSelectedView) so that\n // an in-flight selection change is visible before React re-renders the context.\n const defaultViewEntry = viewsQueries.endpoints.getDefaultView.select({\n viewType,\n projectName,\n })(state)\n const targetViewId = defaultViewEntry?.data?.id || selectedView?.id\n\n // 3. Determine if the working view is active.\n // IMPORTANT: use !!resolvedWorkingViewId to avoid the undefined === undefined false-positive\n // that would occur on a new project before any working view exists.\n // Note: WORKING_VIEW_ID ('_working_') is a UI-only sentinel; it never appears in\n // server-side cache IDs, so there is no point checking for it here.\n const isWorkingViewActive =\n (!!resolvedWorkingViewId && targetViewId === resolvedWorkingViewId) || cacheDirtyThisTick\n\n // 4. If the working view is active, use its cache as the baseline to prevent stale merges.\n if (isWorkingViewActive && workingViewEntry?.data?.settings) {\n return {\n settings: workingViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n // 5. For named views: use the defaultView cache settings as the baseline.\n // This is populated by the initial useGetDefaultViewQuery fetch and is more reliable\n // than the getView endpoint cache (which is only fetched on-demand when editing).\n if (defaultViewEntry?.data?.settings) {\n return {\n settings: defaultViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n return { workingViewId: resolvedWorkingViewId }\n }, [store, viewContext])\n\n const updateViewSettingsHandler = useCallback<UpdateViewSettingsFn>(\n async (...args) =>\n await updateViewSettings(...args, viewContext, onApplyViewChanges, getLatest, markCacheDirty),\n [viewContext, onApplyViewChanges, getLatest],\n )\n\n return {\n updateViewSettings: updateViewSettingsHandler,\n onCreateView: onApplyViewChanges,\n getLatestSettings: getLatest,\n markCacheDirty,\n }\n}\n\ntype SettingsObject = Record<string, any>\n\nexport type PathKeys<T> = T extends SettingsObject\n ? {\n [K in keyof T & string]: NonNullable<T[K]> extends readonly any[]\n ? K\n : NonNullable<T[K]> extends SettingsObject\n ? K | `${K}.${PathKeys<NonNullable<T[K]>>}`\n : K\n }[keyof T & string]\n : never\n\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathValue<NonNullable<T[K]>, Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never\n\nconst getNestedValue = <T extends SettingsObject, P extends PathKeys<T>>(\n settings: T | undefined,\n path: P,\n): PathValue<T, P> | undefined => {\n return path.split('.').reduce<any>((value, key) => value?.[key], settings)\n}\n\nconst setNestedValue = <T extends SettingsObject>(settings: T, path: string, value: any): T => {\n const [key, ...rest] = path.split('.')\n\n if (!key) return settings\n\n return {\n ...settings,\n [key]: rest.length\n ? setNestedValue((settings[key] as SettingsObject) || {}, rest.join('.'), value)\n : value,\n }\n}\n\nexport const useViewsState = <\n Settings extends SettingsObject = SettingsObject,\n P extends PathKeys<Settings> = PathKeys<Settings>,\n>(\n path: P,\n defaultValue?: PathValue<Settings, P>,\n): [\n PathValue<Settings, P> | undefined,\n (value: SetStateAction<PathValue<Settings, P>>) => void,\n] => {\n const { viewSettings, isLoadingViews } = useViewsContext()\n const { updateViewSettings, getLatestSettings } = useViewUpdateHelper()\n const [localValue, setLocalValueState] = useState<PathValue<Settings, P> | null>(null)\n const localValueRef = useRef<PathValue<Settings, P> | null>(null)\n\n const settings = viewSettings as Settings | undefined\n const value = localValue !== null ? localValue : getNestedValue(settings, path) ?? defaultValue\n\n const setLocalValue = useCallback((newValue: PathValue<Settings, P> | null) => {\n localValueRef.current = newValue\n setLocalValueState(newValue)\n }, [])\n\n const setValue = useCallback(\n (nextValue: SetStateAction<PathValue<Settings, P>>) => {\n if (isLoadingViews || !settings) return\n\n const latestSettings = (getLatestSettings().settings as Settings | undefined) ?? settings\n const currentValue =\n localValueRef.current !== null\n ? localValueRef.current\n : getNestedValue(latestSettings, path) ?? defaultValue\n const resolvedValue =\n typeof nextValue === 'function'\n ? (nextValue as (value: PathValue<Settings, P>) => PathValue<Settings, P>)(\n currentValue as PathValue<Settings, P>,\n )\n : nextValue\n\n void updateViewSettings(\n setNestedValue(latestSettings, path, resolvedValue),\n setLocalValue,\n resolvedValue,\n {},\n )\n },\n [\n defaultValue,\n getLatestSettings,\n isLoadingViews,\n path,\n settings,\n setLocalValue,\n updateViewSettings,\n ],\n )\n\n return [value, setValue]\n}\n"],"names":["cacheDirtyThisTick","markCacheDirty","updateViewSettings","updatedSettings","localStateSetter","newLocalValue","options","viewContext","onApplyViewChanges","getLatest","viewSettings","viewType","projectName","selectedView","setSelectedView","workingView","onSettingsChanged","previousSelectedViewId","wasWorking","latestSettingsFromCache","latestWorkingViewIdFromCache","latestSettings","newSettings","newWorkingView","generateWorkingView","viewId","newWorkingViewId","promise","toast","error","errorMsg","useViewUpdateHelper","createView","useCreateViewMutation","updateView","useUpdateViewMutation","useViewsContext","store","useStore","useCallback","arg","patchPayload","key","state","workingViewEntry","viewsQueries","resolvedWorkingViewId","defaultViewEntry","targetViewId","args","getNestedValue","settings","path","value","setNestedValue","rest","useViewsState","defaultValue","isLoadingViews","getLatestSettings","localValue","setLocalValueState","useState","localValueRef","useRef","setLocalValue","newValue","setValue","nextValue","currentValue","resolvedValue"],"mappings":"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"}
1
+ {"version":3,"file":"viewUpdateHelper.cjs.js","sources":["../../../../../../src/containers/Views/utils/viewUpdateHelper.ts"],"sourcesContent":["/**\n * Shared helper for updating view settings with optimistic local state management.\n *\n * Sequential updateViewSettings calls in the same event tick MUST chain correctly:\n * the second call has to see the first call's changes. Closure-captured\n * `viewSettings` does not refresh between sync calls (no re-render yet), so we\n * read the latest settings from the RTK Query cache at call time instead.\n * RTK's updateView mutation performs an optimistic cache write in\n * `onQueryStarted`, so the cache is already up-to-date by the time the next\n * call reads it.\n */\n\nimport {\n EntityIdResponse,\n useCreateViewMutation,\n useUpdateViewMutation,\n viewsQueries,\n} from '@shared/api'\nimport { generateWorkingView } from './generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { SetStateAction, useCallback, useRef, useState } from 'react'\nimport { useStore } from 'react-redux'\nimport { useViewsContext, ViewsContextValue } from '../context/ViewsContext'\n\ninterface UpdateOptions {\n successMessage?: string\n errorMessage?: string\n}\n\n// Module-level flag shared across every useViewUpdateHelper instance. Set true\n// when a mutation has been dispatched in the current tick (RTK cache is now\n// optimistically fresh); reset on the next microtask. Must be module-level so\n// that two different hook instances (e.g. ProjectOverviewDataProvider +\n// ProjectOverviewContext) coordinate correctly when writes flow through one\n// and subsequent reads come from the other in the same event tick.\nlet cacheDirtyThisTick = false\nconst markCacheDirty = () => {\n if (cacheDirtyThisTick) return\n cacheDirtyThisTick = true\n queueMicrotask(() => {\n cacheDirtyThisTick = false\n })\n}\n\nexport type UpdateViewSettingsFn = (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions,\n) => Promise<void>\n\nexport interface LatestSettingsResult {\n settings?: any\n workingViewId?: string\n}\n\nexport const updateViewSettings = async (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions = {},\n viewContext: ViewsContextValue,\n onApplyViewChanges: (arg: any, viewId?: string) => Promise<EntityIdResponse | void>,\n // Reads latest effective settings from RTK Query cache at call time. Required to\n // prevent stale-closure races when two updates fire in the same tick.\n getLatest: () => LatestSettingsResult,\n // Invoked synchronously right after the mutation is dispatched. The caller\n // uses this to flip a \"cache is fresh this tick\" flag so subsequent sync\n // calls in the same tick read the just-updated cache instead of stale state.\n markCacheDirty: () => void,\n): Promise<void> => {\n const {\n viewSettings,\n viewType,\n projectName,\n selectedView,\n setSelectedView,\n workingView,\n onSettingsChanged,\n isErrorWorkingView,\n } = viewContext\n\n if (!viewType) throw new Error('No view type provided for updating view settings')\n\n const previousSelectedViewId = selectedView?.id\n const wasWorking = selectedView?.working\n\n try {\n // Immediately update local state for fast UI response\n localStateSetter(newLocalValue)\n\n // Read latest settings from RTK cache (includes prior same-tick optimistic writes).\n // Fallback to closure-captured value if cache has nothing (first render, etc.).\n const { settings: latestSettingsFromCache, workingViewId: latestWorkingViewIdFromCache } =\n getLatest()\n const latestSettings = latestSettingsFromCache ?? viewSettings\n\n // If we have no settings baseline at all (neither from cache nor from context), AND there is no error\n // abort to prevent writing a partial payload that would overwrite saved settings.\n // This is a defence-in-depth guard; in normal flow isLoadingViews prevents callers\n // from triggering updates before data is available.\n if (latestSettings === undefined && !isErrorWorkingView) {\n console.warn(\n 'updateViewSettings: no settings baseline available, aborting to prevent data loss.',\n )\n return\n }\n\n // Create settings with updates\n const newSettings = { ...latestSettings, ...updatedSettings }\n\n // always update the working view no matter what\n const newWorkingView = generateWorkingView(newSettings)\n\n // Ensure the payload uses the consistent ID if we already have a working view\n const viewId = latestWorkingViewIdFromCache ?? workingView?.id\n if (viewId) {\n newWorkingView.id = viewId\n }\n const newWorkingViewId = newWorkingView.id\n\n // Make API call in background\n // only include the fields that are updating (just settings)\n const payload = viewId ? { settings: newSettings } : newWorkingView\n\n const promise = onApplyViewChanges(\n {\n payload,\n viewType: viewType,\n projectName: projectName,\n },\n viewId,\n )\n\n // Mutation dispatch above ran onQueryStarted synchronously → RTK cache now\n // reflects `newSettings`. Signal this so any subsequent sync call in the\n // same tick reads the fresh cache instead of the stale closure baseline.\n markCacheDirty()\n\n // if not already on the working view: set that the settings have been changed to show the little blue save button and switch to the working view\n // Note: selectedView?.id is always a real UUID from the server, never the WORKING_VIEW_ID sentinel.\n if (!wasWorking || selectedView?.id !== viewId) {\n if (selectedView) {\n onSettingsChanged(true)\n }\n setSelectedView(newWorkingViewId as string)\n }\n\n await promise\n\n // Clear local state after successful API call - the server data will take over\n localStateSetter(null)\n\n if (options.successMessage) {\n toast.success(options.successMessage)\n }\n } catch (error) {\n // Revert local state on error\n localStateSetter(null)\n\n if (previousSelectedViewId) {\n setSelectedView(previousSelectedViewId)\n }\n\n if (selectedView && !wasWorking) {\n onSettingsChanged(false)\n }\n\n console.error(error)\n const errorMsg = options.errorMessage || `Failed to update view settings: ${error}`\n toast.error(errorMsg)\n }\n}\n\nexport const useViewUpdateHelper = () => {\n const [createView] = useCreateViewMutation()\n const [updateView] = useUpdateViewMutation()\n\n const viewContext = useViewsContext()\n const store = useStore()\n\n const onApplyViewChanges = useCallback(\n async (arg: any, viewId?: string) => {\n if (viewId) {\n // Filter the payload to only include valid patch fields\n // and ideally only include fields that are actually being updated.\n // Expecting the caller to provide only the fields they want to update in the payload.\n const patchPayload: any = {}\n const patchFields = ['label', 'owner', 'settings']\n patchFields.forEach((key) => {\n if (arg.payload[key] !== undefined) {\n patchPayload[key] = arg.payload[key]\n }\n })\n\n return await updateView({\n viewType: arg.viewType,\n projectName: arg.projectName,\n viewId,\n payload: patchPayload,\n }).unwrap()\n } else {\n return await createView(arg).unwrap()\n }\n },\n [createView, updateView],\n )\n\n // Returns cached settings when a same-tick prior write has refreshed the\n // cache. Otherwise returns undefined and the caller falls back to the\n // closure-captured viewSettings (correct baseline for the first write in a\n // tick, including the named-view → working-view fork).\n const getLatest = useCallback((): LatestSettingsResult => {\n const { viewType, projectName, selectedView, workingView } = viewContext\n if (!viewType) return {}\n\n const state = store.getState() as any\n\n // 1. Get the working view from the store — most authoritative after optimistic writes.\n const workingViewEntry = viewsQueries.endpoints.getWorkingView.select({\n viewType,\n projectName,\n })(state)\n const storeWorkingViewId = workingViewEntry?.data?.id\n // Prefer the store's working view ID over the potentially stale context closure value.\n const resolvedWorkingViewId = storeWorkingViewId || workingView?.id\n\n // 2. Determine the currently targeted view ID.\n // Use the store's getDefaultView cache (updated optimistically by setSelectedView) so that\n // an in-flight selection change is visible before React re-renders the context.\n const defaultViewEntry = viewsQueries.endpoints.getDefaultView.select({\n viewType,\n projectName,\n })(state)\n const targetViewId = defaultViewEntry?.data?.id || selectedView?.id\n\n // 3. Determine if the working view is active.\n // IMPORTANT: use !!resolvedWorkingViewId to avoid the undefined === undefined false-positive\n // that would occur on a new project before any working view exists.\n // Note: WORKING_VIEW_ID ('_working_') is a UI-only sentinel; it never appears in\n // server-side cache IDs, so there is no point checking for it here.\n const isWorkingViewActive =\n (!!resolvedWorkingViewId && targetViewId === resolvedWorkingViewId) || cacheDirtyThisTick\n\n // 4. If the working view is active, use its cache as the baseline to prevent stale merges.\n if (isWorkingViewActive && workingViewEntry?.data?.settings) {\n return {\n settings: workingViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n // 5. For named views: use the defaultView cache settings as the baseline.\n // This is populated by the initial useGetDefaultViewQuery fetch and is more reliable\n // than the getView endpoint cache (which is only fetched on-demand when editing).\n if (defaultViewEntry?.data?.settings) {\n return {\n settings: defaultViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n return { workingViewId: resolvedWorkingViewId }\n }, [store, viewContext])\n\n const updateViewSettingsHandler = useCallback<UpdateViewSettingsFn>(\n async (...args) =>\n await updateViewSettings(...args, viewContext, onApplyViewChanges, getLatest, markCacheDirty),\n [viewContext, onApplyViewChanges, getLatest],\n )\n\n return {\n updateViewSettings: updateViewSettingsHandler,\n onCreateView: onApplyViewChanges,\n getLatestSettings: getLatest,\n markCacheDirty,\n }\n}\n\ntype SettingsObject = Record<string, any>\n\nexport type PathKeys<T> = T extends SettingsObject\n ? {\n [K in keyof T & string]: NonNullable<T[K]> extends readonly any[]\n ? K\n : NonNullable<T[K]> extends SettingsObject\n ? K | `${K}.${PathKeys<NonNullable<T[K]>>}`\n : K\n }[keyof T & string]\n : never\n\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathValue<NonNullable<T[K]>, Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never\n\nconst getNestedValue = <T extends SettingsObject, P extends PathKeys<T>>(\n settings: T | undefined,\n path: P,\n): PathValue<T, P> | undefined => {\n return path.split('.').reduce<any>((value, key) => value?.[key], settings)\n}\n\nconst setNestedValue = <T extends SettingsObject>(settings: T, path: string, value: any): T => {\n const [key, ...rest] = path.split('.')\n\n if (!key) return settings\n\n return {\n ...settings,\n [key]: rest.length\n ? setNestedValue((settings[key] as SettingsObject) || {}, rest.join('.'), value)\n : value,\n }\n}\n\nexport const useViewsState = <\n Settings extends SettingsObject = SettingsObject,\n P extends PathKeys<Settings> = PathKeys<Settings>,\n>(\n path: P,\n defaultValue?: PathValue<Settings, P>,\n): [\n PathValue<Settings, P> | undefined,\n (value: SetStateAction<PathValue<Settings, P>>) => void,\n] => {\n const { viewSettings, isLoadingViews } = useViewsContext()\n const { updateViewSettings, getLatestSettings } = useViewUpdateHelper()\n const [localValue, setLocalValueState] = useState<PathValue<Settings, P> | null>(null)\n const localValueRef = useRef<PathValue<Settings, P> | null>(null)\n\n const settings = viewSettings as Settings | undefined\n const value = localValue !== null ? localValue : getNestedValue(settings, path) ?? defaultValue\n\n const setLocalValue = useCallback((newValue: PathValue<Settings, P> | null) => {\n localValueRef.current = newValue\n setLocalValueState(newValue)\n }, [])\n\n const setValue = useCallback(\n (nextValue: SetStateAction<PathValue<Settings, P>>) => {\n if (isLoadingViews || !settings) return\n\n const latestSettings = (getLatestSettings().settings as Settings | undefined) ?? settings\n const currentValue =\n localValueRef.current !== null\n ? localValueRef.current\n : getNestedValue(latestSettings, path) ?? defaultValue\n const resolvedValue =\n typeof nextValue === 'function'\n ? (nextValue as (value: PathValue<Settings, P>) => PathValue<Settings, P>)(\n currentValue as PathValue<Settings, P>,\n )\n : nextValue\n\n void updateViewSettings(\n setNestedValue(latestSettings, path, resolvedValue),\n setLocalValue,\n resolvedValue,\n {},\n )\n },\n [\n defaultValue,\n getLatestSettings,\n isLoadingViews,\n path,\n settings,\n setLocalValue,\n updateViewSettings,\n ],\n )\n\n return [value, setValue]\n}\n"],"names":["cacheDirtyThisTick","markCacheDirty","updateViewSettings","updatedSettings","localStateSetter","newLocalValue","options","viewContext","onApplyViewChanges","getLatest","viewSettings","viewType","projectName","selectedView","setSelectedView","workingView","onSettingsChanged","isErrorWorkingView","previousSelectedViewId","wasWorking","latestSettingsFromCache","latestWorkingViewIdFromCache","latestSettings","newSettings","newWorkingView","generateWorkingView","viewId","newWorkingViewId","promise","toast","error","errorMsg","useViewUpdateHelper","createView","useCreateViewMutation","updateView","useUpdateViewMutation","useViewsContext","store","useStore","useCallback","arg","patchPayload","key","state","workingViewEntry","viewsQueries","resolvedWorkingViewId","defaultViewEntry","targetViewId","args","getNestedValue","settings","path","value","setNestedValue","rest","useViewsState","defaultValue","isLoadingViews","getLatestSettings","localValue","setLocalValueState","useState","localValueRef","useRef","setLocalValue","newValue","setValue","nextValue","currentValue","resolvedValue"],"mappings":"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"}