-
-
-
-
-
-
+
-
-
+
+
+
)
}
diff --git a/src/components/editor/MovieInterfaceForm.jsx b/src/components/editor/MovieInterfaceForm.jsx
new file mode 100644
index 0000000..9d8202f
--- /dev/null
+++ b/src/components/editor/MovieInterfaceForm.jsx
@@ -0,0 +1,105 @@
+import React, { Component } from 'react'
+import { PropTypes, connect, Link } from '../../family'
+import { moveInterface } from '../../actions/interface'
+
+const OP_MOVE = 1
+const OP_COPY = 2
+
+class MoveInterfaceForm extends Component {
+ static contextTypes = {
+ rmodal: PropTypes.instanceOf(Component),
+ onAddInterface: PropTypes.func.isRequired,
+ onUpdateInterface: PropTypes.func.isRequired
+ }
+ static propTypes = {
+ title: PropTypes.string.isRequired,
+ repository: PropTypes.object.isRequired,
+ itfId: PropTypes.number.isRequired,
+ moveInterface: PropTypes.func.isRequired
+ }
+ constructor (props) {
+ super(props)
+ const { repository } = props
+ let modId = 0
+ if (repository.modules.length > 0) {
+ modId = repository.modules[0].id
+ }
+ this.state = {
+ op: OP_MOVE, // 1 move, 2 copy
+ modId
+ }
+ }
+ render () {
+ const { rmodal } = this.context
+ const { repository } = this.props
+ const { modId, op } = this.state
+ return (
+
+
+ {this.props.title}
+
+
+
+ )
+ }
+ componentDidUpdate () {
+ this.context.rmodal.reposition()
+ }
+ handleSubmit = (e) => {
+ e.preventDefault()
+ const params = {
+ modId: this.state.modId,
+ op: this.state.op,
+ itfId: this.props.itfId
+ }
+ this.props.moveInterface(params, () => {
+ let { rmodal } = this.context
+ if (rmodal) rmodal.resolve()
+ })
+ }
+}
+
+const mapStateToProps = (state) => ({
+})
+const mapDispatchToProps = ({
+ moveInterface
+})
+export default connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(MoveInterfaceForm)
diff --git a/src/components/editor/PropertyList.tsx b/src/components/editor/PropertyList.tsx
index 7a6e797..5c08eb9 100644
--- a/src/components/editor/PropertyList.tsx
+++ b/src/components/editor/PropertyList.tsx
@@ -1,10 +1,16 @@
import React, { Component } from 'react'
import { PropTypes, Link } from '../../family'
-import { Tree, SmartTextarea, RModal, RSortable, CopyToClipboard } from '../utils'
+import {
+ Tree,
+ SmartTextarea,
+ RModal,
+ RSortable,
+ CopyToClipboard
+} from '../utils'
import PropertyForm from './PropertyForm'
import Importer from './Importer'
import Previewer from './InterfacePreviewer'
-import { GoPlus, GoTrashcan, GoQuestion } from 'react-icons/go'
+import { GoPlus, GoTrashcan, GoQuestion, GoChevronDown, GoChevronRight } from 'react-icons/go'
import { rptFromStr2Num } from './InterfaceSummary'
import './PropertyList.css'
import { ButtonGroup, Button, Checkbox } from '@material-ui/core'
@@ -14,32 +20,34 @@ import Mock from 'mockjs'
import JSON5 from 'json5'
import { elementInViewport } from 'utils/ElementInViewport'
-const mockProperty = process.env.NODE_ENV === 'development'
- ? () => Mock.mock({
- 'scope|1': ['request', 'response'],
- name: '@WORD(6)',
- 'type|1': ['String', 'Number', 'Boolean'],
- 'value|1': ['@INT', '@FLOAT', '@TITLE', '@NAME'],
- description: '@CSENTENCE',
- parentId: -1,
- interfaceId: '@NATURAL',
- moduleId: '@NATURAL',
- repositoryId: '@NATURAL',
- })
- : () => ({
- scope: 'response',
- name: '',
- type: 'String',
- value: '',
- description: '',
- parentId: -1,
- interfaceId: undefined,
- moduleId: undefined,
- repositoryId: undefined,
- })
+const mockProperty =
+ process.env.NODE_ENV === 'development'
+ ? () =>
+ Mock.mock({
+ 'scope|1': ['request', 'response'],
+ name: '@WORD(6)',
+ 'type|1': ['String', 'Number', 'Boolean'],
+ 'value|1': ['@INT', '@FLOAT', '@TITLE', '@NAME'],
+ description: '@CSENTENCE',
+ parentId: -1,
+ interfaceId: '@NATURAL',
+ moduleId: '@NATURAL',
+ repositoryId: '@NATURAL',
+ })
+ : () => ({
+ scope: 'response',
+ name: '',
+ type: 'String',
+ value: '',
+ description: '',
+ parentId: -1,
+ interfaceId: undefined,
+ moduleId: undefined,
+ repositoryId: undefined,
+ })
export const RequestPropertyListPreviewer = (props: any) => (
-
+
)
export const ResponsePropertyListPreviewer = (props: any) => (
@@ -60,19 +68,17 @@ class SortableTreeTableHeader extends Component
{
{/* DONE 2.1 每列增加帮助 Tip */}
- {editable && (
-
- {
- e.preventDefault()
- handleClickCreatePropertyButton()
- }}
- >
-
-
-
- )}
+
+ {
+ e.preventDefault()
+ handleClickCreatePropertyButton()
+ }}
+ >
+ {editable && }
+
+
名称
必选
类型
@@ -108,8 +114,13 @@ const PropertyLabel = (props: any) => {
}
}
+// const PropertyArrow = (props: { property: any }) => {}
+
const getFormattedValue = (itf: any) => {
- if ((itf.type === 'Array' || itf.type === 'Object' || itf.type === 'String') && itf.value) {
+ if (
+ (itf.type === 'Array' || itf.type === 'Object' || itf.type === 'String') &&
+ itf.value
+ ) {
try {
const formatted = JSON.stringify(JSON5.parse(itf.value), undefined, 2)
return formatted
@@ -120,17 +131,53 @@ const getFormattedValue = (itf: any) => {
return itf.value || ''
}
}
-
-class SortableTreeTableRow extends Component
{
+interface SortableTreeTableRowState {
+ property: {
+ children: any[];
+ [k: string]: any;
+ }
+ interfaceId: number
+ childrenAdded: boolean
+ childrenExpandingIdList: number[]
+}
+interface SortableTreeTableRowProps {
+ /** 当前层级是不是展开 */
+ isExpanding: boolean
+ interfaceId: number
+ [k: string]: any
+}
+class SortableTreeTableRow extends Component<
+ SortableTreeTableRowProps,
+ SortableTreeTableRowState
+> {
focusNameInput: HTMLInputElement | undefined = undefined
- state = {
- property: { children: [] },
- childrenAdded: false,
+ constructor(props: SortableTreeTableRowProps) {
+ super(props)
+ this.state = {
+ property: { children: [] },
+ childrenAdded: false,
+ childrenExpandingIdList: [],
+ interfaceId: -1,
+ }
}
static getDerivedStateFromProps(nextProps: any, prevState: any) {
return {
+ interfaceId: nextProps.interfaceId,
property: nextProps.property,
- childrenAdded: nextProps.property.children.length > prevState.property.children.length,
+ childrenAdded:
+ nextProps.property.children.length > prevState.property.children.length,
+ childrenExpandingIdList:
+ nextProps.interfaceId !== prevState.interfaceId
+ ? nextProps.property.children
+ // 默认展现 0,1,2 三个层级
+ .filter(
+ (item: any) =>
+ item.children &&
+ item.children.length > 0 &&
+ nextProps.property.depth < 1
+ )
+ .map((item: any) => item.id)
+ : prevState.childrenExpandingIdList,
}
}
componentDidMount() {
@@ -143,141 +190,289 @@ class SortableTreeTableRow extends Component {
if (this.focusNameInput && this.state.childrenAdded) {
this.focusNameInput.focus()
if (!elementInViewport(this.focusNameInput)) {
- this.focusNameInput.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })
+ this.focusNameInput.scrollIntoView({
+ behavior: 'smooth',
+ block: 'nearest',
+ inline: 'nearest',
+ })
}
}
}
render() {
- const { property, editable, handleClickCreateChildPropertyButton, highlightId,
- handleDeleteMemoryProperty, handleChangePropertyField, handleSortProperties } = this.props
+ const {
+ property,
+ isExpanding,
+ editable,
+ handleClickCreateChildPropertyButton,
+ highlightId,
+ handleDeleteMemoryProperty,
+ handleChangePropertyField,
+ handleSortProperties,
+ } = this.props
return (
-
-
- {property.children.sort((a: any, b: any) => a.priority - b.priority).map((item: any) =>
-
-
- {editable &&
-
- {(item.type === 'Object' || item.type === 'Array')
- ?
{ e.preventDefault(); handleClickCreateChildPropertyButton(item) }}
+ isExpanding && (
+
+
+ {property.children
+ .sort((a: any, b: any) => a.priority - b.priority)
+ .map((item: any) => {
+ const childrenIsExpanding = this.state.childrenExpandingIdList.includes(
+ item.id
+ )
+ return (
+
+
+
+ {(item.type === 'Object' || item.type === 'Array') &&
+ item.children &&
+ item.children.length ? (
+ {
+ e.preventDefault()
+ this.setState(prev => ({
+ ...prev,
+ childrenExpandingIdList: childrenIsExpanding
+ ? prev.childrenExpandingIdList.filter(
+ id => id !== item.id
+ )
+ : [...prev.childrenExpandingIdList, item.id],
+ }))
+ }}
+ >
+ {childrenIsExpanding ? (
+
+ ) : (
+
+ )}
+
+ ) : null}
+ {editable && (
+ <>
+ {item.type === 'Object' || item.type === 'Array' ? (
+ {
+ e.preventDefault()
+ handleClickCreateChildPropertyButton(item)
+ this.setState(prev => ({
+ ...prev,
+ childrenExpandingIdList: _.uniq([
+ ...prev.childrenExpandingIdList,
+ item.id,
+ ]),
+ }))
+ }}
+ >
+
+
+ ) : null}
+ handleDeleteMemoryProperty(e, item)}
+ >
+
+
+ >
+ )}
+
+
-
-
- : null}
- handleDeleteMemoryProperty(e, item)}>
-
- }
-
- {!editable
- ?
- <>
-
{item.name}
- {item.scope === 'request' && item.depth === 0 ?
-
: null}
- >
- :
{
- if (item.id === highlightId) {
- this.focusNameInput = input
- }
- }}
- value={item.name}
- onChange={e => handleChangePropertyField(item.id, 'name', e.target.value)}
- className="form-control editable"
- spellCheck={false}
- placeholder=""
- />
- }
-
-
-
- handleChangePropertyField(
- item.id,
- 'required',
- e.target.checked
- )
- }
- color="primary"
- inputProps={{
- 'aria-label': '必选',
- }}
- />
-
+ {!editable ? (
+ <>
+
+
+ {item.name}
+
+
+ {item.scope === 'request' && item.depth === 0 ? (
+
+ ) : null}
+ >
+ ) : (
+
{
+ if (item.id === highlightId) {
+ this.focusNameInput = input
+ }
+ }}
+ value={item.name}
+ onChange={e =>
+ handleChangePropertyField(
+ item.id,
+ 'name',
+ e.target.value
+ )
+ }
+ className="form-control editable"
+ spellCheck={false}
+ placeholder=""
+ />
+ )}
+
+
+
+ handleChangePropertyField(
+ item.id,
+ 'required',
+ e.target.checked
+ )
+ }
+ color="primary"
+ inputProps={{
+ 'aria-label': '必选',
+ }}
+ />
+
-
- {!editable
- ? {item.type}
- :
- }
-
-
- {!editable
- ? {item.rule}
- : handleChangePropertyField(item.id, 'rule', e.target.value)}
- className="form-control editable"
- spellCheck={false}
- placeholder=""
- />
- }
-
-
- {!editable
- ? {getFormattedValue(item)}
- : handleChangePropertyField(item.id, 'value', e.target.value)}
- rows="1"
- className="form-control editable"
- spellCheck={false}
- placeholder=""
- />
- }
-
-
- {!editable
- ? {item.description}
- : handleChangePropertyField(item.id, 'description', e.target.value)}
- rows="1"
- className="form-control editable"
- spellCheck={false}
- placeholder=""
- />
- }
-
-
- {item.children && item.children.length ?
: null}
-
- )}
-
-
+
+ {!editable ? (
+
+ {item.type}
+
+ ) : (
+
+ )}
+
+
+ {!editable ? (
+ {item.rule}
+ ) : (
+
+ handleChangePropertyField(
+ item.id,
+ 'rule',
+ e.target.value
+ )
+ }
+ className="form-control editable"
+ spellCheck={false}
+ placeholder=""
+ />
+ )}
+
+
+ {!editable ? (
+
+
+ {getFormattedValue(item)}
+
+
+ ) : (
+
+ handleChangePropertyField(
+ item.id,
+ 'value',
+ e.target.value
+ )
+ }
+ rows="1"
+ className="form-control editable"
+ spellCheck={false}
+ placeholder=""
+ />
+ )}
+
+
+ {!editable ? (
+
+ {item.description}
+
+ ) : (
+
+ handleChangePropertyField(
+ item.id,
+ 'description',
+ e.target.value
+ )
+ }
+ rows="1"
+ className="form-control editable"
+ spellCheck={false}
+ placeholder=""
+ />
+ )}
+
+
+ {item.children && item.children.length ? (
+
+ ) : null}
+
+ )
+ })}
+
+
+ )
)
}
}
-
class SortableTreeTable extends Component {
render() {
const { root, editable } = this.props
return (
-
+
)
}
@@ -312,11 +507,23 @@ class PropertyList extends Component {
}
}
render() {
- const { title, label, scope, properties = [], repository = {}, mod = {}, itf = {} } = this.props
- if (!itf.id) { return null }
+ const {
+ title,
+ label,
+ scope,
+ properties = [],
+ repository = {},
+ mod = {},
+ itf = {},
+ } = this.props
+ if (!itf.id) {
+ return null
+ }
const { editable, requestParamsType } = this.props // itf.locker && (itf.locker.id === auth.id)
const pos = rptFromStr2Num(requestParamsType)
- let scopedProperties = properties.map((property: any) => ({ ...property })).filter((property: any) => property.scope === scope)
+ let scopedProperties = properties
+ .map((property: any) => ({ ...property }))
+ .filter((property: any) => property.scope === scope)
if (scope === 'request' && editable) {
scopedProperties = scopedProperties.filter((s: any) => s.pos === pos)
}
@@ -328,10 +535,17 @@ class PropertyList extends Component {
{editable && [
- ,
- ,
+ ,
+ ,
]}
-
@@ -340,42 +554,77 @@ class PropertyList extends Component
{
- {this.state.previewer &&
}
+ {this.state.previewer && (
+
+ )}
this.setState({ createProperty: false })}
onResolve={this.handleCreatePropertySucceeded}
>
-
+
this.setState({ createChildProperty: false })}
onResolve={this.handleCreatePropertySucceeded}
>
-
+
- this.setState({ importer: false })} onResolve={this.handleCreatePropertySucceeded}>
-
+ this.setState({ importer: false })}
+ onResolve={this.handleCreatePropertySucceeded}
+ >
+
)
}
handleClickCreatePropertyButton = () => {
this.handleClickCreateChildPropertyButton()
- }
+ };
// handlefocused = () => {
// this.setState({ highlightId: undefined })
// }
@@ -399,35 +648,37 @@ class PropertyList extends Component {
handleAddMemoryProperty(child, () => {
/** empty */
})
- }
+ };
handleClickImporterButton = () => {
this.setState({ importer: true })
- }
+ };
handleClickPreviewerButton = () => {
this.setState({ previewer: !this.state.previewer })
- }
+ };
handleChangePropertyField = (id: any, key: any, value: any) => {
const { handleChangeProperty } = this.props
const { properties } = this.props
const property = properties.find((property: any) => property.id === id)
handleChangeProperty({ ...property, [key]: value })
- }
+ };
handleCreatePropertySucceeded = () => {
/** empty */
- }
+ };
handleDeleteMemoryProperty = (e: any, property: any) => {
e.preventDefault()
const { handleDeleteMemoryProperty } = this.props
handleDeleteMemoryProperty(property)
- }
+ };
handleSortProperties = (_: any, sortable: any) => {
const { properties } = this.props
const ids = sortable.toArray()
ids.forEach((id: any, index: any) => {
- const property = properties.find((item: any) => item.id === id || item.id === +id)
+ const property = properties.find(
+ (item: any) => item.id === id || item.id === +id
+ )
property.priority = index + 1
})
- }
+ };
}
export default PropertyList
diff --git a/src/components/editor/RepositoryEditor.sass b/src/components/editor/RepositoryEditor.sass
index 66b2e30..e762336 100644
--- a/src/components/editor/RepositoryEditor.sass
+++ b/src/components/editor/RepositoryEditor.sass
@@ -3,7 +3,7 @@
.RepositoryEditor
> .header
position: relative
- padding: 2rem
+ padding: 2rem 2rem 1rem 2rem
background-color: #fafbfc
> .title
font-size: 2rem
@@ -89,19 +89,7 @@
.DuplicatedInterfacesWarning
margin-top: 1rem
- .alert.alert-warning
- margin-bottom: .5rem
- .title
- margin-right: 1rem
- .icon
- font-size: 1.4rem
- margin-right: .5rem
- .msg
- font-weight: bold
- margin-right: 1rem
- .itf
- a
- margin-right: 1rem
+
.ModuleList
margin: 0
@@ -351,8 +339,8 @@
margin-bottom: -1px
.th, .td
&.operations
- width: 4.5rem
- min-width: 4.5rem
+ padding: .5rem
+ width: 1rem
&.name
width: 20rem
flex-grow: 3
@@ -372,7 +360,6 @@
color: $brand
.td
&.operations
- padding: .5rem .75rem
height: auto
line-height: 1
justify-content: flex-end
@@ -390,6 +377,8 @@
&.payload.name
justify-content: space-between
position: relative
+ .name-wrapper
+ flex-grow: 1
@for $i from 1 through 42
&.depth-#{$i}
padding-left: $i * 1rem + 0.75rem
@@ -416,7 +405,11 @@
&.payload.desc
word-break: break-word
.SortableTreeTable.editable
- .flex-row
+ .flex-row
+ .th, .td
+ &.operations
+ width: 4.5rem
+ padding: .5rem .75rem
.td
&.payload
padding: 0
diff --git a/src/components/editor/RepositoryEditor.tsx b/src/components/editor/RepositoryEditor.tsx
index d2af36a..9cdef8d 100644
--- a/src/components/editor/RepositoryEditor.tsx
+++ b/src/components/editor/RepositoryEditor.tsx
@@ -8,11 +8,42 @@ import ModuleList from './ModuleList'
import InterfaceList from './InterfaceList'
import InterfaceEditor from './InterfaceEditor'
import DuplicatedInterfacesWarning from './DuplicatedInterfacesWarning'
-import { addRepository, updateRepository, clearRepository, fetchRepository } from '../../actions/repository'
-import { addModule, updateModule, deleteModule, sortModuleList } from '../../actions/module'
-import { addInterface, updateInterface, deleteInterface, lockInterface, unlockInterface, sortInterfaceList } from '../../actions/interface'
-import { addProperty, updateProperty, deleteProperty, updateProperties, sortPropertyList } from '../../actions/property'
-import { GoRepo, GoPencil, GoVersions, GoPlug, GoDatabase, GoJersey, GoLinkExternal } from 'react-icons/go'
+import {
+ addRepository,
+ updateRepository,
+ clearRepository,
+ fetchRepository
+} from '../../actions/repository'
+import {
+ addModule,
+ updateModule,
+ deleteModule,
+ sortModuleList
+} from '../../actions/module'
+import {
+ addInterface,
+ updateInterface,
+ deleteInterface,
+ lockInterface,
+ unlockInterface,
+ sortInterfaceList
+} from '../../actions/interface'
+import {
+ addProperty,
+ updateProperty,
+ deleteProperty,
+ updateProperties,
+ sortPropertyList
+} from '../../actions/property'
+import {
+ GoRepo,
+ GoPlug,
+ GoDatabase,
+ GoJersey,
+ GoChecklist,
+ GoLinkExternal,
+ GoPencil
+} from 'react-icons/go'
import './RepositoryEditor.css'
import ExportPostmanForm from '../repository/ExportPostmanForm'
@@ -69,20 +100,34 @@ class RepositoryEditor extends Component {
// }
}
render() {
- const { location: { params }, auth } = this.props
+ const {
+ location: { params },
+ room,
+ auth,
+ } = this.props
let { repository } = this.props
- if (!repository.fetching && !repository.data) { return 未找到对应仓库
}
- if (repository.fetching || !repository.data || !repository.data.id) { return }
+ if (!repository.fetching && !repository.data) {
+ return 未找到对应仓库
+ }
+ if (repository.fetching || !repository.data || !repository.data.id) {
+ return
+ }
repository = repository.data
if (repository.name) {
document.title = `RAP2 ${repository.name}`
}
- const mod = repository && repository.modules && repository.modules.length
- ? (repository.modules.find((item: any) => item.id === +params.mod) || repository.modules[0]) : {}
- const itf = mod.interfaces && mod.interfaces.length
- ? (mod.interfaces.find((item: any) => item.id === +params.itf) || mod.interfaces[0]) : {}
+ const mod =
+ repository && repository.modules && repository.modules.length
+ ? repository.modules.find((item: any) => item.id === +params.mod) ||
+ repository.modules[0]
+ : {}
+ const itf =
+ mod.interfaces && mod.interfaces.length
+ ? mod.interfaces.find((item: any) => item.id === +params.itf) ||
+ mod.interfaces[0]
+ : {}
const properties = itf.properties || []
const ownerlink = repository.organization
@@ -90,31 +135,87 @@ class RepositoryEditor extends Component {
: `/repository/joined?user=${repository.owner.id}`
const isOwned = repository.owner.id === auth.id
- const isJoined = repository.members.find((item: any) => item.id === auth.id)
+ const isJoined = repository.members.find(
+ (item: any) => item.id === auth.id
+ )
return (
- {repository.organization ? repository.organization.name : repository.owner.fullname}
+
+ {repository.organization
+ ? repository.organization.name
+ : repository.owner.fullname}
+
/
{repository.name}
{/* 编辑权限:拥有者或者成员 */}
- {isOwned || isJoined
- ?
this.setState({ update: true })}> 编辑
- : null
- }
-
this.setState({ update: false })} onResolve={this.handleUpdate}>
-
+ {isOwned || isJoined ? (
+ this.setState({ update: true })}
+ >
+ 编辑
+
+ ) : null}
+
+ {
+ ok && this.handleUpdate()
+ this.setState({ update: false })
+ }}
+ title="编辑仓库"
+ repository={repository}
+ />
- 插件
- 数据
- 测试
- this.setState({ exportPostman: true })}> 导出Postman Collection
+
+ 插件
+
+
+ 数据
+
+
+ 测试
+
+ {room &&
+ room[repository.id] &&
+ typeof room[repository.id].coverage !== 'undefined' && (
+
+ Room用例覆盖:{' '}
+ {Math.round(room[repository.id].coverage * 100)}%
+
+ )}
+ this.setState({ exportPostman: true })}
+ >
+ 导出Postman Collection
+
this.setState({ exportPostman: false })}
@@ -125,47 +226,36 @@ class RepositoryEditor extends Component {
{repository.description}
- {this.renderRelatedProjects()}
)
}
- renderRelatedProjects() {
- const { repository } = this.props
- const { collaborators } = repository.data
- return (
-
- {collaborators &&
- Array.isArray(collaborators) &&
- collaborators.map(collab => (
-
-
-
- 协同
-
-
- {collab.name}
-
-
- ))}
-
- )
- }
handleUpdate = () => {
const { pathname, hash, search } = this.props.router.location
this.props.replace(pathname + search + hash)
- }
+ };
}
// 容器组件
@@ -174,7 +264,7 @@ const mapStateToProps = (state: RootState) => ({
repository: state.repository,
router: state.router,
})
-const mapDispatchToProps = ({
+const mapDispatchToProps = {
onFetchRepository: fetchRepository,
onAddRepository: addRepository,
onUpdateRepository: updateRepository,
@@ -195,7 +285,7 @@ const mapDispatchToProps = ({
onDeleteProperty: deleteProperty,
onSortPropertyList: sortPropertyList,
replace,
-})
+}
export default connect(
mapStateToProps,
mapDispatchToProps
diff --git a/src/components/home/Home.tsx b/src/components/home/Home.tsx
index 1c9ab43..ec40261 100644
--- a/src/components/home/Home.tsx
+++ b/src/components/home/Home.tsx
@@ -29,10 +29,10 @@ const Home = ({ owned, joined, logs }: any) => {
return (
-
+
-
+
diff --git a/src/components/organization/OrganizationForm.tsx b/src/components/organization/OrganizationForm.tsx
index 351f08c..fff195b 100644
--- a/src/components/organization/OrganizationForm.tsx
+++ b/src/components/organization/OrganizationForm.tsx
@@ -76,7 +76,7 @@ function OrganizationForm(props: Props) {
return (