Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pywb update new internet Browser layout #870

Open
wants to merge 74 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
cc8ebb3
Solr work
m4rk3r Jul 22, 2020
4f69204
Fix solr url query
m4rk3r Aug 10, 2020
52a2cac
Add updates for solr: config and docker compose changes
m4rk3r Aug 10, 2020
6c9bc46
Add solr url to wr config, limit searchauto loop
m4rk3r Aug 24, 2020
f15657f
Move deriv access to admin roles only
m4rk3r Aug 25, 2020
6580dbd
Increase search index ttl
m4rk3r Aug 26, 2020
e4f4a42
Add search indexing fn to user manager
m4rk3r Aug 26, 2020
cd092ab
Remove old webrecorder message
m4rk3r Aug 28, 2020
632453b
Add beta_access check for search features, fail silently on search se…
m4rk3r Sep 1, 2020
870cf5f
Add urlFrag to initialValues
m4rk3r Oct 6, 2020
62c418d
Add helper function to usermanager, cleanup
m4rk3r Oct 13, 2020
3c3d0ce
Add access check to search api
m4rk3r Oct 13, 2020
f3277df
Add solr cloud config, search method url param
m4rk3r Oct 23, 2020
2e8a1bd
Add space after clearing search
m4rk3r Oct 26, 2020
1f9d041
Update derivative recording name
m4rk3r Oct 26, 2020
7940f98
Add user lookup by email helper fn
m4rk3r Oct 26, 2020
782ce57
Tweaks to searchbox, persist search records for a week, unescape url …
m4rk3r Oct 27, 2020
e5b8ff0
Update derivative copy
m4rk3r Oct 27, 2020
fa3e2f2
Add search results column, separate recording sessions from derivs in…
m4rk3r Nov 13, 2020
7bc9f62
Tweak solr cdx conditional record matching
m4rk3r Nov 18, 2020
db288a4
If mime is empty default to text/html
m4rk3r Nov 18, 2020
832956b
Update solr docs ttl
m4rk3r Nov 18, 2020
26de192
Updates to search compose
m4rk3r Nov 30, 2020
d65f786
Make url wildcard search case-insensitive
m4rk3r Nov 30, 2020
ad82086
Exclude beta archivist from rate limiting
m4rk3r Nov 30, 2020
61e2b99
Search updates:
m4rk3r Dec 1, 2020
7b3cf52
Remove derivs tab from session manager, limit indexing to own collect…
m4rk3r Dec 22, 2020
cf7e595
Search updates
m4rk3r Jan 21, 2021
2132054
Fix index timeout check
m4rk3r Jan 25, 2021
14f6d49
Move dedup hash to solrconfig, add indexing message to frontend
m4rk3r Feb 8, 2021
22f153f
Queue uploads for indexing
m4rk3r Mar 2, 2021
df57ee9
UI Fixes:
m4rk3r Mar 16, 2021
ab35437
Add browser select to bookmark sidebar
m4rk3r Mar 16, 2021
e907204
Adds `include_derivs` flag to `get_recordings`, disable wsgi logging,…
m4rk3r Mar 23, 2021
c12b548
Update usage to include derivs flag
m4rk3r Mar 24, 2021
5e273e3
Lower indexing loader timeout, set autoindexed on upload
m4rk3r Mar 24, 2021
c4b50e5
Merge branch 'default-rb-select' into develop
m4rk3r Mar 29, 2021
3b0cf52
admin: add index collection widget
m4rk3r Mar 29, 2021
8b02bfd
Remove depricated desktop app, dropdown style tweak
m4rk3r Apr 8, 2021
bcff9d8
Upgrade to latest pywb
m4rk3r Apr 22, 2021
d48e825
Update instances of native -> current
m4rk3r Apr 23, 2021
17c949b
Update search access check
m4rk3r Apr 29, 2021
abbafb3
Increase scan_iter count
m4rk3r May 11, 2021
7293570
Fix for mime query in url_search
m4rk3r May 12, 2021
f30592e
Remote browser updates:
m4rk3r May 13, 2021
14fa145
Handle null timestamp link building
m4rk3r May 20, 2021
5b430e9
Search access cleanup
m4rk3r May 26, 2021
3c75b8c
Trim search input whitespace
m4rk3r Jun 21, 2021
89622ae
Check for userAgent string before regex
m4rk3r Jun 29, 2021
c6eed87
Moderation updates
m4rk3r Jul 1, 2021
0e5fafa
Add user suspension check
m4rk3r Jul 1, 2021
a8646d3
Add settings link to collection list for admins, namespace role class
m4rk3r Jul 2, 2021
30f6a37
Make settings link absolute
m4rk3r Jul 2, 2021
29d20a6
Add nofollow meta tag guidance
m4rk3r Jul 9, 2021
34f7846
Add fallback for search server bad response
m4rk3r Jul 22, 2021
09002c4
Update autopilot guide link
m4rk3r Jul 28, 2021
831284a
rearrange solr batch indexing, shorten ttl
m4rk3r Aug 6, 2021
2374ed9
Nginx path traversal fix
m4rk3r Nov 11, 2021
5a5ec3d
Add email update to user admin
m4rk3r Dec 3, 2021
955948b
Clarify and fix api access
m4rk3r Jan 6, 2022
dd19035
Remove deriv record from coll redis on removal
m4rk3r Jan 13, 2022
35deec1
Migration script tweaks
m4rk3r Jan 13, 2022
7733280
Add user rename admin command
m4rk3r Jan 14, 2022
27d44f3
reverse lc_users key
m4rk3r Jan 19, 2022
96d77bf
Remove old lc user key on rename, login check for pw reset
m4rk3r Jan 20, 2022
2162863
Add search-all checkbox, style tweaks
m4rk3r Jan 31, 2022
76ed5af
Auth check for defaults api
m4rk3r Feb 18, 2022
dfe331e
Reflect webpage filter default when none are selected
m4rk3r Feb 25, 2022
8324fa8
Merge remote-tracking branch 'origin/search-all' into develop
m4rk3r Mar 9, 2022
ded8ff4
Add ability to block registrations from a domain specified in domain-…
m4rk3r Apr 7, 2022
ed9cf70
Password reset updates
m4rk3r Apr 8, 2022
a99e3d6
Fix typo
m4rk3r May 2, 2022
c68a598
update yaml load fn, input box style
m4rk3r Jun 29, 2022
161aa89
Upgrade werkzug
m4rk3r Jun 30, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ services:
- CONTAINER_EXPIRE_SECS=3600
- IDLE_TIMEOUT=5

- BROWSER_NET=webrecorder_browsers
- MAIN_NET=webrecorder_default
- BROWSER_NET=conifer_browsers
- MAIN_NET=conifer_default

ports:
- 9020:9020
Expand Down Expand Up @@ -190,11 +190,12 @@ services:

volumes:
- ./data/solr:/var/solr
- ./solrconf:/opt/solr/server/solr/configsets/solrconf

entrypoint:
- docker-entrypoint.sh
command:
- solr-precreate
- webrecorder
- conifer
- /opt/solr/server/solr/configsets/solrconf

ports:
- 8983:8983
Expand Down Expand Up @@ -227,4 +228,3 @@ networks:

browsers:
driver: bridge

1 change: 1 addition & 0 deletions frontend/babel.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ module.exports = {
],
"plugins": [
["@babel/plugin-proposal-class-properties", { "loose": true }],
["@babel/plugin-proposal-private-methods", { "loose": true }],
"@babel/plugin-proposal-export-default-from",
"@babel/plugin-transform-runtime",
"add-module-exports",
Expand Down
3 changes: 2 additions & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
"react-dnd": "^6.0.0",
"react-dnd-html5-backend": "^6.0.0",
"react-dom": "^16.9.0",
"react-google-recaptcha": "^2.1.0",
"react-helmet": "^6.0.0",
"react-hot-loader": "^4.6.3",
"react-redux": "^5.1.1",
Expand All @@ -97,7 +98,7 @@
"resolve-url-loader": "^2.3.0",
"sass-loader": "^7.1.0",
"serialize-javascript": "^1.5.0",
"shepherd-client": "github:oldweb-today/shepherd-client#1.2.1",
"shepherd-client": "github:oldweb-today/shepherd-client#rb-dimensions",
"strip-loader": "^0.1.2",
"style-loader": "0.23.1",
"superagent": "^4.0.0",
Expand Down
21 changes: 14 additions & 7 deletions frontend/src/components/RemoveWidget/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,23 @@ class RemoveWidget extends Component {
withConfirmation: true
};

static getDerivedStateFromProps(props, state) {
if (!props.isDeleting && state.isDeleting && state.confirmRemove) {
return {
confirmRemove: false,
isDeleting: false
};
}

return null;
}

constructor(props) {
super(props);

this.state = {
confirmRemove: false
confirmRemove: false,
isDeleting: false
};
}

Expand All @@ -58,12 +70,6 @@ class RemoveWidget extends Component {
return false;
}

componentDidUpdate(prevProps) {
if (!this.props.isDeleting && prevProps.isDeleting) {
this.setState({ confirmRemove: false });
}
}

removeClick = (evt) => {
evt.stopPropagation();

Expand All @@ -73,6 +79,7 @@ class RemoveWidget extends Component {
return;
}

this.setState({ isDeleting: true });
this.props.callback();
} else {
this.setState({ confirmRemove: true });
Expand Down
81 changes: 60 additions & 21 deletions frontend/src/components/Searchbox/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import './style.scss';


const parseQuery = (search) => {
search = search.trim();
const filters = search.match(/((is|start|end|session):[a-z0-9-.:]+)/ig) || [];
const urlFragRX = search.match(/url:((?:https?:\/\/)?(?:www\.)?(?:[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6})?(?:[-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*))/i);
const searchRX = search.match(/(?:(?:(?:is|start|end|session|url):[^ ]+\s?)+\s?)?(.*)/i);
Expand All @@ -38,21 +39,23 @@ class Searchbox extends PureComponent {
clear: PropTypes.func,
location: PropTypes.object,
search: PropTypes.func,
searching: PropTypes.bool,
busy: PropTypes.bool,
searched: PropTypes.bool,
};

static getDerivedStateFromProps(props, state) {
const modalClosed = !state.options && !state.reset;
const textChange = state.search !== state.prevSearch && !state.reset;
const filterValues = {
includeAll: state.includeAll,
includeWebpages: state.includeWebpages,
includeImages: state.includeImages,
includeAudio: state.includeAudio,
includeVideo: state.includeVideo,
includeDocuments: state.includeDocuments,
};
const filterFields = {
includeAll: 'is:any',
includeWebpages: 'is:page',
includeImages: 'is:image',
includeAudio: 'is:audio',
Expand Down Expand Up @@ -85,13 +88,19 @@ class Searchbox extends PureComponent {
searchStruct += b ? `${filterFields[val]} ` : '';
});

// if no filters set, default to webpage
const filtersSet = Object.values(filterValues).some(f => !!f);
if (!filtersSet) {
filterValues.includeWebpages = true;
}

if (urlFrag || (urlFragTxt && textChange)) {
if (textChange) {
urlFrag = urlFragTxt;
}

if (urlFrag) {
searchStruct += textChange ? `url:${urlFragTxt} ` : `url:${encodeURIComponent(urlFrag)} `;
searchStruct += textChange ? `url:${urlFragTxt} ` : `url:${urlFrag} `;
}
}

Expand Down Expand Up @@ -164,6 +173,7 @@ class Searchbox extends PureComponent {
constructor(props) {
super(props);

let includeAll = false;
let includeWebpages = true;
let includeImages = false;
let includeAudio = false;
Expand All @@ -172,14 +182,17 @@ class Searchbox extends PureComponent {
let session = '';
let search = '';
let searchFrag = '';
let urlFrag = '';
let date = 'anytime';
let startDate = new Date();
let endDate = new Date();
let urlSearch = false;

// create clone
this.initialValues = {
date,
endDate,
includeAll,
includeWebpages,
includeImages,
includeAudio,
Expand All @@ -188,19 +201,23 @@ class Searchbox extends PureComponent {
search,
searchFrag,
session,
startDate
startDate,
urlFrag,
urlSearch
};

if (props.location.search) {
const qs = querystring.parse(props.location.search.replace(/^\?/, ''));

if (qs.search) {
if (qs.search || qs.url) {
props.search(qs);
search = qs.search;
searchFrag = qs.search;
urlFrag = qs.url ? decodeURIComponent(qs.url) : '';
}

if (qs.mime) {
includeAll = qs.mime.includes('*');
includeWebpages = qs.mime.includes('text/html');
includeImages = qs.mime.includes('image/');
includeAudio = qs.mime.includes('audio/');
Expand All @@ -218,12 +235,17 @@ class Searchbox extends PureComponent {
endDate = qs.to ? this.parseDate(qs.to) : endDate;
date = 'daterange';
}

if (qs.method === 'url') {
urlSearch = true;
}
}

this.state = {
date,
endDate,
options: false,
includeAll,
includeWebpages,
includeImages,
includeAudio,
Expand All @@ -233,7 +255,9 @@ class Searchbox extends PureComponent {
search,
searchStruct: '',
session,
startDate
startDate,
urlFrag,
urlSearch
};

if (props.location.search) {
Expand All @@ -250,7 +274,7 @@ class Searchbox extends PureComponent {
componentDidUpdate(prevProps, prevState) {
// check for searched prop being cleared
if (prevProps.searched && !this.props.searched) {
this.setState({ search: 'is:page', searchFrag: '', urlFrag: '' });
this.setState({ search: 'is:page ', searchFrag: '', urlFrag: '' });
}
}

Expand All @@ -276,15 +300,24 @@ class Searchbox extends PureComponent {

handleChange = (evt) => {
// noop while indexing
if (this.props.searching) {
if (this.props.busy) {
return;
}

if (evt.target.type === 'checkbox') {
if (evt.target.name in this.state) {
this.setState({ [evt.target.name]: !this.state[evt.target.name] });
if (evt.target.name === 'includeAll') {
this.setState({
includeAll: true,
includeWebpages: false,
includeImages: false,
includeAudio: false,
includeVideo: false,
includeDocuments: false
});
} else if (evt.target.name in this.state) {
this.setState({ [evt.target.name]: !this.state[evt.target.name], includeAll: false });
} else {
this.setState({ [evt.target.name]: true });
this.setState({ [evt.target.name]: true, includeAll: false });
}
} else {
this.setState({
Expand All @@ -311,6 +344,7 @@ class Searchbox extends PureComponent {
const {
date,
endDate,
includeAll,
includeAudio,
includeDocuments,
includeImages,
Expand All @@ -319,15 +353,17 @@ class Searchbox extends PureComponent {
search,
session,
startDate,
urlFrag
urlFrag,
urlSearch
} = this.state;

const { query } = parseQuery(search);

const mime = (includeWebpages ? 'text/html,' : '') +
(includeImages ? 'image/,' : '') +
(includeAudio ? 'audio/,' : '') +
(includeVideo ? 'video/,' : '') +
const mime = (includeAll ? '*,' : '') +
(includeWebpages ? 'text/html,' : '') +
(includeImages ? 'image/*,' : '') +
(includeAudio ? 'audio/*,' : '') +
(includeVideo ? 'video/*,' : '') +
(includeDocuments ? 'application/pdf' : '');

let dateFilter = {};
Expand All @@ -343,7 +379,7 @@ class Searchbox extends PureComponent {

const urlQuery = {};
if (urlFrag) {
urlQuery.url = urlFrag;
urlQuery.url = encodeURIComponent(urlFrag);
}

const searchParams = {
Expand All @@ -361,7 +397,7 @@ class Searchbox extends PureComponent {
collection.get('owner'),
collection.get('id'),
searchParams,
collection.get('autoindexed')
collection.get('autoindexed') && !urlSearch
);

// close adv search
Expand All @@ -382,12 +418,14 @@ class Searchbox extends PureComponent {
}

render() {
const { collection, searching, searched } = this.props;
const { busy, collection, searched } = this.props;
const { date } = this.state;
const busyAction = searched ? 'Searching...' : 'Indexing collection...';
const inputTitle = busy ? busyAction : 'Search';

return (
<div className="search-box">
<InputGroup title="Search">
<InputGroup title={inputTitle}>
<InputGroup.Prepend>
<InputGroup.Text>
<SearchIcon />
Expand All @@ -396,10 +434,10 @@ class Searchbox extends PureComponent {
<Form.Control aria-label="filter" onKeyUp={this.keyUp} onChange={this.handleChange} name="search" value={this.state.search} autoComplete="off" placeholder="Filter" />
<InputGroup.Append>
{
(searching || searched) &&
(busy || searched) &&
<React.Fragment>
{
searching ?
busy ?
<LoaderIcon /> :
<Button variant="link" onClick={this.clear}><XIcon /></Button>
}
Expand All @@ -421,6 +459,7 @@ class Searchbox extends PureComponent {

<div className="label">Include File Types</div>
<ul>
<li><Form.Check type="checkbox" onChange={this.handleChange} id="includeAll" name="includeAll" checked={this.state.includeAll} label="All" /></li>
<li><Form.Check type="checkbox" onChange={this.handleChange} id="includeWebpages" name="includeWebpages" checked={this.state.includeWebpages} label="Webpages" /></li>
<li><Form.Check type="checkbox" onChange={this.handleChange} id="includeImages" name="includeImages" checked={this.state.includeImages} label="Images" /></li>
<li><Form.Check type="checkbox" onChange={this.handleChange} id="includeAudio" name="includeAudio" checked={this.state.includeAudio} label="Audio" /></li>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ class CollectionCoverUI extends Component {
<title>{`${collection.get('title')} (Web archive collection by ${collection.get('owner')})`}</title> :
<title>{collection.get('title')}</title>
}
<meta name="robots" value="nofollow" />
<meta name="description" content={description} />
<meta property="og:url" content={`${appHost}${getCollectionLink(collection)}`} />
<meta property="og:type" content="website" />
Expand Down
Loading