diff --git a/web/src/index.css b/web/src/index.css index f4fdb65..bd75d66 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -156,3 +156,8 @@ body { font-family: "Geist", "Gill Sans MT", Calibri, "Trebuchet MS", sans-serif; margin: 0px; } + +/* Подписи полей во всех формах полужирные */ +.ant-form-item-label > label { + font-weight: 600; +} diff --git a/web/src/index.tsx b/web/src/index.tsx index 83b74ef..ee73778 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -50,7 +50,7 @@ createRoot(rootElement).render( }, Form: { labelFontSize: 12, - labelColor: '#667085', + labelColor: '#101828', }, }, }}> diff --git a/web/src/layouts/CatalogueJur.tsx b/web/src/layouts/CatalogueJur.tsx index 537dd33..6c01029 100644 --- a/web/src/layouts/CatalogueJur.tsx +++ b/web/src/layouts/CatalogueJur.tsx @@ -45,6 +45,7 @@ export function CatalogueJur() { {createFormOpen && ( { setCreateFormOpen(false); }} diff --git a/web/src/store/slices/catalogueJurSlice/catalogueJurSlice.ts b/web/src/store/slices/catalogueJurSlice/catalogueJurSlice.ts index 7abf90b..e863b79 100644 --- a/web/src/store/slices/catalogueJurSlice/catalogueJurSlice.ts +++ b/web/src/store/slices/catalogueJurSlice/catalogueJurSlice.ts @@ -10,6 +10,7 @@ const initialState: CatalogueJurSliceType = { total_groups: 0, loading: false, error: null, + currentRequestId: null, isGettingArchive: false, relatedGroupFilter: null, activeCompanyGroup: null, @@ -29,21 +30,33 @@ const catalogueJurSlice = createSlice({ state.activeCompanyGroup = action.payload; state.relatedGroupFilter = null; }, + resetRows(state) { + state.raw_rows = []; + state.total_groups = 0; + // Запрос, начатый до сброса, больше не нужен: его ответ отбросится в fulfilled/rejected + state.currentRequestId = null; + state.loading = false; + }, }, extraReducers: (builder) => { builder - .addCase(getCatalogueJurThunk.pending, (state, _) => { + .addCase(getCatalogueJurThunk.pending, (state, action) => { + state.currentRequestId = action.meta.requestId; state.loading = true; state.error = null; }) .addCase(getCatalogueJurThunk.fulfilled, (state, action) => { + if (action.meta.requestId !== state.currentRequestId) return; state.raw_rows = action.payload.items; state.total_groups = action.payload.total; state.loading = false; + state.currentRequestId = null; }) .addCase(getCatalogueJurThunk.rejected, (state, action) => { + if (action.meta.requestId !== state.currentRequestId) return; state.error = action.payload ?? 'Неизвестная ошибка'; state.loading = false; + state.currentRequestId = null; }) // Выбранная ГК — копия строки списка ГК: после перезагрузки списка берём свежую (счётчик ЮЛ в шапке и вкладке) .addCase(getCompanyGroupsThunk.fulfilled, (state, action) => { @@ -54,5 +67,5 @@ const catalogueJurSlice = createSlice({ }, }); -export const { setIsGettingArchive, setRelatedGroupFilter, setActiveCompanyGroup } = catalogueJurSlice.actions; +export const { setIsGettingArchive, setRelatedGroupFilter, setActiveCompanyGroup, resetRows } = catalogueJurSlice.actions; export default catalogueJurSlice.reducer; diff --git a/web/src/store/slices/catalogueJurSlice/types.ts b/web/src/store/slices/catalogueJurSlice/types.ts index 7227c33..9048d8a 100644 --- a/web/src/store/slices/catalogueJurSlice/types.ts +++ b/web/src/store/slices/catalogueJurSlice/types.ts @@ -7,6 +7,7 @@ export interface CatalogueJurSliceType { raw_rows: ICatalogueJur[]; loading: boolean; error: string | null; + currentRequestId: string | null; isGettingArchive: boolean; relatedGroupFilter?: RelatedGroupOut | null; activeCompanyGroup?: ICompanyGroup | null; diff --git a/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.css b/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.css index 6c551ff..fb2568b 100644 --- a/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.css +++ b/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.css @@ -1,9 +1,67 @@ -.ant-tabs-tab-active { +.catalogue-company-group-tabs { + padding-top: 8px; +} + +.catalogue-company-group-tabs .ant-tabs-nav { + margin: 0 !important; +} + +.catalogue-company-group-tabs .ant-tabs-nav-list { + gap: 8px; +} + +.catalogue-company-group-tabs .ant-tabs-tab { + padding: 8px 12px !important; + margin: 0 !important; + border-radius: 8px !important; + display: flex; + align-items: center; +} + +.catalogue-company-group-tabs .ant-tabs-tab-active { background-color: #ecfdf3 !important; } -.ant-tabs-tab { - padding: 8px 12px !important; - margin: 10px 0 0 0 !important; - border-radius: 8px !important; +.catalogue-company-group-tabs .ant-tabs-tab-btn { + display: flex; + align-items: center; + font-size: 14px; + line-height: 1; + color: #667085 !important; } + +.catalogue-company-group-tabs .ant-tabs-tab-active .ant-tabs-tab-btn { + color: #166534 !important; + font-weight: 600; +} + +.catalogue-company-group-tabs .ant-tabs-ink-bar { + display: none !important; +} + +.catalogue-company-group-tabs__label { + display: inline-flex; + align-items: center; + gap: 8px; +} + +.catalogue-company-group-tabs__count { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 20px; + height: 20px; + padding: 0 6px; + border-radius: 10px; + background-color: #f0f2f5; + color: #667085; + font-size: 12px; + line-height: 1; + font-weight: 500; +} + +.catalogue-company-group-tabs .ant-tabs-tab-active .catalogue-company-group-tabs__count { + background-color: transparent; + color: #166534; + font-weight: 600; +} \ No newline at end of file diff --git a/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.tsx b/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.tsx index b6f770b..712d8c8 100644 --- a/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.tsx +++ b/web/src/widgets/CatalogueCompanyGroup/CatalogueCompanyGroupTabs/CatalogueCompanyGroupTabs.tsx @@ -11,22 +11,34 @@ interface CatalogueCompanyGroupTabsI { export type CatalogueCompanyGroupTabKey = 'legal_entities' | 'gsk' | 'gsz'; +const TabLabel = ({ title, count }: { title: string; count: number }) => ( + + {title} + {count} + +); + export const CatalogueCompanyGroupTabs = ({ activeTab, setActiveTab, gskData, gszData }: CatalogueCompanyGroupTabsI) => { const activeCompanyGroup = useAppSelector((state) => state.catalogue_jur.activeCompanyGroup); return ( setActiveTab(key as CatalogueCompanyGroupTabKey)} - tabBarStyle={{ margin: 0, marginBottom: 0 }} - style={{ marginBottom: 0 }} items={[ { key: 'legal_entities', - label: `ЮЛ ${activeCompanyGroup?.legal_entities_count ?? 0}`, + label: , + }, + { + key: 'gsk', + label: , + }, + { + key: 'gsz', + label: , }, - { key: 'gsk', label: `ГСК ${gskData?.length ?? 0}` }, - { key: 'gsz', label: `ГСЗ ${gszData?.length ?? 0}` }, ]} /> ); diff --git a/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx b/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx index afce0b8..9c338b6 100644 --- a/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx +++ b/web/src/widgets/CatalogueJur/CatalogueJurForm/CatalogueJurForm.tsx @@ -16,6 +16,7 @@ type Props = { onCancel: () => void; onOk: (values: CatalogueJurFormProps) => void | Promise; jurId?: string; + outsideGroup?: boolean; }; // Ошибки сервера, относящиеся к одному полю, показываем у этого поля @@ -26,7 +27,7 @@ const FIELD_BY_ERROR_CODE: Record = { CRM_ID_EXISTS: 'crm_id', }; -export const CatalogueJurForm: React.FC = ({ open, onCancel, onOk, jurId }) => { +export const CatalogueJurForm: React.FC = ({ open, onCancel, onOk, jurId, outsideGroup = false }) => { const [form] = Form.useForm(); const notification = useNotificationApi(); const [initialDataLoading, setInitialDataLoading] = useState(false); @@ -67,7 +68,9 @@ export const CatalogueJurForm: React.FC = ({ open, onCancel, onOk, jurId } finally { setInitialDataLoading(false); } - } else { + } else if (!outsideGroup) { + // Создание из карточки ГК: подставляем выбранную ГК. В «ЮЛ вне ГК» не подставляем — + // выбранная ГК остаётся в сторе после ухода со страницы «ГК и организации». form.setFieldsValue({ company_group_id: activeCompanyGroup?.id ?? undefined, }); @@ -253,7 +256,7 @@ export const CatalogueJurForm: React.FC = ({ open, onCancel, onOk, jurId } - placeholder='Поиск по ГК, CRM ID или РФ' + placeholder='Поиск по ЮЛ или ИНН' value={rawQuery} onChange={(e) => setRawQuery(e.target.value)} style={{ maxWidth: 320 }} diff --git a/web/src/widgets/CatalogueJur/CatalogueJurTable/config.tsx b/web/src/widgets/CatalogueJur/CatalogueJurTable/config.tsx index 7be6ee9..8197075 100644 --- a/web/src/widgets/CatalogueJur/CatalogueJurTable/config.tsx +++ b/web/src/widgets/CatalogueJur/CatalogueJurTable/config.tsx @@ -39,7 +39,7 @@ export const catalogueJurConfig: TableConfig = { title: 'Тип', features: { multiselect: true, sort: true }, render: (val) => { - const preset = val === 'ЮЛ' ? TAG_PRESETS.orange : TAG_PRESETS.purple; + const preset = val === 'ЮЛ' ? TAG_PRESETS.purple : TAG_PRESETS.orange; return ; }, }, diff --git a/web/src/widgets/RelatedGroup/RelatedGroupForm/RelatedGroupForm.tsx b/web/src/widgets/RelatedGroup/RelatedGroupForm/RelatedGroupForm.tsx index b796691..4e6bc39 100644 --- a/web/src/widgets/RelatedGroup/RelatedGroupForm/RelatedGroupForm.tsx +++ b/web/src/widgets/RelatedGroup/RelatedGroupForm/RelatedGroupForm.tsx @@ -111,7 +111,7 @@ export const RelatedGroupForm: React.FC = ({ open, onCancel, onOk, relate loading={initialDataLoading} confirmLoading={confirmLoading}>
- +