@hkyhy/marsun-components-core 0.1.72 → 0.1.74

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.
@@ -1 +1 @@
1
- {"version":3,"file":"IamUsersPage.js","sources":["../../../../src/components/Iam/pages/IamUsersPage.tsx"],"sourcesContent":["import { ModulePageShell } from '@/components/Layout';\nimport { Modal } from '@/components/Modal';\nimport {\n PermissionBindPanel,\n type PermissionBindCatalog,\n type PermissionBindItem,\n} from '@/components/PermissionBindPanel';\nimport Filter, {\n getFilterValue,\n InputFilterItem as ReactInputFilterItem,\n type FilterValue,\n} from '@/components/ReactFilter';\nimport { Table } from '@/components/Table';\nimport { SEMANTIC_COLORS, Tags } from '@/components/Tag';\nimport { CommonDescriptions, type DescriptionItem } from '@/components/Descriptions';\nimport { FormDataSync, FormInfo, FormModal, Select } from '@/components/Form';\nimport { Button, Space, Typography, message } from 'antd';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport type { IamClient } from '../client';\nimport type { IamRole, IamSharedGroup, IamUser } from '../types';\nimport { catalogToItems } from '../utils/catalogToItems';\nimport { buildDraftEffectivePermissions } from '../utils/draftEffectivePermissions';\nimport { MULTI_TAG_SHOW_LENGTH, multiTagSelectProps } from '../utils/multiTagSelect';\nimport { roleDisplayName, roleSelectOption } from '../utils/roleDisplay';\n\nconst ReactFilterBar = Filter as ComponentType<{\n value: FilterValue;\n onChange: (next: FilterValue) => void;\n list: unknown;\n}>;\n\nconst EP_PANEL_HEIGHT = 420;\n\nfunction buildViewItems(user: IamUser): DescriptionItem[] {\n const rolesValue: ReactNode = user.roles?.length ? (\n <Tags\n tags={user.roles.map((r) => roleDisplayName(r))}\n showLength={MULTI_TAG_SHOW_LENGTH}\n color={SEMANTIC_COLORS.INFO}\n empty=\"—\"\n />\n ) : (\n '—'\n );\n\n return [\n { label: '工号', value: user.employeeId || '—' },\n { label: '姓名', value: user.displayName || '—' },\n { label: '邮箱', value: user.email || '—' },\n {\n label: '组织',\n value:\n user.orgs\n ?.map((o) => o.name)\n .filter(Boolean)\n .join('、') || '—',\n span: 2,\n },\n { label: '角色', value: rolesValue, span: 2 },\n ];\n}\n\nexport type IamUsersPageProps = {\n client: IamClient;\n catalog: PermissionBindCatalog;\n systemEntryCodes: readonly string[];\n tableName?: string;\n title?: string;\n};\n\nexport default function IamUsersPage({\n client,\n catalog,\n systemEntryCodes,\n tableName = 'iam_users',\n title = '用户管理',\n}: IamUsersPageProps) {\n const [loading, setLoading] = useState(false);\n const [rows, setRows] = useState<IamUser[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [filterValue, setFilterValue] = useState<FilterValue>([]);\n const keyword = useMemo(() => {\n const flat = getFilterValue(filterValue) as Record<string, unknown>;\n return String(flat.keyword ?? '');\n }, [filterValue]);\n const [viewUser, setViewUser] = useState<IamUser | null>(null);\n const [viewLoading, setViewLoading] = useState(false);\n const [permUser, setPermUser] = useState<IamUser | null>(null);\n const [roles, setRoles] = useState<IamRole[]>([]);\n const [groups, setGroups] = useState<IamSharedGroup[]>([]);\n const [roleCodes, setRoleCodes] = useState<string[]>([]);\n const [groupIds, setGroupIds] = useState<string[]>([]);\n const [permFormEpoch, setPermFormEpoch] = useState(0);\n\n const catalogNameByCode = useMemo(() => {\n const m: Record<string, string> = {};\n for (const item of catalogToItems(catalog)) {\n m[item.code] = item.name;\n }\n return m;\n }, [catalog]);\n\n const draftEp = useMemo(\n () =>\n buildDraftEffectivePermissions({\n roleCodes,\n groupIds,\n roles,\n groups,\n nameByCode: catalogNameByCode,\n }),\n [roleCodes, groupIds, roles, groups, catalogNameByCode],\n );\n\n const panelPermissions = useMemo((): PermissionBindItem[] => {\n const epItems = draftEp\n .filter((p) => p.layer !== 'RESOURCE')\n .map((p) => ({\n id: p.code,\n code: p.code,\n name: p.name || p.code,\n layer: p.layer,\n }));\n const byCode = new Map(epItems.map((p) => [p.code, p]));\n const fromCatalog = catalogToItems(catalog).map((item) => {\n const hit = byCode.get(item.code);\n return hit ? { ...item, name: hit.name || item.name, layer: hit.layer || item.layer } : item;\n });\n const used = new Set(fromCatalog.map((p) => p.code));\n return [...fromCatalog, ...epItems.filter((p) => !used.has(p.code))];\n }, [draftEp, catalog]);\n\n const checkedEpIds = useMemo(\n () => draftEp.filter((p) => p.layer !== 'RESOURCE').map((p) => p.code),\n [draftEp],\n );\n\n const roleOptions = useMemo(() => roles.map((r) => roleSelectOption(r)), [roles]);\n const groupOptions = useMemo(\n () =>\n groups.map((g) => ({\n value: g.id,\n label: g.name || g.code,\n title: g.code ? `编码:${g.code}` : g.name,\n })),\n [groups],\n );\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const data = await client.listUsers({ page, pageSize: 20, keyword: keyword || undefined });\n setRows(data.pageData);\n setTotal(data.total);\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载失败');\n } finally {\n setLoading(false);\n }\n }, [client, page, keyword]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const openView = async (u: IamUser) => {\n setViewUser(u);\n setViewLoading(true);\n try {\n const detail = await client.getUser(u.id);\n setViewUser({\n ...u,\n ...detail,\n orgs: detail.orgs?.length ? detail.orgs : u.orgs,\n roles: detail.roles?.length ? detail.roles : u.roles,\n });\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载用户详情失败');\n } finally {\n setViewLoading(false);\n }\n };\n\n const openPerm = async (u: IamUser) => {\n setPermUser(u);\n try {\n const [r, g, mine, detail] = await Promise.all([\n client.listRoles(),\n client.listSharedGroups(),\n client.listUserSharedGroups(u.id),\n client.getUser(u.id),\n ]);\n setRoles(r);\n setGroups(g);\n setGroupIds(mine.map((x) => x.id));\n const appRoleCodes =\n detail.roles?.filter((x) => r.some((rr) => rr.code === x.code)).map((x) => x.code) || [];\n setRoleCodes(appRoleCodes);\n setPermFormEpoch((n) => n + 1);\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载权限失败');\n }\n };\n\n const onPermFormSync = useCallback((data: Record<string, unknown>) => {\n if (Array.isArray(data.groupIds)) setGroupIds(data.groupIds.map(String));\n if (Array.isArray(data.roleCodes)) setRoleCodes(data.roleCodes.map(String));\n }, []);\n\n const viewItems = useMemo(() => (viewUser ? buildViewItems(viewUser) : []), [viewUser]);\n\n return (\n <ModulePageShell title={title}>\n <div style={{ marginBottom: 12 }}>\n <ReactFilterBar\n value={filterValue}\n onChange={(next) => {\n setFilterValue(next);\n setPage(1);\n }}\n list={[\n [\n {\n type: ReactInputFilterItem,\n props: {\n name: 'keyword',\n label: '工号/姓名',\n placeholder: '工号/姓名',\n },\n },\n ],\n ]}\n />\n </div>\n <Table\n rowKey=\"id\"\n loading={loading}\n dataSource={rows}\n tableName={tableName}\n pagination={{\n current: page,\n total,\n pageSize: 20,\n onChange: setPage,\n }}\n columns={[\n { title: '工号', dataIndex: 'employeeId' },\n { title: '姓名', dataIndex: 'displayName' },\n { title: '邮箱', dataIndex: 'email', render: (v: string | null) => v || '—' },\n {\n title: '组织',\n key: 'org',\n render: (_: unknown, r: IamUser) =>\n r.orgs?.find((o) => o.isPrimary)?.name || r.orgs?.[0]?.name || '—',\n },\n {\n title: '操作',\n key: 'ops',\n render: (_: unknown, r: IamUser) => (\n <Space>\n <Button type=\"link\" size=\"small\" onClick={() => void openView(r)}>\n 查看\n </Button>\n <Button type=\"link\" size=\"small\" onClick={() => void openPerm(r)}>\n 权限管理\n </Button>\n </Space>\n ),\n },\n ]}\n />\n\n <Modal\n open={Boolean(viewUser)}\n title=\"查看用户\"\n onCancel={() => setViewUser(null)}\n footer={null}\n size=\"M\"\n scrollable\n >\n {viewUser ? (\n <CommonDescriptions\n content={viewItems}\n column={1}\n bordered\n size=\"small\"\n title={viewLoading ? '加载中…' : undefined}\n />\n ) : null}\n </Modal>\n\n <FormModal\n key={`iam-perm-${permUser?.id || 'x'}-${permFormEpoch}`}\n open={Boolean(permUser)}\n title={`权限管理 · ${permUser?.displayName || ''}`}\n width={920}\n onCancel={() => setPermUser(null)}\n okText=\"保存\"\n cancelText=\"取消\"\n formProps={{\n data: {\n dataScope: 'COMPANY',\n groupIds,\n roleCodes,\n },\n onSubmit: async (data: { groupIds?: string[]; roleCodes?: string[] }) => {\n if (!permUser) return;\n try {\n await client.setUserAppRoleCodes(permUser.id, data.roleCodes ?? roleCodes);\n await client.setUserSharedGroups(permUser.id, data.groupIds ?? groupIds);\n message.success('已保存');\n setPermUser(null);\n void load();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '保存失败');\n throw e;\n }\n },\n }}\n >\n <Space direction=\"vertical\" style={{ width: '100%' }} size=\"middle\">\n <FormInfo\n column={2}\n gap={16}\n list={[\n <Select\n key=\"dataScope\"\n name=\"dataScope\"\n label=\"数据权限\"\n disabled\n options={[{ value: 'COMPANY', label: '全公司' }]}\n />,\n <Select\n key=\"groupIds\"\n name=\"groupIds\"\n label=\"共享组\"\n mode=\"multiple\"\n allowClear\n options={groupOptions}\n placeholder=\"请选择共享组(可选)\"\n {...multiTagSelectProps}\n />,\n <Select\n key=\"roleCodes\"\n name=\"roleCodes\"\n label=\"用户角色\"\n mode=\"multiple\"\n allowClear\n options={roleOptions}\n placeholder=\"请选择本应用角色(可选)\"\n {...multiTagSelectProps}\n />,\n ]}\n />\n <FormDataSync onChange={onPermFormSync} />\n <div>\n <Typography.Text strong>权限点(只读预览)</Typography.Text>\n {panelPermissions.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ display: 'block', marginTop: 8 }}>\n 暂无权限点\n </Typography.Text>\n ) : (\n <div style={{ marginTop: 8 }}>\n <PermissionBindPanel\n catalog={catalog}\n permissions={panelPermissions}\n value={checkedEpIds}\n onChange={() => undefined}\n systemEntryCodes={[...systemEntryCodes]}\n readOnly\n height={EP_PANEL_HEIGHT}\n />\n </div>\n )}\n </div>\n </Space>\n </FormModal>\n </ModulePageShell>\n );\n}\n"],"names":["ReactFilterBar","Filter","EP_PANEL_HEIGHT","buildViewItems","user","rolesValue","_a","jsx","Tags","r","roleDisplayName","MULTI_TAG_SHOW_LENGTH","SEMANTIC_COLORS","_b","o","IamUsersPage","client","catalog","systemEntryCodes","tableName","title","loading","setLoading","useState","rows","setRows","total","setTotal","page","setPage","filterValue","setFilterValue","keyword","useMemo","flat","getFilterValue","viewUser","setViewUser","viewLoading","setViewLoading","permUser","setPermUser","roles","setRoles","groups","setGroups","roleCodes","setRoleCodes","groupIds","setGroupIds","permFormEpoch","setPermFormEpoch","catalogNameByCode","m","item","catalogToItems","draftEp","buildDraftEffectivePermissions","panelPermissions","epItems","p","byCode","fromCatalog","hit","used","checkedEpIds","roleOptions","roleSelectOption","groupOptions","g","load","useCallback","data","message","useEffect","openView","u","detail","e","openPerm","mine","x","appRoleCodes","rr","n","onPermFormSync","viewItems","jsxs","ModulePageShell","next","ReactInputFilterItem","Table","v","_","_d","_c","Space","Button","Modal","CommonDescriptions","FormModal","FormInfo","Select","multiTagSelectProps","FormDataSync","Typography","PermissionBindPanel"],"mappings":"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"}
1
+ {"version":3,"file":"IamUsersPage.js","sources":["../../../../src/components/Iam/pages/IamUsersPage.tsx"],"sourcesContent":["import { ModulePageShell } from '@/components/Layout';\nimport { Modal } from '@/components/Modal';\nimport {\n PermissionBindPanel,\n type PermissionBindCatalog,\n type PermissionBindItem,\n} from '@/components/PermissionBindPanel';\nimport Filter, {\n getFilterValue,\n InputFilterItem as ReactInputFilterItem,\n type FilterValue,\n} from '@/components/ReactFilter';\nimport { Table } from '@/components/Table';\nimport { SEMANTIC_COLORS, Tags } from '@/components/Tag';\nimport { CommonDescriptions, type DescriptionItem } from '@/components/Descriptions';\nimport { FormDataSync, FormInfo, FormModal, Select } from '@/components/Form';\nimport { Button, Space, Typography, message } from 'antd';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport type { IamClient } from '../client';\nimport type { IamRole, IamSharedGroup, IamUser } from '../types';\nimport { catalogToItems } from '../utils/catalogToItems';\nimport { buildDraftEffectivePermissions } from '../utils/draftEffectivePermissions';\nimport { MULTI_TAG_SHOW_LENGTH, multiTagSelectProps } from '../utils/multiTagSelect';\nimport { roleDisplayName, roleSelectOption } from '../utils/roleDisplay';\n\nconst ReactFilterBar = Filter as ComponentType<{\n value: FilterValue;\n onChange: (next: FilterValue) => void;\n list: unknown;\n}>;\n\nconst EP_PANEL_HEIGHT = 420;\n\nfunction buildViewItems(user: IamUser): DescriptionItem[] {\n const rolesValue: ReactNode = user.roles?.length ? (\n <Tags\n tags={user.roles.map((r) => roleDisplayName(r))}\n showLength={MULTI_TAG_SHOW_LENGTH}\n color={SEMANTIC_COLORS.INFO}\n empty=\"—\"\n />\n ) : (\n '—'\n );\n\n return [\n { label: '工号', value: user.employeeId || '—' },\n { label: '姓名', value: user.displayName || '—' },\n { label: '邮箱', value: user.email || '—' },\n {\n label: '组织',\n value:\n user.orgs\n ?.map((o) => o.name)\n .filter(Boolean)\n .join('、') || '—',\n span: 2,\n },\n { label: '角色', value: rolesValue, span: 2 },\n ];\n}\n\nexport type IamUsersPageProps = {\n client: IamClient;\n catalog: PermissionBindCatalog;\n systemEntryCodes: readonly string[];\n tableName?: string;\n title?: string;\n};\n\nexport default function IamUsersPage({\n client,\n catalog,\n systemEntryCodes,\n tableName = 'iam_users',\n title = '用户管理',\n}: IamUsersPageProps) {\n const [loading, setLoading] = useState(false);\n const [rows, setRows] = useState<IamUser[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [filterValue, setFilterValue] = useState<FilterValue>([]);\n const keyword = useMemo(() => {\n const flat = getFilterValue(filterValue) as Record<string, unknown>;\n return String(flat.keyword ?? '');\n }, [filterValue]);\n const [viewUser, setViewUser] = useState<IamUser | null>(null);\n const [viewLoading, setViewLoading] = useState(false);\n const [permUser, setPermUser] = useState<IamUser | null>(null);\n const [roles, setRoles] = useState<IamRole[]>([]);\n const [groups, setGroups] = useState<IamSharedGroup[]>([]);\n const [roleCodes, setRoleCodes] = useState<string[]>([]);\n const [groupIds, setGroupIds] = useState<string[]>([]);\n const [permFormEpoch, setPermFormEpoch] = useState(0);\n\n const catalogNameByCode = useMemo(() => {\n const m: Record<string, string> = {};\n for (const item of catalogToItems(catalog)) {\n m[item.code] = item.name;\n }\n return m;\n }, [catalog]);\n\n const draftEp = useMemo(\n () =>\n buildDraftEffectivePermissions({\n roleCodes,\n groupIds,\n roles,\n groups,\n nameByCode: catalogNameByCode,\n }),\n [roleCodes, groupIds, roles, groups, catalogNameByCode],\n );\n\n const panelPermissions = useMemo((): PermissionBindItem[] => {\n const epItems = draftEp\n .filter((p) => p.layer !== 'RESOURCE')\n .map((p) => ({\n id: p.code,\n code: p.code,\n name: p.name || p.code,\n layer: p.layer,\n }));\n const byCode = new Map(epItems.map((p) => [p.code, p]));\n const fromCatalog = catalogToItems(catalog).map((item) => {\n const hit = byCode.get(item.code);\n return hit ? { ...item, name: hit.name || item.name, layer: hit.layer || item.layer } : item;\n });\n const used = new Set(fromCatalog.map((p) => p.code));\n return [...fromCatalog, ...epItems.filter((p) => !used.has(p.code))];\n }, [draftEp, catalog]);\n\n const checkedEpIds = useMemo(\n () => draftEp.filter((p) => p.layer !== 'RESOURCE').map((p) => p.code),\n [draftEp],\n );\n\n const roleOptions = useMemo(() => roles.map((r) => roleSelectOption(r)), [roles]);\n const groupOptions = useMemo(\n () =>\n groups.map((g) => ({\n value: g.id,\n label: g.name || g.code,\n title: g.code ? `编码:${g.code}` : g.name,\n })),\n [groups],\n );\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const data = await client.listUsers({ page, pageSize: 20, keyword: keyword || undefined });\n setRows(data.pageData);\n setTotal(data.total);\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载失败');\n } finally {\n setLoading(false);\n }\n }, [client, page, keyword]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const openView = async (u: IamUser) => {\n setViewUser(u);\n setViewLoading(true);\n try {\n const detail = await client.getUser(u.id);\n setViewUser({\n ...u,\n ...detail,\n orgs: detail.orgs?.length ? detail.orgs : u.orgs,\n roles: detail.roles?.length ? detail.roles : u.roles,\n });\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载用户详情失败');\n } finally {\n setViewLoading(false);\n }\n };\n\n const openPerm = async (u: IamUser) => {\n setPermUser(u);\n try {\n const [r, g, mine, detail] = await Promise.all([\n client.listRoles(),\n client.listSharedGroups(),\n client.listUserSharedGroups(u.id),\n client.getUser(u.id),\n ]);\n setRoles(r);\n setGroups(g);\n setGroupIds(mine.map((x) => x.id));\n const appRoleCodes =\n detail.roles?.filter((x) => r.some((rr) => rr.code === x.code)).map((x) => x.code) || [];\n setRoleCodes(appRoleCodes);\n setPermFormEpoch((n) => n + 1);\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载权限失败');\n }\n };\n\n const onPermFormSync = useCallback((data: Record<string, unknown>) => {\n if (Array.isArray(data.groupIds)) setGroupIds(data.groupIds.map(String));\n if (Array.isArray(data.roleCodes)) setRoleCodes(data.roleCodes.map(String));\n }, []);\n\n const viewItems = useMemo(() => (viewUser ? buildViewItems(viewUser) : []), [viewUser]);\n\n return (\n <ModulePageShell title={title} fillHeight={false}>\n <div style={{ marginBottom: 12 }}>\n <ReactFilterBar\n value={filterValue}\n onChange={(next) => {\n setFilterValue(next);\n setPage(1);\n }}\n list={[\n [\n {\n type: ReactInputFilterItem,\n props: {\n name: 'keyword',\n label: '工号/姓名',\n placeholder: '工号/姓名',\n },\n },\n ],\n ]}\n />\n </div>\n <Table\n rowKey=\"id\"\n loading={loading}\n dataSource={rows}\n tableName={tableName}\n pagination={{\n current: page,\n total,\n pageSize: 20,\n onChange: setPage,\n }}\n columns={[\n { title: '工号', dataIndex: 'employeeId' },\n { title: '姓名', dataIndex: 'displayName' },\n { title: '邮箱', dataIndex: 'email', render: (v: string | null) => v || '—' },\n {\n title: '组织',\n key: 'org',\n render: (_: unknown, r: IamUser) =>\n r.orgs?.find((o) => o.isPrimary)?.name || r.orgs?.[0]?.name || '—',\n },\n {\n title: '操作',\n key: 'ops',\n render: (_: unknown, r: IamUser) => (\n <Space>\n <Button type=\"link\" size=\"small\" onClick={() => void openView(r)}>\n 查看\n </Button>\n <Button type=\"link\" size=\"small\" onClick={() => void openPerm(r)}>\n 权限管理\n </Button>\n </Space>\n ),\n },\n ]}\n />\n\n <Modal\n open={Boolean(viewUser)}\n title=\"查看用户\"\n onCancel={() => setViewUser(null)}\n footer={null}\n size=\"M\"\n scrollable\n >\n {viewUser ? (\n <CommonDescriptions\n content={viewItems}\n column={1}\n bordered\n size=\"small\"\n title={viewLoading ? '加载中…' : undefined}\n />\n ) : null}\n </Modal>\n\n <FormModal\n key={`iam-perm-${permUser?.id || 'x'}-${permFormEpoch}`}\n open={Boolean(permUser)}\n title={`权限管理 · ${permUser?.displayName || ''}`}\n width={920}\n onCancel={() => setPermUser(null)}\n okText=\"保存\"\n cancelText=\"取消\"\n formProps={{\n data: {\n dataScope: 'COMPANY',\n groupIds,\n roleCodes,\n },\n onSubmit: async (data: { groupIds?: string[]; roleCodes?: string[] }) => {\n if (!permUser) return;\n try {\n await client.setUserAppRoleCodes(permUser.id, data.roleCodes ?? roleCodes);\n await client.setUserSharedGroups(permUser.id, data.groupIds ?? groupIds);\n message.success('已保存');\n setPermUser(null);\n void load();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '保存失败');\n throw e;\n }\n },\n }}\n >\n <Space direction=\"vertical\" style={{ width: '100%' }} size=\"middle\">\n <FormInfo\n column={2}\n gap={16}\n list={[\n <Select\n key=\"dataScope\"\n name=\"dataScope\"\n label=\"数据权限\"\n disabled\n options={[{ value: 'COMPANY', label: '全公司' }]}\n />,\n <Select\n key=\"groupIds\"\n name=\"groupIds\"\n label=\"共享组\"\n mode=\"multiple\"\n allowClear\n options={groupOptions}\n placeholder=\"请选择共享组(可选)\"\n {...multiTagSelectProps}\n />,\n <Select\n key=\"roleCodes\"\n name=\"roleCodes\"\n label=\"用户角色\"\n mode=\"multiple\"\n allowClear\n options={roleOptions}\n placeholder=\"请选择本应用角色(可选)\"\n {...multiTagSelectProps}\n />,\n ]}\n />\n <FormDataSync onChange={onPermFormSync} />\n <div>\n <Typography.Text strong>权限点(只读预览)</Typography.Text>\n {panelPermissions.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ display: 'block', marginTop: 8 }}>\n 暂无权限点\n </Typography.Text>\n ) : (\n <div style={{ marginTop: 8 }}>\n <PermissionBindPanel\n catalog={catalog}\n permissions={panelPermissions}\n value={checkedEpIds}\n onChange={() => undefined}\n systemEntryCodes={[...systemEntryCodes]}\n readOnly\n height={EP_PANEL_HEIGHT}\n />\n </div>\n )}\n </div>\n </Space>\n </FormModal>\n </ModulePageShell>\n );\n}\n"],"names":["ReactFilterBar","Filter","EP_PANEL_HEIGHT","buildViewItems","user","rolesValue","_a","jsx","Tags","r","roleDisplayName","MULTI_TAG_SHOW_LENGTH","SEMANTIC_COLORS","_b","o","IamUsersPage","client","catalog","systemEntryCodes","tableName","title","loading","setLoading","useState","rows","setRows","total","setTotal","page","setPage","filterValue","setFilterValue","keyword","useMemo","flat","getFilterValue","viewUser","setViewUser","viewLoading","setViewLoading","permUser","setPermUser","roles","setRoles","groups","setGroups","roleCodes","setRoleCodes","groupIds","setGroupIds","permFormEpoch","setPermFormEpoch","catalogNameByCode","m","item","catalogToItems","draftEp","buildDraftEffectivePermissions","panelPermissions","epItems","p","byCode","fromCatalog","hit","used","checkedEpIds","roleOptions","roleSelectOption","groupOptions","g","load","useCallback","data","message","useEffect","openView","u","detail","e","openPerm","mine","x","appRoleCodes","rr","n","onPermFormSync","viewItems","jsxs","ModulePageShell","next","ReactInputFilterItem","Table","v","_","_d","_c","Space","Button","Modal","CommonDescriptions","FormModal","FormInfo","Select","multiTagSelectProps","FormDataSync","Typography","PermissionBindPanel"],"mappings":"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"}
@@ -13,6 +13,11 @@ export type ModulePageShellProps = {
13
13
  children?: ReactNode;
14
14
  className?: string;
15
15
  bodyClassName?: string;
16
+ /**
17
+ * true(默认):填满父级 flex 链并 clip,供页内嵌套滚动(沙盘/预警等)。
18
+ * false:高度随内容撑开,交给外层 VirtualScrollbar(IAM 列表等文档流页)。
19
+ */
20
+ fillHeight?: boolean;
16
21
  };
17
22
  declare const ModulePageShell: React.FC<ModulePageShellProps>;
18
23
  export default ModulePageShell;
@@ -1,36 +1,59 @@
1
- import { jsxs as h, jsx as e } from "react/jsx-runtime";
2
- import l from "classnames";
3
- import { useEffect as b } from "react";
4
- import N from "../PageSpin/index.js";
5
- import o from "./style.module.scss.js";
6
- import { usePageShell as v } from "../PageShell/PageShellContext.js";
7
- const w = ({
8
- title: m,
9
- description: r,
10
- breadcrumb: s,
11
- toolbar: d,
12
- spinning: u = !1,
1
+ import { jsxs as b, jsx as l } from "react/jsx-runtime";
2
+ import o from "classnames";
3
+ import { useEffect as N } from "react";
4
+ import v from "../PageSpin/index.js";
5
+ import e from "./style.module.scss.js";
6
+ import { usePageShell as x } from "../PageShell/PageShellContext.js";
7
+ const B = ({
8
+ title: r,
9
+ description: s,
10
+ breadcrumb: d,
11
+ toolbar: u,
12
+ spinning: t = !1,
13
13
  syncPageMeta: n = !0,
14
- actions: i,
15
- children: p,
16
- className: t,
17
- bodyClassName: g
14
+ actions: p,
15
+ children: i,
16
+ className: g,
17
+ bodyClassName: c,
18
+ fillHeight: a = !0
18
19
  }) => {
19
- const { setPageMeta: a, pageLoading: c } = v(), f = !!(u || c);
20
- return b(() => {
20
+ const { setPageMeta: m, pageLoading: f } = x(), h = !!(t || f);
21
+ return N(() => {
21
22
  if (n)
22
- return a({
23
- title: m,
24
- description: r,
25
- actionItems: i
26
- }), () => a({});
27
- }, [m, r, i, n, a]), /* @__PURE__ */ h("div", { className: l("module-page-shell", o["module-page-shell"], t), children: [
28
- s ? /* @__PURE__ */ e("div", { className: l("module-page-breadcrumb", o["module-page-breadcrumb"]), children: s }) : null,
29
- d ? /* @__PURE__ */ e("div", { className: l("module-page-toolbar", o["module-page-toolbar"]), children: d }) : null,
30
- /* @__PURE__ */ e("div", { className: l("module-page-body", o["module-page-body"], g), children: /* @__PURE__ */ e(N, { spinning: f, children: p }) })
31
- ] });
23
+ return m({
24
+ title: r,
25
+ description: s,
26
+ actionItems: p
27
+ }), () => m({});
28
+ }, [r, s, p, n, m]), /* @__PURE__ */ b(
29
+ "div",
30
+ {
31
+ className: o(
32
+ "module-page-shell",
33
+ e["module-page-shell"],
34
+ a && e["module-page-shell--fill"],
35
+ g
36
+ ),
37
+ children: [
38
+ d ? /* @__PURE__ */ l("div", { className: o("module-page-breadcrumb", e["module-page-breadcrumb"]), children: d }) : null,
39
+ u ? /* @__PURE__ */ l("div", { className: o("module-page-toolbar", e["module-page-toolbar"]), children: u }) : null,
40
+ /* @__PURE__ */ l(
41
+ "div",
42
+ {
43
+ className: o(
44
+ "module-page-body",
45
+ e["module-page-body"],
46
+ a && e["module-page-body--fill"],
47
+ c
48
+ ),
49
+ children: /* @__PURE__ */ l(v, { spinning: h, naturalHeight: !a, children: i })
50
+ }
51
+ )
52
+ ]
53
+ }
54
+ );
32
55
  };
33
56
  export {
34
- w as default
57
+ B as default
35
58
  };
36
59
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/Layout/ModulePageShell/index.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport type { ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport PageSpin from '../PageSpin';\nimport { usePageShell, type PageShellActionItem } from '../PageShell';\nimport styles from './style.module.scss';\n\nexport type ModulePageShellProps = {\n title?: string;\n description?: ReactNode;\n breadcrumb?: ReactNode;\n toolbar?: ReactNode;\n /** 页面级 loading,与 usePageShellLoading 注册的 ctx loading 合并 */\n spinning?: boolean;\n /** 是否同步 title/description/actions 到 PageShellProvider(App 顶栏),默认 true */\n syncPageMeta?: boolean;\n actions?: PageShellActionItem[];\n children?: ReactNode;\n className?: string;\n bodyClassName?: string;\n};\n\nconst ModulePageShell: React.FC<ModulePageShellProps> = ({\n title,\n description,\n breadcrumb,\n toolbar,\n spinning = false,\n syncPageMeta = true,\n actions,\n children,\n className,\n bodyClassName,\n}) => {\n const { setPageMeta, pageLoading: ctxLoading } = usePageShell();\n const showSpinning = Boolean(spinning || ctxLoading);\n\n useEffect(() => {\n if (!syncPageMeta) return;\n setPageMeta({\n title,\n description,\n actionItems: actions,\n });\n return () => setPageMeta({});\n }, [title, description, actions, syncPageMeta, setPageMeta]);\n\n return (\n <div className={classNames('module-page-shell', styles['module-page-shell'], className)}>\n {breadcrumb ? (\n <div className={classNames('module-page-breadcrumb', styles['module-page-breadcrumb'])}>\n {breadcrumb}\n </div>\n ) : null}\n\n {toolbar ? (\n <div className={classNames('module-page-toolbar', styles['module-page-toolbar'])}>\n {toolbar}\n </div>\n ) : null}\n\n <div className={classNames('module-page-body', styles['module-page-body'], bodyClassName)}>\n <PageSpin spinning={showSpinning}>{children}</PageSpin>\n </div>\n </div>\n );\n};\n\nexport default ModulePageShell;\n"],"names":["ModulePageShell","title","description","breadcrumb","toolbar","spinning","syncPageMeta","actions","children","className","bodyClassName","setPageMeta","ctxLoading","usePageShell","showSpinning","useEffect","jsxs","classNames","styles","jsx","PageSpin"],"mappings":";;;;;;AAsBA,MAAMA,IAAkD,CAAC;AAAA,EACvD,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,cAAAC,IAAe;AAAA,EACf,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AACF,MAAM;AACJ,QAAM,EAAE,aAAAC,GAAa,aAAaC,EAAA,IAAeC,EAAA,GAC3CC,IAAe,GAAQT,KAAYO;AAEzC,SAAAG,EAAU,MAAM;AACd,QAAKT;AACL,aAAAK,EAAY;AAAA,QACV,OAAAV;AAAA,QACA,aAAAC;AAAA,QACA,aAAaK;AAAA,MAAA,CACd,GACM,MAAMI,EAAY,EAAE;AAAA,EAC7B,GAAG,CAACV,GAAOC,GAAaK,GAASD,GAAcK,CAAW,CAAC,GAGzD,gBAAAK,EAAC,SAAI,WAAWC,EAAW,qBAAqBC,EAAO,mBAAmB,GAAGT,CAAS,GACnF,UAAA;AAAA,IAAAN,IACC,gBAAAgB,EAAC,OAAA,EAAI,WAAWF,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC,GAClF,UAAAf,EAAA,CACH,IACE;AAAA,IAEHC,IACC,gBAAAe,EAAC,OAAA,EAAI,WAAWF,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,GAC5E,UAAAd,EAAA,CACH,IACE;AAAA,IAEJ,gBAAAe,EAAC,OAAA,EAAI,WAAWF,EAAW,oBAAoBC,EAAO,kBAAkB,GAAGR,CAAa,GACtF,UAAA,gBAAAS,EAACC,GAAA,EAAS,UAAUN,GAAe,UAAAN,GAAS,EAAA,CAC9C;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Layout/ModulePageShell/index.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport type { ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport PageSpin from '../PageSpin';\nimport { usePageShell, type PageShellActionItem } from '../PageShell';\nimport styles from './style.module.scss';\n\nexport type ModulePageShellProps = {\n title?: string;\n description?: ReactNode;\n breadcrumb?: ReactNode;\n toolbar?: ReactNode;\n /** 页面级 loading,与 usePageShellLoading 注册的 ctx loading 合并 */\n spinning?: boolean;\n /** 是否同步 title/description/actions 到 PageShellProvider(App 顶栏),默认 true */\n syncPageMeta?: boolean;\n actions?: PageShellActionItem[];\n children?: ReactNode;\n className?: string;\n bodyClassName?: string;\n /**\n * true(默认):填满父级 flex 链并 clip,供页内嵌套滚动(沙盘/预警等)。\n * false:高度随内容撑开,交给外层 VirtualScrollbar(IAM 列表等文档流页)。\n */\n fillHeight?: boolean;\n};\n\nconst ModulePageShell: React.FC<ModulePageShellProps> = ({\n title,\n description,\n breadcrumb,\n toolbar,\n spinning = false,\n syncPageMeta = true,\n actions,\n children,\n className,\n bodyClassName,\n fillHeight = true,\n}) => {\n const { setPageMeta, pageLoading: ctxLoading } = usePageShell();\n const showSpinning = Boolean(spinning || ctxLoading);\n\n useEffect(() => {\n if (!syncPageMeta) return;\n setPageMeta({\n title,\n description,\n actionItems: actions,\n });\n return () => setPageMeta({});\n }, [title, description, actions, syncPageMeta, setPageMeta]);\n\n return (\n <div\n className={classNames(\n 'module-page-shell',\n styles['module-page-shell'],\n fillHeight && styles['module-page-shell--fill'],\n className,\n )}\n >\n {breadcrumb ? (\n <div className={classNames('module-page-breadcrumb', styles['module-page-breadcrumb'])}>\n {breadcrumb}\n </div>\n ) : null}\n\n {toolbar ? (\n <div className={classNames('module-page-toolbar', styles['module-page-toolbar'])}>\n {toolbar}\n </div>\n ) : null}\n\n <div\n className={classNames(\n 'module-page-body',\n styles['module-page-body'],\n fillHeight && styles['module-page-body--fill'],\n bodyClassName,\n )}\n >\n <PageSpin spinning={showSpinning} naturalHeight={!fillHeight}>\n {children}\n </PageSpin>\n </div>\n </div>\n );\n};\n\nexport default ModulePageShell;\n"],"names":["ModulePageShell","title","description","breadcrumb","toolbar","spinning","syncPageMeta","actions","children","className","bodyClassName","fillHeight","setPageMeta","ctxLoading","usePageShell","showSpinning","useEffect","jsxs","classNames","styles","jsx","PageSpin"],"mappings":";;;;;;AA2BA,MAAMA,IAAkD,CAAC;AAAA,EACvD,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,cAAAC,IAAe;AAAA,EACf,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,YAAAC,IAAa;AACf,MAAM;AACJ,QAAM,EAAE,aAAAC,GAAa,aAAaC,EAAA,IAAeC,EAAA,GAC3CC,IAAe,GAAQV,KAAYQ;AAEzC,SAAAG,EAAU,MAAM;AACd,QAAKV;AACL,aAAAM,EAAY;AAAA,QACV,OAAAX;AAAA,QACA,aAAAC;AAAA,QACA,aAAaK;AAAA,MAAA,CACd,GACM,MAAMK,EAAY,EAAE;AAAA,EAC7B,GAAG,CAACX,GAAOC,GAAaK,GAASD,GAAcM,CAAW,CAAC,GAGzD,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAC,EAAO,mBAAmB;AAAA,QAC1BR,KAAcQ,EAAO,yBAAyB;AAAA,QAC9CV;AAAA,MAAA;AAAA,MAGD,UAAA;AAAA,QAAAN,IACC,gBAAAiB,EAAC,OAAA,EAAI,WAAWF,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC,GAClF,UAAAhB,EAAA,CACH,IACE;AAAA,QAEHC,IACC,gBAAAgB,EAAC,OAAA,EAAI,WAAWF,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,GAC5E,UAAAf,EAAA,CACH,IACE;AAAA,QAEJ,gBAAAgB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWF;AAAA,cACT;AAAA,cACAC,EAAO,kBAAkB;AAAA,cACzBR,KAAcQ,EAAO,wBAAwB;AAAA,cAC7CT;AAAA,YAAA;AAAA,YAGF,4BAACW,GAAA,EAAS,UAAUN,GAAc,eAAe,CAACJ,GAC/C,UAAAH,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1,8 +1,10 @@
1
1
  const e = {
2
- "module-page-shell": "_module-page-shell_140iw_1",
3
- "module-page-breadcrumb": "_module-page-breadcrumb_140iw_10",
4
- "module-page-toolbar": "_module-page-toolbar_140iw_19",
5
- "module-page-body": "_module-page-body_140iw_26"
2
+ "module-page-shell": "_module-page-shell_tpdgq_1",
3
+ "module-page-shell--fill": "_module-page-shell--fill_tpdgq_7",
4
+ "module-page-breadcrumb": "_module-page-breadcrumb_tpdgq_12",
5
+ "module-page-toolbar": "_module-page-toolbar_tpdgq_21",
6
+ "module-page-body": "_module-page-body_tpdgq_28",
7
+ "module-page-body--fill": "_module-page-body--fill_tpdgq_34"
6
8
  };
7
9
  export {
8
10
  e as default
@@ -1 +1 @@
1
- {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -3,6 +3,8 @@ export type PageSpinProps = {
3
3
  spinning: boolean;
4
4
  children: ReactNode;
5
5
  className?: string;
6
+ /** 高度随内容撑开(不抢 flex:1),配合 ModulePageShell fillHeight={false} */
7
+ naturalHeight?: boolean;
6
8
  };
7
9
  /** 模块页 body 区整页 Spin:参与 flex 高度链,遮罩 Filter + 主工作区 */
8
10
  declare const PageSpin: React.FC<PageSpinProps>;
@@ -1,9 +1,27 @@
1
- import { jsx as r } from "react/jsx-runtime";
2
- import { Spin as p } from "antd";
3
- import t from "classnames";
4
- import a from "./style.module.scss.js";
5
- const n = ({ spinning: o, children: s, className: m }) => /* @__PURE__ */ r(p, { spinning: o, classNames: { root: t(a["page-spin"], m) }, children: s });
1
+ import { jsx as m } from "react/jsx-runtime";
2
+ import { Spin as t } from "antd";
3
+ import e from "classnames";
4
+ import s from "./style.module.scss.js";
5
+ const c = ({
6
+ spinning: a,
7
+ children: o,
8
+ className: p,
9
+ naturalHeight: r = !1
10
+ }) => /* @__PURE__ */ m(
11
+ t,
12
+ {
13
+ spinning: a,
14
+ classNames: {
15
+ root: e(
16
+ s["page-spin"],
17
+ r && s["page-spin--natural"],
18
+ p
19
+ )
20
+ },
21
+ children: o
22
+ }
23
+ );
6
24
  export {
7
- n as default
25
+ c as default
8
26
  };
9
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/Layout/PageSpin/index.tsx"],"sourcesContent":["import { Spin } from 'antd';\nimport classNames from 'classnames';\nimport type { ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type PageSpinProps = {\n spinning: boolean;\n children: ReactNode;\n className?: string;\n};\n\n/** 模块页 body 区整页 Spin:参与 flex 高度链,遮罩 Filter + 主工作区 */\nconst PageSpin: React.FC<PageSpinProps> = ({ spinning, children, className }) => (\n <Spin spinning={spinning} classNames={{ root: classNames(styles['page-spin'], className) }}>\n {children}\n </Spin>\n);\n\nexport default PageSpin;\n"],"names":["PageSpin","spinning","children","className","Spin","classNames","styles"],"mappings":";;;;AAYA,MAAMA,IAAoC,CAAC,EAAE,UAAAC,GAAU,UAAAC,GAAU,WAAAC,0BAC9DC,GAAA,EAAK,UAAAH,GAAoB,YAAY,EAAE,MAAMI,EAAWC,EAAO,WAAW,GAAGH,CAAS,EAAA,GACpF,UAAAD,EAAA,CACH;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Layout/PageSpin/index.tsx"],"sourcesContent":["import { Spin } from 'antd';\nimport classNames from 'classnames';\nimport type { ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type PageSpinProps = {\n spinning: boolean;\n children: ReactNode;\n className?: string;\n /** 高度随内容撑开(不抢 flex:1),配合 ModulePageShell fillHeight={false} */\n naturalHeight?: boolean;\n};\n\n/** 模块页 body 区整页 Spin:参与 flex 高度链,遮罩 Filter + 主工作区 */\nconst PageSpin: React.FC<PageSpinProps> = ({\n spinning,\n children,\n className,\n naturalHeight = false,\n}) => (\n <Spin\n spinning={spinning}\n classNames={{\n root: classNames(\n styles['page-spin'],\n naturalHeight && styles['page-spin--natural'],\n className,\n ),\n }}\n >\n {children}\n </Spin>\n);\n\nexport default PageSpin;\n"],"names":["PageSpin","spinning","children","className","naturalHeight","jsx","Spin","classNames","styles"],"mappings":";;;;AAcA,MAAMA,IAAoC,CAAC;AAAA,EACzC,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC,IAAgB;AAClB,MACE,gBAAAC;AAAA,EAACC;AAAA,EAAA;AAAA,IACC,UAAAL;AAAA,IACA,YAAY;AAAA,MACV,MAAMM;AAAA,QACJC,EAAO,WAAW;AAAA,QAClBJ,KAAiBI,EAAO,oBAAoB;AAAA,QAC5CL;AAAA,MAAA;AAAA,IACF;AAAA,IAGD,UAAAD;AAAA,EAAA;AACH;"}
@@ -1,5 +1,6 @@
1
1
  const p = {
2
- "page-spin": "_page-spin_p0vqm_1"
2
+ "page-spin": "_page-spin_scp8x_1",
3
+ "page-spin--natural": "_page-spin--natural_scp8x_7"
3
4
  };
4
5
  export {
5
6
  p as default
@@ -1 +1 @@
1
- {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,36 +1,36 @@
1
- const r = "_drawer_1y3tr_25", e = "_small_1y3tr_56", _ = "_large_1y3tr_68", o = {
2
- "kne-responsive-boundary": "_kne-responsive-boundary_1y3tr_3",
3
- "kne-responsive-scroll": "_kne-responsive-scroll_1y3tr_7",
1
+ const r = "_drawer_1ha0z_25", e = "_small_1ha0z_56", a = "_large_1ha0z_68", _ = {
2
+ "kne-responsive-boundary": "_kne-responsive-boundary_1ha0z_3",
3
+ "kne-responsive-scroll": "_kne-responsive-scroll_1ha0z_7",
4
4
  drawer: r,
5
5
  small: e,
6
- "is-mobile": "_is-mobile_1y3tr_59",
7
- large: _,
8
- "drawer-body-inner": "_drawer-body-inner_1y3tr_68",
9
- "drawer-antd-header": "_drawer-antd-header_1y3tr_85",
10
- "drawer-antd-footer": "_drawer-antd-footer_1y3tr_86",
11
- "drawer-antd-body": "_drawer-antd-body_1y3tr_90",
12
- "drawer-outer": "_drawer-outer_1y3tr_103",
13
- "no-title": "_no-title_1y3tr_119",
14
- "no-footer": "_no-footer_1y3tr_123",
15
- "no-padding": "_no-padding_1y3tr_126",
16
- "drawer-title": "_drawer-title_1y3tr_137",
17
- "drawer-body": "_drawer-body_1y3tr_68",
18
- "body-scroll-off": "_body-scroll-off_1y3tr_171",
19
- "modal-footer-extra": "_modal-footer-extra_1y3tr_210",
20
- "drawer-close": "_drawer-close_1y3tr_225",
21
- "drawer-host": "_drawer-host_1y3tr_239",
22
- "drawer-host-render": "_drawer-host-render_1y3tr_247",
23
- "drawer-panel-host": "_drawer-panel-host_1y3tr_263",
24
- "drawer-panel-body": "_drawer-panel-body_1y3tr_273",
25
- "drawer-form-host": "_drawer-form-host_1y3tr_283",
26
- "drawer-wrapper-mobile": "_drawer-wrapper-mobile_1y3tr_302",
27
- "drawer-wrapper-mobile-vertical": "_drawer-wrapper-mobile-vertical_1y3tr_307",
28
- "drawer-root-mobile": "_drawer-root-mobile_1y3tr_312"
6
+ "is-mobile": "_is-mobile_1ha0z_59",
7
+ large: a,
8
+ "drawer-body-inner": "_drawer-body-inner_1ha0z_68",
9
+ "drawer-antd-header": "_drawer-antd-header_1ha0z_85",
10
+ "drawer-antd-footer": "_drawer-antd-footer_1ha0z_86",
11
+ "drawer-antd-body": "_drawer-antd-body_1ha0z_90",
12
+ "drawer-outer": "_drawer-outer_1ha0z_103",
13
+ "no-title": "_no-title_1ha0z_119",
14
+ "no-footer": "_no-footer_1ha0z_123",
15
+ "no-padding": "_no-padding_1ha0z_126",
16
+ "drawer-title": "_drawer-title_1ha0z_137",
17
+ "drawer-body": "_drawer-body_1ha0z_68",
18
+ "body-scroll-off": "_body-scroll-off_1ha0z_178",
19
+ "modal-footer-extra": "_modal-footer-extra_1ha0z_217",
20
+ "drawer-close": "_drawer-close_1ha0z_232",
21
+ "drawer-host": "_drawer-host_1ha0z_246",
22
+ "drawer-host-render": "_drawer-host-render_1ha0z_254",
23
+ "drawer-panel-host": "_drawer-panel-host_1ha0z_270",
24
+ "drawer-panel-body": "_drawer-panel-body_1ha0z_280",
25
+ "drawer-form-host": "_drawer-form-host_1ha0z_290",
26
+ "drawer-wrapper-mobile": "_drawer-wrapper-mobile_1ha0z_309",
27
+ "drawer-wrapper-mobile-vertical": "_drawer-wrapper-mobile-vertical_1ha0z_314",
28
+ "drawer-root-mobile": "_drawer-root-mobile_1ha0z_319"
29
29
  };
30
30
  export {
31
- o as default,
31
+ _ as default,
32
32
  r as drawer,
33
- _ as large,
33
+ a as large,
34
34
  e as small
35
35
  };
36
36
  //# sourceMappingURL=drawer.module.scss.js.map
@@ -1,10 +1,10 @@
1
1
  const l = {
2
- "modal-tabs-layout": "_modal-tabs-layout_11mt7_2",
3
- "modal-columns-layout": "_modal-columns-layout_11mt7_58",
4
- "modal-columns-layout__col": "_modal-columns-layout__col_11mt7_69",
5
- "modal-scroll-region": "_modal-scroll-region_11mt7_80",
6
- "modal-scroll-region-inner": "_modal-scroll-region-inner_11mt7_121",
7
- "is-inset": "_is-inset_11mt7_126"
2
+ "modal-tabs-layout": "_modal-tabs-layout_d9ufs_3",
3
+ "modal-columns-layout": "_modal-columns-layout_d9ufs_59",
4
+ "modal-columns-layout__col": "_modal-columns-layout__col_d9ufs_70",
5
+ "modal-scroll-region": "_modal-scroll-region_d9ufs_81",
6
+ "modal-scroll-region-inner": "_modal-scroll-region-inner_d9ufs_131",
7
+ "is-inset": "_is-inset_d9ufs_136"
8
8
  };
9
9
  export {
10
10
  l as default
@@ -1,38 +1,38 @@
1
- const a = "_modal_raar2_25", o = "_small_raar2_48", r = "_large_raar2_51", _ = {
2
- "kne-responsive-boundary": "_kne-responsive-boundary_raar2_3",
3
- "kne-responsive-scroll": "_kne-responsive-scroll_raar2_7",
4
- modal: a,
5
- small: o,
6
- large: r,
7
- "modal-body-inner": "_modal-body-inner_raar2_51",
8
- "is-mobile": "_is-mobile_raar2_54",
9
- "modal-container": "_modal-container_raar2_69",
10
- "modal-antd-header": "_modal-antd-header_raar2_84",
11
- "modal-antd-footer": "_modal-antd-footer_raar2_85",
12
- "modal-antd-body": "_modal-antd-body_raar2_89",
13
- "modal-outer": "_modal-outer_raar2_98",
14
- "no-title": "_no-title_raar2_104",
15
- "no-footer": "_no-footer_raar2_109",
16
- "no-padding": "_no-padding_raar2_112",
17
- "modal-title": "_modal-title_raar2_123",
18
- "modal-body": "_modal-body_raar2_51",
19
- "modal-footer": "_modal-footer_raar2_132",
20
- "body-scroll-off": "_body-scroll-off_raar2_159",
21
- "is-embedded-footer": "_is-embedded-footer_raar2_203",
22
- "modal-footer-extra": "_modal-footer-extra_raar2_203",
23
- "modal-footer-actions": "_modal-footer-actions_raar2_224",
24
- "modal-close": "_modal-close_raar2_229",
25
- "modal-host": "_modal-host_raar2_243",
26
- "modal-form-host": "_modal-form-host_raar2_251",
27
- "modal-wrap": "_modal-wrap_raar2_268",
28
- "modal-wrap-centered": "_modal-wrap-centered_raar2_293",
29
- "modal-wrap-fullscreen": "_modal-wrap-fullscreen_raar2_325",
30
- "modal-mask-fullscreen": "_modal-mask-fullscreen_raar2_364"
1
+ const o = "_modal_1jkp8_25", _ = "_small_1jkp8_48", l = "_large_1jkp8_51", a = {
2
+ "kne-responsive-boundary": "_kne-responsive-boundary_1jkp8_3",
3
+ "kne-responsive-scroll": "_kne-responsive-scroll_1jkp8_7",
4
+ modal: o,
5
+ small: _,
6
+ large: l,
7
+ "modal-body-inner": "_modal-body-inner_1jkp8_51",
8
+ "is-mobile": "_is-mobile_1jkp8_54",
9
+ "modal-container": "_modal-container_1jkp8_69",
10
+ "modal-antd-header": "_modal-antd-header_1jkp8_84",
11
+ "modal-antd-footer": "_modal-antd-footer_1jkp8_85",
12
+ "modal-antd-body": "_modal-antd-body_1jkp8_89",
13
+ "modal-outer": "_modal-outer_1jkp8_98",
14
+ "no-title": "_no-title_1jkp8_104",
15
+ "no-footer": "_no-footer_1jkp8_109",
16
+ "no-padding": "_no-padding_1jkp8_112",
17
+ "modal-title": "_modal-title_1jkp8_123",
18
+ "modal-body": "_modal-body_1jkp8_51",
19
+ "modal-footer": "_modal-footer_1jkp8_132",
20
+ "body-scroll-off": "_body-scroll-off_1jkp8_166",
21
+ "is-embedded-footer": "_is-embedded-footer_1jkp8_210",
22
+ "modal-footer-extra": "_modal-footer-extra_1jkp8_210",
23
+ "modal-footer-actions": "_modal-footer-actions_1jkp8_231",
24
+ "modal-close": "_modal-close_1jkp8_236",
25
+ "modal-host": "_modal-host_1jkp8_250",
26
+ "modal-form-host": "_modal-form-host_1jkp8_258",
27
+ "modal-wrap": "_modal-wrap_1jkp8_275",
28
+ "modal-wrap-centered": "_modal-wrap-centered_1jkp8_300",
29
+ "modal-wrap-fullscreen": "_modal-wrap-fullscreen_1jkp8_332",
30
+ "modal-mask-fullscreen": "_modal-mask-fullscreen_1jkp8_371"
31
31
  };
32
32
  export {
33
- _ as default,
34
- r as large,
35
- a as modal,
36
- o as small
33
+ a as default,
34
+ l as large,
35
+ o as modal,
36
+ _ as small
37
37
  };
38
38
  //# sourceMappingURL=style.module.scss.js.map