Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Merge branch 'master' into ZNTA-1166-webhook
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Sep 22, 2016
2 parents b7e271f + baf5cca commit 8a4b6ac
Show file tree
Hide file tree
Showing 78 changed files with 2,094 additions and 1,919 deletions.
10 changes: 9 additions & 1 deletion docker/rundev.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,20 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
# change to top of the git working directory
cd $DIR/../
ZANATA_WAR=$(echo $PWD/zanata-war/target/zanata-*.war)

if [ -f "$ZANATA_WAR" ]
then
chcon -Rt svirt_sandbox_file_t "$ZANATA_WAR"
else
echo "===== NO war file found. Please build Zanata war first ====="
exit 1
fi

# volume mapping for zanata server files
ZANATA_DIR=$HOME/docker-volumes/zanata
# create the data directory and set permissions (SELinux)
mkdir -p $ZANATA_DIR && chcon -Rt svirt_sandbox_file_t "$ZANATA_DIR"
# make zanata directory and standalone.xml file accessible to docker containers (SELinux)
chcon -Rt svirt_sandbox_file_t "$ZANATA_WAR"

# build the docker dev image
docker build -t zanata/server-dev docker/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ public class GlossaryPushTest extends ZanataTestCase {
private ClientWorkFlow clientWorkFlow;
private File projectRootPath;
private String userConfigPath;
private String basicUserConfigPath;

private String pushCommand = "mvn -U --batch-mode zanata:glossary-push " +
"-Dglossary.lang=fr -Dzanata.file=compendium_fr.po " +
Expand All @@ -64,7 +63,6 @@ public void before() {
clientWorkFlow = new ClientWorkFlow();
projectRootPath = clientWorkFlow.getProjectRootPath("glossary");
userConfigPath = ClientWorkFlow.getUserConfigPath("glossarist");
basicUserConfigPath = ClientWorkFlow.getUserConfigPath("translator");
}

@Test(timeout = ZanataTestCase.MAX_SHORT_TEST_DURATION)
Expand All @@ -85,7 +83,7 @@ public void successfulGlossaryPush() throws Exception {

editorPage.searchGlossary("filesystem");

assertThat(editorPage.getGlossaryResultTable().get(1).get(1))
assertThat(editorPage.getGlossaryResultTable().get(1).get(2))
.isEqualTo("système de fichiers")
.as("The first glossary result is correct");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
@Slf4j
public class InvalidGlossaryPushTest extends ZanataTestCase {

private String pushCommand = "mvn --batch-mode zanata:glossary-push -Dglossary.lang=fr -Dzanata.glossaryFile=compendium_fr_invalid.po -Dzanata.userConfig=";
private String pushCommand = "mvn --batch-mode zanata:glossary-push -Dglossary.lang=fr -Dzanata.file=compendium_fr_invalid.po -Dzanata.userConfig=";
private ClientWorkFlow clientWorkFlow;
private String userConfigPath;
private File projectRootPath;
Expand Down
122 changes: 95 additions & 27 deletions zanata-frontend/src/frontend/app/actions/glossary.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ export const PAGE_SIZE_SELECTION = [20, 50, 100, 300, 500]
// 500 by default
export const PAGE_SIZE_DEFAULT = last(PAGE_SIZE_SELECTION)

export const GLOSSARY_PERMISSION_REQUEST = 'GLOSSARY_PERMISSION_REQUEST'
export const GLOSSARY_PERMISSION_SUCCESS = 'GLOSSARY_PERMISSION_SUCCESS'
export const GLOSSARY_PERMISSION_FAILURE = 'GLOSSARY_PERMISSION_FAILURE'
export const GLOSSARY_UPDATE_FILTER = 'GLOSSARY_UPDATE_FILTER'
export const GLOSSARY_UPDATE_LOCALE = 'GLOSSARY_UPDATE_LOCALE'
export const GLOSSARY_INIT_STATE_FROM_URL = 'GLOSSARY_INIT_STATE_FROM_URL'
Expand Down Expand Up @@ -60,6 +63,14 @@ export const GLOSSARY_DELETE_ALL_FAILURE = 'GLOSSARY_DELETE_ALL_FAILURE'
export const GLOSSARY_EXPORT_REQUEST = 'GLOSSARY_EXPORT_REQUEST'
export const GLOSSARY_EXPORT_SUCCESS = 'GLOSSARY_EXPORT_SUCCESS'
export const GLOSSARY_EXPORT_FAILURE = 'GLOSSARY_EXPORT_FAILURE'

export const GLOSSARY_GET_QUALIFIED_NAME_REQUEST =
'GLOSSARY_GET_QUALIFIED_NAME_REQUEST'
export const GLOSSARY_GET_QUALIFIED_NAME_SUCCESS =
'GLOSSARY_GET_QUALIFIED_NAME_SUCCESS'
export const GLOSSARY_GET_QUALIFIED_NAME_FAILURE =
'GLOSSARY_GET_QUALIFIED_NAME_FAILURE'

export const glossaryUpdateLocale = createAction(GLOSSARY_UPDATE_LOCALE)
export const glossaryUpdateFilter = createAction(GLOSSARY_UPDATE_FILTER)
export const glossaryUpdateField = createAction(GLOSSARY_UPDATE_FIELD)
Expand All @@ -86,7 +97,8 @@ const getGlossaryTerms = (state) => {
src = DEFAULT_LOCALE.localeId,
locale = '',
filter = '',
sort = ''
sort = '',
qualifiedName
} = state.glossary
const query = state.routing.location.query

Expand All @@ -103,9 +115,10 @@ const getGlossaryTerms = (state) => {
const filterQuery = filter ? `&filter=${filter}` : ''
const sortQuery = sort
? `&sort=${GlossaryHelper.convertSortToParam(sort)}` : ''
const qualifiedNameQuery = '&qualifiedName=' + qualifiedName
const endpoint = window.config.baseUrl + window.config.apiRoot +
'/glossary/entries' + srcQuery +
localeQuery + pageQuery + filterQuery + sortQuery
localeQuery + pageQuery + filterQuery + sortQuery + qualifiedNameQuery

const apiTypes = [
GLOSSARY_TERMS_REQUEST,
Expand All @@ -131,9 +144,9 @@ const getGlossaryTerms = (state) => {
}
}

const getGlossaryStats = (dispatch, resetTerms) => {
const getGlossaryStats = (dispatch, qualifiedName, resetTerms) => {
const endpoint = window.config.baseUrl + window.config.apiRoot +
'/glossary/info'
'/glossary/info?qualifiedName=' + qualifiedName
const apiTypes = [
GLOSSARY_STATS_REQUEST,
{
Expand All @@ -152,12 +165,58 @@ const getGlossaryStats = (dispatch, resetTerms) => {
}
}

const importGlossaryFile = (dispatch, data, srcLocaleId) => {
const getPermission = (dispatch, qualifiedName) => {
const endpoint = window.config.baseUrl + window.config.apiRoot +
'/user/permission/glossary?qualifiedName=' + qualifiedName
const apiTypes = [
GLOSSARY_PERMISSION_REQUEST,
{
type: GLOSSARY_PERMISSION_SUCCESS,
payload: (action, state, res) => {
return res.json().then((json) => {
dispatch(getGlossaryStats(dispatch, qualifiedName, true))
return json
})
}
},
GLOSSARY_PERMISSION_FAILURE
]
return {
[CALL_API]: buildAPIRequest(endpoint, 'GET', getJsonHeaders(), apiTypes)
}
}

const getQualifiedName = (dispatch, projectSlug) => {
const endpoint = window.config.baseUrl + window.config.apiRoot +
(projectSlug ? '/projects/p/' + projectSlug + '/glossary/qualifiedName'
: '/glossary/qualifiedName')

const apiTypes = [
GLOSSARY_GET_QUALIFIED_NAME_REQUEST,
{
type: GLOSSARY_GET_QUALIFIED_NAME_SUCCESS,
payload: (action, state, res) => {
return res.json().then((json) => {
const qualifiedName = json.name
dispatch(getPermission(dispatch, qualifiedName))
return qualifiedName
})
}
},
GLOSSARY_GET_QUALIFIED_NAME_FAILURE
]
return {
[CALL_API]: buildAPIRequest(endpoint, 'GET', getJsonHeaders(), apiTypes)
}
}

const importGlossaryFile = (dispatch, data, qualifiedName, srcLocaleId) => {
const endpoint = window.config.baseUrl + window.config.apiRoot + '/glossary'
let formData = new FormData()
formData.append('file', data.file, data.file.name)
formData.append('fileName', data.file.name)
formData.append('srcLocale', srcLocaleId)
formData.append('qualifiedName', qualifiedName)
if (data.transLocale) {
formData.append('transLocale', data.transLocale.value)
}
Expand All @@ -168,7 +227,7 @@ const importGlossaryFile = (dispatch, data, srcLocaleId) => {
type: GLOSSARY_UPLOAD_SUCCESS,
payload: (action, state, res) => {
return res.json().then((json) => {
dispatch(getGlossaryStats(dispatch, true))
dispatch(getGlossaryStats(dispatch, qualifiedName, true))
return json
})
}
Expand All @@ -181,12 +240,12 @@ const importGlossaryFile = (dispatch, data, srcLocaleId) => {
}
}

const createGlossaryTerm = (dispatch, term) => {
const createGlossaryTerm = (dispatch, qualifiedName, term) => {
let headers = getJsonHeaders()
headers['Content-Type'] = 'application/json'
const endpoint = window.config.baseUrl + window.config.apiRoot +
'/glossary/entries'
const entryDTO = GlossaryHelper.convertToDTO(term)
'/glossary/entries?locale=' + term.srcTerm.locale
const entryDTO = GlossaryHelper.convertToDTO(term, qualifiedName)
const apiTypes = [
{
type: GLOSSARY_CREATE_REQUEST,
Expand All @@ -198,7 +257,7 @@ const createGlossaryTerm = (dispatch, term) => {
type: GLOSSARY_CREATE_SUCCESS,
payload: (action, state, res) => {
return res.json().then((json) => {
dispatch(getGlossaryStats(dispatch, true))
dispatch(getGlossaryStats(dispatch, state.qualifiedName, true))
return json
})
}
Expand All @@ -211,13 +270,14 @@ const createGlossaryTerm = (dispatch, term) => {
}
}

const updateGlossaryTerm = (dispatch, term, needRefresh) => {
const updateGlossaryTerm = (dispatch, qualifiedName, term, localeId,
needRefresh) => {
let headers = getJsonHeaders()
headers['Content-Type'] = 'application/json'

const endpoint = window.config.baseUrl + window.config.apiRoot +
'/glossary/entries'
const entryDTO = GlossaryHelper.convertToDTO(term)
'/glossary/entries?locale=' + localeId
const entryDTO = GlossaryHelper.convertToDTO(term, qualifiedName)

const apiTypes = [
{
Expand All @@ -230,7 +290,8 @@ const updateGlossaryTerm = (dispatch, term, needRefresh) => {
type: GLOSSARY_UPDATE_SUCCESS,
payload: (action, state, res) => {
return res.json().then((json) => {
needRefresh && dispatch(getGlossaryStats(dispatch, false))
needRefresh &&
dispatch(getGlossaryStats(dispatch, state.qualifiedName, false))
return json
})
}
Expand All @@ -257,7 +318,7 @@ const deleteGlossaryTerm = (dispatch, id) => {
type: GLOSSARY_DELETE_SUCCESS,
payload: (action, state, res) => {
return res.json().then((json) => {
dispatch(getGlossaryStats(dispatch, true))
dispatch(getGlossaryStats(dispatch, state.qualifiedName, true))
return json
})
}
Expand All @@ -269,8 +330,9 @@ const deleteGlossaryTerm = (dispatch, id) => {
}
}

const deleteAllGlossaryEntry = (dispatch) => {
const endpoint = window.config.baseUrl + window.config.apiRoot + '/glossary'
const deleteAllGlossaryEntry = (dispatch, qualifiedName) => {
const endpoint = window.config.baseUrl + window.config.apiRoot +
'/glossary?qualifiedName=' + qualifiedName
const apiTypes = [
{
type: GLOSSARY_DELETE_ALL_REQUEST,
Expand All @@ -281,7 +343,7 @@ const deleteAllGlossaryEntry = (dispatch) => {
{
type: GLOSSARY_DELETE_ALL_SUCCESS,
payload: (action, state, res) => {
return dispatch(getGlossaryStats(dispatch, true))
return dispatch(getGlossaryStats(dispatch, state.qualifiedName, true))
}
},
GLOSSARY_DELETE_ALL_FAILURE
Expand All @@ -291,9 +353,9 @@ const deleteAllGlossaryEntry = (dispatch) => {
}
}

const glossaryExport = (type) => {
const glossaryExport = (type, qualifiedName) => {
const endpoint = window.config.baseUrl + window.config.apiRoot +
'/glossary/file?fileType=' + type
'/glossary/file?fileType=' + type + '&qualifiedName=' + qualifiedName
let headers = getJsonHeaders()
headers['Content-Type'] = 'application/octet-stream'
const apiTypes = [
Expand Down Expand Up @@ -323,18 +385,19 @@ const glossaryExport = (type) => {

export const glossaryDownload = () => {
return (dispatch, getState) => {
dispatch(glossaryExport(getState().glossary.exportFile.type.value))
dispatch(glossaryExport(getState().glossary.exportFile.type.value,
getState().glossary.qualifiedName))
}
}

export const glossaryInitStateFromUrl =
createAction(GLOSSARY_INIT_STATE_FROM_URL)

export const glossaryInitialLoad = () => {
export const glossaryInitialLoad = (projectSlug) => {
return (dispatch, getState) => {
const query = getState().routing.location.query
dispatch(glossaryInitStateFromUrl(query))
dispatch(getGlossaryStats(dispatch, true))
dispatch(glossaryInitStateFromUrl({ query, projectSlug }))
dispatch(getQualifiedName(dispatch, projectSlug))
}
}

Expand Down Expand Up @@ -368,27 +431,32 @@ export const glossaryDeleteTerm = (id) => {

export const glossaryDeleteAll = () => {
return (dispatch, getState) => {
dispatch(deleteAllGlossaryEntry(dispatch))
dispatch(deleteAllGlossaryEntry(dispatch,
getState().glossary.qualifiedName))
}
}

export const glossaryUpdateTerm = (term, needRefresh) => {
return (dispatch, getState) => {
const targetLocale = getState().glossary.locale || DEFAULT_LOCALE.localeId
// do cloning to prevent changes in selectedTerm
dispatch(updateGlossaryTerm(dispatch, cloneDeep(term), needRefresh))
dispatch(updateGlossaryTerm(dispatch, getState().glossary.qualifiedName,
cloneDeep(term), targetLocale, needRefresh))
}
}

export const glossaryCreateNewEntry = (entry) => {
return (dispatch, getState) => {
dispatch(createGlossaryTerm(dispatch, entry))
dispatch(createGlossaryTerm(dispatch, getState().glossary.qualifiedName,
entry))
}
}

export const glossaryImportFile = () => {
return (dispatch, getState) => {
dispatch(importGlossaryFile(dispatch,
getState().glossary.importFile,
getState().glossary.qualifiedName,
getState().glossary.stats.srcLocale.locale.localeId))
}
}
Expand Down
14 changes: 8 additions & 6 deletions zanata-frontend/src/frontend/app/components/Nav/index.jsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React, { PropTypes } from 'react'
import NavItem from './NavItem'
import { flattenThemeClasses } from 'zanata-ui'
// import { startsWith } from 'lodash'
import { getDswid } from '../../utils/UrlHelper'

const dswid = window.dswh && window.dswh.windowId
? '?dswid=' + window.dswh.windowId
: ''
const dswid = getDswid()

/**
* URL path for frontend
Expand Down Expand Up @@ -146,8 +146,8 @@ const Nav = ({
className={flattenThemeClasses(classes)}>
{items.map((item, itemId) => {
if (((item.auth === 'public') || (item.auth === auth) ||
(item.auth === 'loggedin' && admin)) && !item.more) {
let link = null
(item.auth === 'loggedin' && admin))) {
let link
if (isJsfPage) {
// jsf pages
link = links[item.link]
Expand All @@ -163,11 +163,13 @@ const Nav = ({
}

const useHref = isJsfPage || !item.internalLink
const isActive = active === link

return <NavItem key={itemId}
loading={loading}
id={item.id}
small={item.small}
active={active.indexOf(link) >= 0}
active={isActive}
link={link}
useHref={useHref}
icon={item.icon}
Expand Down
3 changes: 2 additions & 1 deletion zanata-frontend/src/frontend/app/containers/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Icons
} from 'zanata-ui'
import { Nav } from '../components'
import { getContextPath } from '../utils/UrlHelper'

/**
* TODO: use react-ally to identify accessibility issue in dev mode
Expand All @@ -32,7 +33,7 @@ class App extends Component {
} = this.props

const links = {
'context': window.config.baseUrl || '',
'context': getContextPath(),
'/login': window.config.links.loginUrl,
'/signup': window.config.links.registerUrl
}
Expand Down
Loading

0 comments on commit 8a4b6ac

Please sign in to comment.