Skip to content

Commit

Permalink
hook selectedDocId and selectedLocaleId into MTMerge container
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Sep 5, 2018
1 parent 900ec0f commit 1e59238
Show file tree
Hide file tree
Showing 12 changed files with 126 additions and 62 deletions.
Expand Up @@ -169,11 +169,11 @@ public Response prefillProjectVersionByMachineTranslation(

@CheckRole("mt-bulk")
@POST
@Path("project/{projectSlug}/version/{versionSlug}/document/{docId}")
@Path("project/{projectSlug}/version/{versionSlug}/document")
public Response prefillDocumentByMachineTranslation(
@PathParam("projectSlug") String projectSlug,
@PathParam("versionSlug") String versionSlug,
@PathParam("docId") String docId,
@QueryParam("docId") String docId,
MachineTranslationPrefill prefillRequest) {
if (mtServiceURL == null) {
return Response.status(Response.Status.SERVICE_UNAVAILABLE).build();
Expand Down
9 changes: 6 additions & 3 deletions server/zanata-frontend/src/app/actions/version-actions.js
Expand Up @@ -60,7 +60,7 @@ import {
*/

export const toggleMTMergeModal =
createAction(TOGGLE_MT_MERGE_MODAL)
createAction(TOGGLE_MT_MERGE_MODAL, toggle => toggle, (args) => ({ args }))
/** Open or close the TM Merge modal */
export const toggleTMMergeModal =
createAction(TOGGLE_TM_MERGE_MODAL)
Expand Down Expand Up @@ -141,7 +141,10 @@ const toProjectVersionString = (projectVersion) => {
* @returns {APIAction} redux api action object FIXME
*/
export function mergeVersionFromMT (projectSlug, versionSlug, mergeOptions) {
const endpoint = `${apiUrl}/mt/project/${projectSlug}/version/${versionSlug}`
const api = `${apiUrl}/mt/project/${projectSlug}/version/${versionSlug}` +
(mergeOptions.selectedDocId
? `/document?docId=${mergeOptions.selectedDocId}` : '')

/** @type {APITypes} */
const types = [VERSION_MT_MERGE_REQUEST,
{
Expand All @@ -167,7 +170,7 @@ export function mergeVersionFromMT (projectSlug, versionSlug, mergeOptions) {
overwriteFuzzy: true, // mergeOptions.overwriteFuzzy
}
const apiRequest = buildAPIRequest(
endpoint, 'POST', getJsonHeaders(), types, JSON.stringify(serverOptions)
api, 'POST', getJsonHeaders(), types, JSON.stringify(serverOptions)
)
return {
[CALL_API]: apiRequest
Expand Down
Expand Up @@ -96,7 +96,7 @@ storiesOf('MTMergeModal', module)
<MTMergeModal
processStatus={undefined}
allowMultiple={false}
showMTMerge={true}
show={true}
availableLocales={testLocales}
projectSlug='myProject'
versionSlug='myVersion'
Expand Down
24 changes: 19 additions & 5 deletions server/zanata-frontend/src/app/components/MTMerge/MTMergeModal.tsx
Expand Up @@ -15,16 +15,19 @@ import CancellableProgressBar from '../ProgressBar/CancellableProgressBar'
export type MTTranslationStatus = MTTranslationStatus

export interface MTMergeAPIOptions {
selectedDocId?: string
selectedLocales: LocaleId[]
saveAs: MTTranslationStatus
overwriteFuzzy?: boolean
}

// Redux state, ie connect's TStateProps
export type MTMergeModalStateProps = Readonly<{
showMTMerge: boolean
show: boolean
availableLocales: Locale[]
processStatus?: ProcessStatus
docId?: string
localeId?: LocaleId
}>

// Redux dispatch, ie connect's TDispatchProps
Expand Down Expand Up @@ -78,15 +81,20 @@ export class MTMergeModal extends Component<Props, MTMergeUIState> {

public render() {
const {
showMTMerge,
show,
projectSlug,
versionSlug,
availableLocales,
processStatus,
onCancelMTMerge,
queryMTMergeProgress,
docId,
localeId
} = this.props
const enableSubmit = this.state.checkedLocales.length > 0 && !processStatus

const isSingleDocument = docId && localeId
const enableSubmit = isSingleDocument ? true
: (this.state.checkedLocales.length > 0 && !processStatus)
const queryProgress = () => {
queryMTMergeProgress(processStatus ? processStatus.url : '')
}
Expand All @@ -101,7 +109,7 @@ export class MTMergeModal extends Component<Props, MTMergeUIState> {
return (
<Modal
title='Machine Translation Merge'
visible={showMTMerge}
visible={show}
onOk={this.handleOk}
onCancel={this.handleCancel}
destroyOnClose={true}
Expand Down Expand Up @@ -133,6 +141,8 @@ export class MTMergeModal extends Component<Props, MTMergeUIState> {
</p>
: (
<MTMergeOptions
docId={docId}
localeId={localeId}
allowMultiple={this.props.allowMultiple}
availableLocales={availableLocales}
checkedLocales={this.state.checkedLocales}
Expand All @@ -149,8 +159,12 @@ export class MTMergeModal extends Component<Props, MTMergeUIState> {
}

private handleOk = (_: React.MouseEvent<any>) => {
const isSingleDoc = this.props.docId && this.props.localeId
const locales = isSingleDoc && this.props.localeId ?
[this.props.localeId] : this.state.checkedLocales
const opts: MTMergeAPIOptions = {
selectedLocales: this.state.checkedLocales,
selectedDocId: isSingleDoc ? this.props.docId : undefined,
selectedLocales: locales,
saveAs: this.state.saveAs,
overwriteFuzzy: this.state.overwriteFuzzy
}
Expand Down
Expand Up @@ -26,6 +26,8 @@ export type MTMergeOptionsParams = Readonly<{
allowMultiple: boolean
projectSlug: string
versionSlug: string
docId?: string
localeId?: LocaleId
availableLocales: Locale[]
checkedLocales: LocaleId[]
saveAs: MTTranslationStatus
Expand All @@ -46,9 +48,13 @@ export class MTMergeOptions extends Component<Props> {

public render() {
// are all the boxes checked?
const allChecked = this.props.availableLocales.length === this.props.checkedLocales.length
const {
availableLocales, checkedLocales, allowMultiple, docId, localeId
} = this.props
const allChecked = availableLocales.length === checkedLocales.length
// are some of the boxes checked? (not zero, not all)
const someChecked = ![0, this.props.availableLocales.length].includes(this.props.checkedLocales.length)
const someChecked = ![0, availableLocales.length].includes(checkedLocales.length)
const isSingleDocument = docId && localeId

return (
<React.Fragment>
Expand All @@ -57,38 +63,56 @@ export class MTMergeOptions extends Component<Props> {
<br />
<Alert message="Only .po (gettext) and .properties files are supported"
type="info" showIcon/>
{/* Select Languages */}
<h3 className="txt-info mt4 fw5">
<Icon type="global" className="mr2 txt-neutral"/>
{this.props.allowMultiple ? "Languages" : "Language"}
</h3>
{this.props.allowMultiple
? <div>
{/*this is the "check all" checkbox*/}
<div style={{borderBottom: '1px solid #E9E9E9'}}>
<Checkbox
checked={allChecked}
indeterminate={someChecked}
onChange={this.onCheckAllChange}
>
All languages
</Checkbox>
</div>
<br />
<CheckboxGroup
onChange={this.onCheckboxGroupChange} value={this.props.checkedLocales}
>
{this.props.availableLocales.map(loc =>
<Checkbox key={loc.localeId} value={loc.localeId}>
{loc.displayName}
</Checkbox>)}
</CheckboxGroup>
</div>
: <LocaleSelect
locales={this.props.availableLocales}
onChange={this.onSelectChange}
style={{ width: '100%' }}
/>

{isSingleDocument &&
<React.Fragment>
<h3 className="txt-info mt4 fw5">
<Icon type="file" className="mr2 txt-neutral"/>
Document
</h3>
<span className='fw5'>{docId}</span>

<h3 className="txt-info mt4 fw5">
<Icon type="global" className="mr2 txt-neutral"/>
Language
</h3>
<span className='fw5'>{localeId}</span>
</React.Fragment>
}

{!isSingleDocument &&
<React.Fragment>
<h3 className="txt-info mt4 fw5">
<Icon type="global" className="mr2 txt-neutral"/>
{allowMultiple ? "Languages" : "Language"}
</h3>
{allowMultiple
? <div>
{/*this is the "check all" checkbox*/}
<div style={{borderBottom: '1px solid #E9E9E9'}}>
<Checkbox
checked={allChecked}
indeterminate={someChecked}
onChange={this.onCheckAllChange}>
All languages
</Checkbox>
</div>
<br />
<CheckboxGroup
onChange={this.onCheckboxGroupChange} value={checkedLocales}
>
{availableLocales.map(loc =>
<Checkbox key={loc.localeId} value={loc.localeId}>
{loc.displayName}
</Checkbox>)}
</CheckboxGroup>
</div>
: <LocaleSelect
locales={availableLocales}
onChange={this.onSelectChange}
style={{ width: '100%' }} />
}
</React.Fragment>
}

{/* Other options */}
Expand Down
Expand Up @@ -19,16 +19,20 @@ const mapReduxStateToProps = (state: RootState): MTMergeModalStateProps => {
projectVersion: {
locales,
MTMerge: {
showMTMerge,
show,
processStatus,
docId,
localeId
// queryStatus
}
}
} = state
return {
showMTMerge,
show,
availableLocales: locales as Locale[],
processStatus,
docId,
localeId
// queryStatus
}
}
Expand All @@ -45,7 +49,9 @@ const mapDispatchToProps = (dispatch: any): MTMergeModalDispatchProps => {
dispatch(currentMTMergeProcessFinished())
},
onCancel: () => {
dispatch(toggleMTMergeModal())
dispatch(toggleMTMergeModal({MTMerge:
{show: false, docId: undefined, localeId: undefined}
}))
},
onSubmit: (projectSlug, versionSlug, mtMergeOptions) => {
dispatch(mergeVersionFromMT(projectSlug, versionSlug, mtMergeOptions))
Expand Down
3 changes: 2 additions & 1 deletion server/zanata-frontend/src/app/jsf/index.js
Expand Up @@ -56,7 +56,8 @@ const enhancedHistory = syncHistoryWithStore(history, store)

export default function mountReactToJsf () {
// Attaching to window object so modals can be triggered from the JSF page
window.toggleMTMergeModal = () => store.dispatch(toggleMTMergeModal())
window.toggleMTMergeModal = (show, docId, localeId) =>
store.dispatch(toggleMTMergeModal({MTMerge: {show, docId, localeId}}))
window.toggleTMMergeModal = () => store.dispatch(toggleTMMergeModal())
window.toggleTMXExportModal = (show) =>
store.dispatch(showExportTMXModal(show))
Expand Down
4 changes: 3 additions & 1 deletion server/zanata-frontend/src/app/reducers/state.ts
Expand Up @@ -23,10 +23,12 @@ export type RootState = DeepReadonly<{
// TODO verify types
export type ProjectVersionState = {
MTMerge: {
showMTMerge: boolean
show: boolean
triggered: boolean
processStatus?: ProcessStatus
queryStatus?: string
localeId?: LocaleId
docId?: string
}
TMMerge: {
show: boolean
Expand Down
24 changes: 19 additions & 5 deletions server/zanata-frontend/src/app/reducers/version-reducer.js
Expand Up @@ -32,10 +32,12 @@ import { SEVERITY, statusToSeverity } from '../actions/common-actions'
export const defaultState = {
// See mapReduxStateToProps in MTMergeContainer.ts
MTMerge: {
showMTMerge: false,
show: false,
triggered: false,
processStatus: undefined,
queryStatus: undefined,
localeId: undefined,
docId: undefined
},
TMMerge: {
show: false,
Expand All @@ -56,10 +58,18 @@ export const defaultState = {
// Should be fixed by Redux 4: https://github.com/reactjs/redux/pull/2773
/** @type {import('redux').Reducer<ProjectVersionState>} */
const version = handleActions({
[TOGGLE_MT_MERGE_MODAL]: (state, _action) => {
return update(state, {
MTMerge: { showMTMerge: { $set: !state.MTMerge.showMTMerge } }
})
[TOGGLE_MT_MERGE_MODAL]: (state, action) => {
const {show, docId, localeId} = action.payload ? action.payload.MTMerge
: state.MTMerge
return {
...state,
MTMerge: {
...state.MTMerge,
show,
docId,
localeId
}
}
},
[TOGGLE_TM_MERGE_MODAL]: (state, _action) => {
return update(state, {
Expand Down Expand Up @@ -223,6 +233,10 @@ const version = handleActions({
[MT_MERGE_PROCESS_FINISHED]: (state, _action) => {
return update(state, {
// MTMerge: { processStatus: { $set: undefined } },
MTMerge: {
docId: { $set: undefined },
localeId: { $set: undefined }
},
notification: {
$set: {
severity: `${state.MTMerge.processStatus
Expand Down
10 changes: 5 additions & 5 deletions server/zanata-frontend/src/app/reducers/version-reducer.test.js
Expand Up @@ -30,11 +30,11 @@ describe('version-reducer test', () => {
const initial = versionReducer(undefState, dummyAction)
const shown = versionReducer(initial, {
type: TOGGLE_TM_MERGE_MODAL,
payload: { show: true }
payload: { TMMerge: {show: true}}
})
const hidden = versionReducer(shown, {
type: TOGGLE_TM_MERGE_MODAL,
payload: { show: false }
payload: { TMMerge: {show: false}}
})
expect(initial.TMMerge).toEqual({
processStatus: undefined,
Expand Down Expand Up @@ -290,7 +290,7 @@ describe('version-reducer test', () => {
MTMerge: {
processStatus: undefined,
queryStatus: undefined,
showMTMerge: false,
show: false,
triggered: false
},
TMMerge: {
Expand Down Expand Up @@ -339,7 +339,7 @@ describe('version-reducer test', () => {
MTMerge: {
processStatus: undefined,
queryStatus: undefined,
showMTMerge: false,
show: false,
triggered: false
},
TMMerge: {
Expand Down Expand Up @@ -370,7 +370,7 @@ describe('version-reducer test', () => {
MTMerge: {
processStatus: undefined,
queryStatus: undefined,
showMTMerge: false,
show: false,
triggered: false
},
TMMerge: {
Expand Down
Expand Up @@ -418,7 +418,7 @@
</ui:fragment>
<ui:fragment rendered="#{versionHomeAction.canMTDocument(document.docId)}">
<li>
<a href="#" class="i__item--right" onclick="toggleMTMergeModal(); return false">
<a href="#" class="i__item--right" onclick="toggleMTMergeModal(true, '#{document.docId}', '#{versionHomeAction.selectedLocale.localeId}'); return false">
#{msgs['jsf.iteration.MTMerge']}
<i class="i i--translate i__item__icon"></i>
</a>
Expand Down

0 comments on commit 1e59238

Please sign in to comment.