Skip to content

Commit 6399545

Browse files
committed
feat(publish): initial support for dataset publication
proof-of-concept publish button
1 parent cfcad2d commit 6399545

File tree

7 files changed

+76
-13
lines changed

7 files changed

+76
-13
lines changed

app/actions/api.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ export function fetchMyDatasets (page: number = 1, pageSize: number = pageSizeDe
7272
peername: ref.peername,
7373
name: ref.name,
7474
path: ref.path,
75-
isLinked: !!ref.fsiPath
75+
isLinked: !!ref.fsiPath,
76+
published: ref.published
7677
}))
7778
}
7879
}
@@ -413,3 +414,20 @@ export function initDatasetAndFetch (filepath: string, name: string, format: str
413414
return response
414415
}
415416
}
417+
418+
export function publishDataset (peername: string, name: string): ApiActionThunk {
419+
return async (dispatch) => {
420+
const action = {
421+
type: 'publish',
422+
[CALL_API]: {
423+
endpoint: 'publish',
424+
method: 'POST',
425+
segments: {
426+
peername,
427+
name
428+
}
429+
}
430+
}
431+
return dispatch(action)
432+
}
433+
}

app/actions/selections.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ export const setSelectedListItem = (type: string, selectedListItem: string) => {
2121
}
2222
}
2323

24-
export const setWorkingDataset = (peername: string, name: string, isLinked: boolean) => {
24+
export const setWorkingDataset = (peername: string, name: string, isLinked: boolean, published: boolean) => {
2525
return {
2626
type: SELECTIONS_SET_WORKING_DATASET,
2727
payload: {
2828
peername,
2929
name,
30-
isLinked
30+
isLinked,
31+
published
3132
}
3233
}
3334
}

app/components/Dataset.tsx

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ export interface DatasetProps {
4848
setSidebarWidth: (type: string, sidebarWidth: number) => Action
4949
setFilter: (filter: string) => Action
5050
setSelectedListItem: (type: string, activeTab: string) => Action
51-
setWorkingDataset: (peername: string, name: string, isLinked: boolean) => Action
51+
setWorkingDataset: (peername: string, name: string, isLinked: boolean, published: boolean) => Action
52+
publishDataset: (peername: string, name: string) => Action
5253
fetchWorkingDatasetDetails: () => Promise<ApiAction>
5354
fetchWorkingHistory: (page?: number, pageSize?: number) => ApiActionThunk
5455
fetchWorkingStatus: () => Promise<ApiAction>
@@ -167,7 +168,8 @@ export default class Dataset extends React.Component<DatasetProps> {
167168
activeTab,
168169
component: selectedComponent,
169170
commit: selectedCommit,
170-
isLinked
171+
isLinked,
172+
published
171173
} = selections
172174

173175
const { history, status, path } = workingDataset
@@ -179,6 +181,7 @@ export default class Dataset extends React.Component<DatasetProps> {
179181
setSidebarWidth,
180182
setSelectedListItem,
181183
fetchWorkingHistory,
184+
publishDataset,
182185
signout
183186
} = this.props
184187

@@ -208,6 +211,37 @@ export default class Dataset extends React.Component<DatasetProps> {
208211
</div>
209212
)
210213

214+
let publishButton
215+
if (username === workingDataset.peername) {
216+
publishButton = published ? (
217+
<div
218+
className='header-column'
219+
data-tip={`http://localhost:3000/${workingDataset.peername}/${workingDataset.name}`}
220+
onClick={() => { shell.openExternal(`http://localhost:3000/${workingDataset.peername}/${workingDataset.name}`) }}
221+
>
222+
<div className='header-column-icon'>
223+
<FontAwesomeIcon icon={faFolderOpen} size='lg'/>
224+
</div>
225+
<div className='header-column-text'>
226+
<div className='label'>Show on Web</div>
227+
</div>
228+
</div>
229+
) : (
230+
<div
231+
className='header-column'
232+
data-tip={workingDataset.linkpath}
233+
onClick={() => { publishDataset(workingDataset.peername, workingDataset.name) }}
234+
>
235+
<div className='header-column-icon'>
236+
<FontAwesomeIcon icon={faFolderOpen} size='lg'/>
237+
</div>
238+
<div className='header-column-text'>
239+
<div className='label'>Publish</div>
240+
</div>
241+
</div>
242+
)
243+
}
244+
211245
const UserMenu = () => {
212246
const [showMenu, setShowMenu] = React.useState(false)
213247

@@ -264,6 +298,7 @@ export default class Dataset extends React.Component<DatasetProps> {
264298

265299
</div>
266300
{linkButton}
301+
{publishButton}
267302
<UserMenu />
268303
</div>
269304
<div className='columns'>

app/components/DatasetList.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ interface DatasetListProps {
1111
myDatasets: MyDatasets
1212
workingDataset: WorkingDataset
1313
setFilter: (filter: string) => Action
14-
setWorkingDataset: (peername: string, name: string, isLinked: boolean) => Action
14+
setWorkingDataset: (peername: string, name: string, isLinked: boolean, published: boolean) => Action
1515
fetchMyDatasets: (page: number, pageSize: number) => Promise<AnyAction>
1616
setModal: (modal: Modal) => void
1717
}
@@ -50,14 +50,16 @@ export default class DatasetList extends React.Component<DatasetListProps> {
5050
return true
5151
})
5252

53+
console.log(filteredDatasets)
54+
5355
const listContent = filteredDatasets.length > 0
54-
? filteredDatasets.map(({ peername, name, title, isLinked }) => (
56+
? filteredDatasets.map(({ peername, name, title, isLinked, published }) => (
5557
<div
5658
key={`${peername}/${name}`}
5759
className={classNames('sidebar-list-item', 'sidebar-list-item-text', {
5860
'selected': (peername === workingDataset.peername) && (name === workingDataset.name)
5961
})}
60-
onClick={() => setWorkingDataset(peername, name, isLinked)}
62+
onClick={() => setWorkingDataset(peername, name, isLinked, published)}
6163
>
6264
<div className='text-column'>
6365
<div className='text'>{title}</div>

app/containers/DatasetContainer.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import { toggleDatasetList, setSidebarWidth, signout } from '../actions/ui'
88
import {
99
fetchWorkingDatasetDetails,
1010
fetchWorkingStatus,
11-
fetchWorkingHistory
11+
fetchWorkingHistory,
12+
publishDataset
1213
} from '../actions/api'
1314
import {
1415
setActiveTab,
@@ -57,6 +58,7 @@ const DatasetContainer = connect(
5758
fetchWorkingDatasetDetails,
5859
fetchWorkingStatus,
5960
fetchWorkingHistory,
61+
publishDataset,
6062
signout
6163
},
6264
mergeProps

app/models/store.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export interface Selections {
6565
peername: string | null
6666
name: string | null
6767
isLinked: boolean
68+
published: boolean
6869
activeTab: string
6970
component: SelectedComponent
7071
commit: string
@@ -87,6 +88,7 @@ export interface DatasetSummary {
8788
name: string
8889
path: string
8990
isLinked: boolean
91+
published: boolean
9092
}
9193

9294
// list of local datasets

app/reducers/selections.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const initialState: Selections = {
1111
peername: localStore().getItem('peername') || '',
1212
name: localStore().getItem('name') || '',
1313
isLinked: localStore().getItem('isLinked') === 'true',
14+
published: localStore().getItem('published') === 'true',
1415
activeTab: localStore().getItem('activeTab') || 'status',
1516
component: localStore().getItem('component') as SelectedComponent || '',
1617
commit: localStore().getItem('commit') || '',
@@ -44,21 +45,23 @@ export default (state = initialState, action: AnyAction) => {
4445
return state
4546

4647
case SELECTIONS_SET_WORKING_DATASET:
47-
const { peername, name, isLinked } = action.payload
48+
const { peername, name, isLinked, published } = action.payload
4849
localStore().setItem('peername', peername)
4950
localStore().setItem('name', name)
5051
localStore().setItem('isLinked', isLinked)
51-
return Object.assign({}, state, { peername, name, isLinked })
52+
localStore().setItem('published', published)
53+
return Object.assign({}, state, { peername, name, isLinked, published })
5254

5355
case LIST_SUCC:
5456
// if there is no peername + name in selections, use the first one on the list
5557
if (state.peername === '' && state.name === '') {
5658
if (action.payload.data.length === 0) return state
57-
const { peername: firstPeername, name: firstName, isLinked: firstIsLinked } = action.payload.data[0]
59+
const { peername: firstPeername, name: firstName, isLinked: firstIsLinked, published } = action.payload.data[0]
5860
localStore().setItem('peername', firstPeername)
5961
localStore().setItem('name', firstName)
6062
localStore().setItem('isLinked', firstIsLinked)
61-
return Object.assign({}, state, { peername: firstPeername, name: firstName, isLinked: firstIsLinked })
63+
localStore().setItem('published', published)
64+
return Object.assign({}, state, { peername: firstPeername, name: firstName, isLinked: firstIsLinked, published })
6265
} else {
6366
return state
6467
}

0 commit comments

Comments
 (0)