@sales-planner/react 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -132,6 +132,70 @@ function ImportSuppliers() {
132
132
  | `useComputedViews(ctx, options?)` | query | List materialized views |
133
133
  | `useRefreshAllViews(ctx, options?)` | mutation | Refresh all views (auto-invalidates `skuMetrics`) |
134
134
 
135
+ ### Admin hooks
136
+
137
+ #### Tenants
138
+
139
+ | Hook | Kind | Description |
140
+ | --- | --- | --- |
141
+ | `useTenants(query?)` | query | Paginated list (filterable by `owner_id`) |
142
+ | `useTenantById(id)` | query | Single tenant |
143
+ | `useCreateTenant()` | mutation | Create tenant (SysAdmin) |
144
+ | `useCreateTenantWithShopAndUser()` | mutation | Create tenant + shop + user + API key (SysAdmin) |
145
+ | `useUpdateTenant()` | mutation | Update tenant (`{ id, data }`) |
146
+ | `useDeleteTenant()` | mutation | Delete tenant (SysAdmin) |
147
+
148
+ #### Users
149
+
150
+ | Hook | Kind | Description |
151
+ | --- | --- | --- |
152
+ | `useUsers(query?)` | query | Paginated list (filterable by `tenantId`) |
153
+ | `useUserById(id)` | query | Single user |
154
+ | `useCreateUser()` | mutation | Create user |
155
+ | `useDeleteUser()` | mutation | Delete user |
156
+
157
+ #### Shops
158
+
159
+ | Hook | Kind | Description |
160
+ | --- | --- | --- |
161
+ | `useShops(query?)` | query | Paginated list (filterable by `tenantId`) |
162
+ | `useShopById(id)` | query | Single shop |
163
+ | `useCreateShop()` | mutation | Create shop |
164
+ | `useUpdateShop()` | mutation | Update shop (`{ id, data }`) |
165
+
166
+ #### Roles (predefined, read-only)
167
+
168
+ | Hook | Kind | Description |
169
+ | --- | --- | --- |
170
+ | `useRoles(query?)` | query | Paginated list |
171
+ | `useRoleById(id)` | query | Single role |
172
+
173
+ #### User Roles
174
+
175
+ | Hook | Kind | Description |
176
+ | --- | --- | --- |
177
+ | `useUserRoles(query?)` | query | Paginated list (filterable by `userId`, `roleId`, `tenantId`) |
178
+ | `useUserRoleById(id)` | query | Single user-role assignment |
179
+ | `useCreateUserRole()` | mutation | Assign role to user |
180
+ | `useDeleteUserRole()` | mutation | Remove role from user |
181
+
182
+ #### User Shops
183
+
184
+ | Hook | Kind | Description |
185
+ | --- | --- | --- |
186
+ | `useUserShops(query?)` | query | List (filterable by `userId`, `shopId`, `tenantId`) |
187
+ | `useUserShopById(id)` | query | Single user-shop assignment |
188
+ | `useCreateUserShop()` | mutation | Assign user to shop |
189
+ | `useDeleteUserShop()` | mutation | Remove user from shop |
190
+
191
+ #### API Keys
192
+
193
+ | Hook | Kind | Description |
194
+ | --- | --- | --- |
195
+ | `useApiKeys(query?)` | query | Paginated list (filterable by `user_id`) |
196
+ | `useCreateApiKey()` | mutation | Create API key |
197
+ | `useRevokeApiKey()` | mutation | Revoke (delete) API key |
198
+
135
199
  ### Utilities
136
200
 
137
201
  | Export | Description |
@@ -162,7 +226,21 @@ Available keys:
162
226
  | --- | --- | --- |
163
227
  | `queryKeys.me()` | — | Current user |
164
228
  | `queryKeys.metadata()` | — | Entity metadata |
165
- | `queryKeys.entity(name, ctx)` | entity name, shop context | Root key for an entity |
229
+ | `queryKeys.tenants(query?)` | pagination + owner_id | Tenants list |
230
+ | `queryKeys.tenantDetail(id)` | id | Single tenant |
231
+ | `queryKeys.users(query?)` | pagination + tenantId | Users list |
232
+ | `queryKeys.userDetail(id)` | id | Single user |
233
+ | `queryKeys.shops(query?)` | pagination + tenantId | Shops list |
234
+ | `queryKeys.shopDetail(id)` | id | Single shop |
235
+ | `queryKeys.roles(query?)` | pagination | Roles list |
236
+ | `queryKeys.roleDetail(id)` | id | Single role |
237
+ | `queryKeys.userRoles(query?)` | userId, roleId, tenantId | User-role assignments |
238
+ | `queryKeys.userRoleDetail(id)` | id | Single user-role |
239
+ | `queryKeys.userShops(query?)` | userId, shopId, tenantId | User-shop assignments |
240
+ | `queryKeys.userShopDetail(id)` | id | Single user-shop |
241
+ | `queryKeys.apiKeys(query?)` | pagination + user_id | API keys list |
242
+ | `queryKeys.apiKeyDetail(id)` | id | Single API key |
243
+ | `queryKeys.entity(name, ctx)` | entity name, shop context | Root key for a data entity |
166
244
  | `queryKeys.entityList(name, ctx, query?)` | entity, ctx, pagination | Paginated list |
167
245
  | `queryKeys.entityDetail(name, ctx, id)` | entity, ctx, id | Single entity |
168
246
  | `queryKeys.entityByCode(name, ctx, code)` | entity, ctx, code | Code lookup |
@@ -177,3 +255,12 @@ Available keys:
177
255
  ## Cache Invalidation
178
256
 
179
257
  All mutations automatically invalidate their related query caches. `useRefreshAllViews` additionally invalidates `skuMetrics`.
258
+
259
+ ## Related Packages
260
+
261
+ - `@sales-planner/shared` — TypeScript types
262
+ - `@sales-planner/http-client` — HTTP client (included as dependency)
263
+
264
+ ## License
265
+
266
+ MIT
@@ -0,0 +1,57 @@
1
+ import type { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
2
+ import type { Tenant, CreateTenantRequest, UpdateTenantRequest, CreateTenantWithShopRequest, TenantWithShopAndApiKey, PaginatedResponse, PaginationQuery, User, CreateUserRequest, Shop, CreateShopRequest, UpdateShopRequest, Role, UserRoleResponse, CreateUserRoleRequest, GetUserRolesQuery, UserShop, CreateUserShopRequest, GetUserShopsQuery, ApiKey, CreateApiKeyRequest } from '@sales-planner/shared';
3
+ interface GetTenantsQuery extends PaginationQuery {
4
+ owner_id?: number;
5
+ }
6
+ export declare function useTenants(query?: GetTenantsQuery, options?: Omit<UseQueryOptions<PaginatedResponse<Tenant>>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedResponse<Tenant>, Error>;
7
+ export declare function useTenantById(id: number, options?: Omit<UseQueryOptions<Tenant>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<Tenant, Error>;
8
+ export declare function useCreateTenant(options?: Omit<UseMutationOptions<Tenant, Error, CreateTenantRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<Tenant, Error, CreateTenantRequest, unknown>;
9
+ export declare function useCreateTenantWithShopAndUser(options?: Omit<UseMutationOptions<TenantWithShopAndApiKey, Error, CreateTenantWithShopRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<TenantWithShopAndApiKey, Error, import("@sales-planner/shared").CreateTenantWithShopDto, unknown>;
10
+ export declare function useUpdateTenant(options?: Omit<UseMutationOptions<Tenant, Error, {
11
+ id: number;
12
+ data: UpdateTenantRequest;
13
+ }>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<Tenant, Error, {
14
+ id: number;
15
+ data: UpdateTenantRequest;
16
+ }, unknown>;
17
+ export declare function useDeleteTenant(options?: Omit<UseMutationOptions<void, Error, number>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<void, Error, number, unknown>;
18
+ interface GetUsersQuery extends PaginationQuery {
19
+ tenantId?: number;
20
+ }
21
+ export declare function useUsers(query?: GetUsersQuery, options?: Omit<UseQueryOptions<PaginatedResponse<User>>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedResponse<User>, Error>;
22
+ export declare function useUserById(id: number, options?: Omit<UseQueryOptions<User>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<User, Error>;
23
+ export declare function useCreateUser(options?: Omit<UseMutationOptions<User, Error, CreateUserRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<User, Error, import("@sales-planner/shared").CreateUserDto, unknown>;
24
+ export declare function useDeleteUser(options?: Omit<UseMutationOptions<void, Error, number>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<void, Error, number, unknown>;
25
+ interface GetShopsQuery extends PaginationQuery {
26
+ tenantId?: number;
27
+ }
28
+ export declare function useShops(query?: GetShopsQuery, options?: Omit<UseQueryOptions<PaginatedResponse<Shop>>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedResponse<Shop>, Error>;
29
+ export declare function useShopById(id: number, options?: Omit<UseQueryOptions<Shop>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<Shop, Error>;
30
+ export declare function useCreateShop(options?: Omit<UseMutationOptions<Shop, Error, CreateShopRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<Shop, Error, import("@sales-planner/shared").CreateShopDto, unknown>;
31
+ export declare function useUpdateShop(options?: Omit<UseMutationOptions<Shop, Error, {
32
+ id: number;
33
+ data: UpdateShopRequest;
34
+ }>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<Shop, Error, {
35
+ id: number;
36
+ data: UpdateShopRequest;
37
+ }, unknown>;
38
+ export declare function useRoles(query?: PaginationQuery, options?: Omit<UseQueryOptions<PaginatedResponse<Role>>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedResponse<Role>, Error>;
39
+ export declare function useRoleById(id: number, options?: Omit<UseQueryOptions<Role>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<Role, Error>;
40
+ interface GetUserRolesQueryWithPagination extends GetUserRolesQuery, PaginationQuery {
41
+ }
42
+ export declare function useUserRoles(query?: GetUserRolesQueryWithPagination, options?: Omit<UseQueryOptions<PaginatedResponse<UserRoleResponse>>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedResponse<UserRoleResponse>, Error>;
43
+ export declare function useUserRoleById(id: number, options?: Omit<UseQueryOptions<UserRoleResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<UserRoleResponse, Error>;
44
+ export declare function useCreateUserRole(options?: Omit<UseMutationOptions<UserRoleResponse, Error, CreateUserRoleRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<UserRoleResponse, Error, import("@sales-planner/shared").CreateUserRoleDto, unknown>;
45
+ export declare function useDeleteUserRole(options?: Omit<UseMutationOptions<void, Error, number>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<void, Error, number, unknown>;
46
+ export declare function useUserShops(query?: GetUserShopsQuery, options?: Omit<UseQueryOptions<UserShop[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<UserShop[], Error>;
47
+ export declare function useUserShopById(id: number, options?: Omit<UseQueryOptions<UserShop>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<UserShop, Error>;
48
+ export declare function useCreateUserShop(options?: Omit<UseMutationOptions<UserShop, Error, CreateUserShopRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<UserShop, Error, import("@sales-planner/shared").CreateUserShopDto, unknown>;
49
+ export declare function useDeleteUserShop(options?: Omit<UseMutationOptions<void, Error, number>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<void, Error, number, unknown>;
50
+ interface GetApiKeysQuery extends PaginationQuery {
51
+ user_id?: number;
52
+ }
53
+ export declare function useApiKeys(query?: GetApiKeysQuery, options?: Omit<UseQueryOptions<PaginatedResponse<ApiKey>>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedResponse<ApiKey>, Error>;
54
+ export declare function useCreateApiKey(options?: Omit<UseMutationOptions<ApiKey, Error, CreateApiKeyRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<ApiKey, Error, import("@sales-planner/shared").CreateApiKeyDto, unknown>;
55
+ export declare function useRevokeApiKey(options?: Omit<UseMutationOptions<void, Error, number>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<void, Error, number, unknown>;
56
+ export {};
57
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
package/dist/admin.js ADDED
@@ -0,0 +1,266 @@
1
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
2
+ import { useSalesPlannerClient } from './provider.js';
3
+ import { queryKeys } from './keys.js';
4
+ export function useTenants(query, options) {
5
+ const client = useSalesPlannerClient();
6
+ return useQuery({
7
+ queryKey: queryKeys.tenants(query),
8
+ queryFn: () => client.tenants.getAll(query),
9
+ ...options,
10
+ });
11
+ }
12
+ export function useTenantById(id, options) {
13
+ const client = useSalesPlannerClient();
14
+ return useQuery({
15
+ queryKey: queryKeys.tenantDetail(id),
16
+ queryFn: () => client.tenants.getById(id),
17
+ ...options,
18
+ });
19
+ }
20
+ export function useCreateTenant(options) {
21
+ const client = useSalesPlannerClient();
22
+ const qc = useQueryClient();
23
+ return useMutation({
24
+ mutationFn: (request) => client.tenants.create(request),
25
+ onSuccess: () => {
26
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'tenants'] });
27
+ },
28
+ ...options,
29
+ });
30
+ }
31
+ export function useCreateTenantWithShopAndUser(options) {
32
+ const client = useSalesPlannerClient();
33
+ const qc = useQueryClient();
34
+ return useMutation({
35
+ mutationFn: (request) => client.tenants.createWithShopAndUser(request),
36
+ onSuccess: () => {
37
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'tenants'] });
38
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'shops'] });
39
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'users'] });
40
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'api-keys'] });
41
+ },
42
+ ...options,
43
+ });
44
+ }
45
+ export function useUpdateTenant(options) {
46
+ const client = useSalesPlannerClient();
47
+ const qc = useQueryClient();
48
+ return useMutation({
49
+ mutationFn: ({ id, data }) => client.tenants.update(id, data),
50
+ onSuccess: () => {
51
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'tenants'] });
52
+ },
53
+ ...options,
54
+ });
55
+ }
56
+ export function useDeleteTenant(options) {
57
+ const client = useSalesPlannerClient();
58
+ const qc = useQueryClient();
59
+ return useMutation({
60
+ mutationFn: (id) => client.tenants.delete(id),
61
+ onSuccess: () => {
62
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'tenants'] });
63
+ },
64
+ ...options,
65
+ });
66
+ }
67
+ export function useUsers(query, options) {
68
+ const client = useSalesPlannerClient();
69
+ return useQuery({
70
+ queryKey: queryKeys.users(query),
71
+ queryFn: () => client.users.getAll(query),
72
+ ...options,
73
+ });
74
+ }
75
+ export function useUserById(id, options) {
76
+ const client = useSalesPlannerClient();
77
+ return useQuery({
78
+ queryKey: queryKeys.userDetail(id),
79
+ queryFn: () => client.users.getById(id),
80
+ ...options,
81
+ });
82
+ }
83
+ export function useCreateUser(options) {
84
+ const client = useSalesPlannerClient();
85
+ const qc = useQueryClient();
86
+ return useMutation({
87
+ mutationFn: (request) => client.users.create(request),
88
+ onSuccess: () => {
89
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'users'] });
90
+ },
91
+ ...options,
92
+ });
93
+ }
94
+ export function useDeleteUser(options) {
95
+ const client = useSalesPlannerClient();
96
+ const qc = useQueryClient();
97
+ return useMutation({
98
+ mutationFn: (id) => client.users.delete(id),
99
+ onSuccess: () => {
100
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'users'] });
101
+ },
102
+ ...options,
103
+ });
104
+ }
105
+ export function useShops(query, options) {
106
+ const client = useSalesPlannerClient();
107
+ return useQuery({
108
+ queryKey: queryKeys.shops(query),
109
+ queryFn: () => client.shops.getAll(query),
110
+ ...options,
111
+ });
112
+ }
113
+ export function useShopById(id, options) {
114
+ const client = useSalesPlannerClient();
115
+ return useQuery({
116
+ queryKey: queryKeys.shopDetail(id),
117
+ queryFn: () => client.shops.getById(id),
118
+ ...options,
119
+ });
120
+ }
121
+ export function useCreateShop(options) {
122
+ const client = useSalesPlannerClient();
123
+ const qc = useQueryClient();
124
+ return useMutation({
125
+ mutationFn: (request) => client.shops.create(request),
126
+ onSuccess: () => {
127
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'shops'] });
128
+ },
129
+ ...options,
130
+ });
131
+ }
132
+ export function useUpdateShop(options) {
133
+ const client = useSalesPlannerClient();
134
+ const qc = useQueryClient();
135
+ return useMutation({
136
+ mutationFn: ({ id, data }) => client.shops.update(id, data),
137
+ onSuccess: () => {
138
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'shops'] });
139
+ },
140
+ ...options,
141
+ });
142
+ }
143
+ // ── Roles ──
144
+ export function useRoles(query, options) {
145
+ const client = useSalesPlannerClient();
146
+ return useQuery({
147
+ queryKey: queryKeys.roles(query),
148
+ queryFn: () => client.roles.getAll(query),
149
+ ...options,
150
+ });
151
+ }
152
+ export function useRoleById(id, options) {
153
+ const client = useSalesPlannerClient();
154
+ return useQuery({
155
+ queryKey: queryKeys.roleDetail(id),
156
+ queryFn: () => client.roles.getById(id),
157
+ ...options,
158
+ });
159
+ }
160
+ export function useUserRoles(query, options) {
161
+ const client = useSalesPlannerClient();
162
+ return useQuery({
163
+ queryKey: queryKeys.userRoles(query),
164
+ queryFn: () => client.userRoles.getAll(query),
165
+ ...options,
166
+ });
167
+ }
168
+ export function useUserRoleById(id, options) {
169
+ const client = useSalesPlannerClient();
170
+ return useQuery({
171
+ queryKey: queryKeys.userRoleDetail(id),
172
+ queryFn: () => client.userRoles.getById(id),
173
+ ...options,
174
+ });
175
+ }
176
+ export function useCreateUserRole(options) {
177
+ const client = useSalesPlannerClient();
178
+ const qc = useQueryClient();
179
+ return useMutation({
180
+ mutationFn: (request) => client.userRoles.create(request),
181
+ onSuccess: () => {
182
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'user-roles'] });
183
+ },
184
+ ...options,
185
+ });
186
+ }
187
+ export function useDeleteUserRole(options) {
188
+ const client = useSalesPlannerClient();
189
+ const qc = useQueryClient();
190
+ return useMutation({
191
+ mutationFn: (id) => client.userRoles.delete(id),
192
+ onSuccess: () => {
193
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'user-roles'] });
194
+ },
195
+ ...options,
196
+ });
197
+ }
198
+ // ── User Shops ──
199
+ export function useUserShops(query, options) {
200
+ const client = useSalesPlannerClient();
201
+ return useQuery({
202
+ queryKey: queryKeys.userShops(query),
203
+ queryFn: () => client.userShops.getAll(query),
204
+ ...options,
205
+ });
206
+ }
207
+ export function useUserShopById(id, options) {
208
+ const client = useSalesPlannerClient();
209
+ return useQuery({
210
+ queryKey: queryKeys.userShopDetail(id),
211
+ queryFn: () => client.userShops.getById(id),
212
+ ...options,
213
+ });
214
+ }
215
+ export function useCreateUserShop(options) {
216
+ const client = useSalesPlannerClient();
217
+ const qc = useQueryClient();
218
+ return useMutation({
219
+ mutationFn: (request) => client.userShops.create(request),
220
+ onSuccess: () => {
221
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'user-shops'] });
222
+ },
223
+ ...options,
224
+ });
225
+ }
226
+ export function useDeleteUserShop(options) {
227
+ const client = useSalesPlannerClient();
228
+ const qc = useQueryClient();
229
+ return useMutation({
230
+ mutationFn: (id) => client.userShops.delete(id),
231
+ onSuccess: () => {
232
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'user-shops'] });
233
+ },
234
+ ...options,
235
+ });
236
+ }
237
+ export function useApiKeys(query, options) {
238
+ const client = useSalesPlannerClient();
239
+ return useQuery({
240
+ queryKey: queryKeys.apiKeys(query),
241
+ queryFn: () => client.apiKeys.getAll(query),
242
+ ...options,
243
+ });
244
+ }
245
+ export function useCreateApiKey(options) {
246
+ const client = useSalesPlannerClient();
247
+ const qc = useQueryClient();
248
+ return useMutation({
249
+ mutationFn: (request) => client.apiKeys.create(request),
250
+ onSuccess: () => {
251
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'api-keys'] });
252
+ },
253
+ ...options,
254
+ });
255
+ }
256
+ export function useRevokeApiKey(options) {
257
+ const client = useSalesPlannerClient();
258
+ const qc = useQueryClient();
259
+ return useMutation({
260
+ mutationFn: (id) => client.apiKeys.delete(id),
261
+ onSuccess: () => {
262
+ qc.invalidateQueries({ queryKey: ['sales-planner', 'api-keys'] });
263
+ },
264
+ ...options,
265
+ });
266
+ }
package/dist/index.d.ts CHANGED
@@ -19,4 +19,5 @@ export { skuCompetitorMappings } from './shop-scoped-entities.js';
19
19
  export { competitorProducts } from './shop-scoped-entities.js';
20
20
  export { competitorSales } from './shop-scoped-entities.js';
21
21
  export { useMe, useEntitiesMetadata, useSkuMetrics, useSkuMetricsById, useSkuMetricsByAbcClass, useSkuMetricsExportCsv, useComputedViews, useRefreshAllViews, } from './specialized.js';
22
+ export { useTenants, useTenantById, useCreateTenant, useCreateTenantWithShopAndUser, useUpdateTenant, useDeleteTenant, useUsers, useUserById, useCreateUser, useDeleteUser, useShops, useShopById, useCreateShop, useUpdateShop, useRoles, useRoleById, useUserRoles, useUserRoleById, useCreateUserRole, useDeleteUserRole, useUserShops, useUserShopById, useCreateUserShop, useDeleteUserShop, useApiKeys, useCreateApiKey, useRevokeApiKey, } from './admin.js';
22
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7E,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EACL,KAAK,EACL,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7E,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EACL,KAAK,EACL,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAEL,UAAU,EACV,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,eAAe,EACf,eAAe,EAEf,QAAQ,EACR,WAAW,EACX,aAAa,EACb,aAAa,EAEb,QAAQ,EACR,WAAW,EACX,aAAa,EACb,aAAa,EAEb,QAAQ,EACR,WAAW,EAEX,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EAEjB,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EAEjB,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -23,3 +23,19 @@ export { competitorProducts } from './shop-scoped-entities.js';
23
23
  export { competitorSales } from './shop-scoped-entities.js';
24
24
  // ── Specialized hooks ──
25
25
  export { useMe, useEntitiesMetadata, useSkuMetrics, useSkuMetricsById, useSkuMetricsByAbcClass, useSkuMetricsExportCsv, useComputedViews, useRefreshAllViews, } from './specialized.js';
26
+ // ── Admin hooks ──
27
+ export {
28
+ // Tenants
29
+ useTenants, useTenantById, useCreateTenant, useCreateTenantWithShopAndUser, useUpdateTenant, useDeleteTenant,
30
+ // Users
31
+ useUsers, useUserById, useCreateUser, useDeleteUser,
32
+ // Shops
33
+ useShops, useShopById, useCreateShop, useUpdateShop,
34
+ // Roles
35
+ useRoles, useRoleById,
36
+ // User Roles
37
+ useUserRoles, useUserRoleById, useCreateUserRole, useDeleteUserRole,
38
+ // User Shops
39
+ useUserShops, useUserShopById, useCreateUserShop, useDeleteUserShop,
40
+ // API Keys
41
+ useApiKeys, useCreateApiKey, useRevokeApiKey, } from './admin.js';
package/dist/keys.d.ts CHANGED
@@ -13,6 +13,20 @@ export declare function toShopContextParams(ctx: ShopContext): ShopContextParams
13
13
  export declare const queryKeys: {
14
14
  readonly me: () => readonly ["sales-planner", "me"];
15
15
  readonly metadata: () => readonly ["sales-planner", "metadata"];
16
+ readonly tenants: (query?: Record<string, unknown>) => readonly ["sales-planner", "tenants", Record<string, unknown>];
17
+ readonly tenantDetail: (id: number) => readonly ["sales-planner", "tenants", number];
18
+ readonly users: (query?: Record<string, unknown>) => readonly ["sales-planner", "users", Record<string, unknown>];
19
+ readonly userDetail: (id: number) => readonly ["sales-planner", "users", number];
20
+ readonly shops: (query?: Record<string, unknown>) => readonly ["sales-planner", "shops", Record<string, unknown>];
21
+ readonly shopDetail: (id: number) => readonly ["sales-planner", "shops", number];
22
+ readonly roles: (query?: Record<string, unknown>) => readonly ["sales-planner", "roles", Record<string, unknown>];
23
+ readonly roleDetail: (id: number) => readonly ["sales-planner", "roles", number];
24
+ readonly userRoles: (query?: Record<string, unknown>) => readonly ["sales-planner", "user-roles", Record<string, unknown>];
25
+ readonly userRoleDetail: (id: number) => readonly ["sales-planner", "user-roles", number];
26
+ readonly userShops: (query?: Record<string, unknown>) => readonly ["sales-planner", "user-shops", Record<string, unknown>];
27
+ readonly userShopDetail: (id: number) => readonly ["sales-planner", "user-shops", number];
28
+ readonly apiKeys: (query?: Record<string, unknown>) => readonly ["sales-planner", "api-keys", Record<string, unknown>];
29
+ readonly apiKeyDetail: (id: number) => readonly ["sales-planner", "api-keys", number];
16
30
  readonly entity: (entity: string, ctx: ShopContext) => readonly ["sales-planner", string, number, number];
17
31
  readonly entityList: (entity: string, ctx: ShopContext, query?: Record<string, unknown>) => readonly ["sales-planner", string, number, number, "list", Record<string, unknown>];
18
32
  readonly entityDetail: (entity: string, ctx: ShopContext, id: number) => readonly ["sales-planner", string, number, number, number];
@@ -1 +1 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,CAEvE;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;;;8BAIH,MAAM,OAAO,WAAW;kCAGpB,MAAM,OAAO,WAAW,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oCAGvD,MAAM,OAAO,WAAW,MAAM,MAAM;oCAGpC,MAAM,OAAO,WAAW,QAAQ,MAAM;oCAGtC,MAAM,OAAO,WAAW,UAAU,MAAM,GAAG,KAAK;qCAG/C,MAAM,UAAU,MAAM,GAAG,KAAK;+BAGpC,WAAW;mCAEP,WAAW,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qCAE1C,WAAW,MAAM,MAAM;kCAC1B,WAAW,YAAY,MAAM;6BAGlC,WAAW;CACnB,CAAC"}
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,CAEvE;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;;;+BAKF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gCACtB,MAAM;6BAET,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;8BACtB,MAAM;6BAEP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;8BACtB,MAAM;6BAEP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;8BACtB,MAAM;iCAEH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;kCAEtB,MAAM;iCAEP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;kCAEtB,MAAM;+BAET,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gCACtB,MAAM;8BAGR,MAAM,OAAO,WAAW;kCAGpB,MAAM,OAAO,WAAW,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oCAGvD,MAAM,OAAO,WAAW,MAAM,MAAM;oCAGpC,MAAM,OAAO,WAAW,QAAQ,MAAM;oCAGtC,MAAM,OAAO,WAAW,UAAU,MAAM,GAAG,KAAK;qCAG/C,MAAM,UAAU,MAAM,GAAG,KAAK;+BAGpC,WAAW;mCAEP,WAAW,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qCAE1C,WAAW,MAAM,MAAM;kCAC1B,WAAW,YAAY,MAAM;6BAGlC,WAAW;CACnB,CAAC"}
package/dist/keys.js CHANGED
@@ -7,6 +7,22 @@ export function toShopContextParams(ctx) {
7
7
  export const queryKeys = {
8
8
  me: () => ['sales-planner', 'me'],
9
9
  metadata: () => ['sales-planner', 'metadata'],
10
+ // ── Admin resources (no shop context) ──
11
+ tenants: (query) => ['sales-planner', 'tenants', query ?? {}],
12
+ tenantDetail: (id) => ['sales-planner', 'tenants', id],
13
+ users: (query) => ['sales-planner', 'users', query ?? {}],
14
+ userDetail: (id) => ['sales-planner', 'users', id],
15
+ shops: (query) => ['sales-planner', 'shops', query ?? {}],
16
+ shopDetail: (id) => ['sales-planner', 'shops', id],
17
+ roles: (query) => ['sales-planner', 'roles', query ?? {}],
18
+ roleDetail: (id) => ['sales-planner', 'roles', id],
19
+ userRoles: (query) => ['sales-planner', 'user-roles', query ?? {}],
20
+ userRoleDetail: (id) => ['sales-planner', 'user-roles', id],
21
+ userShops: (query) => ['sales-planner', 'user-shops', query ?? {}],
22
+ userShopDetail: (id) => ['sales-planner', 'user-shops', id],
23
+ apiKeys: (query) => ['sales-planner', 'api-keys', query ?? {}],
24
+ apiKeyDetail: (id) => ['sales-planner', 'api-keys', id],
25
+ // ── Data entities (shop-scoped) ──
10
26
  entity: (entity, ctx) => ['sales-planner', entity, ctx.shopId, ctx.tenantId],
11
27
  entityList: (entity, ctx, query) => [...queryKeys.entity(entity, ctx), 'list', query ?? {}],
12
28
  entityDetail: (entity, ctx, id) => [...queryKeys.entity(entity, ctx), id],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sales-planner/react",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "React hooks for Sales Planner API powered by TanStack Query",
5
5
  "author": "Damir Manapov",
6
6
  "license": "MIT",
@@ -25,8 +25,8 @@
25
25
  "README.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@sales-planner/http-client": "0.19.2",
29
- "@sales-planner/shared": "0.17.2"
28
+ "@sales-planner/http-client": "0.19.3",
29
+ "@sales-planner/shared": "0.17.3"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@tanstack/react-query": ">=5.0.0",