Skip to content

Commit 8427797

Browse files
committed
Fix admin forms
- Product and vendor service create pages weren't working right due to changes around categories (and some other stuff) - Vendor service create couldn't work right because the mobility adapter options were coming back on the entity, not as a meta endpoint. Add a meta endpoint instead. - Categories related list can use an admin link for the row id.
1 parent 2064fdd commit 8427797

File tree

12 files changed

+53
-28
lines changed

12 files changed

+53
-28
lines changed

adminapp/src/api.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ export default {
9696
get(`/adminapi/v1/meta/resource_access`, data, ...args),
9797
getStateMachine: ({ name, ...data }, ...args) =>
9898
get(`/adminapi/v1/meta/state_machines/${name}`, data, ...args),
99+
getVendorServiceMobilityAdapterOptions: (data, ...args) =>
100+
get(`/adminapi/v1/meta/vendor_service_mobility_adapter_options`, data, ...args),
99101

100102
getBankAccount: ({ id, ...data }, ...args) =>
101103
get(`/adminapi/v1/bank_accounts/${id}`, data, ...args),

adminapp/src/components/CategoriesRelatedList.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default function CategoriesRelatedList({ categories }) {
1010
headers={["Id", "Name", "Slug", "Parent"]}
1111
keyRowAttr="id"
1212
toCells={(row) => [
13-
row.id,
13+
<AdminLink model={row} />,
1414
row.name,
1515
row.slug,
1616
row.parent ? <AdminLink model={row.parent}>{row.parent.name}</AdminLink> : null,

adminapp/src/pages/ProductCreatePage.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default function ProductCreatePage() {
1212
name: formHelpers.initialTranslation,
1313
vendor: null,
1414
ordinal: 0,
15-
category: null,
15+
vendorServiceCategories: [],
1616
inventory: {
1717
maxQuantityPerMemberPerOrder: null,
1818
limitedQuantity: false,

adminapp/src/pages/ProductDetailPage.jsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ export default function ProductDetailPage() {
2929
label: "Vendor",
3030
value: <AdminLink model={model.vendor}>{model.vendor.name}</AdminLink>,
3131
},
32-
{
33-
label: "Category",
34-
value: model.vendorServiceCategories[0]?.name,
35-
},
3632
{
3733
label: "Max Per Member/Offering",
3834
value: model.inventory.maxQuantityPerMemberPerOffering,

adminapp/src/pages/VendorServiceCreatePage.jsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import api from "../api";
22
import ResourceCreate from "../components/ResourceCreate";
3+
import { dayjs } from "../modules/dayConfig";
34
import VendorServiceForm from "./VendorServiceForm.jsx";
45
import React from "react";
56

@@ -8,6 +9,10 @@ export default function VendorServiceCreatePage() {
89
internalName: "",
910
externalName: "",
1011
vendor: { name: "" },
12+
categories: [],
13+
mobilityAdapterSetting: "no_adapter",
14+
periodBegin: dayjs().format(),
15+
periodEnd: dayjs().add(1, "day").format(),
1116
};
1217
return (
1318
<ResourceCreate

adminapp/src/pages/VendorServiceDetailPage.jsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import api from "../api";
22
import AdminLink from "../components/AdminLink";
33
import AuditActivityList from "../components/AuditActivityList";
4+
import CategoriesRelatedList from "../components/CategoriesRelatedList";
45
import RelatedList from "../components/RelatedList";
56
import ResourceDetail from "../components/ResourceDetail";
67
import detailPageImageProperties from "../components/detailPageImageProperties";
@@ -46,13 +47,7 @@ export default function VendorServiceDetailPage() {
4647
</AdminLink>,
4748
]}
4849
/>,
49-
<RelatedList
50-
title="Categories"
51-
rows={model.categories}
52-
headers={["Id", "Name", "Slug"]}
53-
keyRowAttr="id"
54-
toCells={(row) => [row.id, row.name, row.slug]}
55-
/>,
50+
<CategoriesRelatedList categories={model.categories} />,
5651
<AuditActivityList activities={model.auditActivities} />,
5752
]}
5853
</ResourceDetail>

adminapp/src/pages/VendorServiceForm.jsx

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import ImageFileInput from "../components/ImageFileInput";
55
import ResponsiveStack from "../components/ResponsiveStack";
66
import SafeDateTimePicker from "../components/SafeDateTimePicker";
77
import VendorServiceCategoryMultiSelect from "../components/VendorServiceCategoryMultiSelect";
8+
import { useGlobalApiState } from "../hooks/globalApiState";
89
import { formatOrNull } from "../modules/dayConfig";
910
import RemoveIcon from "@mui/icons-material/Remove";
1011
import {
@@ -91,29 +92,22 @@ export default function VendorServiceForm({
9192
/>
9293
</ResponsiveStack>
9394
<VendorServiceCategoryMultiSelect
94-
{...register("category")}
95+
{...register("categories")}
9596
label="Categories"
9697
helperText="What ledger funds can be used to pay for this service?"
9798
value={resource.categories}
9899
style={{ flex: 1 }}
99100
onChange={(_, c) => setField("categories", c)}
100-
required
101101
/>
102102
<FormControl>
103103
<InputLabel>Mobility Adapter</InputLabel>
104-
<Select
104+
<MobilityAdapterSelect
105105
{...register("mobilityAdapterSetting")}
106106
label="Mobility Adapter Key"
107107
name="mobilityAdapterSetting"
108108
value={resource.mobilityAdapterSetting}
109109
onChange={setFieldFromInput}
110-
>
111-
{resource.mobilityAdapterSettingOptions.map(({ name, value }) => (
112-
<MenuItem key={value} value={value}>
113-
{name}
114-
</MenuItem>
115-
))}
116-
</Select>
110+
/>
117111
<FormHelperText>
118112
How this service maps to backend functionality. Generally a programmer will
119113
set this.
@@ -141,3 +135,20 @@ export default function VendorServiceForm({
141135
</FormLayout>
142136
);
143137
}
138+
139+
function MobilityAdapterSelect({ ...rest }) {
140+
const data = useGlobalApiState(
141+
(data, ...args) => api.getVendorServiceMobilityAdapterOptions({ ...data }, ...args),
142+
{ items: [] }
143+
);
144+
145+
return (
146+
<Select {...rest}>
147+
{data.items.map(({ name, value }) => (
148+
<MenuItem key={value} value={value}>
149+
{name}
150+
</MenuItem>
151+
))}
152+
</Select>
153+
);
154+
}

lib/suma/admin_api/meta.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ class Suma::AdminAPI::Meta < Suma::AdminAPI::V1
6262
end
6363
end
6464
end
65+
66+
get :vendor_service_mobility_adapter_options do
67+
use_http_expires_caching 48.hours
68+
check_admin_role_access!(:read, :admin_access)
69+
present_collection Suma::Vendor::Service.mobility_adapter_setting_options
70+
end
6571
end
6672

6773
class CurrencyEntity < BaseEntity

lib/suma/admin_api/vendor_services.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ class DetailedVendorServiceEntity < VendorServiceEntity
2121

2222
expose :mobility_adapter_setting
2323
expose :mobility_adapter_setting_name
24-
expose :mobility_adapter_setting_options
2524
end
2625

2726
resource :vendor_services do
@@ -43,7 +42,7 @@ class DetailedVendorServiceEntity < VendorServiceEntity
4342
params do
4443
requires(:vendor, type: JSON) { use :model_with_id }
4544
requires :image, type: File
46-
requires(:image_caption, type: JSON) { use :translated_text, allow_blank: true }
45+
optional(:image_caption, type: JSON) { use :translated_text, allow_blank: true }
4746
requires :internal_name, type: String
4847
requires :external_name, type: String
4948
requires :period_begin, type: Time

lib/suma/vendor/service.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def usage_prohibited_reason(member, rate:, now:)
6767
return nil
6868
end
6969

70-
def mobility_adapter_setting_options
70+
def self.mobility_adapter_setting_options
7171
return [
7272
{name: "No Adapter/Non-Mobility", value: "no_adapter"},
7373
{name: "Deep Linking (suma sends receipts)", value: "deep_linking_suma_receipts"},
@@ -89,7 +89,7 @@ def mobility_adapter_setting
8989
end
9090

9191
def mobility_adapter_setting_name
92-
self.mobility_adapter_setting_options.find { |h| h[:value] == self.mobility_adapter_setting }.fetch(:name)
92+
self.class.mobility_adapter_setting_options.find { |h| h[:value] == self.mobility_adapter_setting }.fetch(:name)
9393
end
9494

9595
def mobility_adapter_setting=(value)

0 commit comments

Comments
 (0)