To receive notifications about scheduled maintenance, please subscribe to the mailing-list gitlab-operations@sympa.ethz.ch. You can subscribe to the mailing-list at https://sympa.ethz.ch

Commit d3d6ebf7 authored by Hermann's avatar Hermann
Browse files

Merge branch 'master' into feature/filters

parents 84bfe1b8 de627555
......@@ -12,26 +12,11 @@ RUN npm run $NPM_BUILD_COMMAND
# Second stage: Server to deliver files
FROM node:alpine
# Port 8080 can be used as non root
EXPOSE 8080
# Create user with home directory and no password
RUN adduser -Dh /admintool admintool
USER admintool
WORKDIR /admintool
# Install http server
RUN npm install --no-save http-server
FROM nginx:1.15-alpine
# Copy files from first stage
COPY --from=build /index.html /admintool/
COPY --from=build /dist /admintool/dist
# Serve index.html for every file which is not found on the server
# Hotfix for direct links
RUN ln index.html 404.html
COPY --from=build /index.html /var/www/
COPY --from=build /dist /var/www/dist
# Run server (-g will automatically serve the gzipped files if possible)
CMD ["/admintool/node_modules/.bin/http-server", "-g", "/admintool"]
# Copy nginx configuration
COPY nginx.conf /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/;
index index.html;
try_files $uri /index.html =404;
}
......@@ -11,9 +11,14 @@ const APISession = {
token: '',
// user admins are a very special case as the permissions on the resource can only
// be seen by requesting users and check whether you see their membership
isUserAdmin: false
isUserAdmin: false,
};
const amivapi = axios.create({
baseURL: apiUrl,
headers: { 'Content-Type': 'application/json' },
});
// OAuth Handler
const oauth = new ClientOAuth2({
clientId: oAuthID,
......@@ -21,18 +26,13 @@ const oauth = new ClientOAuth2({
redirectUri: `${ownUrl}/oauthcallback`,
});
export function resetSession() {
function resetSession() {
APISession.authenticated = false;
APISession.token = '';
localStorage.remove('token');
window.location.replace(oauth.token.getUri());
}
const amivapi = axios.create({
baseURL: apiUrl,
headers: { 'Content-Type': 'application/json' },
});
function checkToken(token) {
// check if a token is still valid
return new Promise((resolve, reject) => {
......@@ -88,6 +88,26 @@ export function getSession() {
});
}
export function deleteSession() {
return new Promise((resolve, reject) => {
getSession().then((api) => {
api.get(`sessions/${APISession.token}`).then((response) => {
if (response.status === 200) {
api.delete(
`sessions/${response.data._id}`,
{ headers: { 'If-Match': response.data._etag } },
).then((deleteResponse) => {
if (deleteResponse.status === 204) {
resetSession();
resolve(deleteResponse.data);
} else reject();
}).catch(reject);
} else reject();
}).catch(reject);
});
});
}
export class ResourceHandler {
/* Handler to get and manipulate resource items
*
......
......@@ -71,10 +71,8 @@ export default class newEvent extends EditView {
type: 'string',
enum: ['Omnivor', 'Vegi', 'Vegan', 'Other'],
};
additionalFields.properties.specialFood = {
'Special Food Requirements': {
type: 'string',
},
additionalFields.properties['Special Food Requirements'] = {
type: 'string',
};
additionalFields.required.push('Food');
}
......
......@@ -42,5 +42,3 @@ m.route(root, '/events', {
'/newjoboffer': layoutWith(JobItem),
'/joboffers/:id': layoutWith(JobItem),
});
m.route.prefix('');
......@@ -9,11 +9,12 @@ import {
ToolbarTitle,
Dialog,
SVG,
Button,
IconButton,
} from 'polythene-mithril';
import { styler } from 'polythene-core-css';
import { icons } from './views/elements';
import { resetSession } from './auth';
import { deleteSession } from './auth';
import { colors } from './style';
const layoutStyle = [
......@@ -109,7 +110,11 @@ export class Layout {
style: { color: '#ffffff' },
})),
m(ToolbarTitle, { text: 'AMIV Admintools' }),
m('a', { onclick: resetSession }, 'Logout'),
m(Button, {
className: 'red-row-button',
label: 'logout',
events: { onclick: deleteSession },
}),
]),
m(
'div.mdc-typography.wrapper-sidebar',
......
......@@ -16,6 +16,11 @@ export default class UserEdit extends EditView {
m(RadioGroup, {
name: 'Membership',
buttons: [
{
value: 'none',
label: 'No Member',
defaultChecked: this.data.membership === 'none',
},
{
value: 'regular',
label: 'Regular AMIV Member',
......@@ -27,9 +32,9 @@ export default class UserEdit extends EditView {
defaultChecked: this.data.membership === 'extraordinary',
},
{
value: 'honory',
value: 'honorary',
label: 'Honorary Member',
defaultChecked: this.data.membership === 'honory',
defaultChecked: this.data.membership === 'honorary',
},
],
onChange: ({ value }) => { this.data.membership = value; },
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment