+ onClick={() => {
setExpandResponse((value) => ({
...value,
[instance.id]: !value[instance.id],
- }))
- }
+ }));
+ }}
>
CHES Response
@@ -59,9 +63,9 @@ export const NotificationCard: React.FC = ({ instance })
Subscribers
- {!instance.notification.subscribers.length && (
+ {instance.notification.subscribers.length === 0 && (
- {!instance.notification.subscribers.length && 'No Subscribers'}
+ {instance.notification.subscribers.length === 0 && 'No Subscribers'}
)}
{instance.notification.subscribers.map((subscriber) => {
diff --git a/app/editor/src/features/admin/notifications/dashboard/NotificationsDashboard.tsx b/app/editor/src/features/admin/notifications/dashboard/NotificationsDashboard.tsx
index 2206a2987f..964dae1c07 100644
--- a/app/editor/src/features/admin/notifications/dashboard/NotificationsDashboard.tsx
+++ b/app/editor/src/features/admin/notifications/dashboard/NotificationsDashboard.tsx
@@ -8,9 +8,9 @@ import {
ButtonVariant,
Checkbox,
IconButton,
- IDashboardFilter,
- INotificationInstanceModel,
- IOptionItem,
+ type IDashboardFilter,
+ type INotificationInstanceModel,
+ type IOptionItem,
Loader,
NotificationStatusName,
OptionItem,
@@ -140,12 +140,12 @@ export const NotificationsDashboard: React.FC = () => {
label="Show failed only"
className="failed-filter"
checked={filter.notificationStatus?.includes(NotificationStatusName.Failed)}
- onChange={(e) =>
+ onChange={(e) => {
setFilter((filter) => ({
...filter,
notificationStatus: e.target.checked ? [NotificationStatusName.Failed] : [],
- }))
- }
+ }));
+ }}
/>
@@ -153,11 +153,15 @@ export const NotificationsDashboard: React.FC = () => {
className="keyword-filter"
name="keyword"
value={search ?? ''}
- onChange={(e) => setSearch(e.target.value)}
+ onChange={(e) => {
+ setSearch(e.target.value);
+ }}
>
setFilter((filter) => ({ ...filter, page: 1, keyword: search }))}
+ onClick={(e) => {
+ setFilter((filter) => ({ ...filter, page: 1, keyword: search }));
+ }}
/>
@@ -184,7 +188,9 @@ export const NotificationsDashboard: React.FC = () => {
@@ -204,7 +210,9 @@ export const NotificationsDashboard: React.FC = () => {
diff --git a/app/editor/src/features/admin/notifications/dashboard/utils/getLastSent.ts b/app/editor/src/features/admin/notifications/dashboard/utils/getLastSent.ts
index db86b859d8..8b4e8e0fb1 100644
--- a/app/editor/src/features/admin/notifications/dashboard/utils/getLastSent.ts
+++ b/app/editor/src/features/admin/notifications/dashboard/utils/getLastSent.ts
@@ -1,4 +1,4 @@
-import { formatDashboardDate, INotificationInstanceModel } from 'tno-core';
+import { formatDashboardDate, type INotificationInstanceModel } from 'tno-core';
export const getLastSent = (instance: INotificationInstanceModel) => {
const sentOn = instance?.sentOn;
diff --git a/app/editor/src/features/admin/notifications/dashboard/utils/getNotificationOptions.ts b/app/editor/src/features/admin/notifications/dashboard/utils/getNotificationOptions.ts
index 713516367e..011814c08c 100644
--- a/app/editor/src/features/admin/notifications/dashboard/utils/getNotificationOptions.ts
+++ b/app/editor/src/features/admin/notifications/dashboard/utils/getNotificationOptions.ts
@@ -1,4 +1,4 @@
-import { getSortableOptions, INotificationModel } from 'tno-core';
+import { getSortableOptions, type INotificationModel } from 'tno-core';
export const getNotificationOptions = (templates: INotificationModel[], currentId: number) => {
return getSortableOptions(templates, currentId);
diff --git a/app/editor/src/features/admin/notifications/dashboard/utils/getStatus.ts b/app/editor/src/features/admin/notifications/dashboard/utils/getStatus.ts
index a7ce8c069d..3a012fffc9 100644
--- a/app/editor/src/features/admin/notifications/dashboard/utils/getStatus.ts
+++ b/app/editor/src/features/admin/notifications/dashboard/utils/getStatus.ts
@@ -6,7 +6,7 @@ import { NotificationStatusName } from 'tno-core';
* @returns A message that represents the status.
*/
export const getStatus = (status?: NotificationStatusName) => {
- if (!status) return 'Pending';
+ if (status == null) return 'Pending';
switch (status) {
case NotificationStatusName.Failed:
return 'Failed to Send';
diff --git a/app/editor/src/features/admin/notifications/utils/getNotificationTemplateOptions.ts b/app/editor/src/features/admin/notifications/utils/getNotificationTemplateOptions.ts
index 6fd120de9a..d789afe08c 100644
--- a/app/editor/src/features/admin/notifications/utils/getNotificationTemplateOptions.ts
+++ b/app/editor/src/features/admin/notifications/utils/getNotificationTemplateOptions.ts
@@ -1,4 +1,4 @@
-import { getSortableOptions, INotificationTemplateModel, OptionItem } from 'tno-core';
+import { getSortableOptions, type INotificationTemplateModel, OptionItem } from 'tno-core';
export const getNotificationTemplateOptions = (
templates: INotificationTemplateModel[],
diff --git a/app/editor/src/features/admin/products/ProductDetailsForm.tsx b/app/editor/src/features/admin/products/ProductDetailsForm.tsx
index 0401b4d455..f4d41b74cb 100644
--- a/app/editor/src/features/admin/products/ProductDetailsForm.tsx
+++ b/app/editor/src/features/admin/products/ProductDetailsForm.tsx
@@ -13,8 +13,8 @@ import {
FormikText,
FormikTextArea,
getEnumStringOptions,
- IOptionItem,
- IProductModel,
+ type IOptionItem,
+ type IProductModel,
OptionItem,
ProductTypeName,
Row,
@@ -83,7 +83,7 @@ export const ProductDetailsForm: React.FC = () => {
required
options={productTypeOptions}
value={productTypeOptions.find((o) => o.value === values.productType)}
- onChange={(e: any) => setFieldValue('productType', e.value)}
+ onChange={async (e: any) => await setFieldValue('productType', e.value)}
isClearable={false}
/>
= 1}>
@@ -124,9 +124,7 @@ export const ProductDetailsForm: React.FC = () => {
{
u.userId === row.userId))
+ if (values.subscribers.some((u) => u.userId === row.userId)) {
setFieldValue(
'subscribers',
values.subscribers.map((item) =>
item.userId === row.userId ? subscription : item,
),
);
- else setFieldValue('subscribers', [subscription, ...values.subscribers]);
+ } else setFieldValue('subscribers', [subscription, ...values.subscribers]);
}}
/>,
{
const { toggle, isShowing } = useModal();
const [Product, setProduct] = React.useState(
- (state as any)?.Product ?? { ...defaultProduct, ownerId: userInfo?.id },
+ state?.Product ?? { ...defaultProduct, ownerId: userInfo?.id },
);
const [active, setActive] = React.useState('Product');
@@ -76,7 +76,9 @@ const ProductForm: React.FC = () => {
iconType="back"
label="Back to Products"
className="back-button"
- onClick={() => navigate('/admin/products')}
+ onClick={() => {
+ navigate('/admin/products');
+ }}
/>
{
const [isReady, setIsReady] = React.useState(false);
React.useEffect(() => {
- if (!products.length && !isReady) {
+ if (products.length === 0 && !isReady) {
setIsReady(true);
findProducts({})
.then((data) => {
@@ -46,13 +46,15 @@ const ProductList: React.FC = () => {
navigate(`/admin/products/0`)}
+ label={'Add new product'}
+ onClick={() => {
+ navigate('/admin/products/0');
+ }}
/>
{
- if (filter && filter.keyword?.length) {
+ if (filter?.keyword?.length) {
const value = filter.keyword.toLocaleLowerCase();
setItems(
products.filter(
@@ -66,7 +68,7 @@ const ProductList: React.FC = () => {
}
}}
onSearch={(filter) => {
- if (filter && filter.keyword?.length) {
+ if (filter?.keyword?.length) {
const value = filter.keyword.toLocaleLowerCase();
setItems(
products.filter(
diff --git a/app/editor/src/features/admin/products/ProductNotificationSubscribersForm.tsx b/app/editor/src/features/admin/products/ProductNotificationSubscribersForm.tsx
index d173f790e8..cd34989884 100644
--- a/app/editor/src/features/admin/products/ProductNotificationSubscribersForm.tsx
+++ b/app/editor/src/features/admin/products/ProductNotificationSubscribersForm.tsx
@@ -3,9 +3,9 @@ import {
CellEllipsis,
Checkbox,
Grid,
- IProductModel,
- IUserFilter,
- IUserProductModel,
+ type IProductModel,
+ type IUserFilter,
+ type IUserProductModel,
ProductRequestStatusName,
SortDirection,
} from 'tno-core';
@@ -62,14 +62,14 @@ export const ProductNotificationSubscribersForm: React.FC<
isSubscribed: e.currentTarget.checked,
status: ProductRequestStatusName.NA,
};
- if (values.subscribers.some((u) => u.userId === row.userId))
+ if (values.subscribers.some((u) => u.userId === row.userId)) {
setFieldValue(
'subscribers',
values.subscribers.map((item) =>
item.userId === row.userId ? subscription : item,
),
);
- else setFieldValue('subscribers', [subscription, ...values.subscribers]);
+ } else setFieldValue('subscribers', [subscription, ...values.subscribers]);
}}
/>,
{row.username},
diff --git a/app/editor/src/features/admin/products/ProductReportSubscribersForm.tsx b/app/editor/src/features/admin/products/ProductReportSubscribersForm.tsx
index 78e99f3ce1..dab3ef5428 100644
--- a/app/editor/src/features/admin/products/ProductReportSubscribersForm.tsx
+++ b/app/editor/src/features/admin/products/ProductReportSubscribersForm.tsx
@@ -6,10 +6,10 @@ import {
FormikSelect,
getEnumStringOptions,
Grid,
- IProductModel,
- IUserFilter,
- IUserProductModel,
- OptionItem,
+ type IProductModel,
+ type IUserFilter,
+ type IUserProductModel,
+ type OptionItem,
ProductRequestStatusName,
ReportDistributionFormatName,
SortDirection,
@@ -75,14 +75,14 @@ export const ProductReportSubscribersForm: React.FC u.userId === row.userId))
+ if (values.subscribers.some((u) => u.userId === row.userId)) {
setFieldValue(
'subscribers',
values.subscribers.map((item) =>
item.userId === row.userId ? subscription : item,
),
);
- else setFieldValue('subscribers', [subscription, ...values.subscribers]);
+ } else setFieldValue('subscribers', [subscription, ...values.subscribers]);
}}
/>,
{
- setFieldValue(`subscribers.${index}`, {
+ onChange={async (approve) =>
+ await setFieldValue(`subscribers.${index}`, {
...user,
status: ProductRequestStatusName.NA,
isSubscribed: approve,
@@ -43,8 +43,8 @@ export const ProductSubRequests: React.FC = () => {
- setFieldValue(`subscribers.${index}`, {
+ onChange={async (approve) =>
+ await setFieldValue(`subscribers.${index}`, {
...user,
status: ProductRequestStatusName.NA,
isSubscribed: !approve,
diff --git a/app/editor/src/features/admin/products/ProductSubscribersForm.tsx b/app/editor/src/features/admin/products/ProductSubscribersForm.tsx
index fc8ce8580b..2f7ff0bab0 100644
--- a/app/editor/src/features/admin/products/ProductSubscribersForm.tsx
+++ b/app/editor/src/features/admin/products/ProductSubscribersForm.tsx
@@ -2,9 +2,9 @@ import { useFormikContext } from 'formik';
import React from 'react';
import { useUsers } from 'store/hooks/admin';
import {
- IProductModel,
- IUserFilter,
- IUserProductModel,
+ type IProductModel,
+ type IUserFilter,
+ type IUserProductModel,
ProductRequestStatusName,
ProductTypeName,
Show,
@@ -50,8 +50,8 @@ export const ProductSubscribersForm = () => {
// Merge users with subscribers to this product.
setSubscribers(
users.items.map((user) => {
- var subscription = values.subscribers.find((s) => s.userId === user.id);
- var userSubscription: IUserProductModel = {
+ const subscription = values.subscribers.find((s) => s.userId === user.id);
+ const userSubscription: IUserProductModel = {
username: user.username,
email: user.email,
preferredEmail: user.preferredEmail,
@@ -78,7 +78,9 @@ export const ProductSubscribersForm = () => {
setFilter({ ...filter, page: 1 })}
+ onSearch={async (filter: IUserFilter) => {
+ setFilter({ ...filter, page: 1 });
+ }}
/>
= ({ user, onChang
options={[
{
label: 'Approve',
- onClick: () => onChange(true),
+ onClick: () => {
+ onChange(true);
+ },
+ },
+ {
+ label: 'Reject',
+ onClick: () => {
+ onChange(false);
+ },
},
- { label: 'Reject', onClick: () => onChange(false) },
]}
className="toggle-group"
/>
diff --git a/app/editor/src/features/admin/products/constants/defaultProduct.ts b/app/editor/src/features/admin/products/constants/defaultProduct.ts
index 51bedeb472..c5b7272e89 100644
--- a/app/editor/src/features/admin/products/constants/defaultProduct.ts
+++ b/app/editor/src/features/admin/products/constants/defaultProduct.ts
@@ -1,4 +1,4 @@
-import { IProductModel, ProductTypeName } from 'tno-core';
+import { type IProductModel, ProductTypeName } from 'tno-core';
export const defaultProduct: IProductModel = {
id: 0,
diff --git a/app/editor/src/features/admin/report-templates/ReportTemplateForm.tsx b/app/editor/src/features/admin/report-templates/ReportTemplateForm.tsx
index 395739af7a..32052cd6e4 100644
--- a/app/editor/src/features/admin/report-templates/ReportTemplateForm.tsx
+++ b/app/editor/src/features/admin/report-templates/ReportTemplateForm.tsx
@@ -7,7 +7,7 @@ import {
Button,
ButtonVariant,
IconButton,
- IReportTemplateModel,
+ type IReportTemplateModel,
Modal,
ReportTypeName,
Row,
@@ -69,7 +69,9 @@ const ReportTemplateForm: React.FC = () => {
iconType="back"
label="Back to report templates"
className="back-button"
- onClick={() => navigate('/admin/report/templates')}
+ onClick={() => {
+ navigate('/admin/report/templates');
+ }}
/>
diff --git a/app/editor/src/features/admin/report-templates/ReportTemplateFormCharts.tsx b/app/editor/src/features/admin/report-templates/ReportTemplateFormCharts.tsx
index 000c98832b..9508c9b824 100644
--- a/app/editor/src/features/admin/report-templates/ReportTemplateFormCharts.tsx
+++ b/app/editor/src/features/admin/report-templates/ReportTemplateFormCharts.tsx
@@ -7,9 +7,9 @@ import {
ButtonVariant,
Col,
getSortableOptions,
- IChartTemplateModel,
- IReportTemplateModel,
- OptionItem,
+ type IChartTemplateModel,
+ type IReportTemplateModel,
+ type OptionItem,
Row,
Select,
} from 'tno-core';
@@ -26,10 +26,13 @@ export const ReportTemplateFormCharts: React.FC = () => {
const [chart, setChart] = React.useState();
React.useEffect(() => {
- if (!chartTemplates.length)
+ if (chartTemplates.length === 0) {
findAllChartTemplates()
- .then((results) => setChartOptions(getSortableOptions(results)))
+ .then((results) => {
+ setChartOptions(getSortableOptions(results));
+ })
.catch(() => {});
+ }
// Only fetch items on initial load.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
@@ -81,7 +84,7 @@ export const ReportTemplateFormCharts: React.FC = () => {
const charts = [...values.chartTemplates, { ...chart }].map((ct, i) => {
return { ...ct, sortOrder: i };
});
- setFieldValue(`chartTemplates`, charts);
+ setFieldValue('chartTemplates', charts);
setChart(undefined);
}}
disabled={!chart || values.chartTemplates.some((ct) => ct.id === chart.id)}
@@ -98,9 +101,9 @@ export const ReportTemplateFormCharts: React.FC = () => {
}
+ else if (section.Value.SectionType == ReportSectionType.AI)
+ {
+ @* AI SECTION *@
+ var alt = section.Value.Settings.Label;
+
+ }
@if (!horizontalCharts && !endChartGroup)
{
diff --git a/app/editor/src/features/admin/reports/ReportForm.tsx b/app/editor/src/features/admin/reports/ReportForm.tsx
index 8dfed01a09..e7cde5bf0b 100644
--- a/app/editor/src/features/admin/reports/ReportForm.tsx
+++ b/app/editor/src/features/admin/reports/ReportForm.tsx
@@ -11,8 +11,8 @@ import {
Col,
hasErrors,
IconButton,
- IReportModel,
- IUserReportModel,
+ type IReportModel,
+ type IUserReportModel,
Modal,
Row,
Show,
@@ -125,7 +125,9 @@ const ReportForm: React.FC = () => {
iconType="back"
label="Back to reports"
className="back-button"
- onClick={() => navigate('/admin/reports')}
+ onClick={() => {
+ navigate('/admin/reports');
+ }}
/>