| import trim from 'licia/trim' |
| import isEmpty from 'licia/isEmpty' |
| import map from 'licia/map' |
| import each from 'licia/each' |
| import escape from 'licia/escape' |
| import copy from 'licia/copy' |
| import isJson from 'licia/isJson' |
| import Emitter from 'licia/Emitter' |
| import truncate from 'licia/truncate' |
| import { classPrefix as c } from '../lib/util' |
|
|
| export default class Detail extends Emitter { |
| constructor($container, devtools) { |
| super() |
| this._$container = $container |
| this._devtools = devtools |
|
|
| this._detailData = {} |
| this._bindEvent() |
| } |
| show(data) { |
| if (data.resTxt && trim(data.resTxt) === '') { |
| delete data.resTxt |
| } |
| if (isEmpty(data.resHeaders)) { |
| delete data.resHeaders |
| } |
| if (isEmpty(data.reqHeaders)) { |
| delete data.reqHeaders |
| } |
|
|
| let postData = '' |
| if (data.data) { |
| postData = `<pre class="${c('data')}">${escape(data.data)}</pre>` |
| } |
|
|
| let reqHeaders = '<tr><td>γͺγ</td></tr>' |
| if (data.reqHeaders) { |
| reqHeaders = map(data.reqHeaders, (val, key) => { |
| return `<tr> |
| <td class="${c('key')}">${escape(key)}</td> |
| <td>${escape(val)}</td> |
| </tr>` |
| }).join('') |
| } |
|
|
| let resHeaders = '<tr><td>γͺγ</td></tr>' |
| if (data.resHeaders) { |
| resHeaders = map(data.resHeaders, (val, key) => { |
| return `<tr> |
| <td class="${c('key')}">${escape(key)}</td> |
| <td>${escape(val)}</td> |
| </tr>` |
| }).join('') |
| } |
|
|
| let resTxt = '' |
| if (data.resTxt) { |
| let text = data.resTxt |
| if (text.length > MAX_RES_LEN) { |
| text = truncate(text, MAX_RES_LEN) |
| } |
| resTxt = `<pre class="${c('response')}">${escape(text)}</pre>` |
| } |
|
|
| const html = `<div class="${c('control')}"> |
| <span class="${c('icon-arrow-left back')}"></span> |
| <span class="${c('icon-delete back')}"></span> |
| <span class="${c('url')}">${escape(data.url)}</span> |
| <span class="${c('icon-copy copy-res')}"></span> |
| </div> |
| <div class="${c('http')}"> |
| ${postData} |
| <div class="${c('section')}"> |
| <h2>γ¬γΉγγ³γΉγγγγΌ</h2> |
| <table class="${c('headers')}"> |
| <tbody> |
| ${resHeaders} |
| </tbody> |
| </table> |
| </div> |
| <div class="${c('section')}"> |
| <h2>γͺγ―γ¨γΉγγγγγΌ</h2> |
| <table class="${c('headers')}"> |
| <tbody> |
| ${reqHeaders} |
| </tbody> |
| </table> |
| </div> |
| ${resTxt} |
| </div>` |
|
|
| this._$container.html(html).show() |
| this._detailData = data |
| } |
| hide() { |
| this._$container.hide() |
| this.emit('hide') |
| } |
| _copyRes = () => { |
| const detailData = this._detailData |
|
|
| let data = `${detailData.method} ${detailData.url} ${detailData.status}\n` |
| if (!isEmpty(detailData.data)) { |
| data += '\nγͺγ―γ¨γΉγγγΌγΏ\n\n' |
| data += `${detailData.data}\n` |
| } |
| if (!isEmpty(detailData.reqHeaders)) { |
| data += '\nγͺγ―γ¨γΉγγγγγΌ\n\n' |
| each(detailData.reqHeaders, (val, key) => (data += `${key}: ${val}\n`)) |
| } |
| if (!isEmpty(detailData.resHeaders)) { |
| data += '\nγ¬γΉγγ³γΉγγγγΌ\n\n' |
| each(detailData.resHeaders, (val, key) => (data += `${key}: ${val}\n`)) |
| } |
| if (detailData.resTxt) { |
| data += `\n${detailData.resTxt}\n` |
| } |
|
|
| copy(data) |
| this._devtools.notify('γ³γγΌγγΎγγ', { icon: 'success' }) |
| } |
| _bindEvent() { |
| const devtools = this._devtools |
|
|
| this._$container |
| .on('click', c('.back'), () => this.hide()) |
| .on('click', c('.copy-res'), this._copyRes) |
| .on('click', c('.http .response'), () => { |
| const data = this._detailData |
| const resTxt = data.resTxt |
|
|
| if (isJson(resTxt)) { |
| return showSources('object', resTxt) |
| } |
|
|
| switch (data.subType) { |
| case 'css': |
| return showSources('css', resTxt) |
| case 'html': |
| return showSources('html', resTxt) |
| case 'javascript': |
| return showSources('js', resTxt) |
| case 'json': |
| return showSources('object', resTxt) |
| } |
| switch (data.type) { |
| case 'image': |
| return showSources('img', data.url) |
| } |
| }) |
|
|
| const showSources = (type, data) => { |
| const sources = devtools.get('sources') |
| if (!sources) { |
| return |
| } |
|
|
| sources.set(type, data) |
|
|
| devtools.showTool('sources') |
| } |
| } |
| } |
|
|
| const MAX_RES_LEN = 100000 |
|
|