Compare commits

..

1 Commits

Author SHA1 Message Date
Mojib Wali 43a095795b v1.3.1stable 2021-01-20 17:30:51 +01:00
29 changed files with 203 additions and 845 deletions
+6 -39
View File
@@ -20,42 +20,9 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
strategy: strategy:
matrix: matrix:
python-version: [3.6, 3.7, 3.8, 3.9] python-version: [3.6, 3.7, 3.8]
requirements-level: [min, pypi] requirements-level: [min, pypi]
db-service: [postgresql12]
search-service: [elasticsearch7]
exclude:
- python-version: 3.6
requirements-level: pypi
- python-version: 3.7
requirements-level: min
- python-version: 3.8
requirements-level: min
- python-version: 3.9
requirements-level: min
- db-service: postgresql12
requirements-level: min
- search-service: elasticsearch7
requirements-level: min
include:
- db-service: postgresql12
DB_EXTRAS: "postgresql"
- search-service: elasticsearch7
SEARCH_EXTRAS: "elasticsearch7"
env:
DB: ${{ matrix.db-service }}
SEARCH: ${{ matrix.search-service }}
EXTRAS: all,${{ matrix.DB_EXTRAS }},${{ matrix.SEARCH_EXTRAS }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
@@ -68,7 +35,8 @@ jobs:
- name: Generate dependencies - name: Generate dependencies
run: | run: |
python -m pip install --upgrade pip setuptools py wheel requirements-builder python -m pip install --upgrade pip setuptools py wheel requirements-builder
requirements-builder -e "$EXTRAS" --level=${{ matrix.requirements-level }} setup.py > .${{ matrix.requirements-level }}-${{ matrix.python-version }}-requirements.txt requirements-builder -e all --level=${{ matrix.requirements-level }} setup.py > .${{ matrix.requirements-level }}-${{ matrix.python-version }}-requirements.txt
- name: Cache pip - name: Cache pip
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
@@ -77,11 +45,10 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
pip install -r .${{ matrix.requirements-level }}-${{ matrix.python-version }}-requirements.txt pip install -r .${{matrix.requirements-level}}-${{ matrix.python-version }}-requirements.txt
pip install ".[$EXTRAS]" pip install .[all]
pip freeze pip freeze
docker --version
docker-compose --version
- name: Run tests - name: Run tests
run: | run: |
./run-tests.sh ./run-tests.sh
@@ -8,3 +8,4 @@
$navbar_background_image: unset; $navbar_background_image: unset;
$navbar_background_color: #ffffff; $navbar_background_color: #ffffff;
@@ -1,324 +0,0 @@
/*
* Copyright (C) 2020 CERN.
* Copyright (C) 2020 Northwestern University.
* Copyright (C) 2020 Graz University of Technology
*
* invenio-theme-tugraz is free software; you can redistribute it
* and/or modify it under the terms of the MIT License; see LICENSE
* file for more details.
*
* origin: invenio_app_rdm/search/components.js
*/
import React, { useState } from "react";
import { Card, Item, Input, Label, Button, Grid, Checkbox, List, } from "semantic-ui-react";
import { BucketAggregation, Toggle } from "react-searchkit";
import _ from "lodash";
import _truncate from "lodash/truncate";
import Overridable from "react-overridable";
import { SearchBar } from "@js/invenio_search_ui/components";
export const RDMRecordResultsListItem = ({ result, index }) => {
const description = _.get(result, "metadata.description", "No description");
const version = _.get(result, "metadata.version", "");
const creators = _.get(result, "metadata.creators", []);
const title = _.get(result, "metadata.title", "No title");
const subjects = _.get(result, "metadata.subjects", null);
const rights = _.get(result, "metadata.rights", null)
const publicationDate = _.get(result, "ui.publication_date_l10n_long", "No publication date found");
const createdDate = _.get(result, "ui.created_date_l10n_long", "No creation date found.");
const resourceType = _.get(result, "ui.resource_type", "No resource type");
const access = _.get(result, "ui.access_right.title", "No access rights");
const accessRightCategory = _.get(result, "ui.access_right.category", "closed");
const accessRightIcon = _.get(result, "ui.access_right.icon", "closed");
const accessRight = {type: access, category: accessRightCategory, icon: accessRightIcon, rights};
const href = `/records/${result.id}`;
return (
<Item key={index}>
<Item.Content>
<div className="badges">
<Label className="record-version">
{publicationDate} {version ? `(${version})` : null}
</Label>
<Label className="teal">
{resourceType}
</Label>
</div>
<Item.Header href={href}>{title}</Item.Header>
<Creators creators={creators}/>
<Item.Description href={href}>
{_truncate(description.replace(/(<([^>]+)>)/ig, ''), { length: 350 })}
</Item.Description>
<Footer subjects={subjects} createdDate={createdDate} accessRight={accessRight}/>
</Item.Content>
</Item>
);
};
const Creators = ({creators}) => {
const creatorTags = creators.map((creator, index) => {
return <Creator key={index} creator={creator}/>;
});
return (
<div className="creators">
{creatorTags}
</div>
);
};
const Identifiers = ({creator}) => {
return (
<div className="identifiers">
{_.isObject(creator.identifiers) && creator.identifiers.hasOwnProperty("orcid") &&
<Orcid creator={creator}/>
}
</div>
);
};
const Orcid = ({creator}) => {
const href = `https://orcid.org/${creator.identifiers.orcid}`
return (
<a href={href} target="_blank">
<img className="inline-orcid" src="/static/extra/orcid.png"/>
</a>
);
};
const Creator = ({creator}) => {
return (
<div className="creator">
<Identifiers creator={creator}/>
<span className="text-muted">{creator.person_or_org.name}</span>
</div>
);
};
const Footer = ({subjects, createdDate, accessRight}) => {
return (
<Item.Extra>
<div className="left floated column">
{subjects && subjects.map((subject, index) => (
<Label key={index} size="tiny">
{subject.subject}
</Label>
))}
{createdDate && (
<div>
<small>
Uploaded on <span>{createdDate}</span>
</small>
</div>
)}
</div>
<div className="right floated column">
<span className={`ui access-right ${accessRight.category}`}>
<i className={`icon ${accessRight.icon}`}></i>
{accessRight.type} {accessRight.rights && accessRight.rights.map((right, index) => (
<a key={index} href={right.uri}>({right.identifier})</a>
))}
</span>
</div>
</Item.Extra>
);
};
/**
* ATTENTION:
* The following classes are only here because it is not easily possible to
* import it from the original module.
* If there is in the future a possibility to import following classes from
* invenio_app_rdm then this should be done!
*/
export const RDMRecordResultsGridItem = ({ result, index }) => {
const description = _.get(result, "metadata.description", "No description");
return (
<Card fluid key={index} href={`/records/${result.pid}`}>
<Card.Content>
<Card.Header>{result.metadata.title}</Card.Header>
<Card.Description>
{_truncate(description, { length: 200 })}
</Card.Description>
</Card.Content>
</Card>
);
};
export const RDMRecordSearchBarContainer = () => {
return (
<Overridable id={"SearchApp.searchbar"}>
<SearchBar />
</Overridable>
);
};
export const RDMRecordSearchBarElement = ({
placeholder: passedPlaceholder,
queryString,
onInputChange,
executeSearch,
}) => {
const placeholder = passedPlaceholder || "Search";
const onBtnSearchClick = () => {
executeSearch();
};
const onKeyPress = (event) => {
if (event.key === "Enter") {
executeSearch();
}
};
return (
<Input
action={{
icon: "search",
onClick: onBtnSearchClick,
className: "search",
}}
placeholder={placeholder}
onChange={(event, { value }) => {
onInputChange(value);
}}
value={queryString}
onKeyPress={onKeyPress}
/>
);
};
export const RDMRecordFacetsValues = ({
bucket,
isSelected,
onFilterClicked,
getChildAggCmps,
}) => {
const childAggCmps = getChildAggCmps(bucket);
const [isActive, setisActive] = useState(false);
const hasChildren = childAggCmps && childAggCmps.props.buckets.length > 0;
return (
<List.Item key={bucket.key}>
<div
className={`title ${hasChildren ? "" : "facet-subtitle"} ${
isActive ? "active" : ""
}`}
>
<List.Content floated="right">
<Label circular>{bucket.doc_count}</Label>
</List.Content>
{hasChildren ? (
<i
className={`angle ${isActive ? "down" : "right"} icon`}
onClick={() => setisActive(!isActive)}
></i>
) : null}
<Checkbox
label={bucket.label}
value={bucket.key}
onClick={() => onFilterClicked(bucket.key)}
checked={isSelected}
/>
</div>
<div className={`content facet-content ${isActive ? "active" : ""}`}>
{childAggCmps}
</div>
</List.Item>
);
};
const SearchHelpLinks = () => {
return (
<Overridable id={"RdmSearch.SearchHelpLinks"}>
<Grid className="padded-small">
<Grid.Row className="no-padded">
<Grid.Column>
<Card className="borderless-facet">
<Card.Content>
<a>Advanced search</a>
</Card.Content>
</Card>
</Grid.Column>
</Grid.Row>
<Grid.Row className="no-padded">
<Grid.Column>
<Card className="borderless-facet">
<Card.Content>
<a>Search guide</a>
</Card.Content>
</Card>
</Grid.Column>
</Grid.Row>
</Grid>
</Overridable>
);
};
export const RDMRecordFacets = ({ aggs, currentResultsState }) => {
return (
<>
<Toggle
title="Versions"
label="View all versions"
filterValue={["all_versions", "true"]}
/>
{aggs.map((agg) => {
return (
<div key={agg.title} className="ui accordion">
<BucketAggregation title={agg.title} agg={agg} />
</div>
);
})}
<SearchHelpLinks />
</>
);
};
export const RDMBucketAggregationElement = ({ title, containerCmp }) => {
return (
<Card className="borderless-facet">
<Card.Content>
<Card.Header>{title}</Card.Header>
</Card.Content>
<Card.Content>{containerCmp}</Card.Content>
</Card>
);
};
export const RDMToggleComponent = ({
updateQueryFilters,
userSelectionFilters,
filterValue,
label,
title,
isChecked,
}) => {
const _isChecked = (userSelectionFilters) => {
const isFilterActive =
userSelectionFilters.filter((filter) => filter[0] === filterValue[0])
.length > 0;
return isFilterActive;
};
const onToggleClicked = () => {
updateQueryFilters(filterValue);
};
var isChecked = _isChecked(userSelectionFilters);
return (
<Card className="borderless-facet">
<Card.Content>
<Card.Header>{title}</Card.Header>
</Card.Content>
<Card.Content>
<Checkbox
toggle
label={label}
onClick={onToggleClicked}
checked={isChecked}
/>
</Card.Content>
</Card>
);
};
@@ -1,30 +0,0 @@
/*
* Copyright (C) 2020 Graz University of Technology
*
* invenio-theme-tugraz is free software; you can redistribute it and/or modify
* it under the terms of the MIT License; see LICENSE file for more details.
*/
import { defaultComponents, createSearchAppInit } from "@js/invenio_search_ui";
import {
RDMRecordResultsListItem,
RDMBucketAggregationElement,
RDMRecordFacets,
RDMRecordFacetsValues,
RDMRecordResultsGridItem,
RDMRecordSearchBarContainer,
RDMRecordSearchBarElement,
RDMToggleComponent,
} from "./components";
const initSearchApp = createSearchAppInit({
"ResultsList.item": RDMRecordResultsListItem,
"BucketAggregation.element": RDMBucketAggregationElement,
"BucketAggregationValues.element": RDMRecordFacetsValues,
"ResultsGrid.item": RDMRecordResultsGridItem,
"SearchApp.facets": RDMRecordFacets,
"SearchApp.searchbarContainer": RDMRecordSearchBarContainer,
"SearchBar.element": RDMRecordSearchBarElement,
"SearchFilters.ToggleComponent": RDMToggleComponent,
});
@@ -13,68 +13,68 @@
#login-tug-logo { #login-tug-logo {
& g { & g {
fill: @tugrazRed; fill: #e4154b;
} }
} }
#login-tug-logo:hover { #login-tug-logo:hover {
& g { & g {
fill: @tugrazBlack; fill: #231f20;
} }
} }
.accounts-link { .accounts-link {
margin: 5%; margin: 5%;
color: @primaryLink; color: #fff;
border: 1px solid @primaryLink; border: 1px solid #fff;
background-color: transparent; background-color: transparent;
} }
.accounts-link :hover { .accounts-link :hover {
font-size: smaller !important; font-size: smaller !important;
color: @primaryLink; color: white;
background-color: @primaryLinkHoverBackground !important; background-color: #000000 !important;
} }
.tu-button-style button { .tu-button-style button {
cursor: pointer; cursor: pointer;
border: 1px solid @primaryButton; border: 1px solid #fff;
background-color: transparent; background-color: transparent;
height: 29px; height: 29px;
color: @primaryButton; color: #fff;
font-family: "Source Sans Pro"; font-family: "Source Sans Pro";
font-weight: 300; font-weight: 300;
font-size: 16px; font-size: 16px;
} }
.tu-button-style button:hover { .tu-button-style button:hover {
cursor: pointer; cursor: pointer;
color: @primaryButton; color: white;
background-color: @primaryButtonHoverBackground !important; background-color: #000000 !important;
} }
.form-accounts { .form-accounts {
margin: 15%; margin: 15%;
text-align: left !important; text-align: left !important;
& i { & i {
color: @primaryFormAccounts !important; color: #fff !important;
} }
& label { & label {
display: flex !important; display: flex !important;
font-weight: 300 !important; font-weight: 300 !important;
color: @primaryFormAccounts !important; color: white !important;
} }
& input { & input {
border: 0px none !important; border: 0px none !important;
padding: 0px !important; padding: 0px !important;
border-bottom: 1px solid @primaryFormAccounts !important; border-bottom: 1px solid white !important;
background-color: transparent !important; background-color: transparent !important;
color: @primaryFormAccounts !important; color: white !important;
border-radius: 0 !important; border-radius: 0 !important;
width: 100% !important; width: 100% !important;
} }
& input::placeholder { & input::placeholder {
opacity: 1 !important; opacity: 1 !important;
color: @formAccountsInputPlaceholder !important; color: silver !important;
} }
& th { & th {
display: block; display: block;
@@ -85,7 +85,7 @@
} }
.field > input::selection { .field > input::selection {
background: @fieldInputSelectionBackground; background: #50a2ce;
} }
.accounts-header { .accounts-header {
@@ -96,7 +96,7 @@
login and sign-up pages form background color login and sign-up pages form background color
*/ */
.sign-form { .sign-form {
background-color: @signInBackground !important; background-color: #245b78 !important;
padding: 0 !important; padding: 0 !important;
height: 100%; height: 100%;
} }
@@ -104,10 +104,10 @@ login and sign-up pages form background color
.tug-button-login { .tug-button-login {
display: flex; display: flex;
align-items: center; align-items: center;
fill: @tugrazRed; fill: #e4154b;
} }
.tug-button-login :hover { .tug-button-login :hover {
fill: @primaryButtonHoverBackground; fill: #000000;
} }
.login-page-button { .login-page-button {
margin: 5%; margin: 5%;
@@ -118,20 +118,20 @@ login and sign-up pages form background color
cursor: pointer; cursor: pointer;
} }
& a:hover { & a:hover {
background-color: @primaryLinkHoverBackground; background-color: #000;
color: @primaryLink !important; color: #fff !important;
text-decoration: none; text-decoration: none;
} }
} }
.login-page-button-white { .login-page-button-white {
color: @primaryButton !important; color: #fff !important;
font-family: "Source Sans Pro"; font-family: "Source Sans Pro";
font-size: initial; font-size: initial;
} }
.login-page-button-black { .login-page-button-black {
color: @primaryButtonInverted !important; color: #000 !important;
font-family: "Source Sans Pro"; font-family: "Source Sans Pro";
font-size: initial; font-size: initial;
} }
@@ -7,7 +7,7 @@
*/ */
#footer { #footer {
color: @footerGrey; color: #5E5E5E;
/*background-image: url("/static/images/footer.jpg");*/ /*background-image: url("/static/images/footer.jpg");*/
-webkit-background-size: 100% 100%; -webkit-background-size: 100% 100%;
@@ -22,18 +22,18 @@
background-attachment: fixed; background-attachment: fixed;
&.footer-bottom { &.footer-bottom {
background-color: @footerBottomBackground; background-color: #f2f2f2;
padding-top: 15px; padding-top: 15px;
padding-bottom: 15px; padding-bottom: 15px;
font-size: 16px; font-size: 16px;
a { a {
text-decoration: none; text-decoration: none;
color: @footerGrey; color: #5E5E5E;
&:hover, &:focus { &:hover, &:focus {
color: @primaryLink; color: #ffffff;
background-color: @primaryLinkHoverBackground; background-color: #000000;
} }
} }
} }
@@ -22,12 +22,12 @@ h2 {
} }
.record-version { .record-version {
color: @greyDark; color: #777777;
background-color: @recordVersionBackground !important; background-color: #f2f2f2 !important;
} }
.random-records-frontpage article { .random-records-frontpage article {
border-bottom: 1px solid @randomRecordsFrontpageArticle; border-bottom: 1px solid rgba(34,36,38,.15);
margin-bottom: 1rem; margin-bottom: 1rem;
padding-bottom: 1rem; padding-bottom: 1rem;
} }
@@ -10,7 +10,7 @@
width: 18px; width: 18px;
height: 18px; height: 18px;
vertical-align: top; vertical-align: top;
fill: @tugrazRed; fill: #e4154b;
} }
/*****logo section******/ /*****logo section******/
@@ -18,18 +18,18 @@
vertical-align: middle; vertical-align: middle;
white-space: nowrap; white-space: nowrap;
& a { & a {
fill: @tugrazRed; fill: #e4154b;
} }
} }
.affiliation-logo :hover { .affiliation-logo :hover {
text-decoration: none; text-decoration: none;
fill: @primaryLinkHoverBackground; fill: #000000;
color: @primaryLinkHoverBackground; color: #000000;
} }
.affiliation { .affiliation {
background-color: @primaryLink; background-color: white;
display: table; display: table;
margin: 0 auto 80px; margin: 0 auto 80px;
max-width: 1060px; max-width: 1060px;
@@ -78,12 +78,12 @@ a {
.short-menu-right { .short-menu-right {
display: table-cell; display: table-cell;
width: 50%; width: 50%;
color: @primaryLinkInverted; color: #000000;
} }
.short-menu-right :hover { .short-menu-right :hover {
background-color: @primaryLinkHoverBackground; background-color: #000000;
color: @primaryLink; color: #ffffff;
} }
.short-menu-right-button { .short-menu-right-button {
@@ -104,15 +104,15 @@ a {
& a { & a {
padding: 5px; padding: 5px;
background-color: transparent; background-color: transparent;
color: @primaryLinkInverted; color: #000;
text-decoration: none; text-decoration: none;
} }
} }
.short-menu-left-lang:hover { .short-menu-left-lang:hover {
& a { & a {
background-color: @primaryLinkHoverBackground; background-color: #000;
color: @primaryLink; color: #fff;
text-decoration: none; text-decoration: none;
} }
} }
@@ -126,7 +126,7 @@ a {
& svg { & svg {
& g { & g {
stroke-linejoin: round; stroke-linejoin: round;
stroke: @primaryLinkInverted; stroke: #000;
stroke-miterlimit: 10; stroke-miterlimit: 10;
stroke-width: 2; stroke-width: 2;
fill: none; fill: none;
@@ -137,11 +137,11 @@ a {
.search-icon-header:hover { .search-icon-header:hover {
& a { & a {
background-color: @primaryLinkHoverBackground; background-color: #000;
text-decoration: none; text-decoration: none;
& svg { & svg {
& g { & g {
stroke: @primaryLink; stroke: #fff;
} }
} }
} }
@@ -150,7 +150,7 @@ a {
.short-menu-left-search { .short-menu-left-search {
display: inline-block; display: inline-block;
margin: 12px 9px 6px 0; margin: 12px 9px 6px 0;
color: @primaryLinkInverted; color: #000000;
} }
.short-menu-right-main-menu { .short-menu-right-main-menu {
@@ -181,8 +181,8 @@ svg:not(:root) {
} }
.main-menu-entry a:hover { .main-menu-entry a:hover {
background-color: @primaryLinkHoverBackground; background-color: #000;
color: @primaryLink; color: #fff;
text-decoration: none; text-decoration: none;
} }
@@ -191,7 +191,7 @@ svg:not(:root) {
} }
.main-menu-underline-line { .main-menu-underline-line {
border: 2px solid @greyLight !important; border: 2px solid #e0e1e2 !important;
border-radius: 0; border-radius: 0;
} }
@@ -200,13 +200,13 @@ svg:not(:root) {
} }
.affiliation-text a:hover { .affiliation-text a:hover {
background-color: @primaryLinkHoverBackground; background-color: #000000;
color: @primaryLink; color: #ffffff;
text-decoration: none; text-decoration: none;
} }
.main-menu { .main-menu {
border-bottom: 1px solid @primaryLinkInverted; border-bottom: 1px solid #000;
box-sizing: border-box; box-sizing: border-box;
height: 39px; height: 39px;
margin-top: -1px; margin-top: -1px;
@@ -1,5 +1,5 @@
.ui.inverted.header{ .ui.inverted.header{
color: @primaryLinkInverted; color:#000;
} }
.login-page-button { .login-page-button {
@@ -10,14 +10,14 @@
cursor: pointer; cursor: pointer;
} }
& a:hover { & a:hover {
background-color: @primaryLinkHoverBackground; background-color: #000;
color: @primaryLink !important; color: #fff !important;
text-decoration: none; text-decoration: none;
} }
} }
.text-color{ .text-color{
color: @primaryLinkInverted; color: #000;
} }
@media (max-width: 767px) { @media (max-width: 767px) {
@@ -14,5 +14,5 @@
} }
.text-muted { .text-muted {
color: @greyDark; color: #777;
} }
@@ -12,7 +12,7 @@
* to #ffffff * to #ffffff
***/ ***/
.section-content-light-bg { .section-content-light-bg {
background-color: @primaryBackground; background-color: #ffffff;
} }
/*** /***
@@ -21,7 +21,7 @@
* to #000000 * to #000000
***/ ***/
.section-title { .section-title {
color: @primaryText; color: #000000;
} }
@@ -32,7 +32,7 @@
***/ ***/
.cover-page { .cover-page {
//text-align: center; //text-align: center;
background-color: @primaryBackground; background-color: #ffffff;
} }
@@ -42,7 +42,7 @@
* To #000000 * To #000000
***/ ***/
.panel-free-title { .panel-free-title {
color: @primaryText; color: #000000;
} }
@@ -75,16 +75,16 @@ pre {
***/ ***/
/*.ui.button,*/ /*.ui.button,*/
.ui.search.button { .ui.search.button {
background-color: @tugrazRed; background-color:#e4154b;
} }
.ui.button:hover, .ui.button:hover,
.ui.search.button:hover { .ui.search.button:hover {
background-color: @primaryButtonHoverBackground; background-color:#000000;
} }
.ui.button:hover { .ui.button:hover {
color: @primaryButton; color:#fff;
} }
/*** /***
@@ -123,33 +123,3 @@ pre {
.ui.label { .ui.label {
font-weight: 400; font-weight: 400;
} }
.ui.label.access-right {
float: right;
color: @accessRight;
background-color: white;
&.open {
color: @accessRightOpen;
background-color: white;
}
&.restricted {
color: @accessRightRestricted;
background-color: white;
}
&.embargoed {
color: @accessRightEmbargoed;
background-color: white;
}
&.closed {
color: @accessRightClosed;
background-color: white;
}
}
@@ -5,17 +5,7 @@
* it under the terms of the MIT License; see LICENSE file for more details. * it under the terms of the MIT License; see LICENSE file for more details.
*/ */
.title .dropdown { .access-right {
display: none; color: #e9711c;
} float: right;
.top-bottom-padded {
margin: unset;
}
.label.label-keyword {
font-size: 0.71428571rem;
font-weight: 400;
background-color: @labelKeywordBackground;
border: unset;
} }
@@ -1,28 +0,0 @@
/*
* Copyright (C) 2020 Graz University of Technology
*
* invenio-theme-tugraz is free software; you can redistribute it and/or modify
* it under the terms of the MIT License; see LICENSE file for more details.
*/
.creators {
margin: 0 0 1em;
}
.creators span {
margin-left: 2px;
}
.creator:not(:last-child):after {
color: @greyDark;
content: ';';
}
.creator {
display: inline-block;
margin-right: 5px;
}
.identifiers {
display: inline;
}
@@ -12,7 +12,6 @@
@import "overrides"; @import "overrides";
@import "frontpage"; @import "frontpage";
@import "record"; @import "record";
@import "search";
@import "macros"; @import "macros";
@import "login"; @import "login";
@import (css) @import (css)
@@ -12,56 +12,6 @@
***/ ***/
//@import "../invenio_app_rdm/variables.less"; //@import "../invenio_app_rdm/variables.less";
//@navbar_background_image: unset; //@navbar_background_image: unset;
//@navbar_background_color: #ffffff; //@navbar_background_color: #ffffff;
// badge colors, accessibility
@accessRight : #e9711c;
@accessRightOpen : #e9711c;
@accessRightRestricted: #fbbd08;
@accessRightEmbargoed : #db2828;
@accessRightClosed : #db2828;
// primary colors TU Graz
@tugrazBlack: #231f20;
@tugrazRed : #e4154b;
// accent colors
@greyDark : #777;
@greyLight : #E0E1E2;
@labelKeywordBackground: #E8E8E8;
// link and button colors
@primaryLinkInverted : #000;
@primaryLinkBackgroundInverted: #fff;
@primaryLink : #fff;
@primaryLinkHoverBackground : #000;
@primaryButton : #fff;
@primaryButtonHoverBackground : #000;
@primaryButtonInverted : #000f;
// general
@primaryBackground: #fff;
@primaryText : #000;
//account (signin, signup) specific
@primaryFormAccounts : #fff;
@formAccountsInputPlaceholder : silver;
@fieldInputSelectionBackground: #50a2ce;
@signInBackground : #245b78;
// footer specific
@footerGrey : #5E5E5E;
@footerBottomBackground: #f2f2f2;
// record specific
@recordVersionBackground : #f2f2f2;
@randomRecordsFrontpageArticle: rgba(34, 36, 38, .15);
+1 -31
View File
@@ -9,7 +9,6 @@
"""invenio module for TUGRAZ theme.""" """invenio module for TUGRAZ theme."""
from flask_babelex import gettext as _ from flask_babelex import gettext as _
from invenio_app_rdm.config import RECORDS_UI_ENDPOINTS
INVENIO_THEME_TUGRAZ_DEFAULT_VALUE = _("TU Graz Repository") INVENIO_THEME_TUGRAZ_DEFAULT_VALUE = _("TU Graz Repository")
"""Default value for the application.""" """Default value for the application."""
@@ -92,35 +91,6 @@ DEPOSITS_HEADER_TEMPLATE = "invenio_theme_tugraz/header.html"
# Uncomment below to override records landingpage. # Uncomment below to override records landingpage.
# from invenio_rdm_records.config import RECORDS_UI_ENDPOINTS # from invenio_rdm_records.config import RECORDS_UI_ENDPOINTS
# RECORDS_UI_ENDPOINTS["recid"].update( # RECORDS_UI_ENDPOINTS["recid"].update(
# template="invenio_theme_tugraz/record_landing_page.html" # template="invenio_theme_tugraz/record_landing_page.html"
# ) # )
"""override the default record landing page""" """override the default record landing page"""
# Invenio-search-ui
# =============
# See https://invenio-search-ui.readthedocs.io/en/latest/configuration.html
# SEARCH_UI_SEARCH_TEMPLATE = "invenio_theme_tugraz/search.html"
# """override the default search page"""
TUG_ROUTES = {
"index": "/",
"comingsoon": "/comingsoon",
}
# Invenio-app-rdm
# =============
# See https://invenio-app-rdm.readthedocs.io/en/latest/configuration.html
# """override the default search page"""
# Keep this in sync
APP_RDM_ROUTES = {
"index": "/notvalid/notvalid/notvalid",
"help_search": "/help/search",
"record_search": "/search2",
"record_detail": "/records/<pid_value>",
"record_export": "/records/<pid_value>/export/<export_format>",
"record_file_preview": "/records/<pid_value>/preview/<path:filename>",
"record_file_download": "/records/<pid_value>/files/<path:filename>",
"deposit_search": "/uploads",
"deposit_create": "/uploads/new",
"deposit_edit": "/uploads/<pid_value>",
}
+1 -1
View File
@@ -22,4 +22,4 @@ class FrontpageRecordsSearch(RecordsSearch):
"""Default index and filter for frontpage search.""" """Default index and filter for frontpage search."""
index = "rdmrecords-records" index = "rdmrecords-records"
default_filter = Q("query_string", query=("access.record:public")) default_filter = Q("query_string", query=("access.access_right:open"))
@@ -1,7 +0,0 @@
{%- extends config.INVENIO_THEME_TUGRAZ_BASE_TEMPLATE %}
{%- block page_body %}
<div class="ui container">
<h1 style="text-align: center;">comingsoon</h1>
</div>
{%- endblock %}
@@ -30,15 +30,15 @@
<h2>{{_ ("Repository")}}</h2> <h2>{{_ ("Repository")}}</h2>
<p class="bodytext"> <p class="bodytext">
<a href="{{ url_for('invenio_theme_tugraz.comingsoon') }}"> <a href="{{ url_for('invenio_app_rdm.coming_soon') }}">
{{_ ("Impressum")}}<i class="angle right icon"></i> {{_ ("Impressum")}}<i class="angle right icon"></i>
</a> </a>
<br> <br>
<a href="{{ url_for('invenio_theme_tugraz.comingsoon') }}"> <a href="{{ url_for('invenio_app_rdm.coming_soon') }}">
{{_ ("Data protection")}}<i class="angle right icon"></i> {{_ ("Data protection")}}<i class="angle right icon"></i>
</a> </a>
<br> <br>
<a href="{{ url_for('invenio_theme_tugraz.comingsoon') }}"> <a href="{{ url_for('invenio_app_rdm.coming_soon') }}">
{{_ ("Feedback")}}<i class="angle right icon"></i> {{_ ("Feedback")}}<i class="angle right icon"></i>
</a> </a>
</p> </p>
@@ -45,7 +45,7 @@
<!--TODO: remove this once above is uncommented--> <!--TODO: remove this once above is uncommented-->
<div class="two wide column main-menu-entry"> <div class="two wide column main-menu-entry">
<a href="{{url_for('invenio_app_rdm_records.deposit_search')}}">{{_ ("Uploads")}}</a> <a href="{{url_for('invenio_app_rdm.deposits_user')}}">{{_ ("Uploads")}}</a>
</div> </div>
</div> </div>
@@ -41,7 +41,7 @@
{%- for r in records %} {%- for r in records %}
{%- set creation_date = r._created|from_isodatetime -%} {%- set creation_date = r._created|from_isodatetime -%}
{%- set record_url = url_for('invenio_app_rdm_records.record_detail', pid_value=r.id) %} {%- set record_url = url_for('invenio_records_ui.recid', pid_value=r['id']) %}
<article> <article>
<!--TODO: <!--TODO:
@@ -94,17 +94,12 @@
</div> </div>
</div> </div>
<!--Disabled on feb-relase - enable when stable--> <div class="right floated column">
<!-- <div class="right floated column">
<span class="access-right"> <span class="access-right">
<i class="icon lock open"></i> <i class="icon lock open"></i>
{{ r.access.access_right | make_dict_like('access_right') | vocabulary_title('access_right') }} {{ r.access.access_right | make_dict_like('access_right') | vocabulary_title('access_right') }}
{%- for right in r.metadata.rights %}
<a target="_blank" href="{{right.url}}">{{ '(' ~ right.identifier ~ ')' }}</a>
{%- endfor %}
</span> </span>
</div> --> </div>
</div> </div>
</div> </div>
</article> </article>
@@ -1,6 +1,7 @@
{# {#
Copyright (C) 2020 Zenodo Copyright (C) 2020 Zenodo
Copyright (C) 2020 TUGRAZ Copyright (C) 2020 TUGRAZ
Copyright (C) 2020 mojib wali.
invenio-theme-tugraz is free software; you can redistribute it and/or invenio-theme-tugraz is free software; you can redistribute it and/or
modify it under the terms of the MIT License; see LICENSE file for more modify it under the terms of the MIT License; see LICENSE file for more
@@ -11,11 +12,11 @@
{%- for creators in authors_list %} {%- for creators in authors_list %}
{%- if creators.identifiers and creators.identifiers.orcid %} {%- if creators.identifiers.orcid %}
<a href="{{creators.identifiers.orcid|pid_url('orcid')}}" target="_blank" ><img class="inline-orcid" src="{{ url_for('static', filename='extra/orcid.png')}}" /></a> <a href="{{creators.identifiers.orcid|pid_url('orcid')}}" target="_blank" ><img class="inline-orcid" src="{{ url_for('static', filename='extra/orcid.png')}}" /></a>
{%- endif %} {%- endif %}
<span class="text-muted" {% if creators.affiliations %} {% for affiliation in creators.affiliations %} data-toggle="tooltip" title="{{affiliation.name}}" {%- endfor %} {% endif %}>{{creators.person_or_org.name}}</span> <span class="text-muted" {% if creators.affiliations %} {% for affiliation in creators.affiliations %} data-toggle="tooltip" title="{{affiliation.name}}" {%- endfor %} {% endif %}>{{creators.name}}</span>
{% if not loop.last %}; {% endif %} {% if not loop.last %}; {% endif %}
{%- endfor %} {%- endfor %}
@@ -13,82 +13,89 @@
{%- block css %} {%- block css %}
{{ super() }} {{ super() }}
{{ webpack['invenio-rdm-records-theme.css'] }}
{%- endblock css %} {%- endblock css %}
{%- from "invenio_app_rdm/landing_page/macros/files.html" import file_list_box, preview_file_box %} {%- from "invenio_rdm_records/macros/files.html" import file_list_box, preview_file_box %}
{%- from "invenio_app_rdm/landing_page/macros/detail.html" import show_detail %}
{%- set record = record|dereference_record|serialize_ui %}
{%- set metadata = record.metadata %}
{%- block page_body %} {%- block page_body %}
<div class="ui container"> <div class="ui container">
<div class="ui padded relaxed grid"> <div class="ui padded relaxed grid">
<div class="two column row"> <div class="two column row">
<div class="ten wide column"> <div class="ten wide column">
{%- block record_body %} {%- block record_body %}
<div class="badges"> <div class="left floated left aligned column">
<span class="ui label record-version" title="{{_('Publication date')}}"> <span class="ui label teal" title="Publication date">
{{ record.metadata.publication_date }} {{ '(' ~ record.metadata.version ~ ')' if record.metadata.version }} {{ record.publication_date|to_date|format_date(format='long') }}
</span> </span>
<!--Resource type badge--> <span class="ui label record-version">
<span class="ui label teal" title="{{_('Resource type')}}"> Version {{ record.version }}
{{record.ui.resource_type }} </span>
<span class="ui label grey">
{{ record.resource_type | vocabulary_title('resource_type') }}
</span> </span>
</div> </div>
<h1 style="margin-top: -6px">{{ record.metadata.title }}</h1> <h1>{{ record.titles[0].title }}</h1>
<p>{%- include "invenio_app_rdm/landing_page/details/creators.html" %}</p> <p>
<p>{%- include "invenio_app_rdm/landing_page/details/contributors.html" %}</p> {%- include "invenio_rdm_records/details/creators.html" %}
</p>
<div class="ui grid" style="margin-bottom: 10px;"> {%- if record.contributors %}
<p>
{%- include "invenio_rdm_records/details/contributors.html" %}
</p>
{%- endif %}
<div class="ui grid">
<div class="two column row"> <div class="two column row">
<div class="left floated column"> <div class="left floated column">
{%- for s in record.metadata.subjects %} {%- include "invenio_theme_tugraz/details/doi.html" %}
<div class="ui tiny label">{{s.subject}}</div>
{%- endfor %}
<div style="margin-top: 5px;">
<b>Created:</b> {{ record.ui.created_date_l10n_long }} | <b>Modified:</b> {{ record.ui.updated_date_l10n_long }}
</div>
</div> </div>
<div class="right floated column"> <div class="right floated column">
<span class="ui label access-right"> {#
<i class="icon lock open"></i> {%- include "invenio_rdm_records/details/contact.html" %}
{{ record.access.access_right | make_dict_like('access_right') | vocabulary_title('access_right') }} #}
{%- for right in record.metadata.rights %}
<a target="_blank" href="{{right.url}}">{{ '(' ~ right.identifier ~ ')' }}</a>
{%- endfor %}
<span class="access-right">
{{ record | vocabulary_title('access_right') | lower_case }}
</span> </span>
</div> </div>
</div> </div>
</div> </div>
{%- include "invenio_app_rdm/landing_page/details/description.html" %} {%- include "invenio_rdm_records/details/citation.html" %}
{%- include "invenio_rdm_records/details/keywords.html" %}
{%- include "invenio_rdm_records/details/description.html" %}
{%- include "invenio_rdm_records/details/licenses.html" %}
{# files #} {# files #}
{%- if record.files and record | can_list_files %} {%- if record.files and record | can_list_files %}
{%- set files = record.files | make_files_preview_compatible %} {%- set files = record.files %}
{%- set default_preview_file = files | select_preview_file(default_preview=record.files.default_preview) %} {{ preview_file_box(files | select_preview_file, pid) }}
{{ preview_file_box(default_preview_file, pid) }} {{ file_list_box(files.dumps(), pid) }}
{{ file_list_box(files, pid) }} {%- else %}
<br>
<p style="text-align: center;">
No associated files.
</p>
{% endif %} {% endif %}
{# More details #}
{%- endblock record_body %} {%- endblock record_body %}
</div> </div>
<div class="six wide column"> <div class="six wide column">
<div id="recordManagement"
class="ui container"
data-recid='{{ record["id"] | tojson }}'>
</div>
{% block sidebar %} {% block sidebar %}
{%- include "invenio_app_rdm/landing_page/details/side_bar.html" %} <div class="ui segment rdm-sidebar">
{%- include "invenio_rdm_records/details/side_bar.html" %}
</div>
{% endblock sidebar %} {% endblock sidebar %}
</div> </div>
</div> </div>
@@ -99,9 +106,8 @@
{%- block javascript %} {%- block javascript %}
{{ super() }} {{ super() }}
{{ webpack['invenio-app-rdm-records.js'] }} {{ webpack['invenio-rdm-records-js.js'] }}
{# Communities management #} {# Communities management #}
{{ webpack['invenio-communities-records.js'] }} {{ webpack['invenio-communities-records.js'] }}
{{ webpack['previewer_theme.js'] }} {{webpack['previewer_theme.js']}}
{{ webpack['invenio-app-rdm-record-management.js'] }}
{%- endblock javascript %} {%- endblock javascript %}
@@ -1,82 +0,0 @@
{#
Copyright (C) 2020 Graz University of Technology
invenio-theme-tugraz is free software; you can redistribute it and/or modify
it under the terms of the MIT License; see LICENSE file for more details.
#}
{%- extends config.BASE_TEMPLATE %}
{%- block javascript %}
{{ super() }}
{{ webpack['invenio-theme-tugraz-search-app.js'] }}
{%- endblock %}
{%- block page_body %}
<div data-invenio-search-config='{
"aggs": [
{
"aggName": "access_right",
"field": "access_right",
"title": "Access Right"
},
{
"aggName": "resource_type",
"field": "resource_type.type",
"title": "Resource Type",
"childAgg": {
"aggName": "subtype",
"field": "resource_type.subtype",
"title": "Resource Type"
}
}
],
"appId": "rdm-search",
"initialQueryState": {
"hiddenParams": null,
"size": 10
},
"layoutOptions": {
"gridView": false,
"listView": true
},
"paginationOptions": {
"defaultValue": 10,
"resultsPerPage": [
{
"text": "10",
"value": 10
},
{
"text": "20",
"value": 20
},
{
"text": "50",
"value": 50
}
]
},
"searchApi": {
"axios": {
"headers": {
"Accept": "application/vnd.inveniordm.v1+json"
},
"url": "/api/records",
"withCredentials": true
}
},
"sortOrderDisabled": true,
"sortOptions": [
{
"sortBy": "bestmatch",
"text": "Best match"
},
{
"sortBy": "newest",
"text": "Newest"
}
]
}'></div>
{%- endblock page_body %}
+1 -1
View File
@@ -12,4 +12,4 @@ This file is imported by ``invenio_theme_tugraz.__init__``,
and parsed by ``setup.py``. and parsed by ``setup.py``.
""" """
__version__ = "1.7.0" __version__ = "1.3.1stable"
+23 -35
View File
@@ -12,48 +12,36 @@ from typing import Dict
from elasticsearch_dsl.utils import AttrDict from elasticsearch_dsl.utils import AttrDict
from flask import Blueprint, render_template from flask import Blueprint, render_template
from flask_menu import current_menu
from .search import FrontpageRecordsSearch from .search import FrontpageRecordsSearch
blueprint = Blueprint(
def ui_blueprint(app): "invenio_theme_tugraz",
"""Blueprint for the routes and resources provided by Invenio-theme-tugraz.""" __name__,
routes = app.config.get("TUG_ROUTES") template_folder="templates",
static_folder="static",
blueprint = Blueprint( )
"invenio_theme_tugraz",
__name__,
template_folder="templates",
static_folder="static",
)
blueprint.add_url_rule(routes["index"], view_func=index)
blueprint.add_url_rule(routes["comingsoon"], view_func=comingsoon)
@blueprint.app_template_filter("make_dict_like")
def make_dict_like(value: str, key: str) -> Dict[str, str]:
"""Convert the value to a dict like structure.
in the form of a key -> value pair.
"""
return {key: value}
@blueprint.app_template_filter("cast_to_dict")
def cast_to_dict(attr_dict):
"""Return the dict structure of AttrDict variable."""
return AttrDict.to_dict(attr_dict)
return blueprint
@blueprint.route("/")
def index(): def index():
"""Frontpage.""" """Render frontpage view."""
return render_template( return render_template(
"invenio_theme_tugraz/index.html", "invenio_theme_tugraz/index.html",
records=FrontpageRecordsSearch()[:5].sort("-created").execute()) records=FrontpageRecordsSearch()[:5].sort("-created").execute(),
)
def comingsoon(): @blueprint.app_template_filter("make_dict_like")
"""Frontpage.""" def make_dict_like(value: str, key: str) -> Dict[str, str]:
return render_template("invenio_theme_tugraz/comingsoon.html") """Convert the value to a dict like structure.
in the form of a key -> value pair.
"""
return {key: value}
@blueprint.app_template_filter("cast_to_dict")
def cast_to_dict(attr_dict):
"""Return the dict structure of AttrDict variable."""
return AttrDict.to_dict(attr_dict)
-1
View File
@@ -17,7 +17,6 @@ theme = WebpackThemeBundle(
entry={ entry={
"invenio-theme-tugraz-theme": "./less/invenio_theme_tugraz/theme.less", "invenio-theme-tugraz-theme": "./less/invenio_theme_tugraz/theme.less",
"invenio-theme-tugraz-js": "./js/invenio_theme_tugraz/theme.js", "invenio-theme-tugraz-js": "./js/invenio_theme_tugraz/theme.js",
"invenio-theme-tugraz-search-app": "./js/invenio_theme_tugraz/search/index.js",
}, },
dependencies={}, dependencies={},
) )
+14 -21
View File
@@ -17,33 +17,28 @@ history = open("CHANGES.rst").read()
tests_require = [ tests_require = [
"pytest-invenio>=1.4.0", "pytest-invenio>=1.4.0",
"invenio-app>=1.3.0,<2.0.0", 'invenio-app>=1.3.0,<2.0.0',
"psycopg2-binary>=2.8.6",
] ]
# Should follow inveniosoftware/invenio versions
invenio_search_version = ">=1.4.0,<2.0.0"
invenio_db_version = ">=1.0.5,<2.0.0"
extras_require = { extras_require = {
"elasticsearch7": [f"invenio-search[elasticsearch7]{invenio_search_version}"],
"mysql": [f"invenio-db[mysql,versioning]{invenio_db_version}"],
"postgresql": [f"invenio-db[postgresql,versioning]{invenio_db_version}"],
"sqlite": [f"invenio-db[versioning]{invenio_db_version}"],
"docs": [ "docs": [
"Sphinx>=3", "Sphinx>=3",
], ],
"mysql": [
"invenio-db[mysql]>=1.0.0",
],
"postgresql": [
"invenio-db[postgresql]>=1.0.0",
],
"sqlite": [
"invenio-db>=1.0.0",
],
"tests": tests_require, "tests": tests_require,
} }
extras_require["all"] = [] extras_require["all"] = []
for name, reqs in extras_require.items(): for reqs in extras_require.values():
if name[0] == ":" or name in (
"elasticsearch7",
"mysql",
"postgresql",
"sqlite",
):
continue
extras_require["all"].extend(reqs) extras_require["all"].extend(reqs)
setup_requires = [ setup_requires = [
@@ -57,9 +52,7 @@ install_requires = [
"invenio-assets>=1.2.0", "invenio-assets>=1.2.0",
"invenio-i18n>=1.2.0", "invenio-i18n>=1.2.0",
"elasticsearch_dsl>=7.2.1", "elasticsearch_dsl>=7.2.1",
"invenio_search>=1.4.0,<2.0.0", "invenio_search>=1.3.1",
# keep this package updated.
"invenio_app_rdm>=0.18.8",
] ]
packages = find_packages() packages = find_packages()
@@ -90,7 +83,7 @@ setup(
"invenio_theme_tugraz = invenio_theme_tugraz:InvenioThemeTugraz", "invenio_theme_tugraz = invenio_theme_tugraz:InvenioThemeTugraz",
], ],
"invenio_base.blueprints": [ "invenio_base.blueprints": [
"invenio_theme_tugraz = invenio_theme_tugraz.views:ui_blueprint", "invenio_theme_tugraz = invenio_theme_tugraz.views:blueprint",
], ],
"invenio_i18n.translations": [ "invenio_i18n.translations": [
"messages = invenio_theme_tugraz", "messages = invenio_theme_tugraz",
+26 -26
View File
@@ -1,33 +1,33 @@
# # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# # #
# # Copyright (C) 2020 mojib wali. # Copyright (C) 2020 mojib wali.
# # #
# # invenio-theme-tugraz is free software; you can redistribute it and/or # invenio-theme-tugraz is free software; you can redistribute it and/or
# # modify it under the terms of the MIT License; see LICENSE file for more # modify it under the terms of the MIT License; see LICENSE file for more
# # details. # details.
# """Test views.""" """Test views."""
# from elasticsearch_dsl.utils import AttrDict from elasticsearch_dsl.utils import AttrDict
# from invenio_theme_tugraz.views import cast_to_dict, make_dict_like from invenio_theme_tugraz.views import cast_to_dict, make_dict_like
# def test_make_dict_like(): def test_make_dict_like():
# """Test make_dict_like.""" """Test make_dict_like."""
# access = { access = {
# "access_right" : "open" "access_right" : "open"
# } }
# dicts = make_dict_like("open", "access_right") dicts = make_dict_like("open", "access_right")
# assert access == dicts assert access == dicts
# def test_cast_to_dict(): def test_cast_to_dict():
# """Test cast_to_dict.""" """Test cast_to_dict."""
# resource_type = { resource_type = {
# "subtype" : "publication-datamanagementplan", "subtype" : "publication-datamanagementplan",
# "type" : "publication" "type" : "publication"
# } }
# expected = {'subtype': 'publication-datamanagementplan', 'type': 'publication'} expected = {'subtype': 'publication-datamanagementplan', 'type': 'publication'}
# attr = cast_to_dict(AttrDict(resource_type)) attr = cast_to_dict(AttrDict(resource_type))
# assert expected == attr assert expected == attr