diff --git a/src/css/skeleton.css b/src/css/skeleton.css index 8f10cc0..1967c1d 100644 --- a/src/css/skeleton.css +++ b/src/css/skeleton.css @@ -660,7 +660,7 @@ button:active { margin-top: auto; height: 20px; display: inline-block; - color: red; + color: #990000; } #filter { @@ -669,6 +669,14 @@ button:active { margin-top: auto; } +#filter.executed { + border: 3px solid #448abe +} + +#filter.errored { + border: 2px solid #990000 +} + #filterLabel { display: inherit; } @@ -782,23 +790,46 @@ button:active { .saved-filter-wrapper { display: flex; justify-content: space-between; + margin: 0.2em 0; +} + +.saved-filter-wrapper:hover { + border-top: 1px dashed #999; + border-bottom: 1px dashed #999; } .saved-filter { display: inline-block; - margin: 1rem 0 2.5rem 0; + margin: 0.5rem; cursor: pointer; white-space: pre-wrap; flex-grow: 1; + padding: 0.25em; } .saved-filter:hover { background-color: lightgray; } -.remove-filter { +.saved-filter-wrapper > button { display: inline-block; - margin: 1rem 0 2.5rem 1.5rem; + visibility: hidden; + margin: 0.25rem; + padding: 0.3em; + height: auto; + line-height: normal; + background: #FF6666; + color: #FFF; + letter-spacing: normal; +} + +.saved-filter-wrapper:hover > button:hover { + border: 1px solid #333 !important; + background: #990000 !important; +} + +.saved-filter-wrapper:hover > button { + visibility: visible; } .hidden { diff --git a/src/ts/App/Components/braceEditor.tsx b/src/ts/App/Components/braceEditor.tsx index 51b118c..aab4a84 100644 --- a/src/ts/App/Components/braceEditor.tsx +++ b/src/ts/App/Components/braceEditor.tsx @@ -79,7 +79,6 @@ export default class BraceEditor extends Component { editor.$blockScrolling = Infinity; editor.resize(true); editor.setShowPrintMargin(false); - console.log(options); editor.setOptions({ ...options }); diff --git a/src/ts/App/filterBar.tsx b/src/ts/App/filterBar.tsx index 80fe883..f63f7ff 100644 --- a/src/ts/App/filterBar.tsx +++ b/src/ts/App/filterBar.tsx @@ -3,14 +3,16 @@ import { h, Component } from 'preact'; export interface FilterBarProps { filter: string; updateFilter: (newFilter: string) => void; + filterStatus: string; } interface FilterBarState { value: string; lastValue: string; + filterStatus: string; } -const WAIT_INTERVAL = 1000; +const WAIT_INTERVAL = 1500; const ENTER_KEY = 13; export default class FilterBar extends Component { @@ -20,7 +22,8 @@ export default class FilterBar extends Component this.state = { value: props.filter, - lastValue: '' + lastValue: '', + filterStatus: "clear" }; } @@ -30,7 +33,8 @@ export default class FilterBar extends Component componentWillReceiveProps(newProps: FilterBarProps) { this.setState({ - value: newProps.filter + value: newProps.filter, + filterStatus: newProps.filterStatus }); } @@ -47,6 +51,8 @@ export default class FilterBar extends Component handleKeyDown = (e) => { this.handleChange(e); if (e.keyCode === ENTER_KEY) { + // Prevent calling triggerChange twice because of race condition + window.clearTimeout(this.timer); this.triggerChange(); } } @@ -62,7 +68,7 @@ export default class FilterBar extends Component } render() { - const { value } = this.state; + const { value, filterStatus } = this.state; return (
@@ -72,6 +78,7 @@ export default class FilterBar extends Component name="filter" type="text" value={value} + class={filterStatus} />
); diff --git a/src/ts/App/filterPicker.tsx b/src/ts/App/filterPicker.tsx index 892d9f3..9194ae3 100644 --- a/src/ts/App/filterPicker.tsx +++ b/src/ts/App/filterPicker.tsx @@ -13,13 +13,20 @@ interface FilterPickerState { export default class FilterPicker extends Component { deleteFilter = (filter: string) => { - removeFilter(filter, () => this.loadFilters()) + var confirmDelete = confirm("Are you sure you want to delete the following filter?\n\t" + filter); + if(confirmDelete == true) { + removeFilter(filter, () => this.loadFilters()) + } } componentDidMount() { this.loadFilters(); } + componentDidUpdate() { + this.loadFilters(); + } + loadFilters() { getFilters((filters) => { this.setState({ @@ -39,7 +46,7 @@ export default class FilterPicker extends Component (
 props.close(filter)}>{filter}
- this.deleteFilter(filter)}>X +
))} ; diff --git a/src/ts/App/index.tsx b/src/ts/App/index.tsx index ba9701c..07a8638 100644 --- a/src/ts/App/index.tsx +++ b/src/ts/App/index.tsx @@ -20,6 +20,7 @@ interface AppState { errors: string; options: Object; loading: boolean; + filterStatus: string; } export default class App extends Component { @@ -32,6 +33,7 @@ export default class App extends Component { inputJson: props.inputJson, options: JSON.parse(props.options), loading: false, + filterStatus: "clear", }; } @@ -43,7 +45,8 @@ export default class App extends Component { this.setState({ outputJson: msg.jqResult, errors: msg.error, - loading: false + loading: false, + filterStatus: msg.error ? "errored" : "clear" }); }); this.runJqFilter(); @@ -77,12 +80,12 @@ export default class App extends Component { runJqFilter = () => { const { inputJson, filter } = this.state; - this.setState({loading: true, errors: ""}); + this.setState({loading: true, errors: "", filterStatus: "executed"}); this.port.postMessage({ json: inputJson, filter: filter }); } render() { - const { inputJson, outputJson, errors, filter, options, loading } = this.state; + const { inputJson, outputJson, errors, filter, filterStatus, options, loading } = this.state; const { documentUrl } = this.props; return
{!!this.state.loading && } @@ -95,7 +98,7 @@ export default class App extends Component {
- +
diff --git a/src/ts/App/inputOutput.tsx b/src/ts/App/inputOutput.tsx index 111504e..ae9d9a7 100644 --- a/src/ts/App/inputOutput.tsx +++ b/src/ts/App/inputOutput.tsx @@ -30,6 +30,10 @@ export default class InputOutput extends Component