Skip to content

Commit 1a4fd2c

Browse files
committed
Merge remote-tracking branch 'origin/ui/status-fix'
2 parents 38d0b1d + d8a7000 commit 1a4fd2c

File tree

16 files changed

+267
-65
lines changed

16 files changed

+267
-65
lines changed

app/src/app/dashboard/dashboard-client-content.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,9 @@ export const DashboardClientContent = ({
4545
: null;
4646

4747
const lastEditBy = data?.last_edit_by_user_id
48-
? statbusUsers
49-
.find((u: Tables<"user">) => u.id === editInfo.data?.last_edit_by_user_id)
50-
?.email?.split("@")[0]
51-
.replace(/\./, " ")
48+
? statbusUsers.find(
49+
(u: Tables<"user">) => u.id === editInfo.data?.last_edit_by_user_id
50+
)?.display_name
5251
: null;
5352

5453
return (

app/src/app/establishments/[id]/statistical-variables/statistical-variables-form.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import UnitNotFound from "@/components/statistical-unit-details/unit-not-found";
66
import { useActionState, useEffect, useState } from "react";
77
import { updateStatisticalVariables } from "@/app/legal-units/[id]/update-legal-unit-server-actions";
88
import { EditableFieldWithMetadata } from "@/components/form/editable-field-with-metadata";
9+
import { InfoBox } from "@/components/info-box";
910

1011
export default function StatisticalVariablesForm({
1112
id,
@@ -41,6 +42,15 @@ export default function StatisticalVariablesForm({
4142

4243
return (
4344
<div>
45+
{data?.establishment?.[0].status?.used_for_counting === false && (
46+
<InfoBox>
47+
<p className="text-sm">
48+
This unit has status{" "}
49+
<strong>{data?.establishment?.[0].status?.name}</strong>, therefore
50+
the statistical variables are not included in aggregates.
51+
</p>
52+
</InfoBox>
53+
)}
4454
{statDefinitions.map((statDefinition) => {
4555
const stat = stats?.find(
4656
(s) => s.stat_definition_id === statDefinition.id
@@ -51,7 +61,8 @@ export default function StatisticalVariablesForm({
5161
<EditableFieldWithMetadata
5262
key={statDefinition.code}
5363
label={statDefinition.name ?? statDefinition.code!}
54-
fieldId={`value_${statDefinition.type}`}
64+
fieldId={statDefinition.code!}
65+
fieldName={`value_${statDefinition.type}`}
5566
value={value || ""}
5667
response={statsState}
5768
formAction={statsAction}

app/src/app/import/components/time-context-selector.tsx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,20 @@ export function TimeContextSelector({ unitType }: TimeContextSelectorProps) {
5151
const options: ValidityOption[] = [];
5252
const jobProvidedDef = availableDefinitions.find(d => d.valid_time_from === 'job_provided');
5353
if (jobProvidedDef) {
54-
options.push({
55-
id: 'job_provided_time_context',
56-
label: 'Apply a validity period to all records',
57-
description: 'Select a predefined validity period to apply to all imported records.',
58-
definition: jobProvidedDef,
59-
useExplicitDates: false,
60-
});
61-
options.push({
62-
id: 'job_provided_explicit_dates',
63-
label: 'Provide an explicit start and end date',
64-
description: 'These dates will be used as the default validity for all imported records.',
65-
definition: jobProvidedDef,
66-
useExplicitDates: true,
67-
});
54+
options.push({
55+
id: 'job_provided_time_context',
56+
label: 'Apply a validity period to all records',
57+
description: 'Select a predefined validity period to apply to all imported records.',
58+
definition: jobProvidedDef,
59+
useExplicitDates: false,
60+
});
61+
// options.push({
62+
// id: 'job_provided_explicit_dates',
63+
// label: 'Provide an explicit start and end date',
64+
// description: 'These dates will be used as the default validity for all imported records.',
65+
// definition: jobProvidedDef,
66+
// useExplicitDates: true,
67+
// });
6868
}
6969
const sourceColumnsDefs = availableDefinitions.filter(d => d.valid_time_from === 'source_columns');
7070
sourceColumnsDefs.forEach(def => {

app/src/app/legal-units/[id]/statistical-variables/statistical-variables-form.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Tables } from "@/lib/database.types";
77
import { useActionState, useEffect, useState } from "react";
88
import { EditableFieldWithMetadata } from "@/components/form/editable-field-with-metadata";
99
import { updateStatisticalVariables } from "../update-legal-unit-server-actions";
10+
import { InfoBox } from "@/components/info-box";
1011

1112
export default function StatisticalVariablesForm({
1213
id,
@@ -40,6 +41,15 @@ export default function StatisticalVariablesForm({
4041
}
4142
return (
4243
<div>
44+
{data?.legal_unit?.[0].status?.used_for_counting === false && (
45+
<InfoBox>
46+
<p className="text-sm">
47+
This unit has status{" "}
48+
<strong>{data?.legal_unit?.[0].status?.name}</strong>, therefore the
49+
statistical variables are not included in aggregates.
50+
</p>
51+
</InfoBox>
52+
)}
4353
{statDefinitions.map(
4454
(statDefinition: Tables<"stat_definition_active">) => {
4555
const stat = stats?.find(
@@ -51,7 +61,8 @@ export default function StatisticalVariablesForm({
5161
<EditableFieldWithMetadata
5262
key={statDefinition.code}
5363
label={statDefinition.name ?? statDefinition.code!}
54-
fieldId={`value_${statDefinition.type}`}
64+
fieldId={statDefinition.code!}
65+
fieldName={`value_${statDefinition.type}`}
5566
value={value || ""}
5667
response={statsState}
5768
formAction={statsAction}

app/src/app/search/SearchResults.tsx

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
regionDeriveStateUpdateFromSearchParams,
2121
sectorDeriveStateUpdateFromSearchParams,
2222
statusDeriveStateUpdateFromSearchParams,
23+
lastEditByUserDeriveStateUpdateFromSearchParams,
2324
statisticalVariablesDeriveStateUpdateFromSearchParams,
2425
unitSizeDeriveStateUpdateFromSearchParams,
2526
unitTypeDeriveStateUpdateFromSearchParams,
@@ -55,15 +56,34 @@ const deriveStateFromUrl = (
5556
const sectorAction = sectorDeriveStateUpdateFromSearchParams(urlSearchParams);
5657
const activityCategoryAction = activityCategoryDeriveStateUpdateFromSearchParams(urlSearchParams);
5758
const statusAction = statusDeriveStateUpdateFromSearchParams(urlSearchParams);
58-
const unitSizeAction = unitSizeDeriveStateUpdateFromSearchParams(urlSearchParams);
59-
const dataSourceAction = dataSourceDeriveStateUpdateFromSearchParams(urlSearchParams);
60-
const externalIdentActions = externalIdentTypes.map((extType) => externalIdentDeriveStateUpdateFromSearchParams(extType, urlSearchParams));
61-
const statVarActions = statisticalVariablesDeriveStateUpdateFromSearchParams(statDefinitions, urlSearchParams);
59+
const lastEditByUserAction =
60+
lastEditByUserDeriveStateUpdateFromSearchParams(urlSearchParams);
61+
const unitSizeAction =
62+
unitSizeDeriveStateUpdateFromSearchParams(urlSearchParams);
63+
const dataSourceAction =
64+
dataSourceDeriveStateUpdateFromSearchParams(urlSearchParams);
65+
const externalIdentActions = externalIdentTypes.map((extType) =>
66+
externalIdentDeriveStateUpdateFromSearchParams(extType, urlSearchParams)
67+
);
68+
const statVarActions = statisticalVariablesDeriveStateUpdateFromSearchParams(
69+
statDefinitions,
70+
urlSearchParams
71+
);
6272

6373
const allActions = [
64-
ftsAction, unitTypeAction, invalidCodesAction, legalFormAction, regionAction,
65-
sectorAction, activityCategoryAction, statusAction, unitSizeAction, dataSourceAction,
66-
...externalIdentActions, ...statVarActions,
74+
ftsAction,
75+
unitTypeAction,
76+
invalidCodesAction,
77+
legalFormAction,
78+
regionAction,
79+
sectorAction,
80+
activityCategoryAction,
81+
statusAction,
82+
lastEditByUserAction,
83+
unitSizeAction,
84+
dataSourceAction,
85+
...externalIdentActions,
86+
...statVarActions,
6787
].filter(Boolean) as SearchAction[];
6888

6989
let newInitialQuery = '';

app/src/app/search/components/statistical-unit-table-row.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ export const StatisticalUnitTableRow = ({
105105

106106
const lastEditBy = statbusUsers
107107
.find((user: Tables<'user'>) => user.id === unit.last_edit_by_user_id)
108-
?.email?.split("@")[0]
109-
.replace(/\./, " ");
108+
?.display_name
110109

111110
const getCellClassName = (column: TableColumn) => {
112111
return cn(
@@ -160,10 +159,11 @@ export const StatisticalUnitTableRow = ({
160159
<span className="font-medium">{unit.name}</span>
161160
)}
162161
<small className="text-gray-700 flex items-center space-x-1">
163-
<span className="flex">
162+
<span className="flex text-wrap">
164163
{externalIdentTypes
165164
?.map(
166-
({ code }: Tables<'external_ident_type_active'>) => unit.external_idents[code!] || "-"
165+
({ code }: Tables<"external_ident_type_active">) =>
166+
unit.external_idents[code!] || "-"
167167
)
168168
.join(" | ")}
169169
</span>

app/src/app/search/components/table-toolbar.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import DataSourceFilter from "../filters/data-source/data-source-filter";
1515
import { ColumnSelectorButton } from "./column-selector-button";
1616
import StatusFilter from "../filters/status/status-filter";
1717
import UnitSizeFilter from "../filters/unit-size/unit-size-filter";
18+
import LastEditByUserFilter from "../filters/last-edit-by-user/last-edit-by-user-filter";
1819

1920
export default function TableToolbar() {
2021
return (
@@ -45,6 +46,9 @@ export default function TableToolbar() {
4546
<FilterWrapper columnCode="data_sources">
4647
<DataSourceFilter />
4748
</FilterWrapper>
49+
<FilterWrapper columnCode="last_edit">
50+
<LastEditByUserFilter />
51+
</FilterWrapper>
4852
<StatisticalVariablesFilter />
4953
<InvalidCodesFilter />
5054
<ResetFilterButton />
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"use client";
2+
import LastEditByUserOptions from "@/app/search/filters/last-edit-by-user/last-edit-by-user-options";
3+
import { useBaseData } from "@/atoms/base-data";
4+
import { useMemo } from "react";
5+
6+
export default function LastEditByUserFilter() {
7+
const { statbusUsers } = useBaseData();
8+
9+
return (
10+
<LastEditByUserOptions
11+
options={
12+
statbusUsers?.map(({ id, display_name }) => ({
13+
label: display_name!,
14+
value: id?.toString()!,
15+
humanReadableValue: display_name!,
16+
})) ?? []
17+
}
18+
/>
19+
);
20+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"use client";
2+
3+
import { SearchFilterOption } from "../../search.d";
4+
import { OptionsFilter } from "../../components/options-filter";
5+
import { useCallback, useMemo } from "react";
6+
import { useSearchFilters } from "@/atoms/search";
7+
import { LAST_EDIT_BY_USER } from "../url-search-params";
8+
9+
export default function LastEditByUserOptions({
10+
options,
11+
}: {
12+
readonly options: SearchFilterOption[];
13+
}) {
14+
const { filters, updateFilters } = useSearchFilters();
15+
const filterValue = filters[LAST_EDIT_BY_USER];
16+
const selected = useMemo(() => {
17+
if (Array.isArray(filterValue)) {
18+
return filterValue as (string | null)[];
19+
}
20+
if (typeof filterValue === "string") {
21+
return [filterValue];
22+
}
23+
return [];
24+
}, [filterValue]);
25+
26+
const toggle = useCallback(
27+
async ({ value }: SearchFilterOption) => {
28+
const newSelectedValues = selected.includes(value)
29+
? selected.filter((v) => v !== value)
30+
: [...selected, value];
31+
32+
const newFilters = {
33+
...filters,
34+
[LAST_EDIT_BY_USER]: newSelectedValues,
35+
};
36+
updateFilters(newFilters);
37+
},
38+
[selected, filters, updateFilters]
39+
);
40+
41+
const reset = useCallback(async () => {
42+
const newFilters = {
43+
...filters,
44+
[LAST_EDIT_BY_USER]: [],
45+
};
46+
updateFilters(newFilters);
47+
}, [filters, updateFilters]);
48+
49+
return (
50+
<OptionsFilter
51+
className="p-2 h-9"
52+
title="Last Edit By"
53+
options={options}
54+
selectedValues={selected}
55+
onToggle={toggle}
56+
onReset={reset}
57+
/>
58+
);
59+
}

app/src/app/search/filters/url-search-params.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,31 @@ export function unitSizeDeriveStateUpdateFromValues(
229229
return result;
230230
}
231231

232+
export const LAST_EDIT_BY_USER = "last_edit_by_user_id";
233+
234+
export function lastEditByUserDeriveStateUpdateFromSearchParams(
235+
urlSearchParams: URLSearchParams
236+
): SearchAction {
237+
const initialValue = urlSearchParams.get(LAST_EDIT_BY_USER);
238+
const initialValues = parseInitialValues(initialValue);
239+
return lastEditByUserDeriveStateUpdateFromValues(initialValues);
240+
}
241+
242+
export function lastEditByUserDeriveStateUpdateFromValues(
243+
values: (string | null)[]
244+
): SearchAction {
245+
let result = {
246+
type: "set_query",
247+
payload: {
248+
app_param_name: LAST_EDIT_BY_USER,
249+
api_param_name: LAST_EDIT_BY_USER,
250+
api_param_value: values.length ? `in.(${values.join(",")})` : null,
251+
app_param_values: values,
252+
},
253+
} as SearchAction;
254+
return result;
255+
}
256+
232257
export const DATA_SOURCE = "data_source";
233258

234259
export function dataSourceDeriveStateUpdateFromSearchParams(urlSearchParams: URLSearchParams): SearchAction {

0 commit comments

Comments
 (0)