소스 검색

Fix deeplinking for topbar plugin (#4181)

* Fix deeplinking for topbar plugin

* Lint & added tests for search parsing/serialization
bubble
Grégoire Charvet 黑瓜 6 년 전
committed by kyle
부모
커밋
71d7c1a5ab
3개의 변경된 파일59개의 추가작업 그리고 1개의 파일을 삭제
  1. +7
    -1
      src/core/utils.js
  2. +8
    -0
      src/plugins/topbar/topbar.jsx
  3. +44
    -0
      test/core/utils.js

+ 7
- 1
src/core/utils.js 파일 보기

@@ -623,13 +623,19 @@ export const parseSearch = () => {
continue
}
i = params[i].split("=")
map[decodeURIComponent(i[0])] = decodeURIComponent(i[1])
map[decodeURIComponent(i[0])] = (i[1] && decodeURIComponent(i[1])) || ""
}
}

return map
}

export const serializeSearch = (searchMap) => {
return Object.keys(searchMap).map(k => {
return encodeURIComponent(k) + "=" + encodeURIComponent(searchMap[k])
}).join("&")
}

export const btoa = (str) => {
let buffer



+ 8
- 0
src/plugins/topbar/topbar.jsx 파일 보기

@@ -3,6 +3,7 @@ import PropTypes from "prop-types"

//import "./topbar.less"
import Logo from "./logo_small.png"
import {parseSearch, serializeSearch} from "../../core/utils"

export default class Topbar extends React.Component {

@@ -41,6 +42,12 @@ export default class Topbar extends React.Component {
e.preventDefault()
}

setSearch = (spec) => {
let search = parseSearch()
search["urls.primaryName"] = spec.name
window.location.search = serializeSearch(search)
}

setSelectedUrl = (selectedUrl) => {
const configs = this.props.getConfigs()
const urls = configs.urls || []
@@ -52,6 +59,7 @@ export default class Topbar extends React.Component {
if(spec.url === selectedUrl)
{
this.setState({selectedIndex: i})
this.setSearch(spec)
}
})
}


+ 44
- 0
test/core/utils.js 파일 보기

@@ -3,6 +3,8 @@ import expect from "expect"
import { fromJS, OrderedMap } from "immutable"
import {
mapToList,
parseSearch,
serializeSearch,
validatePattern,
validateMinLength,
validateMaxLength,
@@ -940,6 +942,48 @@ describe("utils", function() {
})
})

describe("parse and serialize search", function() {
afterEach(function() {
win.location.search = ""
})

describe("parsing", function() {
it("works with empty search", function() {
win.location.search = ""
expect(parseSearch()).toEqual({})
})

it("works with only one key", function() {
win.location.search = "?foo"
expect(parseSearch()).toEqual({foo: ""})
})

it("works with keys and values", function() {
win.location.search = "?foo=fooval&bar&baz=bazval"
expect(parseSearch()).toEqual({foo: "fooval", bar: "", baz: "bazval"})
})

it("decode url encoded components", function() {
win.location.search = "?foo=foo%20bar"
expect(parseSearch()).toEqual({foo: "foo bar"})
})
})

describe("serializing", function() {
it("works with empty map", function() {
expect(serializeSearch({})).toEqual("")
})

it("works with multiple keys with and without values", function() {
expect(serializeSearch({foo: "", bar: "barval"})).toEqual("foo=&bar=barval")
})

it("encode url components", function() {
expect(serializeSearch({foo: "foo bar"})).toEqual("foo=foo%20bar")
})
})
})

describe("sanitizeUrl", function() {
it("should sanitize a `javascript:` url", function() {
const res = sanitizeUrl("javascript:alert('bam!')")


불러오는 중...
취소
저장