-
-
-
executeAction(e, 'bold')}>
-
executeAction(e, 'italic')}>
-
executeAction(e, 'insertunorderedlist')}>
-
executeAction(e, 'createlink', prompt('Lank naar','http://'))}>
-
-
onFocus(e)} onBlur={ e => onBlur(e)} onKeyUp={ e => onKeyUp(e)} ref={inputRef}/>
-
- );
-
-}
-
-export default HTMLArea;
diff --git a/packages/components/src/forms/index.jsx b/packages/components/src/forms/index.jsx
deleted file mode 100755
index e492342f4..000000000
--- a/packages/components/src/forms/index.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import loadWidget from '../lib/load-widget';
-import Form from './form';
-
-import './css/default.less'; // add css to result - TODO: dit moet beter
-
-Form.loadWidget = loadWidget;
-
-export {
- Form as default,
- Form,
-};
diff --git a/packages/components/src/forms/input-with-counter.jsx b/packages/components/src/forms/input-with-counter.jsx
deleted file mode 100755
index 2d70e5dea..000000000
--- a/packages/components/src/forms/input-with-counter.jsx
+++ /dev/null
@@ -1,120 +0,0 @@
-import merge from 'merge';
-import { useState, useRef, useEffect } from 'react';
-import HTMLArea from './htmlarea';
-
-import './css/input-with-counter.less'; // add css to result - TODO: dit moet beter
-
-// TODO: ik denk dat hij met HTML area niet meer werkt omdat de value niet goed wordt doorgegeven
-
-const InputWithCounter = function( props ) {
-
- props = merge.recursive({}, {
- name: 'tekst',
- inputType: 'input',
- minLength: 5,
- maxLength: 1024,
- placeholder: '',
- }, props.config, props);
-
- const [currentValue, setCurrentValue] = useState(props.value || props.defaultValue || '');
- const [focused, setFocused] = useState(props.focused || false);
- const [valid, setIsValid] = useState(true);
- const [showWarning, setShowWarning] = useState(false);
- const inputRef = useRef(null);
-
- function isValid() {
- let state = {};
- state.isValid = true;
- state.warning = null;
- if (currentValue.length < props.minLength) {
-// xxx
- state.warning = `De tekst is te kort`;
- state.isValid = false;
- }
- if (currentValue.length > props.maxLength) {
- state.warning = `De tekst is te lang`;
- state.isValid = false;
- }
- this.setState(state)
- return state.isValid;
- }
-
- function validate() {
- this.setState({ showWarning: true })
- return this.isValid();
- }
-
- function handleOnChange({name, value}) {
- setCurrentValue(value);
- setIsValid(value.length >= props.minLength && value.length <= props.maxLength);
- if (typeof props.onChange == 'function') {
- props.onChange({ name, value });
- }
- }
-
- function onInputFocus() {
- setFocused(true);
- setShowWarning(false);
- }
-
- function onInputBlur() {
- setFocused(false);
- }
-
- let counter = null;
- let warning = null;
- if (focused) {
- if (currentValue.length < props.minLength) {
- counter = (
Nog minimaal {props.minLength - currentValue.length} tekens
)
- } else {
- let error = currentValue.length > props.maxLength ? 'osc-form-error' : '';
- counter = (
Je hebt nog {props.maxLength - currentValue.length} tekens over.
)
- }
- }
-
- if (showWarning && warning) {
- warning = (
this['form-warning'] = el }>{warning}
)
- }
-
- let inputHTML = null;
- switch(props.inputType) {
-
- case 'htmlarea':
- inputHTML = (
-
- );
- break;
-
- case 'textarea':
- inputHTML = (
-
- );
- break;
-
- case 'input':
- default:
- inputHTML = (
-
handleOnChange({ name: props.name, value: e.target.value })} onFocus={e => onInputFocus(e)} onBlur={e => onInputBlur(e)}>
- );
-
- }
-
- return (
-
(self.instance = el)} className="osc-input-with-counter">
-
-
- {inputHTML}
- {counter}
- {warning}
-
-
- );
-
-}
-
-export default InputWithCounter;
diff --git a/packages/components/src/index.jsx b/packages/components/src/index.jsx
deleted file mode 100755
index 28b18acb8..000000000
--- a/packages/components/src/index.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from "react";
-
-import About from './about/index.jsx';
-import Button from './button/index.jsx';
-import Comments from './comments/index.jsx';
-import ResourceDetails from './resource-details/index.jsx';
-import ResourcesOverview from './resources-overview/index.jsx';
-import ParticipativeBudgeting from './participative-budgeting/index.jsx';
-import User from './user/index.jsx';
-
-// Lazy zou misschien mooier zijn, maar dan heb je de loadWidget functie niet beschikbaar
-//
-// import { lazy } from 'react';
-//
-// let Button = lazy(() => import('./button/index.jsx'));
-// let User = lazy(() => import('./user/index.jsx'));
-
-export {
- About,
- Button,
- Comments,
- ResourcesOverview,
- ResourceDetails,
- ParticipativeBudgeting,
- User,
-}
-
diff --git a/packages/components/src/lib/has-role.js b/packages/components/src/lib/has-role.js
deleted file mode 100644
index 7fa6d483d..000000000
--- a/packages/components/src/lib/has-role.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const roles = {
- admin: ['admin', 'editor', 'moderator', 'member', 'anonymous', 'all'],
- editor: ['editor', 'moderator', 'member', 'anonymous', 'all'],
- moderator: ['moderator', 'member', 'anonymous', 'all'],
- member: ['member', 'anonymous', 'all'],
- anonymous: ['anonymous', 'all'],
- all: ['all'], // special
- owner: null, // special
-}
-
-module.exports = function hasRole(user, minRoles, ownerId) {
-
- minRoles = minRoles || 'admin'; // admin can do anything
- if (!Array.isArray(minRoles)) minRoles = [minRoles];
-
- let userRole = user && user.role;
-
- let valid = minRoles.find( minRole => {
- return roles[userRole] && roles[userRole].indexOf(minRole) != -1
- });
-
- if (minRoles.includes('owner') && ownerId) {
- valid = valid || ( user.id == ownerId );
- }
-
- return valid;
-
-}
diff --git a/packages/components/src/lib/load-widget.js b/packages/components/src/lib/load-widget.js
deleted file mode 100755
index f791958f2..000000000
--- a/packages/components/src/lib/load-widget.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { createRoot } from "react-dom/client";
-
-export default function loadWidget(elementId, props) {
-
- const Component = this;
-
- const container = document.getElementById(elementId);
- const root = createRoot(container);
- root.render(
);
-
-}
diff --git a/packages/components/src/lib/session-storage.js b/packages/components/src/lib/session-storage.js
deleted file mode 100755
index f43573210..000000000
--- a/packages/components/src/lib/session-storage.js
+++ /dev/null
@@ -1,62 +0,0 @@
-export default function(props) {
-
- let self = this;
- self.projectId = props.projectId || props.config.projectId;
-
- function getData() {
-
- let data = window.sessionStorage.getItem('openstad') || {};
- try {
- data = JSON.parse(data);
- } catch(err) {}
-
- let target = data;
- if (self.projectId) {
- data[self.projectId] = data[self.projectId] || {};
- target = data[self.projectId] || {};
- }
-
- return { data, target }
-
- }
-
- this.get = function(name) {
-
- let { data, target } = getData();
-
- let value = target[name];
- try {
- value = JSON.parse(value);
- } catch(err) {}
-
- return value;
-
- }
-
- this.set = function(name, value) {
-
- if ( typeof name != 'string' ) return;
-
- if ( typeof value == 'undefined' ) value = "";
-
- let { data, target } = getData();
- target[name] = value;
-
- window.sessionStorage.setItem( 'openstad', JSON.stringify(data) );
-
- }
-
-
- this.remove = function(name) {
-
- if ( typeof name != 'string' ) return;
-
- let { data, target } = getData();
-
- delete target[name];
-
- window.sessionStorage.setItem( 'openstad', JSON.stringify(data) );
-
- }
-
-}
diff --git a/packages/components/src/lib/user-has-role.js b/packages/components/src/lib/user-has-role.js
deleted file mode 100755
index b8437382d..000000000
--- a/packages/components/src/lib/user-has-role.js
+++ /dev/null
@@ -1,15 +0,0 @@
-let roles = {
- admin: ['admin', 'moderator', 'editor', 'member', 'anonymous', 'all'],
- moderator: ['moderator', 'editor', 'member', 'anonymous', 'all'],
- editor: ['editor', 'member', 'anonymous', 'all'],
- member: ['member', 'anonymous', 'all'],
- anonymous: ['anonymous', 'all'],
- all: ['all'], // special
- owner: null, // special
-}
-
-export default function(user = {}, requiredRole) {
- let userRole = user.role;
- if (!Object.keys(roles).includes(userRole)) userRole = 'all';
- return roles[userRole].includes(requiredRole);
-}
diff --git a/packages/components/src/loading/css/default.less b/packages/components/src/loading/css/default.less
deleted file mode 100644
index 1fc053914..000000000
--- a/packages/components/src/loading/css/default.less
+++ /dev/null
@@ -1,3 +0,0 @@
-.osc-loading {
- background-color: #eee;
-}
diff --git a/packages/components/src/loading/index.jsx b/packages/components/src/loading/index.jsx
deleted file mode 100644
index ad3abc791..000000000
--- a/packages/components/src/loading/index.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import merge from 'merge';
-
-import './css/default.less'; // add css to result - TODO: dit moet beter
-
-const Loading = function( props ) {
-
- props = merge.recursive({}, {
- title: 'Resources overview',
- }, props.config, props);
-
- return (
-
Loading...
- );
-
-}
-
-export {
- Loading as default,
- Loading,
-};
diff --git a/packages/components/src/participative-budgeting/css/default.less b/packages/components/src/participative-budgeting/css/default.less
deleted file mode 100644
index df1b64cc0..000000000
--- a/packages/components/src/participative-budgeting/css/default.less
+++ /dev/null
@@ -1,6 +0,0 @@
-@import (reference) '../../css/default.less';
-@import '../../css/error.less';
-@import 'participative-budgeting';
-
-@phone: ~'only screen and (max-width: 700px)';
-
diff --git a/packages/components/src/participative-budgeting/css/participative-budgeting.less b/packages/components/src/participative-budgeting/css/participative-budgeting.less
deleted file mode 100644
index 1567b8d1b..000000000
--- a/packages/components/src/participative-budgeting/css/participative-budgeting.less
+++ /dev/null
@@ -1,2 +0,0 @@
-.osc-participative-budgeting {
-}
diff --git a/packages/components/src/participative-budgeting/index.jsx b/packages/components/src/participative-budgeting/index.jsx
deleted file mode 100644
index ab4801803..000000000
--- a/packages/components/src/participative-budgeting/index.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import loadWidget from '../lib/load-widget';
-import ParticipativeBudgeting from './participative-budgeting';
-
-import './css/default.less'; // add css to result - TODO: dit moet beter
-
-ParticipativeBudgeting.loadWidget = loadWidget;
-
-export {
- ParticipativeBudgeting as default,
- ParticipativeBudgeting,
-};
diff --git a/packages/components/src/participative-budgeting/participative-budgeting.jsx b/packages/components/src/participative-budgeting/participative-budgeting.jsx
deleted file mode 100644
index fd31b65d6..000000000
--- a/packages/components/src/participative-budgeting/participative-budgeting.jsx
+++ /dev/null
@@ -1,185 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import hasRole from '../lib/has-role';
-import DataStore from '../data-store';
-import SessionStorage from '../lib/session-storage.js';
-import Button from '../button';
-import LoginButton from '../user/login-button';
-import VoteSelection from '../voting/vote-selection';
-import ResourcesOverview from '../resources-overview';
-import ErrorComponent from '../error';
-
-import { cva } from "class-variance-authority";
-const commentVariants = cva(
- "",
- {
- variants: {
- },
- }
-);
-
-const ParticipativeBudgeting = function(props) {
-
- props = merge.recursive({}, {
- title: 'Participative Budgeting',
- }, props.config, props);
-
- const datastore = new DataStore(props);
- const session = new SessionStorage(props);
-
- const [ currentUser, currentUserError, currentUserIsLoading ] = datastore.useCurrentUser({ ...props });
- const [ userVote, userVoteError, userVoteIsLoading ] = datastore.useUserVote({ ...props });
- const [ isBusy, setIsBusy ] = useState(false)
- const [ selection, setSelection ] = useState([]);
- const [ step, setStep ] = useState(0);
- const [ voteResult, setVoteResult ] = useState({});
-
- useEffect(() => {
- setSelection(session.get('osc-voting-selection') || []);
- setStep(session.get('osc-voting-step') || 0);
- }, []);
-
- function addToSelection(e, resource) {
- let result = [...selection];
- result.push(resource)
- setSelection(result);
- session.set('osc-voting-selection', result);
- }
-
- function removeFromSelection(e, resource) {
- let index = selection.findIndex(elem => elem.id == resource.id);
- if (index != -1) {
- let result = [...selection]
- result.splice(index, 1)
- setSelection(result);
- session.set('osc-voting-selection', result);
- }
- }
-
- function toggleSelection(e, resource) {
- let index = selection.findIndex(elem => elem.id == resource.id);
- if (index == -1) {
- addToSelection(e, resource);
- } else {
- removeFromSelection(e, resource);
- }
- }
-
- function gotoStep(targetStep) {
- setStep(targetStep);
- session.set('osc-voting-step', targetStep);
- }
-
- function nextStep() {
- if (step <= 4) gotoStep(step + 1);
- }
-
- function previousStep() {
- if (step > 0) gotoStep(step - 1);
- }
-
- async function doVote(e, value) {
-
- console.log('DOVOTE');
-
- if (e) e.stopPropagation();
-
- if (isBusy) return;
- setIsBusy(true);
-
- if (!props.votes.isActive) {
- return;
- }
-
- if (!currentUser || !currentUser.role || !hasRole(currentUser, props.votes.requiredUserRole) ) {
- // how did you get here
- let error = new Error('Deze gebruiker kan niet stemmen');
- let event = new window.CustomEvent('osc-error', { detail: error });
- document.dispatchEvent(event);
- }
-
- let result = await userVote.submitVote(selection);
-
- setVoteResult(voteResult);
- nextStep();
-
- setIsBusy(false);
-
- }
-
- function reset() {
- setStep(0);
- session.remove('osc-voting-step');
- setSelection([]);
- session.remove('osc-voting-selection');
- }
-
- let allHTML = null;
-
- switch (step) {
- case 0: // select resources
- allHTML = (
- <>
-
- nextStep()}>Volgende
-
- >
- );
- break;
-
- case 1: // preview selection
- allHTML = (
- <>
-
- previousStep()}>Vorige
- nextStep()}>Volgende
- >
- );
- break;
-
- case 2: // login
- if (currentUser && currentUser.role && hasRole(currentUser, props.votes.requiredUserRole) ) nextStep();
- allHTML = (
- <>
- Nu moet je inloggen
- previousStep()}>Vorige
-
- >
- );
- break;
-
- case 3: // do vote
- if (!currentUser || !currentUser.role || !hasRole(currentUser, props.votes.requiredUserRole) ) previousStep();
- allHTML = (
- <>
- Je bent ingelogd. Stem nu.
- gotoStep(1)}>Vorige
- doVote()}>Stem nu
- >
- );
- break;
-
- case 4: // result
- allHTML = (
- <>
- Klaar
- reset()}>Reset
- >
- );
- break;
-
- }
-
- let titleHTML = props.title ? { props.title } - stap {step + 1} : null;
-
- return (
-
-
- {titleHTML}
- {allHTML}
-
- );
-
-}
-
-export default ParticipativeBudgeting;
diff --git a/packages/components/src/resource-details/css/default.less b/packages/components/src/resource-details/css/default.less
deleted file mode 100644
index 44aa2ecb3..000000000
--- a/packages/components/src/resource-details/css/default.less
+++ /dev/null
@@ -1,6 +0,0 @@
-@import (reference) '../../css/default.less';
-@import '../../css/error.less';
-@import 'resource-details';
-
-@phone: ~'only screen and (max-width: 700px)';
-
diff --git a/packages/components/src/resource-details/css/resource-details.less b/packages/components/src/resource-details/css/resource-details.less
deleted file mode 100644
index 4d2d6de26..000000000
--- a/packages/components/src/resource-details/css/resource-details.less
+++ /dev/null
@@ -1,2 +0,0 @@
-.osc-resource-details {
-}
diff --git a/packages/components/src/resource-details/index.jsx b/packages/components/src/resource-details/index.jsx
deleted file mode 100644
index 2591a1814..000000000
--- a/packages/components/src/resource-details/index.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import loadWidget from '../lib/load-widget';
-import ResourceDetails from './resource-details';
-
-import './css/default.less'; // add css to result - TODO: dit moet beter
-
-ResourceDetails.loadWidget = loadWidget;
-
-export {
- ResourceDetails as default,
- ResourceDetails,
-};
diff --git a/packages/components/src/resource-details/like-buttons.jsx b/packages/components/src/resource-details/like-buttons.jsx
deleted file mode 100644
index cc748ae13..000000000
--- a/packages/components/src/resource-details/like-buttons.jsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import SessionStorage from '../lib/session-storage.js';
-import DataStore from '../data-store';
-import Button from '../button';
-import Error from '../error';
-
-// TODO: op verzoek van Daan; gaan we dat gebruiken?
-// TODO: dit moet, sort of, passen op NLDS
-import { cva } from "class-variance-authority";
-const commentVariants = cva(
- "osc-likebuttons-component osc-likebuttons inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- icon: "w-10 hover:bg-foreground/10",
- link: "underline-offset-4 hover:underline text-primary",
- },
- size: {
- default: "h-12 py-4 px-4",
- sm: "h-10 px-2",
- lg: "h-14 px-8",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-);
-
-const LikeButtons = function(props) {
-
- props = merge.recursive({}, {
- resource: {},
- votes: {
- isActive: false,
- requiredUserRole: 'member',
- voteType: 'likes',
- voteValues: [
- {
- label: 'Like',
- value: 'yes'
- }
- ]
- },
- }, props.config, props);
-
- console.log(props);
-
- const datastore = new DataStore(props);
- const session = new SessionStorage(props);
-
- const [ currentUser, currentUserError, currentUserIsLoading ] = datastore.useCurrentUser({ ...props });
- const [ isBusy, setIsBusy ] = useState(false)
-
- useEffect(() => {
- let pending = session.get('osc-resource-vote-pending');
- console.log('PENDING', pending, props.resource.id, pending && pending[props.resource.id])
- if (pending && pending[props.resource.id]) {
- if (currentUser && currentUser.role) {
- doVote(null, pending[props.resource.id])
- session.remove('osc-resource-vote-pending');
- }
- }
- }, [props.resource, currentUser]);
-
- async function doVote(e, value) {
-
- console.log('VOTE', value);
-
- if (e) e.stopPropagation();
-
- if (isBusy) return;
- setIsBusy(true);
-
- // if (!props.votes.isActive) return;
-
- console.log('currentUser', currentUser);
- if (!currentUser.role) {
- // login
- session.set('osc-resource-vote-pending', { [props.resource.id]: value });
- return document.location.href = props.loginUrl;
- }
-
- let change = {};
- if (props.resource.userVote) change[props.resource.userVote.opinion] = -1;
-
- await props.resource.submitLike({
- opinion: value
- })
-
- setIsBusy(false);
-
- }
-
- let className = 'osc-numberplate-button';
- if (!props.votes.isActive) className += ' osc-inactive';
-
- let buttonsHTML = [];
- for (let value of props.votes.voteValues) {
- let isBusy = false;
- let VoteButton = (
- doVote(e, value.value)} key={`osc-vote-button-${value.value}`}>{value.label} ({props.resource && props.resource[value.value]})
- );
- buttonsHTML.push(VoteButton);
- }
-
- return (
-
- {buttonsHTML}
-
- );
-
-}
-
-export default LikeButtons;
diff --git a/packages/components/src/resource-details/resource-details.jsx b/packages/components/src/resource-details/resource-details.jsx
deleted file mode 100644
index 725fdf64b..000000000
--- a/packages/components/src/resource-details/resource-details.jsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import DataStore from '../data-store';
-import LikeButtons from '../voting/like-buttons';
-import Error from '../error';
-
-// TODO: op verzoek van Daan; gaan we dat gebruiken?
-// TODO: dit moet, sort of, passen op NLDS
-import { cva } from "class-variance-authority";
-const commentVariants = cva(
- "osc-resourceDetails-component osc-resourceDetails inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- icon: "w-10 hover:bg-foreground/10",
- link: "underline-offset-4 hover:underline text-primary",
- },
- size: {
- default: "h-12 py-4 px-4",
- sm: "h-10 px-2",
- lg: "h-14 px-8",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-);
-
-const ResourceDetails = function(props) {
-
- props = merge.recursive({}, {
- title: 'Resource details',
- }, props.config, props);
-
- const datastore = new DataStore(props);
-
- const [ currentUser, currentUserError, currentUserIsLoading ] = datastore.useCurrentUser({ ...props });
- const [ resource, resourceError, resourceIsLoading ] = datastore.useResource({ ...props });
-
- let resourceHTML = null;
- if (resource) {
- resourceHTML = (
- <>
- {resource.title}
-
- Images: {JSON.stringify(resource.images, null, 2)}
-
-
- Summary: {resource.summary}
-
-
- Description: {resource.description}
-
- >
- );
- } else{
- if (resourceIsLoading) { // TODO: i18n
- resourceHTML = Loading...
- } else {
- resourceHTML = {props.emptyListText}
- }
- }
-
- return (
-
-
- {resourceHTML}
-
-
- );
-
-}
-
-export default ResourceDetails;
diff --git a/packages/components/src/resources-filter/css/default.less b/packages/components/src/resources-filter/css/default.less
deleted file mode 100644
index 2cbe62b24..000000000
--- a/packages/components/src/resources-filter/css/default.less
+++ /dev/null
@@ -1,6 +0,0 @@
-@import (reference) '../../css/default.less';
-@import '../../css/error.less';
-@import 'resources-filter';
-
-@phone: ~'only screen and (max-width: 700px)';
-
diff --git a/packages/components/src/resources-filter/css/resources-filter.less b/packages/components/src/resources-filter/css/resources-filter.less
deleted file mode 100644
index 017061641..000000000
--- a/packages/components/src/resources-filter/css/resources-filter.less
+++ /dev/null
@@ -1,2 +0,0 @@
-.osc-resources-filter {
-}
diff --git a/packages/components/src/resources-filter/index.jsx b/packages/components/src/resources-filter/index.jsx
deleted file mode 100644
index c2da8dc26..000000000
--- a/packages/components/src/resources-filter/index.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import loadWidget from '../lib/load-widget';
-import ResourcesFilter from './resources-filter';
-
-import './css/default.less'; // add css to result - TODO: dit moet beter
-
-ResourcesFilter.loadWidget = loadWidget;
-
-export {
- ResourcesFilter as default,
- ResourcesFilter,
-};
diff --git a/packages/components/src/resources-filter/resources-filter.jsx b/packages/components/src/resources-filter/resources-filter.jsx
deleted file mode 100644
index 59eb06f04..000000000
--- a/packages/components/src/resources-filter/resources-filter.jsx
+++ /dev/null
@@ -1,140 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import DataStore from '../data-store';
-import hasRole from '../lib/user-has-role';
-
-// TODO: op verzoek van Daan; gaan we dat gebruiken?
-// TODO: dit moet, sort of, passen op NLDS
-import { cva } from "class-variance-authority";
-const commentVariants = cva(
- "osc-resourcesFilter-component osc-resourcesFilter inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- icon: "w-10 hover:bg-foreground/10",
- link: "underline-offset-4 hover:underline text-primary",
- },
- size: {
- default: "h-12 py-4 px-4",
- sm: "h-10 px-2",
- lg: "h-14 px-8",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-);
-
-const ResourcesFilter = function(props) {
-
- props = merge.recursive({}, {
- title: 'Resources filter',
- search: true,
- tagTypes: [ 'theme', 'area' ],
- onUpdateFilter: filter => console.log(filter),
- }, props.config, props);
-
- const datastore = new DataStore(props);
-
- let defaultFilter = { tags: {}, search: { text: '' } };
- props.tagTypes.forEach(tagType => {
- defaultFilter.tags[tagType] = null;
- });
-
- const [filter, setFilter] = useState(defaultFilter);
- function updateFilter(newFilter) {
- setFilter(newFilter);
- props.onUpdateFilter(newFilter);
- }
-
- function setTag(type, value) {
- let newFilter = {
- ...filter,
- tags: {
- ...filter.tags,
- [type]: filter.tags[type] == value ? null : value,
- }
- };
- updateFilter(newFilter);
- }
-
- function setSearch(value) {
- let newFilter = {
- ...filter,
- search: {
- text: value,
- }
- };
- updateFilter(newFilter);
- }
-
- let tagsByType = [];
- for (let tagType of props.tagTypes) {
- const [ tags, tagsError, tagsIsLoading ] = datastore.useTags({ ...props, type: tagType });
- tagsByType[tagType] = { tags, tagsError, tagsIsLoading };
- }
-
- let errorHTML = null;
- let error = null; // todo: samenvoegen uit lijst
- if (error) {
- console.log(error);
- errorHTML = {error.message}
- }
-
- let tagsHTML = [];
- for (let tagType of props.tagTypes) {
- let tagHTML = null;
- if (tagsByType[tagType].tags.length) {
- tagHTML = (
-
-
{tagType.charAt(0).toUpperCase() + tagType.slice(1)}
- { tagsByType[tagType].tags.map( ( tag, index ) => {
- return (
-
setTag(tagType, tag.id) } key={`osc-tag-${ tagType }-${ index }`}>
-
- {tag.name}
-
- );
- })
- }
-
- );
- } else{
- if (tagsByType[tagType].tagsIsLoading) { // TODO: i18n
- tagHTML = Loading...
- }
- }
- if (tagHTML) {
- tagsHTML.push(tagHTML);
- }
- }
-
- let searchHTML = [];
- if (props.search) {
- searchHTML =
-
- setSearch(e.target.value) } value={filter.search.text}/>
-
- }
-
- return (
-
- {errorHTML}
- {searchHTML}
- {tagsHTML}
-
- );
-
-}
-
-export default ResourcesFilter;
diff --git a/packages/components/src/resources-overview/css/default.less b/packages/components/src/resources-overview/css/default.less
deleted file mode 100644
index 551350fcf..000000000
--- a/packages/components/src/resources-overview/css/default.less
+++ /dev/null
@@ -1,6 +0,0 @@
-@import (reference) '../../css/default.less';
-@import '../../css/error.less';
-@import 'resources-overview';
-
-@phone: ~'only screen and (max-width: 700px)';
-
diff --git a/packages/components/src/resources-overview/css/resources-overview.less b/packages/components/src/resources-overview/css/resources-overview.less
deleted file mode 100644
index 7d44f80bc..000000000
--- a/packages/components/src/resources-overview/css/resources-overview.less
+++ /dev/null
@@ -1,2 +0,0 @@
-.osc-resources-overview {
-}
diff --git a/packages/components/src/resources-overview/index.jsx b/packages/components/src/resources-overview/index.jsx
deleted file mode 100644
index 24bd28350..000000000
--- a/packages/components/src/resources-overview/index.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import loadWidget from '../lib/load-widget';
-import ResourcesOverview from './resources-overview';
-
-import './css/default.less'; // add css to result - TODO: dit moet beter
-
-ResourcesOverview.loadWidget = loadWidget;
-
-export {
- ResourcesOverview as default,
- ResourcesOverview,
-};
diff --git a/packages/components/src/resources-overview/resources-overview.jsx b/packages/components/src/resources-overview/resources-overview.jsx
deleted file mode 100644
index c6a82a56b..000000000
--- a/packages/components/src/resources-overview/resources-overview.jsx
+++ /dev/null
@@ -1,99 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import DataStore from '../data-store';
-import ResourcesFilter from '../resources-filter';
-
-// TODO: op verzoek van Daan; gaan we dat gebruiken?
-// TODO: dit moet, sort of, passen op NLDS
-import { cva } from "class-variance-authority";
-const commentVariants = cva(
- "osc-resourcesOverview-component osc-resourcesOverview inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- icon: "w-10 hover:bg-foreground/10",
- link: "underline-offset-4 hover:underline text-primary",
- },
- size: {
- default: "h-12 py-4 px-4",
- sm: "h-10 px-2",
- lg: "h-14 px-8",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-);
-
-const ResourcesOverview = function(props) {
-
- props = merge.recursive({}, {
- title: 'Resources overview',
- onResourceClick: onResourceClick,
- }, props.config, props);
-
- const datastore = new DataStore(props);
-
- const [ currentUser, currentUserError, currentUserIsLoading ] = datastore.useCurrentUser({ ...props });
- const [ tags, tagsError, tagsIsLoading ] = datastore.useTags({ ...props });
- const [ resources, resourcesError, resourcesIsLoading ] = datastore.useResources({ ...props });
-
- function onResourceClick(e, resource) {
- console.log('ONRESOURCECLICK', resource.id);
- }
-
- let titleHTML = props.title ? { props.title } : null;
-
- // TODO: errors moeten nog
- let errorHTML = null;
- // let error = submitError || resourcesOverviewError;
- // if (error) {
- // console.log(error);
- // errorHTML = {error.message}
- // }
-
- let resourcesHTML = null;
- if (resources.length) {
- resourcesHTML = (
- <>
- { resources.map( ( resource, index ) => {
- return (
- props.onResourceClick(e, resource)} key={`osc-resource-${ index }`}>
- {resource.title} ({ resource.tags && resource.tags.map( ( tag, jndex ) => tag.name).join(', ') })
-
- );
- })
- }
- >
- );
- } else{
- if (resourcesIsLoading) { // TODO: i18n
- resourcesHTML = Loading...
- } else {
- resourcesHTML = {props.emptyListText}
- }
- }
-
- return (
-
- {titleHTML}
- {errorHTML}
-
- Resources
- {resourcesHTML}
-
- );
-
-}
-
-export default ResourcesOverview;
diff --git a/packages/components/src/user/css/default.less b/packages/components/src/user/css/default.less
deleted file mode 100755
index 43dafb2d6..000000000
--- a/packages/components/src/user/css/default.less
+++ /dev/null
@@ -1,6 +0,0 @@
-//@import (reference) '../../component/css/default.less';
-@import 'user';
-
-* {
- box-sizing: border-box;
-}
diff --git a/packages/components/src/user/css/user.less b/packages/components/src/user/css/user.less
deleted file mode 100755
index 9afdbb426..000000000
--- a/packages/components/src/user/css/user.less
+++ /dev/null
@@ -1,7 +0,0 @@
-.osc-user {
-
- h3 {
- padding: 0;
- }
-
-}
diff --git a/packages/components/src/user/index.jsx b/packages/components/src/user/index.jsx
deleted file mode 100755
index 8a8e11aac..000000000
--- a/packages/components/src/user/index.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import loadWidget from '../lib/load-widget';
-import User from './user';
-
-import './css/default.less'; // add css to result - TODO: dit moet beter
-
-User.loadWidget = loadWidget;
-
-export {
- User as default,
- User,
-};
diff --git a/packages/components/src/user/login-button.jsx b/packages/components/src/user/login-button.jsx
deleted file mode 100644
index acb4add19..000000000
--- a/packages/components/src/user/login-button.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import Button from '../button';
-
-const LoginButton = function( props ) {
-
- props = merge.recursive({}, {
- currentUser: {},
- label: 'Login',
- }, props.config, props.config?.login, props.login, props);
-
- function doLogin(e) {
- if (e) e.stopPropagation();
- return document.location.href = props.url;
- }
-
- let label = props.label;
- label.replace(/[[username]]/, props.currentUser.displayName || '');
-
- return (
- doLogin(e)}>{label}
- );
-
-}
-
-export {
- LoginButton as default,
- LoginButton,
-};
diff --git a/packages/components/src/user/logout-button.jsx b/packages/components/src/user/logout-button.jsx
deleted file mode 100644
index fb1bf18ce..000000000
--- a/packages/components/src/user/logout-button.jsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import Button from '../button';
-
-const LogoutButton = function( props ) {
-
- props = merge.recursive({}, {
- currentUser: {},
- label: 'Logout',
- }, props.config, props.config?.logout, props.logout, props);
-
- function doLogout(e) {
- if (e) e.stopPropagation();
-
- // delete sessionData[projectId]
- // window.sessionStorage.setItem('openstad', JSON.stringify(sessionData))
-
- return document.location.href = props.url;
- }
-
- let label = props.label;
- label.replace(/[[username]]/, props.currentUser.displayName || '');
-
- return (
- doLogout(e)}>{label}
- );
-
-}
-
-export {
- LogoutButton as default,
- LogoutButton,
-};
diff --git a/packages/components/src/user/user.jsx b/packages/components/src/user/user.jsx
deleted file mode 100644
index 4ee626d28..000000000
--- a/packages/components/src/user/user.jsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import DataStore from '../data-store';
-import Loading from '../loading';
-import LoginButton from './login-button';
-import LogoutButton from './logout-button';
-
-const User = function( props ) {
-
- // dit zou denk ik een profile knop of zo moeten worden
- // voor nu is het: toon een login button als er geen user is,
- // en anders een logout button plus een json dump van de user
-
- props = merge.recursive({}, {
- loginLabel: 'Login',
- logoutLabel: 'Logout',
- }, props.config, props);
-
- const datastore = new DataStore(props);
-
- const [ currentUser, currentUserError, currentUserIsLoading ] = datastore.useCurrentUser({ ...props });
-
- let titleHTML = null;
- if (currentUser && currentUser.id) {
- titleHTML = User
- }
-
- let userHTML = currentUserIsLoading ? : null;
- if (currentUser && currentUser.id) {
- userHTML = (
-
- {JSON.stringify(currentUser, null, 2)}
-
- );
- }
-
- let buttonHTML = null;
- if (currentUser && currentUser.id) {
- buttonHTML =
- } else {
- buttonHTML =
- }
-
- return (
-
- {buttonHTML}
- {titleHTML}
- {userHTML}
-
- );
-
-}
-
-export {
- User as default,
- User,
-};
diff --git a/packages/components/src/voting/like-buttons.jsx b/packages/components/src/voting/like-buttons.jsx
deleted file mode 100644
index f0fd696d9..000000000
--- a/packages/components/src/voting/like-buttons.jsx
+++ /dev/null
@@ -1,122 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import SessionStorage from '../lib/session-storage.js';
-import hasRole from '../lib/has-role';
-import DataStore from '../data-store';
-import Button from '../button';
-import Error from '../error';
-
-// TODO: op verzoek van Daan; gaan we dat gebruiken?
-// TODO: dit moet, sort of, passen op NLDS
-import { cva } from "class-variance-authority";
-const commentVariants = cva(
- "osc-likebuttons-component osc-likebuttons inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- icon: "w-10 hover:bg-foreground/10",
- link: "underline-offset-4 hover:underline text-primary",
- },
- size: {
- default: "h-12 py-4 px-4",
- sm: "h-10 px-2",
- lg: "h-14 px-8",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-);
-
-const LikeButtons = function(props) {
-
- props = merge.recursive({}, {
- resource: {},
- votes: {
- isActive: false,
- requiredUserRole: 'member',
- voteType: 'likes',
- voteValues: [
- {
- label: 'Like',
- value: 'yes'
- }
- ]
- },
- }, props.config, props);
-
- const datastore = new DataStore(props);
- const session = new SessionStorage(props);
-
- const [ currentUser, currentUserError, currentUserIsLoading ] = datastore.useCurrentUser({ ...props });
- const [ isBusy, setIsBusy ] = useState(false)
-
- useEffect(() => {
- let pending = session.get('osc-resource-vote-pending');
- if (pending && pending[props.resource.id]) {
- if (currentUser && currentUser.role) {
- doVote(null, pending[props.resource.id])
- session.remove('osc-resource-vote-pending');
- }
- }
- }, [props.resource, currentUser]);
-
- async function doVote(e, value) {
-
- if (e) e.stopPropagation();
-
- if (isBusy) return;
- setIsBusy(true);
-
- if (!props.votes.isActive) {
- return;
- }
-
- if (!currentUser.role || !hasRole(currentUser, props.votes.requiredUserRole) ) {
- // login
- session.set('osc-resource-vote-pending', { [props.resource.id]: value });
- return document.location.href = props.login.url;
- }
-
- let change = {};
- if (props.resource.userVote) change[props.resource.userVote.opinion] = -1;
-
- await props.resource.submitLike({
- opinion: value
- })
-
- setIsBusy(false);
-
- }
-
- let className = 'osc-numberplate-button';
- if (!props.votes.isActive) className += ' osc-inactive';
-
- let buttonsHTML = [];
- for (let value of props.votes.voteValues) {
- let isBusy = false;
- let VoteButton = (
- doVote(e, value.value)} key={`osc-vote-button-${value.value}`}>{value.label} ({props.resource && props.resource[value.value]})
- );
- buttonsHTML.push(VoteButton);
- }
-
- return (
-
- {buttonsHTML}
-
- );
-
-}
-
-export default LikeButtons;
diff --git a/packages/components/src/voting/vote-selection.jsx b/packages/components/src/voting/vote-selection.jsx
deleted file mode 100644
index 226b6d141..000000000
--- a/packages/components/src/voting/vote-selection.jsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import merge from 'merge';
-import { useState, useEffect, useCallback } from 'react';
-import SessionStorage from '../lib/session-storage.js';
-import hasRole from '../lib/has-role';
-import DataStore from '../data-store';
-import Button from '../button';
-import Error from '../error';
-
-import { cva } from "class-variance-authority";
-const commentVariants = cva(
- "",
- {
- variants: {
- variant: {
- },
- size: {
- },
- },
- defaultVariants: {
- },
- }
-);
-
-const VoteSelection = function(props) {
-
- props = merge.recursive({}, {
- selection: [],
- votes: {
- isActive: false,
- requiredUserRole: 'member',
- voteType: 'likes',
- voteValues: [
- {
- label: 'Like',
- value: 'yes'
- }
- ]
- },
- }, props.config, props);
-
- const datastore = new DataStore(props);
- const session = new SessionStorage(props);
-
- let selectionHTML = (
- <>
- {props.selection.map((resource, index) => {
- return (
-
- {resource.title}
-
);
- })}
- >
- )
-
- return (
-
-
Geselecteerde plannen
- {selectionHTML}
-
- );
-
-}
-
-export default VoteSelection;
diff --git a/packages/components/webpack.config.js b/packages/components/webpack.config.js
deleted file mode 100755
index f88505fff..000000000
--- a/packages/components/webpack.config.js
+++ /dev/null
@@ -1,205 +0,0 @@
-const webpack = require('webpack');
-const path = require("path");
-const MiniCssExtractPlugin = require('mini-css-extract-plugin');
-const TerserPlugin = require('terser-webpack-plugin');
-
-module.exports = {
-
- mode: 'production',
-
- entry: {
-
- 'all': {
- import: './src/index.jsx',
- filename: 'index.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'about': {
- import: './src/about/index.jsx',
- filename: 'about.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'button': {
- import: './src/button/index.jsx',
- filename: 'button.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'forms': {
- import: './src/forms/index.jsx',
- filename: 'forms.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'comments': {
- import: './src/comments/index.jsx',
- filename: 'comments.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'resource-details': {
- import: './src/resource-details/index.jsx',
- filename: 'resource-details.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'resources-filter': {
- import: './src/resources-filter/index.jsx',
- filename: 'resources-filter.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'resources-overview': {
- import: './src/resources-overview/index.jsx',
- filename: 'resources-overview.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'participative-budgeting': {
- import: './src/participative-budgeting/index.jsx',
- filename: 'participative-budgeting.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- 'user': {
- import: './src/user/index.jsx',
- filename: 'user.js',
- library: {
- name: 'OS20',
- type: 'assign-properties',
- },
- },
-
- },
-
- output: {
- devtoolNamespace: 'mycomponents',
- path: path.resolve(__dirname + '/dist'),
- filename: '[name].js',
- library: ['OpenStad', '[name]'],
- libraryTarget: 'window',
- },
-
- externals: {
- 'react': 'React',
- 'react-dom': 'ReactDOM',
- },
-
- devtool: false,
-
- plugins: [
- new webpack.SourceMapDevToolPlugin({
- filename: '[file].map',
- }),
- new MiniCssExtractPlugin({
- filename: 'css/[name].css',
- ignoreOrder: false,
- }),
-// new webpack.ProvidePlugin({
-// Promise: 'es6-promise-promise',
-// }),
- ],
-
- optimization: {
- minimize: true,
- minimizer: [new TerserPlugin()],
- },
-
- resolve: {
- extensions: [".*", ".js", ".jsx", ".css", ".less"],
- },
-
- module: {
- rules: [
-
- // js and react
- {
- test: /\.(js|jsx)$/,
- exclude: /node_modules/,
- use: ["babel-loader"],
- },
-
- {
- test: /\.less$/,
- use: [
- {
- loader: MiniCssExtractPlugin.loader,
- options: {
-// hmr: process.env.NODE_ENV === 'development',
- },
- },
- 'css-loader',
- 'less-loader',
- ],
- },
-
- {
- test: /\.css$/,
- use: [
- {
- loader: MiniCssExtractPlugin.loader,
- options: {
- publicPath: '../'
- }
- },
- 'css-loader',
- {
- loader: 'postcss-loader',
- options: {
- postcssOptions: {
- plugins: [
- [
- 'postcss-preset-env',
- {
- // Options
- },
- ],
- ],
- },
- },
- },
- ]
- },
-
- { // other images
- test: /\.(png|jpe?g|gif|svg)$/i,
- type: 'asset/resource',
- generator: {
- filename: 'images/[name].[ext]'
-
- },
- },
-
- ],
- },
-
-};